From 16d20db3bd3ed85c34d6fa7d6ebab33ed89b4471 Mon Sep 17 00:00:00 2001 From: bergman Date: Fri, 25 Dec 2020 18:34:45 +0800 Subject: [PATCH 01/10] add python --- recover.py | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100755 recover.py diff --git a/recover.py b/recover.py new file mode 100755 index 0000000..0ac3d67 --- /dev/null +++ b/recover.py @@ -0,0 +1,112 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +import os +import sys +import subprocess +import io +import time +from pathlib import Path + +dev = "/dev/disk3s2" +idx = "0" +folder = "/备份/ctripwiki" +out = "/Volumes/wd4black/backfrombroken" +exclude = [] +# ["/Users/matthew/Library/Developer/Xcode/DerivedData", +# "/Users/matthew/Library/Application Support/Google/Chrome"] +paths = [] + +# stats +last_ts = 0.0 +list_errors = 0 +list_count = 0 +list_total = 125267 +# list_total = 8891 +recover_errors = 0 + +def ls(path): + global list_errors, list_count + dirs = [] + files = [] + args = ["./bin/apfs-list", dev, idx, path] + p = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + list_count = list_count + 1 + if p.returncode == 0: + lines = p.stderr.decode("utf-8") + for ln in lines.split("\n"): + if ln.find("- DIR REC") >= 0: + parts = ln.split("||") + if len(parts) >= 4: + name = parts[-1].strip().split("=")[-1].strip() + if parts[1].strip() == "Dirctry": + dirs.append(name) + else: + files.append(name) + else: + list_errors = list_errors+1 + print("\n" + " ".join(args)) + return [dirs, files] + +def scan(path): + + global total, last_ts, paths, list_errors, list_count + for e in exclude: + if e == path: + return 0 + + dirs,files = ls(path) + for f in files: + paths.append(path + "/" + f) + if time.time() - last_ts > 2.0: + print("Scanning", len(paths), "files...", "%.1f%%" % (len(paths)*100.0/list_total), "(%i errors %.1f%%)" % (list_errors, list_errors*100.0/list_count)) + last_ts = time.time() + + # and then scan the subfolders... + for d in dirs: + s = path + "/" + d + scan(s) + +scan(folder) + +if 1: + start_ts = time.time() + created = dict() + + for progress, i in enumerate(paths): + fld,leaf = os.path.split(i) + part = fld[len(folder):] + + # check if we need to create output folder? + outdir = out + leaf + if outdir not in created and not os.path.isdir(outdir): + os.makedirs(outdir) + created[outdir] = True + + if not leaf == ".DS_Store": + o = out + part + "/" + leaf + # print(i, "->", o) + # if not os.path.exists(o) or Path(o).stat().st_size == 0: + if 1: + args = ["./bin/apfs-recover", dev, idx, i] + outfile = open(o, "wb") + p = subprocess.run(args, stdout=outfile, stderr=subprocess.PIPE) + if not p.returncode == 0: + recover_errors = recover_errors + 1 + print(" ".join(args)) + outfile.close() + if time.time() - last_ts > 2.0: + last_ts = time.time() + elapsed = last_ts - start_ts + if elapsed > 0.0: + rate = progress / elapsed + if rate > 0: + remaining_files = len(paths) - progress + remaining_time = remaining_files / rate + hrs = int(remaining_time / 3600) + remaining_mins = remaining_time - (hrs * 3600) + min = int(remaining_mins / 60) + sec = int(remaining_mins) % 60 + # print(remaining_files, remaining_time, rate, hrs, min, sec) + print("Exporting", progress, "of", len(paths), "(%.2f%%)" % (progress * 100.0 / len(paths)), "files...", "("+str(recover_errors), "errors)", "%ih%im%is @ %.1f" % (hrs, min, sec, rate)) + From 0e1aef422c2b1d64bb33cc8212d125eb86d50729 Mon Sep 17 00:00:00 2001 From: bergman Date: Sat, 9 Jan 2021 21:41:21 +0800 Subject: [PATCH 02/10] init --- coffee/% | 0 coffee/.eslintrc.js | 27 + coffee/.gitignore | 50 + coffee/.vscode/launch.json | 20 + coffee/README.md | 5 + coffee/api/bin/bin.js | 1445 +++++++++++++++++ coffee/api/lornpug/lornpug.js | 1445 +++++++++++++++++ coffee/api/lornpughelp/lornpughelp.js | 1318 +++++++++++++++ coffee/api/runtime/runtime.js | 107 ++ coffee/api/top/top.js | 130 ++ coffee/babel.config.json | 17 + coffee/coffeelint.json | 135 ++ coffee/package.json | 48 + coffee/src/backdir.cs | 68 + coffee/src/backdirhelp.cs | 66 + ...46\234\257\346\226\271\346\241\210.coffee" | 135 ++ coffee/webpack.config.coffee | 64 + coffee/webpack.config.js | 96 ++ coffee/webpack.config.js.map | 1 + ...15\344\275\234\347\233\256\345\275\225.md" | 78 + 20 files changed, 5255 insertions(+) create mode 100644 coffee/% create mode 100644 coffee/.eslintrc.js create mode 100644 coffee/.gitignore create mode 100644 coffee/.vscode/launch.json create mode 100644 coffee/README.md create mode 100755 coffee/api/bin/bin.js create mode 100644 coffee/api/lornpug/lornpug.js create mode 100644 coffee/api/lornpughelp/lornpughelp.js create mode 100644 coffee/api/runtime/runtime.js create mode 100644 coffee/api/top/top.js create mode 100644 coffee/babel.config.json create mode 100644 coffee/coffeelint.json create mode 100644 coffee/package.json create mode 100755 coffee/src/backdir.cs create mode 100644 coffee/src/backdirhelp.cs create mode 100755 "coffee/src/\346\212\200\346\234\257\346\226\271\346\241\210.coffee" create mode 100644 coffee/webpack.config.coffee create mode 100644 coffee/webpack.config.js create mode 100644 coffee/webpack.config.js.map create mode 100644 "coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" diff --git a/coffee/% b/coffee/% new file mode 100644 index 0000000..e69de29 diff --git a/coffee/.eslintrc.js b/coffee/.eslintrc.js new file mode 100644 index 0000000..4e5fe08 --- /dev/null +++ b/coffee/.eslintrc.js @@ -0,0 +1,27 @@ +module.exports = { + extends: [ + "eslint:recommended", + "plugin:react/recommended", + 'wind/node'], + globals: { + FileReader: false, + DOMException: false, + Headers: false, + fetch: false, + }, + rules: { + 'strict': [0], + 'vars-on-top': 0, + 'global-require': 0, + "indent": 0, + "no-tabs":0, + "prettier/prettier": 0, + "spaced-comment":0, + 'new-cap':0, + }, + parser: 'babel-eslint', + parserOptions: { + sourceType: 'module', + allowImportExportEverywhere: true, + } +}; diff --git a/coffee/.gitignore b/coffee/.gitignore new file mode 100644 index 0000000..367ca14 --- /dev/null +++ b/coffee/.gitignore @@ -0,0 +1,50 @@ +dist +output +tmp +mlib + + +# .开头的 +.* + +# ~结尾的 +*~ + +# nodejs的 +node_modules/ +package-lock.json + + + +# 自己做实验要用的 +log/ + + +# log文件 +*.log +log.* + + +# png文件夹也不能上传 +png/ + + +# 压缩文件一般情况也是不必版本控制的 + +*.zip +*.tar + +# 各种lock文件也不该被版本控制, 这些都是自动生成的. +*.lock + + +# 不能忽略的js文件 +!package.json +#不能忽略node的配置文件 +!.eslintrc.js + +#不能忽略gitingnore文件: +!.gitignore + +#不能忽略vscode的配置文件 +!.vscode diff --git a/coffee/.vscode/launch.json b/coffee/.vscode/launch.json new file mode 100644 index 0000000..fc6194a --- /dev/null +++ b/coffee/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "skipFiles": [ + "/**" + ], + "program": "${file}", + "outFiles": [ + "${workspaceFolder}/dist/api/**/**.js" + ] + } + ] +} diff --git a/coffee/README.md b/coffee/README.md new file mode 100644 index 0000000..15c8e87 --- /dev/null +++ b/coffee/README.md @@ -0,0 +1,5 @@ + +# lornpug +# 舔狗项目 +# 舔狗项目 +alias lp="lpg" \ No newline at end of file diff --git a/coffee/api/bin/bin.js b/coffee/api/bin/bin.js new file mode 100755 index 0000000..ff6fb2f --- /dev/null +++ b/coffee/api/bin/bin.js @@ -0,0 +1,1445 @@ +#!/usr/bin/env node +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["mlib"] = factory(); + else + root["mlib"] = factory(); +})(global, function() { +return (() => { +var exports = {}; +exports.id = "bin"; +exports.ids = ["bin"]; +exports.modules = { + +/***/ "./src/lornpug.cs": +/*!************************!* + !*** ./src/lornpug.cs ***! + \************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +var _chalk = _interopRequireDefault(__webpack_require__(/*! chalk */ "chalk")); + +var _lornpughelp = _interopRequireDefault(__webpack_require__(/*! ./lornpughelp.cs */ "./src/lornpughelp.cs")); + +var arg, cmds, dodir, dolp, files, i, iscmd, isdefault, isdir, isio, islp, j, k, len, len1, len2, x; +iscmd = _lornpughelp["default"].iscmd; +dolp = _lornpughelp["default"].dolp; +dodir = _lornpughelp["default"].dodir; +// ------------------init--------------------- +arg = process.argv.slice(2); +console.log('环境和参数信息:'); +console.table([{ + '键: ': 'process.cwd()', + '值: ': process.cwd() +}, { + '键: ': '__dirname', + '值: ': __dirname +}, { + '键: ': 'process.argv', + '值: ': process.argv +}, { + '键: ': '真参数', + '值: ': arg +}]); +cmds = []; // 传入的参数的命令数组 + +files = []; // 传入的文件数组 + +for (i = 0, len = arg.length; i < len; i++) { + x = arg[i]; + + if (iscmd(x)) { + cmds.push(x); + } else { + files.push(x); + } +} + +console.log(_chalk["default"].blueBright("\u547D\u4EE4: ".concat(cmds, " "))); +console.log(_chalk["default"].yellowBright("\u6587\u4EF6: ".concat(files, " "))); // 处理命令 + +isdefault = cmds.length === 0; + +for (j = 0, len1 = cmds.length; j < len1; j++) { + x = cmds[j]; + isdir = /^--dir$/.test(x); + isio = /^--io$/.test(x); + islp = /^--lp$/.test(x); +} // 根据命令, 处理文件, 忽略node_module, 未来根据.gitignore忽略 + + +if (isdefault) { + // 默认是跑测试文件 + console.log(_chalk["default"].cyanBright('默认行为:'), '测试结果: '); +} else if (islp) { + // 修改.zshrc文件, 增加快捷方式 + dolp(0); +} else if (isdir) { + // 建测试目录, 初始化测试文件 + if (files.length === 0) { + dodir('.'); //如果没有任何文件参数, 那么就是从本地搞深度遍历 + } else { + for (k = 0, len2 = files.length; k < len2; k++) { + x = files[k]; + dodir(x); + } + } + + console.log(_chalk["default"].cyanBright('初始化'), '初始化成功: '); +} else if (isio) { + // 增加测试文件 + console.log(_chalk["default"].cyanBright('初始化'), '初始化成功: '); +} else { + console.log(_chalk["default"].redBright('抱歉啊: 不知道你想干啥')); +} +/* +try { + new Function('var {a} = {a: 1}')(); +} catch(error) { + console.error('Your JavaScript runtime does not support some features used by the coffee command. Please use Node 6 or later.'); + process.exit(1); +} + +var path=require('path'); +var fs=require('fs'); + +var potentialPaths=[ + path.join(process.cwd(),), + path.join(process.cwd(),), + path.join(process.cwd(),), + path.join(__dirname,'../lib/c') +]; + +for(var i=0,len=potentialPaths.length;i') + .option('-u, --username ','The user to authenticate as') + .option('-p, --password ','The users password') + .action(function(file) { + console.log('user: %s pass: %s file: %s', + program.username,program.password,file); + }) + .parse(process.argv); +*/ + +/***/ }), + +/***/ "./src/lornpughelp.cs": +/*!****************************!* + !*** ./src/lornpughelp.cs ***! + \****************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.dodir = exports.dolp = exports.iscmd = void 0; + +var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator")); + +var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator")); + +var _chalk = _interopRequireDefault(__webpack_require__(/*! chalk */ "chalk")); + +var _mlib = __webpack_require__(/*! mlib */ "./src/mlib/src/index.cs"); + +var dir1file; + +// -----------------pure function----------------- +// 判断是否有命令参数(--开始的命令参数), 没有--的都是文件 +var iscmd = function iscmd(x) { + return /^--/.test(x); +}; // 处理lp命令 + + +exports.iscmd = iscmd; + +var dolp = /*#__PURE__*/function () { + var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { + var ok, reg, str; + return _regenerator["default"].wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + str = "# \u8214\u72D7\u9879\u76EE\nalias lp=\"lpg\""; + reg = /alias\s*lp="lpg"/; + _context.next = 4; + return _mlib.file.uniqueadd({ + reg: reg, + str: str, + path: '~/.zshrc' + }); + + case 4: + ok = _context.sent; + + if (!ok) { + _context.next = 13; + break; + } + + console.log('命令设置为lp', _chalk["default"].greenBright('成功: '), '需要刷新配置才会生效, 推荐使用快捷重启命令:'); + console.log(_chalk["default"].greenBright('exec zsh'), _chalk["default"].yellow('# 重启当前terminal')); + console.log('如果不能重启terminal: '); + console.log(_chalk["default"].greenBright('source ~/.zshrc'), _chalk["default"].yellow('# 导入配置文件方法一')); + return _context.abrupt("return", console.log(_chalk["default"].greenBright('. ~/.zshrc'), _chalk["default"].yellow('# 导入配置文件方法二'))); + + case 13: + return _context.abrupt("return", console.log(_chalk["default"].redBright('没有'), '进行设置, 可能是配置文件已经存在', _chalk["default"].yellow('请手工检查文件: '), '~/.zshrc')); + + case 14: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function dolp() { + return _ref.apply(this, arguments); + }; +}(); // 处理一个cs或者coffee的初始化 + + +exports.dolp = dolp; + +dir1file = /*#__PURE__*/function () { + var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(path) { + var p; + return _regenerator["default"].wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + p = path + '.lp'; // 判断对应目录是否存在. + + if (!_mlib.file.exist(p)) { + _context2.next = 3; + break; + } + + return _context2.abrupt("return"); + + case 3: + _context2.next = 5; + return _mlib.file.mkdir(p); + + case 5: + _context2.next = 7; + return _mlib.file.cover({ + path: p + '/aaa.0i.cson', + str: '' + }); + + case 7: + _context2.next = 9; + return _mlib.file.cover({ + path: p + '/aaa.0o.cson', + str: '' + }); + + case 9: + _context2.next = 11; + return _mlib.file.cover({ + path: p + '/cto.cson', + str: '' + }); + + case 11: + return _context2.abrupt("return", _context2.sent); + + case 12: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function dir1file(_x) { + return _ref2.apply(this, arguments); + }; +}(); // 处理初始化测试dir + + +var dodir = /*#__PURE__*/function () { + var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(path) { + var i, len, ref, stat, x; + return _regenerator["default"].wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + _context3.next = 2; + return _mlib.file.filetype(path); + + case 2: + stat = _context3.sent; + + if (!stat.isfile) { + _context3.next = 7; + break; + } + + if (/\.coffee$|\.cs$/.test(path)) { + _context3.next = 6; + break; + } + + return _context3.abrupt("return"); + + case 6: + dir1file(path); + + case 7: + if (!stat.isdir) { + _context3.next = 14; + break; + } + + if (!/\./.test(path)) { + _context3.next = 10; + break; + } + + return _context3.abrupt("return"); + + case 10: + _context3.next = 12; + return _mlib.file.readir(path); + + case 12: + ref = _context3.sent; + + // 除了file和dir可能还有其他情况, 比如符号链接 + for (i = 0, len = ref.length; i < len; i++) { + x = ref[i]; // 读取目录, 逐项处理 + + dodir(x); + } + + case 14: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + + return function dodir(_x2) { + return _ref3.apply(this, arguments); + }; +}(); + +exports.dodir = dodir; +var _default = { + iscmd: iscmd, + dolp: dolp, + dodir: dodir +}; +exports.default = _default; +dodir('.'); + +/***/ }), + +/***/ "./src/mlib/src/color.cs": +/*!*******************************!* + !*** ./src/mlib/src/color.cs ***! + \*******************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.samergbstr = exports.getdark = exports.getlight = exports.lrgb = exports.lstr = exports.rgbok = void 0; + +var _colorname = _interopRequireDefault(__webpack_require__(/*! ./colorname.cson */ "./src/mlib/src/colorname.cson")); + +/* + * 关于颜色的库, 这个库会被重写, 因为hsl的亮度判断可以认为是错的. 所以可以保留hsl相关的函数, 但是, 实际应用函数需要重写. + * + */ + +/** + * 拿到视觉暗度 + * 用来判断颜色是否够暗 + * + */ + +/** + * 拿到视觉亮度 + * 用来判断颜色是否够亮 + * 未来用荧光体发光能量来计算数值. + */ + +/* + * 从16进制到rgb + * #fc2 #fc29 #fc292923 #fc2929, 3,4,6,8都有可能 + */ + +/** + * lightrgb核心亮度处理函数 + * * 亮度处理逻辑 t=max(100-g, 200-r), t+r, t+g, t+b + * * 暗度处理逻辑 t=max(g-60, r-100, b-150), r-t, g-t, b-t + * 废弃return false并不合理 + */ + +/** + * 从str到调亮的颜色str + * 这里处理一个style string的亮度 + * 纯函数 + * str: 一个颜色字符串 + * isback: 是否为背景 + * 废弃 return false 并不合理 + */ + +/* +* 从rgb到str +* */ + +/** +* 3种情况 +* 1. rgb情况: 从"rgb(154, 154, 0)"转化为: {r:154,g:154,b:0,} +* "rgba(0, 0, 0, 0)" 还需兼容此种情况 +* 2. 16进制情况: #fc2 #fc29 #fc292923 #fc2929 +* 3. 颜色名: white, black, organge +* */ +var darkcolor, getrgbdark, getrgblight, hex2rgb, lightcolor, lightrgb, lightstr, mlight, rgb2str, str2rgb, test; +darkcolor = 'rgba(44,44,44,1)'; //dark的基础颜色 + +lightcolor = 'rgba(200,200,200,1)'; +/** +* ---------------------单独处理前景或者背景, 配合darkcss的思路--------------------------- +* 亮度判断逻辑 g>100, r>200, 或者g+r>300 +* 亮度处理逻辑 t=max(100-g, 200-r), t+r, t+g, t+b +* +* 暗度判断逻辑 g<60 r<100 b<150 +* 暗度处理逻辑 t=max(g-60, r-100, b-150), r-t, g-t, b-t +* + */ + +/** +* rgbok +* 判断颜色是否需要处理 +* * 亮度判断逻辑 g>100, r>200, 或者g+r>300 +* * 暗度判断逻辑 g<60 r<100 b<150 +* 参数 +* rgb:{r,g,b} +* isback: 是否为背景图片 +* 返回值 +* true: 不需要处理 +* false: 需要处理 + */ + +var rgbok = function rgbok(_ref) { + var rgb = _ref.rgb, + _ref$isback = _ref.isback, + isback = _ref$isback === void 0 ? true : _ref$isback; + var b, g, r; + r = rgb.r; + g = rgb.g; + b = rgb.b; + + if (isback) { + return g < 60 && r < 100 && b < 150; + } else { + return r + g > 300; + } +}; //暗度判断 +//光明模式, 如果亮度<0.7则需要处理, 否则就不需要处理 + +/** + * 从str到调亮的颜色str + * 这里处理一个style string的亮度 + * 纯函数 + * str: 一个颜色字符串 + * isback: 是否为背景 + * 废弃 return false 并不合理 + */ + + +exports.rgbok = rgbok; + +var lstr = function lstr(_ref2) { + var str = _ref2.str, + _ref2$isback = _ref2.isback, + isback = _ref2$isback === void 0 ? true : _ref2$isback; + var l; + + if (!str) { + return false; + } + + if (str === "initial") { + //如果是initial, 那么直接用我的值. + return isback ? darkcolor : lightcolor; + } + + if (/var\(--/.test(str)) { + //fixme 暂时在这里忽略css var #todo + return isback ? darkcolor : lightcolor; + } + + l = lrgb({ + rgb: str2rgb(str), + isback: isback + }); + return rgb2str(l); +}; +/** + * lightrgb核心亮度处理函数 + * * 亮度处理逻辑 t=max(100-g, 200-r), t+r, t+g, t+b + * * 暗度处理逻辑 t=max(g-60, r-100, b-150), r-t, g-t, b-t + * 废弃return false并不合理 + */ + + +exports.lstr = lstr; + +var lrgb = function lrgb(_ref3) { + var rgb = _ref3.rgb, + _ref3$isback = _ref3.isback, + isback = _ref3$isback === void 0 ? true : _ref3$isback; + var b, g, r, t; + + if (rgbok({ + rgb: rgb, + isback: isback + })) { + return rgb; + } + + r = rgb.r; + g = rgb.g; + b = rgb.b; + + if (isback) { + //处理暗黑背景 + t = Math.max(g - 60, r - 100, b - 150); + r -= t; + g -= t; + b -= t; //处理明亮前景 + } else { + t = Math.max(100 - g, 200 - r); + r += t; + g += t; + b += t; + } + + return { + r: r, + g: g, + b: b + }; +}; + +exports.lrgb = lrgb; + +lightstr = function lightstr(_ref4) { + var str = _ref4.str, + _ref4$isback = _ref4.isback, + isback = _ref4$isback === void 0 ? true : _ref4$isback; + var l; + + if (!str) { + return false; + } + + if (str === "initial") { + //如果是initial, 那么直接用我的值. + return isback ? darkcolor : lightcolor; + } + + if (/var\(--/.test(str)) { + //fixme 暂时在这里忽略css var #todo + return isback ? darkcolor : lightcolor; + } + + l = lightrgb({ + rgb: str2rgb(str), + isback: isback + }); + + if (l) { + return rgb2str(l); + } else { + return false; + } +}; + +lightrgb = function lightrgb(_ref5) { + var rgb = _ref5.rgb, + _ref5$isback = _ref5.isback, + isback = _ref5$isback === void 0 ? true : _ref5$isback; + var b, g, r, t; + + if (rgbok({ + rgb: rgb, + isback: isback + })) { + return false; + } + + r = rgb.r; + g = rgb.g; + b = rgb.b; + + if (isback) { + //处理暗黑背景 + t = Math.max(g - 60, r - 100, b - 150); + r -= t; + g -= t; + b -= t; //处理明亮前景 + } else { + t = Math.max(100 - g, 200 - r); + r += t; + g += t; + b += t; + } + + return { + r: r, + g: g, + b: b + }; +}; +/** + * --------------对比度逻辑, 配合darkstyle----------------- + * 这里的计算未必合适. + */ + +/** +* 从str到亮度 + */ + + +var getlight = function getlight(str) { + return getrgblight(str2rgb(str)); +}; + +exports.getlight = getlight; + +var getdark = function getdark(str) { + return getrgbdark(str2rgb(str)); +}; + +exports.getdark = getdark; + +getrgblight = function getrgblight(_ref6) { + var r = _ref6.r, + g = _ref6.g, + b = _ref6.b; + r = r * 1.2; + g = g * 1.7; + return mlight({ + r: r, + g: g, + b: b + }).light; +}; + +getrgbdark = function getrgbdark(_ref7) { + var r = _ref7.r, + g = _ref7.g, + b = _ref7.b; + r = r * 1.3; + g = g * 1.2; + return mlight({ + r: r, + g: g, + b: b + }).light; +}; + +mlight = function mlight(_ref8) { + var r = _ref8.r, + g = _ref8.g, + b = _ref8.b; + var b1, b2, b3; + + if (r > g) { + b1 = r; + b2 = g; + } else { + b1 = g; + b2 = r; + } + + if (b < b2) { + b3 = b; + } else if (b < b1) { + b3 = b2; + b2 = b; + } else { + b3 = b2; + b2 = b1; + b1 = b; + } + + return { + // 这里很不严谨, 亮度的心理阈限测量或许能让这个计算更精确. + light: (b1 + b2 / 6) * 2 / 3, + max: [b1, b2, b3] + }; +}; +/* + * 基础工具函数------------------------------------------------------- + * 判断两个rgbstr实际相等 + */ + + +var samergbstr = function samergbstr(rgbstr1, rgbstr2) { + var b1, b2, g1, g2, r1, r2; + + var _str2rgb = str2rgb(rgbstr1); + + r1 = _str2rgb.r; + g1 = _str2rgb.g; + b1 = _str2rgb.b; + + var _str2rgb2 = str2rgb(rgbstr2); + + r2 = _str2rgb2.r; + g2 = _str2rgb2.g; + b2 = _str2rgb2.b; + return r1 === r2 && g1 === g2 && b1 === b2; +}; + +exports.samergbstr = samergbstr; + +str2rgb = function str2rgb(str) { + var a, c, reg; //"rgb(154, 154, 0)" + + reg = /rgba?\(([0-9]{1,3}), ?([0-9]{1,3}), ?([0-9]{1,3})(, ?([0-9.%]+))?\)/i; + c = reg.exec(str); //16进制颜色 + + if (c == null) { + c = hex2rgb(str); + } //再判断名字颜色: + + + if (c == null) { + c = _colorname["default"][str] && hex2rgb(hex); + } + + if (c == null) { + return false; + } //透明度 + + + a = c[5] != null ? c[5] : 1; + return { + r: +c[1], + g: +c[2], + b: +c[3], + a: a //这里用+是为了把字符串转为数字, 不然会发生很隐蔽的bug. + + }; +}; + +rgb2str = function rgb2str(_ref9) { + var r = _ref9.r, + g = _ref9.g, + b = _ref9.b, + _ref9$a = _ref9.a, + a = _ref9$a === void 0 ? 1 : _ref9$a; + + if (a > 0.99) { + return "rgb(" + r + "," + g + "," + b + ")"; + } else { + return "rgba(" + r + "," + g + "," + b + "," + a + ")"; + } +}; + +hex2rgb = function hex2rgb(str) { + var c, reg, x, y; + reg = /#([^#]*)/i; //判断#62fa89这种类似方式的颜色值 + + c = reg.exec(str); + + if ((c != null ? c[1] : void 0) == null) { + return false; + } + + x = c[1]; + y = []; + + switch (x.length) { + case 3: + y[1] = parseInt('' + x[0] + x[0], 16); + y[2] = parseInt('' + x[1] + x[1], 16); + y[3] = parseInt('' + x[2] + x[2], 16); + break; + + case 4: + //y[1]=parseInt(x[0],16); /20201028修正错误, 这个会把fff转化为 r15g15b15, 其实应该是r255g255b255 + y[1] = parseInt('' + x[0] + x[0], 16); + y[2] = parseInt('' + x[1] + x[1], 16); + y[3] = parseInt('' + x[2] + x[2], 16); + y[5] = parseInt(x[3], 16) / 255; + break; + + case 6: + y[1] = parseInt('' + x[0] + x[1], 16); + y[2] = parseInt('' + x[2] + x[3], 16); + y[3] = parseInt('' + x[4] + x[5], 16); + break; + + case 8: + y[1] = parseInt('' + x[0] + x[1], 16); + y[2] = parseInt('' + x[2] + x[3], 16); + y[3] = parseInt('' + x[4] + x[5], 16); + y[5] = parseInt('' + x[6] + x[7], 16) / 255; + break; + + default: + //不满足上面四个情况, 直接返回false + return false; + } + + return y; +}; //console.log(str2rgb('white')); #test + + +test = function test() { + var result; + result = window.luoclr.lightstr({ + str: 'white', + isback: true + }); + return console.log({ + result: result + }); +}; //lightstr +//lightrgb + + +var _default = { + lstr: lstr, + lrgb: lrgb, + getlight: getlight, + getdark: getdark, + samergbstr: samergbstr +}; +exports.default = _default; + +/***/ }), + +/***/ "./src/mlib/src/file.cs": +/*!******************************!* + !*** ./src/mlib/src/file.cs ***! + \******************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.allfile = exports.readfile = exports.readir = exports.newdir = exports.mkdir = exports.exist = exports.filetype = exports.uniqueadd = exports.cover = exports.realpath = exports.savefile = void 0; + +var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator")); + +var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator")); + +var _promises = _interopRequireDefault(__webpack_require__(/*! fs/promises */ "fs/promises")); + +var _fs = _interopRequireDefault(__webpack_require__(/*! fs */ "fs")); + +var _os = _interopRequireDefault(__webpack_require__(/*! os */ "os")); + +//import {log} from './log.js' +var home, log; +home = _os["default"].homedir(); +log = console.log; // todo 保存文件 + +var savefile = function savefile(_ref) { + var json = _ref.json, + _ref$filename = _ref.filename, + filename = _ref$filename === void 0 ? "temptest.txt" : _ref$filename; + return _promises["default"].writeFile(filename, JSON.stringify(json), function (err) { + log('文件写入', filename); + + if (err) { + return log(err); + } + }); +}; // 拿到真正的path + + +exports.savefile = savefile; + +var realpath = function realpath(path) { + // home文件夹~, node不认, 要调整为os.homedir + if (/^~/.test(path)) { + return path.replace(/^~/, home); + } else { + return path; + } +}; // 加文件内容, 覆盖式 + + +exports.realpath = realpath; + +var cover = /*#__PURE__*/function () { + var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(_ref2) { + var path, str, _ref2$options, options; + + return _regenerator["default"].wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + path = _ref2.path, str = _ref2.str, _ref2$options = _ref2.options, options = _ref2$options === void 0 ? { + encoding: 'utf8' + } : _ref2$options; + _context.next = 3; + return _promises["default"].writeFile(realpath(path), str, options); + + case 3: + return _context.abrupt("return", true); + + case 4: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function cover(_x) { + return _ref3.apply(this, arguments); + }; +}(); // 追加文件内容, 保证追加内容不重复 + + +exports.cover = cover; + +var uniqueadd = /*#__PURE__*/function () { + var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref4) { + var path, reg, str, _ref4$options, options, fstr, rpath; + + return _regenerator["default"].wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + path = _ref4.path, reg = _ref4.reg, str = _ref4.str, _ref4$options = _ref4.options, options = _ref4$options === void 0 ? { + encoding: 'utf8' + } : _ref4$options; + // home文件夹~, node不认, 要调整为os.homedir + rpath = realpath(path); // 读取文件 + + _context2.next = 4; + return _promises["default"].readFile(rpath, options); + + case 4: + fstr = _context2.sent; + + if (!reg.test(fstr)) { + _context2.next = 7; + break; + } + + return _context2.abrupt("return", false); + + case 7: + _context2.next = 9; + return _promises["default"].appendFile(rpath, str != null ? str : reg.source, options); + + case 9: + return _context2.abrupt("return", true); + + case 10: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function uniqueadd(_x2) { + return _ref5.apply(this, arguments); + }; +}(); // 判断是文件/目录 + + +exports.uniqueadd = uniqueadd; + +var filetype = /*#__PURE__*/function () { + var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(path) { + var stat; + return _regenerator["default"].wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + _context3.next = 2; + return _promises["default"].lstat(realpath(path)); + + case 2: + stat = _context3.sent; + return _context3.abrupt("return", { + isfile: stat.isFile(), + isdir: stat.isDirectory() + }); + + case 4: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + + return function filetype(_x3) { + return _ref6.apply(this, arguments); + }; +}(); // 判断文件/目录是否存在 + + +exports.filetype = filetype; + +var exist = function exist(path) { + return _fs["default"].existsSync(realpath(path)); +}; // 建一个目录 + + +exports.exist = exist; + +var mkdir = /*#__PURE__*/function () { + var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(path) { + return _regenerator["default"].wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + _context4.next = 2; + return _promises["default"].mkdir(realpath(path), { + recursive: true + }); + + case 2: + return _context4.abrupt("return", _context4.sent); + + case 3: + case "end": + return _context4.stop(); + } + } + }, _callee4); + })); + + return function mkdir(_x4) { + return _ref7.apply(this, arguments); + }; +}(); // 如果不存在就建一个目录 + + +exports.mkdir = mkdir; + +var newdir = /*#__PURE__*/function () { + var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(path) { + return _regenerator["default"].wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + if (!exist(path)) { + _context5.next = 2; + break; + } + + return _context5.abrupt("return", false); + + case 2: + _context5.next = 4; + return _promises["default"].mkdir(realpath(path)); + + case 4: + return _context5.abrupt("return", _context5.sent); + + case 5: + case "end": + return _context5.stop(); + } + } + }, _callee5); + })); + + return function newdir(_x5) { + return _ref8.apply(this, arguments); + }; +}(); // 读取目录 + + +exports.newdir = newdir; + +var readir = /*#__PURE__*/function () { + var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(path) { + return _regenerator["default"].wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + _context6.next = 2; + return _promises["default"].readdir(realpath(path)); + + case 2: + return _context6.abrupt("return", _context6.sent); + + case 3: + case "end": + return _context6.stop(); + } + } + }, _callee6); + })); + + return function readir(_x6) { + return _ref9.apply(this, arguments); + }; +}(); // 读取文件 + + +exports.readir = readir; + +var readfile = /*#__PURE__*/function () { + var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(path) { + var fstr; + return _regenerator["default"].wrap(function _callee7$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + _context7.next = 2; + return _promises["default"].readFile(realpath(path), { + encoding: 'utf8' + }); + + case 2: + return _context7.abrupt("return", fstr = _context7.sent); + + case 3: + case "end": + return _context7.stop(); + } + } + }, _callee7); + })); + + return function readfile(_x7) { + return _ref10.apply(this, arguments); + }; +}(); // todo 读取目录中所有问题, 深度遍历 + + +exports.readfile = readfile; + +var allfile = function allfile(_ref11) { + var path = _ref11.path, + _ref11$reg = _ref11.reg, + reg = _ref11$reg === void 0 ? false : _ref11$reg, + _ref11$options = _ref11.options, + options = _ref11$options === void 0 ? { + encoding: 'utf8' + } : _ref11$options; + // 如果没传reg, 那么就是要所有文件 + return readdir(path, options); +}; + +exports.allfile = allfile; +var _default = { + savefile: savefile, + cover: cover, + uniqueadd: uniqueadd, + filetype: filetype, + exist: exist, + mkdir: mkdir, + readir: readir, + readfile: readfile, + allfile: allfile +}; +exports.default = _default; + +/***/ }), + +/***/ "./src/mlib/src/index.cs": +/*!*******************************!* + !*** ./src/mlib/src/index.cs ***! + \*******************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +Object.defineProperty(exports, "color", ({ + enumerable: true, + get: function get() { + return _color["default"]; + } +})); +Object.defineProperty(exports, "random", ({ + enumerable: true, + get: function get() { + return _random["default"]; + } +})); +Object.defineProperty(exports, "time", ({ + enumerable: true, + get: function get() { + return _time["default"]; + } +})); +Object.defineProperty(exports, "file", ({ + enumerable: true, + get: function get() { + return _file["default"]; + } +})); + +var _color = _interopRequireDefault(__webpack_require__(/*! ./color.cs */ "./src/mlib/src/color.cs")); + +var _random = _interopRequireDefault(__webpack_require__(/*! ./random.cs */ "./src/mlib/src/random.cs")); + +var _time = _interopRequireDefault(__webpack_require__(/*! ./time.cs */ "./src/mlib/src/time.cs")); + +var _file = _interopRequireDefault(__webpack_require__(/*! ./file.cs */ "./src/mlib/src/file.cs")); + +/***/ }), + +/***/ "./src/mlib/src/random.cs": +/*!********************************!* + !*** ./src/mlib/src/random.cs ***! + \********************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.randomlight = exports.randomcolor = exports.randomember = exports.randomint = void 0; + +var _color = __webpack_require__(/*! ./color.cs */ "./src/mlib/src/color.cs"); + +/* +* 拿到整数版本的随机数 +* 因为random不包含1, 因此, 这个随机数也不包含max +* 因此传入数组的长度正好合适作为数组的索引 + */ +var randomint = function randomint(max) { + return Math.random() * max >> 0; +}; +/* +数组中取一个随机element +*/ + + +exports.randomint = randomint; + +var randomember = function randomember(p) { + return p[randomint(p.length)]; +}; // 随机一个颜色 + + +exports.randomember = randomember; + +var randomcolor = function randomcolor() { + return "rgb(" + randomint(256) + "," + randomint(256) + "," + randomint(256) + ")"; +}; // 随机一个明亮颜色 + + +exports.randomcolor = randomcolor; + +var randomlight = function randomlight() { + return (0, _color.lstr)({ + str: randomcolor(0), + isback: false + }); +}; + +exports.randomlight = randomlight; +var _default = { + randomint: randomint, + randomember: randomember, + randomcolor: randomcolor, + randomlight: randomlight +}; +exports.default = _default; + +/***/ }), + +/***/ "./src/mlib/src/time.cs": +/*!******************************!* + !*** ./src/mlib/src/time.cs ***! + \******************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.gethhmmss = exports.gethhmm = exports.sleep = void 0; + +var sleep = function sleep(ms) { + return new Promise(function (resolve) { + return setTimeout(resolve, ms); + }); +}; + +exports.sleep = sleep; + +var gethhmm = function gethhmm() { + var timestamp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Date.now(); + var t; + t = new Date(+timestamp); + return t.getHours() + ':' + t.getMinutes(); +}; + +exports.gethhmm = gethhmm; + +var gethhmmss = function gethhmmss() { + var timestamp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Date.now(); + var t; + t = new Date(+timestamp); + return t.getHours() + ':' + t.getMinutes() + ':' + t.getSeconds(); +}; + +exports.gethhmmss = gethhmmss; +var _default = { + sleep: sleep, + gethhmm: gethhmm, + gethhmmss: gethhmmss +}; +exports.default = _default; + +/***/ }), + +/***/ "./src/mlib/src/colorname.cson": +/*!*************************************!* + !*** ./src/mlib/src/colorname.cson ***! + \*************************************/ +/***/ ((module) => { + +module.exports = {"black":"#000","silver":"#c0c0c0","gray":"#808080","white":"#fff","maroon":"#800000","red":"#ff0000","purple":"#800080","fuchsia":"#ff00ff","green":"#008000","lime":"#00ff00","olive":"#808000","yellow":"#ffff00","navy":"#000080","blue":"#0000ff","teal":"#008080","aqua":"#00ffff","orange":"#ffa500","aliceblue":"#f0f8ff","antiquewhite":"#faebd7","aquamarine":"#7fffd4","azure":"#f0ffff","beige":"#f5f5dc","bisque":"#ffe4c4","blanchedalmond":"#ffebcd","blueviolet":"#8a2be2","brown":"#a52a2a","burlywood":"#deb887","cadetblue":"#5f9ea0","chartreuse":"#7fff00","chocolate":"#d2691e","coral":"#ff7f50","cornflowerblue":"#6495ed","cornsilk":"#fff8dc","crimson":"#dc143c","cyan":"#00ffff","darkblue":"#00008b","darkcyan":"#008b8b","darkgoldenrod":"#b8860b","darkgray":"#a9a9a9","darkgreen":"#006400","darkgrey":"#a9a9a9","darkkhaki":"#bdb76b","darkmagenta":"#8b008b","darkolivegreen":"#556b2f","darkorange":"#ff8c00","darkorchid":"#9932cc","darkred":"#8b0000","darksalmon":"#e9967a","darkseagreen":"#8fbc8f","darkslateblue":"#483d8b","darkslategray":"#2f4f4f","darkslategrey":"#2f4f4f","darkturquoise":"#00ced1","darkviolet":"#9400d3","deeppink":"#ff1493","deepskyblue":"#00bfff","dimgray":"#696969","dimgrey":"#696969","dodgerblue":"#1e90ff","firebrick":"#b22222","floralwhite":"#fffaf0","forestgreen":"#228b22","gainsboro":"#dcdcdc","ghostwhite":"#f8f8ff","gold":"#ffd700","goldenrod":"#daa520","greenyellow":"#adff2f","grey":"#808080","honeydew":"#f0fff0","hotpink":"#ff69b4","indianred":"#cd5c5c","indigo":"#4b0082","ivory":"#fffff0","khaki":"#f0e68c","lavender":"#e6e6fa","lavenderblush":"#fff0f5","lawngreen":"#7cfc00","lemonchiffon":"#fffacd","lightblue":"#add8e6","lightcoral":"#f08080","lightcyan":"#e0ffff","lightgoldenrodyellow":"#fafad2","lightgray":"#d3d3d3","lightgreen":"#90ee90","lightgrey":"#d3d3d3","lightpink":"#ffb6c1","lightsalmon":"#ffa07a","lightseagreen":"#20b2aa","lightskyblue":"#87cefa","lightslategray":"#778899","lightslategrey":"#778899","lightsteelblue":"#b0c4de","lightyellow":"#ffffe0","limegreen":"#32cd32","linen":"#faf0e6","magenta":"#ff00ff","mediumaquamarine":"#66cdaa","mediumblue":"#0000cd","mediumorchid":"#ba55d3","mediumpurple":"#9370db","mediumseagreen":"#3cb371","mediumslateblue":"#7b68ee","mediumspringgreen":"#00fa9a","mediumturquoise":"#48d1cc","mediumvioletred":"#c71585","midnightblue":"#191970","mintcream":"#f5fffa","mistyrose":"#ffe4e1","moccasin":"#ffe4b5","navajowhite":"#ffdead","oldlace":"#fdf5e6","olivedrab":"#6b8e23","orangered":"#ff4500","orchid":"#da70d6","palegoldenrod":"#eee8aa","palegreen":"#98fb98","paleturquoise":"#afeeee","palevioletred":"#db7093","papayawhip":"#ffefd5","peachpuff":"#ffdab9","peru":"#cd853f","pink":"#ffc0cb","plum":"#dda0dd","powderblue":"#b0e0e6","rosybrown":"#bc8f8f","royalblue":"#4169e1","saddlebrown":"#8b4513","salmon":"#fa8072","sandybrown":"#f4a460","seagreen":"#2e8b57","seashell":"#fff5ee","sienna":"#a0522d","skyblue":"#87ceeb","slateblue":"#6a5acd","slategray":"#708090","slategrey":"#708090","snow":"#fffafa","springgreen":"#00ff7f","steelblue":"#4682b4","tan":"#d2b48c","thistle":"#d8bfd8","tomato":"#ff6347","transparent":"#0000","turquoise":"#40e0d0","violet":"#ee82ee","wheat":"#f5deb3","whitesmoke":"#f5f5f5","yellowgreen":"#9acd32","rebeccapurple":"#663399"} + +/***/ }), + +/***/ "@babel/runtime/helpers/asyncToGenerator": +/*!**********************************************************!* + !*** external "@babel/runtime/helpers/asyncToGenerator" ***! + \**********************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("@babel/runtime/helpers/asyncToGenerator");; + +/***/ }), + +/***/ "@babel/runtime/helpers/interopRequireDefault": +/*!***************************************************************!* + !*** external "@babel/runtime/helpers/interopRequireDefault" ***! + \***************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("@babel/runtime/helpers/interopRequireDefault");; + +/***/ }), + +/***/ "@babel/runtime/regenerator": +/*!*********************************************!* + !*** external "@babel/runtime/regenerator" ***! + \*********************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("@babel/runtime/regenerator");; + +/***/ }), + +/***/ "chalk": +/*!************************!* + !*** external "chalk" ***! + \************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("chalk");; + +/***/ }), + +/***/ "fs": +/*!*********************!* + !*** external "fs" ***! + \*********************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("fs");; + +/***/ }), + +/***/ "fs/promises": +/*!******************************!* + !*** external "fs/promises" ***! + \******************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("fs/promises");; + +/***/ }), + +/***/ "os": +/*!*********************!* + !*** external "os" ***! + \*********************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("os");; + +/***/ }) + +}; +; + +// load runtime +var __webpack_require__ = require("../runtime/runtime.js"); +__webpack_require__.C(exports); +return __webpack_require__.X([], "./src/lornpug.cs"); +})(); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tbGliL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9tbGliLy4vc3JjL2xvcm5wdWcuY3MiLCJ3ZWJwYWNrOi8vbWxpYi8uL3NyYy9sb3JucHVnaGVscC5jcyIsIndlYnBhY2s6Ly9tbGliLy4vc3JjL21saWIvc3JjL2NvbG9yLmNzIiwid2VicGFjazovL21saWIvLi9zcmMvbWxpYi9zcmMvZmlsZS5jcyIsIndlYnBhY2s6Ly9tbGliLy4vc3JjL21saWIvc3JjL2luZGV4LmNzIiwid2VicGFjazovL21saWIvLi9zcmMvbWxpYi9zcmMvcmFuZG9tLmNzIiwid2VicGFjazovL21saWIvLi9zcmMvbWxpYi9zcmMvdGltZS5jcyIsIndlYnBhY2s6Ly9tbGliLy4vc3JjL21saWIvc3JjL2NvbG9ybmFtZS5jc29uIiwid2VicGFjazovL21saWIvZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIiIsIndlYnBhY2s6Ly9tbGliL2V4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIiIsIndlYnBhY2s6Ly9tbGliL2V4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIiIsIndlYnBhY2s6Ly9tbGliL2V4dGVybmFsIFwiY2hhbGtcIiIsIndlYnBhY2s6Ly9tbGliL2V4dGVybmFsIFwiZnNcIiIsIndlYnBhY2s6Ly9tbGliL2V4dGVybmFsIFwiZnMvcHJvbWlzZXNcIiIsIndlYnBhY2s6Ly9tbGliL2V4dGVybmFsIFwib3NcIiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7O0FBR0E7O0FBSEE7QUFLQSxLLEdBTEEsdUIsQ0FLQSxLO0FBQUEsSSxHQUxBLHVC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QUFELFk7QUFGRixDQUFoQjs7OztBQUlBLElBQU8sWUFBVyxTQUFYLFNBQVc7QUFBQSxNQUFDLFNBQUQsdUVBQVcsSUFBSSxDQUFmLEdBQVcsRUFBWDtBQUNsQjtBQUFDLE1BQUUsU0FBUyxDQUFULFVBQUY7U0FDQSxDQUFDLENBQUQsbUJBQWlCLENBQUMsQ0FBbEIsVUFBaUIsRUFBakIsU0FBb0MsQ0FBQyxDQUFELFk7QUFGbkIsQ0FBbEI7OztlQU9lO0FBQ2QsT0FEYyxFQUNkLEtBRGM7QUFFZCxTQUZjLEVBRWQsT0FGYztBQUdkLFdBSGMsRUFHZDtBQUhjLEM7Ozs7Ozs7Ozs7O0FDaEJmLGtCQUFrQiw4ckc7Ozs7Ozs7Ozs7O0FDQWxCLHFFOzs7Ozs7Ozs7OztBQ0FBLDBFOzs7Ozs7Ozs7OztBQ0FBLHdEOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLGdDOzs7Ozs7Ozs7OztBQ0FBLHlDOzs7Ozs7Ozs7OztBQ0FBLGdDIiwiZmlsZSI6ImJpbi9iaW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJtbGliXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIm1saWJcIl0gPSBmYWN0b3J5KCk7XG59KShnbG9iYWwsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcbiNjaGFsayA9IHJlcXVpcmUoJ2NoYWxrJylcbiNpbXBvcnQge2ZpbGV9IGZyb20gJ21saWInXG5pbXBvcnQgbHBoIGZyb20gJy4vbG9ybnB1Z2hlbHAuY3MnXG5cbntpc2NtZCwgZG9scCwgZG9kaXJ9PWxwaFxuXG5cbiMgLS0tLS0tLS0tLS0tLS0tLS0taW5pdC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuYXJnPXByb2Nlc3MuYXJndlsyLi5dXG5jb25zb2xlLmxvZyAn546v5aKD5ZKM5Y+C5pWw5L+h5oGvOidcbmNvbnNvbGUudGFibGUgW1xuXHR7J+mUrjogJzoncHJvY2Vzcy5jd2QoKScsICflgLw6ICc6IHByb2Nlc3MuY3dkKCl9XG5cdHsn6ZSuOiAnOidfX2Rpcm5hbWUnLCAn5YC8OiAnOl9fZGlybmFtZX1cblx0eyfplK46ICc6J3Byb2Nlc3MuYXJndicsICflgLw6ICc6cHJvY2Vzcy5hcmd2fVxuXHR7J+mUrjogJzon55yf5Y+C5pWwJywgJ+WAvDogJzphcmd9XG5dXG5cbmNtZHM9W10gIyDkvKDlhaXnmoTlj4LmlbDnmoTlkb3ku6TmlbDnu4RcbmZpbGVzPVtdICMg5Lyg5YWl55qE5paH5Lu25pWw57uEXG5cbmZvciB4IGluIGFyZ1xuXHRpZiBpc2NtZCB4IHRoZW4gY21kcy5wdXNoIHggZWxzZSBmaWxlcy5wdXNoIHhcblxuXG5jb25zb2xlLmxvZyBjaGFsay5ibHVlQnJpZ2h0IFwi5ZG95LukOiAgI3tjbWRzfSBcIlxuY29uc29sZS5sb2cgY2hhbGsueWVsbG93QnJpZ2h0IFwi5paH5Lu2OiAje2ZpbGVzfSBcIlxuXG5cbiMg5aSE55CG5ZG95LukXG5pc2RlZmF1bHQgPSBjbWRzLmxlbmd0aCA9PTBcbmZvciB4IGluIGNtZHNcblx0aXNkaXI9L14tLWRpciQvLnRlc3QgeFxuXHRpc2lvPS9eLS1pbyQvLnRlc3QgeFxuXHRpc2xwPS9eLS1scCQvLnRlc3QgeFxuXG5cblxuXG4jIOagueaNruWRveS7pCwg5aSE55CG5paH5Lu2LCDlv73nlaVub2RlX21vZHVsZSwg5pyq5p2l5qC55o2uLmdpdGlnbm9yZeW/veeVpVxuaWYgaXNkZWZhdWx0ICMg6buY6K6k5piv6LeR5rWL6K+V5paH5Lu2XG5cdGNvbnNvbGUubG9nIChjaGFsay5jeWFuQnJpZ2h0ICfpu5jorqTooYzkuLo6JyksICfmtYvor5Xnu5Pmnpw6ICdcblxuZWxzZSBpZiBpc2xwICMg5L+u5pS5LnpzaHJj5paH5Lu2LCDlop7liqDlv6vmjbfmlrnlvI9cblx0ZG9scCAwXG5lbHNlIGlmIGlzZGlyICMg5bu65rWL6K+V55uu5b2VLCDliJ3lp4vljJbmtYvor5Xmlofku7Zcblx0aWYgZmlsZXMubGVuZ3RoPT0wXG5cdFx0ZG9kaXIgJy4nICPlpoLmnpzmsqHmnInku7vkvZXmlofku7blj4LmlbAsIOmCo+S5iOWwseaYr+S7juacrOWcsOaQnua3seW6pumBjeWOhlxuXHRlbHNlXG5cdFx0ZG9kaXIgeCBmb3IgeCBpbiBmaWxlc1xuXHRcdFxuXHRjb25zb2xlLmxvZyAoY2hhbGsuY3lhbkJyaWdodCAn5Yid5aeL5YyWJyksICfliJ3lp4vljJbmiJDlip86ICdcblxuZWxzZSBpZiBpc2lvICMg5aKe5Yqg5rWL6K+V5paH5Lu2XG5cdGNvbnNvbGUubG9nIChjaGFsay5jeWFuQnJpZ2h0ICfliJ3lp4vljJYnKSwgJ+WIneWni+WMluaIkOWKnzogJ1xuXHRcbmVsc2Vcblx0Y29uc29sZS5sb2cgY2hhbGsucmVkQnJpZ2h0ICfmirHmrYnllYo6IOS4jeefpemBk+S9oOaDs+W5suWVpSdcblxuXG5cblxuIyMjXG50cnkge1xuXHRuZXcgRnVuY3Rpb24oJ3ZhciB7YX0gPSB7YTogMX0nKSgpO1xufSBjYXRjaChlcnJvcikge1xuXHRjb25zb2xlLmVycm9yKCdZb3VyIEphdmFTY3JpcHQgcnVudGltZSBkb2VzIG5vdCBzdXBwb3J0IHNvbWUgZmVhdHVyZXMgdXNlZCBieSB0aGUgY29mZmVlIGNvbW1hbmQuIFBsZWFzZSB1c2UgTm9kZSA2IG9yIGxhdGVyLicpO1xuXHRwcm9jZXNzLmV4aXQoMSk7XG59XG5cbnZhciBwYXRoPXJlcXVpcmUoJ3BhdGgnKTtcbnZhciBmcz1yZXF1aXJlKCdmcycpO1xuXG52YXIgcG90ZW50aWFsUGF0aHM9W1xuXHRwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwpLFxuXHRwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwpLFxuXHRwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwpLFxuXHRwYXRoLmpvaW4oX19kaXJuYW1lLCcuLi9saWIvYycpXG5dO1xuXG5mb3IodmFyIGk9MCxsZW49cG90ZW50aWFsUGF0aHMubGVuZ3RoO2k8bGVuO2krKykge1xuXHRpZihmcy5leGlzdHNTeW5jKHBvdGVudGlhbFBhdGhzW2ldKSkge1xuXHRcdHJlcXVpcmUocG90ZW50aWFsUGF0aHNbaV0rJy9jb21tYW5kJykucnVuKCk7XG5cdFx0YnJlYWs7XG5cdH1cbn1cblxuXG4vL+S8oOWPguaVsFxudmFyIHByb2dyYW09cmVxdWlyZSgnY29tbWFuZGVyJyk7XG5cbnByb2dyYW1cblx0LmFyZ3VtZW50cygnPGZpbGU+Jylcblx0Lm9wdGlvbignLXUsIC0tdXNlcm5hbWUgPHVzZXJuYW1lPicsJ1RoZSB1c2VyIHRvIGF1dGhlbnRpY2F0ZSBhcycpXG5cdC5vcHRpb24oJy1wLCAtLXBhc3N3b3JkIDxwYXNzd29yZD4nLCdUaGUgdXNlcnMgcGFzc3dvcmQnKVxuXHRcdC5hY3Rpb24oZnVuY3Rpb24oZmlsZSkge1xuXHRcdFx0Y29uc29sZS5sb2coJ3VzZXI6ICVzIHBhc3M6ICVzIGZpbGU6ICVzJyxcblx0XHRcdFx0cHJvZ3JhbS51c2VybmFtZSxwcm9ncmFtLnBhc3N3b3JkLGZpbGUpO1xuXHRcdH0pXG5cdFx0LnBhcnNlKHByb2Nlc3MuYXJndik7XG4jIyNcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcbiNjaGFsayA9IHJlcXVpcmUoJ2NoYWxrJylcbmltcG9ydCB7ZmlsZX0gZnJvbSAnbWxpYidcblxuIyAtLS0tLS0tLS0tLS0tLS0tLXB1cmUgZnVuY3Rpb24tLS0tLS0tLS0tLS0tLS0tLVxuIyDliKTmlq3mmK/lkKbmnInlkb3ku6Tlj4LmlbAoLS3lvIDlp4vnmoTlkb3ku6Tlj4LmlbApLCDmsqHmnIktLeeahOmDveaYr+aWh+S7tlxuZXhwb3J0IGlzY21kPSAoeCktPlxuXHQvXi0tLy50ZXN0IHhcblxuIyDlpITnkIZscOWRveS7pFxuZXhwb3J0IGRvbHAgPSAtPlxuXHRzdHI9JycnXG5cdCMg6IiU54uX6aG555uuXG5cdGFsaWFzIGxwPVwibHBnXCJcblx0JycnXG5cdHJlZz0vYWxpYXNcXHMqbHA9XCJscGdcIi9cblx0b2s9YXdhaXQgZmlsZS51bmlxdWVhZGQge1xuXHRcdHJlZ1xuXHRcdHN0clxuXHRcdHBhdGg6J34vLnpzaHJjJ1xuXHRcdCNwYXRoOiAnUkVBRE1FLm1kJ1xuXHR9XG5cdGlmIG9rXG5cdFx0Y29uc29sZS5sb2cgKCAn5ZG95Luk6K6+572u5Li6bHAnKSwgKGNoYWxrLmdyZWVuQnJpZ2h0ICfmiJDlip86ICcpLCfpnIDopoHliLfmlrDphY3nva7miY3kvJrnlJ/mlYgsIOaOqOiNkOS9v+eUqOW/q+aNt+mHjeWQr+WRveS7pDonXG5cdFx0Y29uc29sZS5sb2cgKGNoYWxrLmdyZWVuQnJpZ2h0ICdleGVjIHpzaCcpLChjaGFsay55ZWxsb3cgJyMg6YeN5ZCv5b2T5YmNdGVybWluYWwnKVxuXG5cdFx0Y29uc29sZS5sb2cgICflpoLmnpzkuI3og73ph43lkK90ZXJtaW5hbDogJ1xuXHRcdGNvbnNvbGUuIGxvZyAoY2hhbGsuZ3JlZW5CcmlnaHQgJ3NvdXJjZSB+Ly56c2hyYycpLCAoY2hhbGsueWVsbG93ICcjIOWvvOWFpemFjee9ruaWh+S7tuaWueazleS4gCcpXG5cdFx0Y29uc29sZS4gbG9nIChjaGFsay5ncmVlbkJyaWdodCAnLiB+Ly56c2hyYycpLCAoY2hhbGsueWVsbG93ICcjIOWvvOWFpemFjee9ruaWh+S7tuaWueazleS6jCcpXG5cdGVsc2Vcblx0XHRjb25zb2xlLmxvZyAoY2hhbGsucmVkQnJpZ2h0ICfmsqHmnIknKSwgKCAn6L+b6KGM6K6+572uLCDlj6/og73mmK/phY3nva7mlofku7blt7Lnu4/lrZjlnKgnKSwgKGNoYWxrLnllbGxvdyAn6K+35omL5bel5qOA5p+l5paH5Lu2OiAnKSwnfi8uenNocmMnXG5cbiMg5aSE55CG5LiA5LiqY3PmiJbogIVjb2ZmZWXnmoTliJ3lp4vljJZcbmRpcjFmaWxlID0gKHBhdGgpLT5cblx0cD0gcGF0aCsnLmxwJ1xuXHQjIOWIpOaWreWvueW6lOebruW9leaYr+WQpuWtmOWcqC5cblx0cmV0dXJuIGlmIChmaWxlLmV4aXN0IHApXG5cdCMg5paw5bu655uu5b2VXG5cdGF3YWl0IGZpbGUubWtkaXIgcFxuXHQjIHRvZG/or7vlj5bmlofku7YsIOWIhuaekOWHveaVsCwg5bu656uL5a+55bqU55qE5rWL6K+V5paH5Lu2XG5cdCMg5Yid5aeL5YyW5rWL6K+V5paH5Lu2XG5cdGF3YWl0IGZpbGUuY292ZXIgcGF0aDpwKycvYWFhLjBpLmNzb24nLHN0cjonJ1xuXHRhd2FpdCBmaWxlLmNvdmVyIHBhdGg6cCsnL2FhYS4wby5jc29uJyxzdHI6Jydcblx0YXdhaXQgZmlsZS5jb3ZlciBwYXRoOnArJy9jdG8uY3Nvbicsc3RyOicnXG5cbiMg5aSE55CG5Yid5aeL5YyW5rWL6K+VZGlyXG5leHBvcnQgZG9kaXIgPSAocGF0aCktPlxuXHRzdGF0PSBhd2FpdCBmaWxlLmZpbGV0eXBlIHBhdGhcblx0aWYgc3RhdC5pc2ZpbGUgIyDmlofku7blpITnkIZcblx0XHQjIOWkhOeQhmNvZmZlZeWSjGNzXG5cdFx0cmV0dXJuIHVubGVzcyAvXFwuY29mZmVlJHxcXC5jcyQvLnRlc3QgcGF0aFxuXHRcdGRpcjFmaWxlIHBhdGhcblx0aWYgc3RhdC5pc2RpciAjIOebruW9leWkhOeQhlxuXHRcdCMg6YCS5b2S5aSE55CG55uu5b2VLCDopoHpgb/lvIDoh6rliqjnlJ/miJDnmoTnm67lvZUo5ZCN56ew6YeM6Z2i5bim54K555qEKVxuXHRcdHJldHVybiBpZiAvXFwuLy50ZXN0IHBhdGhcblx0XHQjIOivu+WPluebruW9lSwg6YCQ6aG55aSE55CGXG5cdFx0ZG9kaXIgeCBmb3IgeCBpbiBhd2FpdCBmaWxlLnJlYWRpciBwYXRoXG5cdHJldHVybiAjIOmZpOS6hmZpbGXlkoxkaXLlj6/og73ov5jmnInlhbbku5bmg4XlhrUsIOavlOWmguespuWPt+mTvuaOpVxuXG5leHBvcnQgZGVmYXVsdCB7XG5cdGlzY21kXG5cdGRvbHBcblx0ZG9kaXJcbn1cblxuZG9kaXIgJy4nXG4iLCIjIyNcbiAqIOWFs+S6juminOiJsueahOW6kywg6L+Z5Liq5bqT5Lya6KKr6YeN5YaZLCDlm6DkuLpoc2znmoTkuq7luqbliKTmlq3lj6/ku6XorqTkuLrmmK/plJnnmoQuIOaJgOS7peWPr+S7peS/neeVmWhzbOebuOWFs+eahOWHveaVsCwg5L2G5pivLCDlrp7pmYXlupTnlKjlh73mlbDpnIDopoHph43lhpkuXG4gKlxuIyMjXG5pbXBvcnQgY29sb3JuYW1lIGZyb20gJy4vY29sb3JuYW1lLmNzb24nXG5cbmRhcmtjb2xvcj0gJ3JnYmEoNDQsNDQsNDQsMSknICNkYXJr55qE5Z+656GA6aKc6ImyXG5saWdodGNvbG9yPSAncmdiYSgyMDAsMjAwLDIwMCwxKSdcblxuXG5cblxuXG4jIyMqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS3ljZXni6zlpITnkIbliY3mma/miJbogIXog4zmma8sIOmFjeWQiGRhcmtjc3PnmoTmgJ3ot68tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOS6ruW6puWIpOaWremAu+i+kSBnPjEwMCwgcj4yMDAsIOaIluiAhWcrcj4zMDBcbiAqIOS6ruW6puWkhOeQhumAu+i+kSB0PW1heCgxMDAtZywgMjAwLXIpLCB0K3IsIHQrZywgdCtiXG4gKlxuICog5pqX5bqm5Yik5pat6YC76L6RIGc8NjAgcjwxMDAgYjwxNTBcbiAqIOaal+W6puWkhOeQhumAu+i+kSB0PW1heChnLTYwLCByLTEwMCwgYi0xNTApLCByLXQsIGctdCwgYi10XG4gKlxuICMjI1xuXG5cdCMjIypcblx0ICogcmdib2tcblx0ICog5Yik5pat6aKc6Imy5piv5ZCm6ZyA6KaB5aSE55CGXG5cdCAqICAqIOS6ruW6puWIpOaWremAu+i+kSBnPjEwMCwgcj4yMDAsIOaIluiAhWcrcj4zMDBcblx0ICogICog5pqX5bqm5Yik5pat6YC76L6RIGc8NjAgcjwxMDAgYjwxNTBcblx0ICog5Y+C5pWwXG5cdCAqIFx0cmdiOntyLGcsYn1cblx0ICogIGlzYmFjazog5piv5ZCm5Li66IOM5pmv5Zu+54mHXG5cdCAqIOi/lOWbnuWAvFxuXHQgKiBcdFx0dHJ1ZTog5LiN6ZyA6KaB5aSE55CGXG5cdCAqIFx0XHRmYWxzZTog6ZyA6KaB5aSE55CGXG5cdCAjIyNcbmV4cG9ydCByZ2Jvaz0oe3JnYixpc2JhY2s9dHJ1ZX0pLT5cblx0e3IsZyxifT1yZ2Jcblx0aWYgaXNiYWNrIHRoZW4gXHRnPDYwICYmIHI8MTAwICYmIGI8MTUwIGVsc2UgcitnPjMwMFxuXHRcdFx0I+aal+W6puWIpOaWrVxuXHRcdFx0I+WFieaYjuaooeW8jywg5aaC5p6c5Lqu5bqmPDAuN+WImemcgOimgeWkhOeQhiwg5ZCm5YiZ5bCx5LiN6ZyA6KaB5aSE55CGXG5cblxuIyMjKlxuICog5LuOc3Ry5Yiw6LCD5Lqu55qE6aKc6Imyc3RyXG4gKiAg6L+Z6YeM5aSE55CG5LiA5Liqc3R5bGUgc3RyaW5n55qE5Lqu5bqmXG4gKiDnuq/lh73mlbBcbiAqIHN0cjog5LiA5Liq6aKc6Imy5a2X56ym5LiyXG4gKiBpc2JhY2s6IOaYr+WQpuS4uuiDjOaZr1xuICog5bqf5byDIHJldHVybiBmYWxzZSDlubbkuI3lkIjnkIZcbiMjI1xuZXhwb3J0IGxzdHI9KHtzdHIsaXNiYWNrPXRydWV9KSAtPlxuXHRyZXR1cm4gZmFsc2UgaWYoIXN0cilcblx0XG5cdCPlpoLmnpzmmK9pbml0aWFsLCDpgqPkuYjnm7TmjqXnlKjmiJHnmoTlgLwuXG5cdHJldHVybiAoaWYgaXNiYWNrIHRoZW4gZGFya2NvbG9yIGVsc2UgbGlnaHRjb2xvcikgaWYgc3RyPT1cImluaXRpYWxcIlxuXHRcblx0I2ZpeG1lIOaaguaXtuWcqOi/memHjOW/veeVpWNzcyB2YXIgICN0b2RvXG5cdHJldHVybiAoaWYgaXNiYWNrIHRoZW4gZGFya2NvbG9yIGVsc2UgbGlnaHRjb2xvcilpZiAvdmFyXFwoLS0vLnRlc3Qoc3RyKVxuXG5cdGw9bHJnYiB7cmdiOiBzdHIycmdiKHN0ciksaXNiYWNrfVxuXHRyZ2Iyc3RyKGwpXG5cbiMjIypcblx0ICogbGlnaHRyZ2LmoLjlv4Pkuq7luqblpITnkIblh73mlbBcblx0ICogICog5Lqu5bqm5aSE55CG6YC76L6RIHQ9bWF4KDEwMC1nLCAyMDAtciksIHQrciwgdCtnLCB0K2Jcblx0ICogICog5pqX5bqm5aSE55CG6YC76L6RIHQ9bWF4KGctNjAsIHItMTAwLCBiLTE1MCksIHItdCwgZy10LCBiLXRcblx0ICog5bqf5byDcmV0dXJuIGZhbHNl5bm25LiN5ZCI55CGXG4jIyNcbmV4cG9ydCBscmdiPSh7cmdiLGlzYmFjaz10cnVlfSkgLT5cblx0cmV0dXJuIHJnYiBpZiByZ2JvayB7cmdiLGlzYmFja31cblx0e3IsZyxifT1yZ2Jcblx0aWYgKGlzYmFjaykgICPlpITnkIbmmpfpu5Hog4zmma9cblx0XHR0PSBNYXRoLm1heChnLTYwLHItMTAwLCBiLTE1MClcblx0XHRyLT10XG5cdFx0Zy09dFxuXHRcdGItPXRcblx0ZWxzZSAgI+WkhOeQhuaYjuS6ruWJjeaZr1xuXHRcdHQ9IE1hdGgubWF4KDEwMC1nLDIwMC1yKVxuXHRcdHIrPXRcblx0XHRnKz10XG5cdFx0Yis9dFxuXHR7cixnLGJ9XG5cbiMjIypcbiAqIOS7jnN0cuWIsOiwg+S6rueahOminOiJsnN0clxuICogIOi/memHjOWkhOeQhuS4gOS4qnN0eWxlIHN0cmluZ+eahOS6ruW6plxuICog57qv5Ye95pWwXG4gKiBzdHI6IOS4gOS4quminOiJsuWtl+espuS4slxuICogaXNiYWNrOiDmmK/lkKbkuLrog4zmma9cbiAqIOW6n+W8gyByZXR1cm4gZmFsc2Ug5bm25LiN5ZCI55CGXG4jIyNcbmxpZ2h0c3RyPSh7c3RyLGlzYmFjaz10cnVlfSkgLT5cblx0cmV0dXJuIGZhbHNlIGlmKCFzdHIpXG5cdFxuXHQj5aaC5p6c5pivaW5pdGlhbCwg6YKj5LmI55u05o6l55So5oiR55qE5YC8LlxuXHRyZXR1cm4gKGlmIGlzYmFjayB0aGVuIGRhcmtjb2xvciBlbHNlIGxpZ2h0Y29sb3IpIGlmIHN0cj09XCJpbml0aWFsXCJcblx0XG5cdCNmaXhtZSDmmoLml7blnKjov5nph4zlv73nlaVjc3MgdmFyICAjdG9kb1xuXHRyZXR1cm4gKGlmIGlzYmFjayB0aGVuIGRhcmtjb2xvciBlbHNlIGxpZ2h0Y29sb3IpaWYgL3ZhclxcKC0tLy50ZXN0KHN0cilcblx0bD1saWdodHJnYiB7cmdiOiBzdHIycmdiKHN0ciksaXNiYWNrfVxuXHRpZiBsIHRoZW4gcmdiMnN0cihsKSBlbHNlIGZhbHNlXG5cblxuXG4jIyMqXG5cdCAqIGxpZ2h0cmdi5qC45b+D5Lqu5bqm5aSE55CG5Ye95pWwXG5cdCAqICAqIOS6ruW6puWkhOeQhumAu+i+kSB0PW1heCgxMDAtZywgMjAwLXIpLCB0K3IsIHQrZywgdCtiXG5cdCAqICAqIOaal+W6puWkhOeQhumAu+i+kSB0PW1heChnLTYwLCByLTEwMCwgYi0xNTApLCByLXQsIGctdCwgYi10XG5cdCAqIOW6n+W8g3JldHVybiBmYWxzZeW5tuS4jeWQiOeQhlxuIyMjXG5saWdodHJnYj0oe3JnYixpc2JhY2s9dHJ1ZX0pIC0+XG5cdHJldHVybiBmYWxzZSBpZihyZ2Jvayh7cmdiLGlzYmFja30pKVxuXHR7cixnLGJ9PXJnYlxuXHRpZiAoaXNiYWNrKSAgI+WkhOeQhuaal+m7keiDjOaZr1xuXHRcdHQ9IE1hdGgubWF4KGctNjAsci0xMDAsIGItMTUwKVxuXHRcdHItPXRcblx0XHRnLT10XG5cdFx0Yi09dFxuXHRlbHNlICAj5aSE55CG5piO5Lqu5YmN5pmvXG5cdFx0dD0gTWF0aC5tYXgoMTAwLWcsMjAwLXIpXG5cdFx0cis9dFxuXHRcdGcrPXRcblx0XHRiKz10XG5cdHtyLGcsYn1cblxuXG5cblxuXG4jIyMqXG4gKiAtLS0tLS0tLS0tLS0tLeWvueavlOW6pumAu+i+kSwg6YWN5ZCIZGFya3N0eWxlLS0tLS0tLS0tLS0tLS0tLS1cbiAqIOi/memHjOeahOiuoeeul+acquW/heWQiOmAgi5cbiMjI1xuXG5cblxuXG5cdFx0IyMjKlxuXHRcdCAqIOS7jnN0cuWIsOS6ruW6plxuXHRcdCAjIyNcbmV4cG9ydCBnZXRsaWdodD0gKHN0cikgLT5cblx0Z2V0cmdibGlnaHQgc3RyMnJnYiBzdHJcblx0XHRcbmV4cG9ydCBnZXRkYXJrPShzdHIpIC0+XG5cdGdldHJnYmRhcmsgc3RyMnJnYiBzdHJcblx0XHRcblxuXG5cbiMjIypcblx0KiDmi7/liLDop4bop4nkuq7luqZcblx0KiDnlKjmnaXliKTmlq3popzoibLmmK/lkKblpJ/kuq5cblx0KiDmnKrmnaXnlKjojaflhYnkvZPlj5HlhYnog73ph4/mnaXorqHnrpfmlbDlgLwuXG4jIyNcbmdldHJnYmxpZ2h0PSAoe3IsZyxifSktPlxuXHRyPXIqMS4yXG5cdGc9ZyoxLjdcblx0bWxpZ2h0KHtyLGcsYn0pLmxpZ2h0XG5cbiMjIypcblx0KiDmi7/liLDop4bop4nmmpfluqZcblx0KiDnlKjmnaXliKTmlq3popzoibLmmK/lkKblpJ/mmpdcblx0KlxuIyMjXG5nZXRyZ2JkYXJrPSh7cixnLGJ9KS0+XG5cdHI9cioxLjNcblx0Zz1nKjEuMlxuXHRtbGlnaHQoe3IsZyxifSkubGlnaHRcblxubWxpZ2h0PSh7cixnLGJ9KS0+XG5cdGlmIHIgPiBnXG5cdFx0YjE9clxuXHRcdGIyPWdcblx0ZWxzZVxuXHRcdGIxPWdcblx0XHRiMj1yXG5cdFxuXHRpZiBiIDwgYjJcblx0XHRiMz1iXG5cdGVsc2UgaWYgYiA8IGIxXG5cdFx0YjM9YjJcblx0XHRiMj1iXG5cdGVsc2Vcblx0XHRiMz1iMlxuXHRcdGIyPWIxXG5cdFx0YjE9YlxuXHRcdFx0IyDov5nph4zlvojkuI3kuKXosKgsIOS6ruW6pueahOW/g+eQhumYiOmZkOa1i+mHj+aIluiuuOiDveiuqei/meS4quiuoeeul+abtOeyvuehri5cblx0bGlnaHQ6IChiMStiMi82KSoyLzMsbWF4OiBbYjEsYjIsYjNdXG5cdFxuXG5cblxuXG5cblxuXG5cbiMjI1xuXHQqIOWfuuehgOW3peWFt+WHveaVsC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0KiDliKTmlq3kuKTkuKpyZ2JzdHLlrp7pmYXnm7jnrYlcbiMjI1xuXG5leHBvcnQgc2FtZXJnYnN0cj0ocmdic3RyMSxyZ2JzdHIyKS0+XG5cdHtyOiByMSxnOiBnMSxiOiBiMX09c3RyMnJnYihyZ2JzdHIxKVxuXHR7cjogcjIsZzogZzIsYjogYjJ9PXN0cjJyZ2Iocmdic3RyMilcblx0cjE9PXIyJiZnMT09ZzImJmIxPT1iMlxuXG5cbiMjIypcbiogM+enjeaDheWGtVxuKiAxLiByZ2Lmg4XlhrU6IOS7jlwicmdiKDE1NCwgMTU0LCAwKVwi6L2s5YyW5Li6OiB7cjoxNTQsZzoxNTQsYjowLH1cbiogXCJyZ2JhKDAsIDAsIDAsIDApXCIg6L+Y6ZyA5YW85a655q2k56eN5oOF5Ya1XG4qIDIuIDE26L+b5Yi25oOF5Ya1OiAgI2ZjMiAgI2ZjMjkgI2ZjMjkyOTIzICNmYzI5MjlcbiogMy4g6aKc6Imy5ZCNOiB3aGl0ZSwgYmxhY2ssIG9yZ2FuZ2VcbiojIyNcblxuc3RyMnJnYj0oc3RyKS0+XG5cblx0I1wicmdiKDE1NCwgMTU0LCAwKVwiXG5cdHJlZz0vcmdiYT9cXCgoWzAtOV17MSwzfSksID8oWzAtOV17MSwzfSksID8oWzAtOV17MSwzfSkoLCA/KFswLTkuJV0rKSk/XFwpL2lcblx0Yz1yZWcuZXhlYyBzdHJcblxuXHQjMTbov5vliLbpopzoibJcblx0Yz89aGV4MnJnYihzdHIpXG5cblx0I+WGjeWIpOaWreWQjeWtl+minOiJsjpcblx0Yz89IGNvbG9ybmFtZVtzdHJdICYmIGhleDJyZ2IoaGV4KVxuXHRcblx0cmV0dXJuIGZhbHNlIHVubGVzcyBjP1xuXG5cblx0I+mAj+aYjuW6plxuXHRhPSBpZiBjWzVdPyB0aGVuIGNbNV0gZWxzZSAxXG5cdHtyOiArY1sxXSxnOiArY1syXSxiOiArY1szXSxhfSAj6L+Z6YeM55SoK+aYr+S4uuS6huaKiuWtl+espuS4sui9rOS4uuaVsOWtlywg5LiN54S25Lya5Y+R55Sf5b6I6ZqQ6JS955qEYnVnLlxuXG5cblx0IyMjXG5cdCAqIOS7jnJnYuWIsHN0clxuXHQgKiMjI1xucmdiMnN0cj0oe3IsZyxiLGE9MX0pIC0+XG5cdGlmIGE+MC45OSB0aGVuICBcInJnYihcIityK1wiLFwiK2crXCIsXCIrYitcIilcIiBlbHNlIFwicmdiYShcIityK1wiLFwiK2crXCIsXCIrYitcIixcIithK1wiKVwiXG5cblxuXHQjIyNcblx0ICog5LuOMTbov5vliLbliLByZ2Jcblx0ICogICNmYzIgICNmYzI5ICNmYzI5MjkyMyAjZmMyOTI5LCAzLDQsNiw46YO95pyJ5Y+v6IO9XG5cdCMjI1xuXG5cbmhleDJyZ2I9KHN0cikgLT5cblx0cmVnPS8jKFteI10qKS9pICPliKTmlq0jNjJmYTg56L+Z56eN57G75Ly85pa55byP55qE6aKc6Imy5YC8XG5cdGM9cmVnLmV4ZWMoc3RyKVxuXHRyZXR1cm4gZmFsc2UgdW5sZXNzIGM/WzFdPyBcdCNjMeS4jeWtmOWcqOmcgOimgXJldHVyblxuXHR4PWNbMV1cblx0eT1bXVxuXHRzd2l0Y2ggeC5sZW5ndGhcblx0XHR3aGVuIDNcblx0XHRcdHlbMV09cGFyc2VJbnQoJycreFswXSt4WzBdLDE2KVxuXHRcdFx0eVsyXT1wYXJzZUludCgnJyt4WzFdK3hbMV0sMTYpXG5cdFx0XHR5WzNdPXBhcnNlSW50KCcnK3hbMl0reFsyXSwxNilcblx0XHR3aGVuIDRcblx0XHRcdCN5WzFdPXBhcnNlSW50KHhbMF0sMTYpOyAgLzIwMjAxMDI45L+u5q2j6ZSZ6K+vLCDov5nkuKrkvJrmiopmZmbovazljJbkuLogcjE1ZzE1YjE1LCDlhbblrp7lupTor6XmmK9yMjU1ZzI1NWIyNTVcblx0XHRcdHlbMV09cGFyc2VJbnQoJycreFswXSt4WzBdLDE2KVxuXHRcdFx0eVsyXT1wYXJzZUludCgnJyt4WzFdK3hbMV0sMTYpXG5cdFx0XHR5WzNdPXBhcnNlSW50KCcnK3hbMl0reFsyXSwxNilcblx0XHRcdHlbNV09cGFyc2VJbnQoeFszXSwxNikvMjU1XG5cdFx0d2hlbiA2XG5cdFx0XHR5WzFdPXBhcnNlSW50KCcnK3hbMF0reFsxXSwxNilcblx0XHRcdHlbMl09cGFyc2VJbnQoJycreFsyXSt4WzNdLDE2KVxuXHRcdFx0eVszXT1wYXJzZUludCgnJyt4WzRdK3hbNV0sMTYpXG5cdFx0d2hlbiA4XG5cdFx0XHR5WzFdPXBhcnNlSW50KCcnK3hbMF0reFsxXSwxNilcblx0XHRcdHlbMl09cGFyc2VJbnQoJycreFsyXSt4WzNdLDE2KVxuXHRcdFx0eVszXT1wYXJzZUludCgnJyt4WzRdK3hbNV0sMTYpXG5cdFx0XHR5WzVdPXBhcnNlSW50KCcnK3hbNl0reFs3XSwxNikvMjU1XG5cdFx0I+S4jea7oei2s+S4iumdouWbm+S4quaDheWGtSwg55u05o6l6L+U5ZueZmFsc2Vcblx0XHRlbHNlIHJldHVybiBmYWxzZVxuXHR5XG5cblx0I2NvbnNvbGUubG9nKHN0cjJyZ2IoJ3doaXRlJykpOyAjdGVzdFxuXG5cblxuXG5cblxudGVzdCA9IC0+XG5cdHJlc3VsdD13aW5kb3cubHVvY2xyLmxpZ2h0c3RyIHN0cjond2hpdGUnLCBpc2JhY2s6dHJ1ZVxuXHRjb25zb2xlLmxvZyB7cmVzdWx0fVxuXG5cbmV4cG9ydCBkZWZhdWx0IHtcblx0I2xpZ2h0c3RyXG5cdCNsaWdodHJnYlxuXHRsc3RyXG5cdGxyZ2Jcblx0Z2V0bGlnaHRcblx0Z2V0ZGFya1xuXHRzYW1lcmdic3RyXG5cbn1cbiIsIiNpbXBvcnQge2xvZ30gZnJvbSAnLi9sb2cuanMnXG5cbmltcG9ydCBmcyBmcm9tICdmcy9wcm9taXNlcydcbmltcG9ydCBmdHMgZnJvbSAnZnMnXG5cbmltcG9ydCBvcyBmcm9tICdvcydcblxuaG9tZSA9IG9zLmhvbWVkaXIoKVxubG9nPWNvbnNvbGUubG9nXG5cblxuIyB0b2RvIOS/neWtmOaWh+S7tlxuZXhwb3J0IHNhdmVmaWxlPSh7anNvbixmaWxlbmFtZT1cInRlbXB0ZXN0LnR4dFwifSktPlxuXHRmcy53cml0ZUZpbGUgZmlsZW5hbWUsSlNPTi5zdHJpbmdpZnkoanNvbiksKGVyciktPlxuXHRcdGxvZyAn5paH5Lu25YaZ5YWlJyxmaWxlbmFtZVxuXHRcdGxvZyBlcnIgaWYgZXJyXG5cbiMg5ou/5Yiw55yf5q2j55qEcGF0aFxuZXhwb3J0IHJlYWxwYXRoPShwYXRoKS0+XG5cdCMgaG9tZeaWh+S7tuWkuX4sIG5vZGXkuI3orqQsIOimgeiwg+aVtOS4um9zLmhvbWVkaXJcblx0aWYgL15+Ly50ZXN0IHBhdGggdGhlbiBwYXRoLnJlcGxhY2UgL15+LywgaG9tZSAgZWxzZSBwYXRoXG5cblxuIyDliqDmlofku7blhoXlrrksIOimhuebluW8j1xuZXhwb3J0IGNvdmVyPSh7cGF0aCwgc3RyLCBvcHRpb25zPWVuY29kaW5nOid1dGY4J30pIC0+XG5cblx0IyDopobnm5blvI/lhpnlhaVcblx0YXdhaXQgZnMud3JpdGVGaWxlIChyZWFscGF0aCBwYXRoKSwgc3RyLCBvcHRpb25zXG5cdHRydWVcbiMg6L+95Yqg5paH5Lu25YaF5a65LCDkv53or4Hov73liqDlhoXlrrnkuI3ph43lpI1cbmV4cG9ydCB1bmlxdWVhZGQ9KHtwYXRoLCByZWcsIHN0ciwgb3B0aW9ucz1lbmNvZGluZzondXRmOCd9KSAtPlxuXG5cdCMgaG9tZeaWh+S7tuWkuX4sIG5vZGXkuI3orqQsIOimgeiwg+aVtOS4um9zLmhvbWVkaXJcblx0cnBhdGggPXJlYWxwYXRoIHBhdGhcblxuXHQjIOivu+WPluaWh+S7tlxuXHRmc3RyPWF3YWl0IGZzLnJlYWRGaWxlIHJwYXRoLCBvcHRpb25zXG5cdCMg5q2j5YiZ5Yik5patXG5cdHJldHVybiBmYWxzZSBpZiByZWcudGVzdCBmc3RyXG5cblx0IyDkuI3ph43lpI3lsLHmj5LlhaVcblx0YXdhaXQgZnMuYXBwZW5kRmlsZSBycGF0aCwgc3RyID8gcmVnLnNvdXJjZSwgb3B0aW9uc1xuXHR0cnVlXG5cbiMg5Yik5pat5piv5paH5Lu2L+ebruW9lVxuZXhwb3J0IGZpbGV0eXBlID0gKHBhdGgpLT5cblx0c3RhdD1hd2FpdCBmcy5sc3RhdCByZWFscGF0aCBwYXRoXG5cdHJldHVybiBpc2ZpbGU6IHN0YXQuaXNGaWxlKCksIGlzZGlyOiBzdGF0LmlzRGlyZWN0b3J5KClcblxuIyDliKTmlq3mlofku7Yv55uu5b2V5piv5ZCm5a2Y5ZyoXG5leHBvcnQgZXhpc3QgPSAocGF0aCktPlxuXHRmdHMuZXhpc3RzU3luYyByZWFscGF0aCBwYXRoXG5cbiMg5bu65LiA5Liq55uu5b2VXG5leHBvcnQgbWtkaXI9KHBhdGgpLT5cblx0YXdhaXQgZnMubWtkaXIgKHJlYWxwYXRoIHBhdGgpLHJlY3Vyc2l2ZTp0cnVlXG5cbiMg5aaC5p6c5LiN5a2Y5Zyo5bCx5bu65LiA5Liq55uu5b2VXG5leHBvcnQgbmV3ZGlyPShwYXRoKS0+XG5cdHJldHVybiBmYWxzZSBpZiBleGlzdCBwYXRoXG5cdGF3YWl0IGZzLm1rZGlyIHJlYWxwYXRoIHBhdGhcblxuIyDor7vlj5bnm67lvZVcbmV4cG9ydCByZWFkaXIgPSAocGF0aCktPlxuXHRhd2FpdCBmcy5yZWFkZGlyIHJlYWxwYXRoIHBhdGhcbiMg6K+75Y+W5paH5Lu2XG5leHBvcnQgcmVhZGZpbGUgPSAocGF0aCktPlxuXHRmc3RyPWF3YWl0IGZzLnJlYWRGaWxlIChyZWFscGF0aCBwYXRoKSwgZW5jb2Rpbmc6J3V0ZjgnXG5cblxuIyB0b2RvIOivu+WPluebruW9leS4reaJgOaciemXrumimCwg5rex5bqm6YGN5Y6GXG5leHBvcnQgYWxsZmlsZSA9ICh7cGF0aCwgcmVnPWZhbHNlLG9wdGlvbnM9ZW5jb2Rpbmc6J3V0ZjgnfSktPlxuXHQjIOWmguaenOayoeS8oHJlZywg6YKj5LmI5bCx5piv6KaB5omA5pyJ5paH5Lu2XG5cdHJlYWRkaXIocGF0aCwgb3B0aW9ucylcblxuXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuXHRzYXZlZmlsZVxuXHRjb3ZlclxuXHR1bmlxdWVhZGRcblx0ZmlsZXR5cGVcblx0ZXhpc3Rcblx0bWtkaXJcblx0cmVhZGlyXG5cdHJlYWRmaWxlXG5cdGFsbGZpbGVcbn1cbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyBjb2xvcn0gZnJvbSAnLi9jb2xvci5jcydcbmV4cG9ydCB7ZGVmYXVsdCBhcyByYW5kb219IGZyb20gXHQnLi9yYW5kb20uY3MnXG5leHBvcnQge2RlZmF1bHQgYXMgdGltZX0gZnJvbSBcdCcuL3RpbWUuY3MnXG5leHBvcnQge2RlZmF1bHQgYXMgZmlsZX0gZnJvbSBcdCcuL2ZpbGUuY3MnXG4iLCJcbiMjI1xuKiDmi7/liLDmlbTmlbDniYjmnKznmoTpmo/mnLrmlbBcbiog5Zug5Li6cmFuZG9t5LiN5YyF5ZCrMSwg5Zug5q2kLCDov5nkuKrpmo/mnLrmlbDkuZ/kuI3ljIXlkKttYXhcbiog5Zug5q2k5Lyg5YWl5pWw57uE55qE6ZW/5bqm5q2j5aW95ZCI6YCC5L2c5Li65pWw57uE55qE57Si5byVXG4jIyNcbmltcG9ydCB7bHN0cn0gZnJvbSAnLi9jb2xvci5jcydcblxuZXhwb3J0IHJhbmRvbWludD0obWF4KSAtPlxuXHQoTWF0aC5yYW5kb20oKSptYXgpPj4wXG5cbiMjI1xu5pWw57uE5Lit5Y+W5LiA5Liq6ZqP5py6ZWxlbWVudFxuIyMjXG5leHBvcnQgcmFuZG9tZW1iZXIgPSAocCkgLT5cblx0cFtyYW5kb21pbnQgcC5sZW5ndGhdXG5cbiMg6ZqP5py65LiA5Liq6aKc6ImyXG5leHBvcnQgcmFuZG9tY29sb3IgPSAtPlxuXHRcInJnYihcIisgKHJhbmRvbWludCAyNTYpK1wiLFwiKyhyYW5kb21pbnQgMjU2ICkrXCIsXCIrKHJhbmRvbWludCAyNTYpK1wiKVwiXG5cblxuIyDpmo/mnLrkuIDkuKrmmI7kuq7popzoibJcbmV4cG9ydCByYW5kb21saWdodCA9IC0+XG5cdGxzdHJcblx0XHRzdHI6cmFuZG9tY29sb3IgMFxuXHRcdGlzYmFjazpmYWxzZVxuXG5cblxuXG5leHBvcnQgZGVmYXVsdCB7XG5cdHJhbmRvbWludFxuXHRyYW5kb21lbWJlclxuXHRyYW5kb21jb2xvclxuXHRyYW5kb21saWdodFxufVxuIiwiZXhwb3J0IHNsZWVwID0gKG1zKSAtPlxuXHRuZXcgUHJvbWlzZSAocmVzb2x2ZSkgLT5cblx0XHRzZXRUaW1lb3V0IHJlc29sdmUsIG1zXG5cblxuZXhwb3J0IGdldGhobW0gPSh0aW1lc3RhbXA9RGF0ZS5ub3coKSktPlxuXHR0PW5ldyBEYXRlKCt0aW1lc3RhbXApXG5cdHQuZ2V0SG91cnMoKSsnOicrdC5nZXRNaW51dGVzKClcblxuZXhwb3J0IGdldGhobW1zcyA9KHRpbWVzdGFtcD1EYXRlLm5vdygpKS0+XG5cdHQ9bmV3IERhdGUoK3RpbWVzdGFtcClcblx0dC5nZXRIb3VycygpKyc6Jyt0LmdldE1pbnV0ZXMoKSsnOicrdC5nZXRTZWNvbmRzKClcblxuXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuXHRzbGVlcFxuXHRnZXRoaG1tXG5cdGdldGhobW1zc1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XCJibGFja1wiOlwiIzAwMFwiLFwic2lsdmVyXCI6XCIjYzBjMGMwXCIsXCJncmF5XCI6XCIjODA4MDgwXCIsXCJ3aGl0ZVwiOlwiI2ZmZlwiLFwibWFyb29uXCI6XCIjODAwMDAwXCIsXCJyZWRcIjpcIiNmZjAwMDBcIixcInB1cnBsZVwiOlwiIzgwMDA4MFwiLFwiZnVjaHNpYVwiOlwiI2ZmMDBmZlwiLFwiZ3JlZW5cIjpcIiMwMDgwMDBcIixcImxpbWVcIjpcIiMwMGZmMDBcIixcIm9saXZlXCI6XCIjODA4MDAwXCIsXCJ5ZWxsb3dcIjpcIiNmZmZmMDBcIixcIm5hdnlcIjpcIiMwMDAwODBcIixcImJsdWVcIjpcIiMwMDAwZmZcIixcInRlYWxcIjpcIiMwMDgwODBcIixcImFxdWFcIjpcIiMwMGZmZmZcIixcIm9yYW5nZVwiOlwiI2ZmYTUwMFwiLFwiYWxpY2VibHVlXCI6XCIjZjBmOGZmXCIsXCJhbnRpcXVld2hpdGVcIjpcIiNmYWViZDdcIixcImFxdWFtYXJpbmVcIjpcIiM3ZmZmZDRcIixcImF6dXJlXCI6XCIjZjBmZmZmXCIsXCJiZWlnZVwiOlwiI2Y1ZjVkY1wiLFwiYmlzcXVlXCI6XCIjZmZlNGM0XCIsXCJibGFuY2hlZGFsbW9uZFwiOlwiI2ZmZWJjZFwiLFwiYmx1ZXZpb2xldFwiOlwiIzhhMmJlMlwiLFwiYnJvd25cIjpcIiNhNTJhMmFcIixcImJ1cmx5d29vZFwiOlwiI2RlYjg4N1wiLFwiY2FkZXRibHVlXCI6XCIjNWY5ZWEwXCIsXCJjaGFydHJldXNlXCI6XCIjN2ZmZjAwXCIsXCJjaG9jb2xhdGVcIjpcIiNkMjY5MWVcIixcImNvcmFsXCI6XCIjZmY3ZjUwXCIsXCJjb3JuZmxvd2VyYmx1ZVwiOlwiIzY0OTVlZFwiLFwiY29ybnNpbGtcIjpcIiNmZmY4ZGNcIixcImNyaW1zb25cIjpcIiNkYzE0M2NcIixcImN5YW5cIjpcIiMwMGZmZmZcIixcImRhcmtibHVlXCI6XCIjMDAwMDhiXCIsXCJkYXJrY3lhblwiOlwiIzAwOGI4YlwiLFwiZGFya2dvbGRlbnJvZFwiOlwiI2I4ODYwYlwiLFwiZGFya2dyYXlcIjpcIiNhOWE5YTlcIixcImRhcmtncmVlblwiOlwiIzAwNjQwMFwiLFwiZGFya2dyZXlcIjpcIiNhOWE5YTlcIixcImRhcmtraGFraVwiOlwiI2JkYjc2YlwiLFwiZGFya21hZ2VudGFcIjpcIiM4YjAwOGJcIixcImRhcmtvbGl2ZWdyZWVuXCI6XCIjNTU2YjJmXCIsXCJkYXJrb3JhbmdlXCI6XCIjZmY4YzAwXCIsXCJkYXJrb3JjaGlkXCI6XCIjOTkzMmNjXCIsXCJkYXJrcmVkXCI6XCIjOGIwMDAwXCIsXCJkYXJrc2FsbW9uXCI6XCIjZTk5NjdhXCIsXCJkYXJrc2VhZ3JlZW5cIjpcIiM4ZmJjOGZcIixcImRhcmtzbGF0ZWJsdWVcIjpcIiM0ODNkOGJcIixcImRhcmtzbGF0ZWdyYXlcIjpcIiMyZjRmNGZcIixcImRhcmtzbGF0ZWdyZXlcIjpcIiMyZjRmNGZcIixcImRhcmt0dXJxdW9pc2VcIjpcIiMwMGNlZDFcIixcImRhcmt2aW9sZXRcIjpcIiM5NDAwZDNcIixcImRlZXBwaW5rXCI6XCIjZmYxNDkzXCIsXCJkZWVwc2t5Ymx1ZVwiOlwiIzAwYmZmZlwiLFwiZGltZ3JheVwiOlwiIzY5Njk2OVwiLFwiZGltZ3JleVwiOlwiIzY5Njk2OVwiLFwiZG9kZ2VyYmx1ZVwiOlwiIzFlOTBmZlwiLFwiZmlyZWJyaWNrXCI6XCIjYjIyMjIyXCIsXCJmbG9yYWx3aGl0ZVwiOlwiI2ZmZmFmMFwiLFwiZm9yZXN0Z3JlZW5cIjpcIiMyMjhiMjJcIixcImdhaW5zYm9yb1wiOlwiI2RjZGNkY1wiLFwiZ2hvc3R3aGl0ZVwiOlwiI2Y4ZjhmZlwiLFwiZ29sZFwiOlwiI2ZmZDcwMFwiLFwiZ29sZGVucm9kXCI6XCIjZGFhNTIwXCIsXCJncmVlbnllbGxvd1wiOlwiI2FkZmYyZlwiLFwiZ3JleVwiOlwiIzgwODA4MFwiLFwiaG9uZXlkZXdcIjpcIiNmMGZmZjBcIixcImhvdHBpbmtcIjpcIiNmZjY5YjRcIixcImluZGlhbnJlZFwiOlwiI2NkNWM1Y1wiLFwiaW5kaWdvXCI6XCIjNGIwMDgyXCIsXCJpdm9yeVwiOlwiI2ZmZmZmMFwiLFwia2hha2lcIjpcIiNmMGU2OGNcIixcImxhdmVuZGVyXCI6XCIjZTZlNmZhXCIsXCJsYXZlbmRlcmJsdXNoXCI6XCIjZmZmMGY1XCIsXCJsYXduZ3JlZW5cIjpcIiM3Y2ZjMDBcIixcImxlbW9uY2hpZmZvblwiOlwiI2ZmZmFjZFwiLFwibGlnaHRibHVlXCI6XCIjYWRkOGU2XCIsXCJsaWdodGNvcmFsXCI6XCIjZjA4MDgwXCIsXCJsaWdodGN5YW5cIjpcIiNlMGZmZmZcIixcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6XCIjZmFmYWQyXCIsXCJsaWdodGdyYXlcIjpcIiNkM2QzZDNcIixcImxpZ2h0Z3JlZW5cIjpcIiM5MGVlOTBcIixcImxpZ2h0Z3JleVwiOlwiI2QzZDNkM1wiLFwibGlnaHRwaW5rXCI6XCIjZmZiNmMxXCIsXCJsaWdodHNhbG1vblwiOlwiI2ZmYTA3YVwiLFwibGlnaHRzZWFncmVlblwiOlwiIzIwYjJhYVwiLFwibGlnaHRza3libHVlXCI6XCIjODdjZWZhXCIsXCJsaWdodHNsYXRlZ3JheVwiOlwiIzc3ODg5OVwiLFwibGlnaHRzbGF0ZWdyZXlcIjpcIiM3Nzg4OTlcIixcImxpZ2h0c3RlZWxibHVlXCI6XCIjYjBjNGRlXCIsXCJsaWdodHllbGxvd1wiOlwiI2ZmZmZlMFwiLFwibGltZWdyZWVuXCI6XCIjMzJjZDMyXCIsXCJsaW5lblwiOlwiI2ZhZjBlNlwiLFwibWFnZW50YVwiOlwiI2ZmMDBmZlwiLFwibWVkaXVtYXF1YW1hcmluZVwiOlwiIzY2Y2RhYVwiLFwibWVkaXVtYmx1ZVwiOlwiIzAwMDBjZFwiLFwibWVkaXVtb3JjaGlkXCI6XCIjYmE1NWQzXCIsXCJtZWRpdW1wdXJwbGVcIjpcIiM5MzcwZGJcIixcIm1lZGl1bXNlYWdyZWVuXCI6XCIjM2NiMzcxXCIsXCJtZWRpdW1zbGF0ZWJsdWVcIjpcIiM3YjY4ZWVcIixcIm1lZGl1bXNwcmluZ2dyZWVuXCI6XCIjMDBmYTlhXCIsXCJtZWRpdW10dXJxdW9pc2VcIjpcIiM0OGQxY2NcIixcIm1lZGl1bXZpb2xldHJlZFwiOlwiI2M3MTU4NVwiLFwibWlkbmlnaHRibHVlXCI6XCIjMTkxOTcwXCIsXCJtaW50Y3JlYW1cIjpcIiNmNWZmZmFcIixcIm1pc3R5cm9zZVwiOlwiI2ZmZTRlMVwiLFwibW9jY2FzaW5cIjpcIiNmZmU0YjVcIixcIm5hdmFqb3doaXRlXCI6XCIjZmZkZWFkXCIsXCJvbGRsYWNlXCI6XCIjZmRmNWU2XCIsXCJvbGl2ZWRyYWJcIjpcIiM2YjhlMjNcIixcIm9yYW5nZXJlZFwiOlwiI2ZmNDUwMFwiLFwib3JjaGlkXCI6XCIjZGE3MGQ2XCIsXCJwYWxlZ29sZGVucm9kXCI6XCIjZWVlOGFhXCIsXCJwYWxlZ3JlZW5cIjpcIiM5OGZiOThcIixcInBhbGV0dXJxdW9pc2VcIjpcIiNhZmVlZWVcIixcInBhbGV2aW9sZXRyZWRcIjpcIiNkYjcwOTNcIixcInBhcGF5YXdoaXBcIjpcIiNmZmVmZDVcIixcInBlYWNocHVmZlwiOlwiI2ZmZGFiOVwiLFwicGVydVwiOlwiI2NkODUzZlwiLFwicGlua1wiOlwiI2ZmYzBjYlwiLFwicGx1bVwiOlwiI2RkYTBkZFwiLFwicG93ZGVyYmx1ZVwiOlwiI2IwZTBlNlwiLFwicm9zeWJyb3duXCI6XCIjYmM4ZjhmXCIsXCJyb3lhbGJsdWVcIjpcIiM0MTY5ZTFcIixcInNhZGRsZWJyb3duXCI6XCIjOGI0NTEzXCIsXCJzYWxtb25cIjpcIiNmYTgwNzJcIixcInNhbmR5YnJvd25cIjpcIiNmNGE0NjBcIixcInNlYWdyZWVuXCI6XCIjMmU4YjU3XCIsXCJzZWFzaGVsbFwiOlwiI2ZmZjVlZVwiLFwic2llbm5hXCI6XCIjYTA1MjJkXCIsXCJza3libHVlXCI6XCIjODdjZWViXCIsXCJzbGF0ZWJsdWVcIjpcIiM2YTVhY2RcIixcInNsYXRlZ3JheVwiOlwiIzcwODA5MFwiLFwic2xhdGVncmV5XCI6XCIjNzA4MDkwXCIsXCJzbm93XCI6XCIjZmZmYWZhXCIsXCJzcHJpbmdncmVlblwiOlwiIzAwZmY3ZlwiLFwic3RlZWxibHVlXCI6XCIjNDY4MmI0XCIsXCJ0YW5cIjpcIiNkMmI0OGNcIixcInRoaXN0bGVcIjpcIiNkOGJmZDhcIixcInRvbWF0b1wiOlwiI2ZmNjM0N1wiLFwidHJhbnNwYXJlbnRcIjpcIiMwMDAwXCIsXCJ0dXJxdW9pc2VcIjpcIiM0MGUwZDBcIixcInZpb2xldFwiOlwiI2VlODJlZVwiLFwid2hlYXRcIjpcIiNmNWRlYjNcIixcIndoaXRlc21va2VcIjpcIiNmNWY1ZjVcIixcInllbGxvd2dyZWVuXCI6XCIjOWFjZDMyXCIsXCJyZWJlY2NhcHVycGxlXCI6XCIjNjYzMzk5XCJ9IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCIpOzsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTs7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIik7OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNoYWxrXCIpOzsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmc1wiKTs7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnMvcHJvbWlzZXNcIik7OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm9zXCIpOzsiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/coffee/api/lornpug/lornpug.js b/coffee/api/lornpug/lornpug.js new file mode 100644 index 0000000..e4e984b --- /dev/null +++ b/coffee/api/lornpug/lornpug.js @@ -0,0 +1,1445 @@ +#!/usr/bin/env node +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["mlib"] = factory(); + else + root["mlib"] = factory(); +})(global, function() { +return (() => { +var exports = {}; +exports.id = "lornpug"; +exports.ids = ["lornpug"]; +exports.modules = { + +/***/ "./src/lornpug.cs": +/*!************************!* + !*** ./src/lornpug.cs ***! + \************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +var _chalk = _interopRequireDefault(__webpack_require__(/*! chalk */ "chalk")); + +var _lornpughelp = _interopRequireDefault(__webpack_require__(/*! ./lornpughelp.cs */ "./src/lornpughelp.cs")); + +var arg, cmds, dodir, dolp, files, i, iscmd, isdefault, isdir, isio, islp, j, k, len, len1, len2, x; +iscmd = _lornpughelp["default"].iscmd; +dolp = _lornpughelp["default"].dolp; +dodir = _lornpughelp["default"].dodir; +// ------------------init--------------------- +arg = process.argv.slice(2); +console.log('环境和参数信息:'); +console.table([{ + '键: ': 'process.cwd()', + '值: ': process.cwd() +}, { + '键: ': '__dirname', + '值: ': __dirname +}, { + '键: ': 'process.argv', + '值: ': process.argv +}, { + '键: ': '真参数', + '值: ': arg +}]); +cmds = []; // 传入的参数的命令数组 + +files = []; // 传入的文件数组 + +for (i = 0, len = arg.length; i < len; i++) { + x = arg[i]; + + if (iscmd(x)) { + cmds.push(x); + } else { + files.push(x); + } +} + +console.log(_chalk["default"].blueBright("\u547D\u4EE4: ".concat(cmds, " "))); +console.log(_chalk["default"].yellowBright("\u6587\u4EF6: ".concat(files, " "))); // 处理命令 + +isdefault = cmds.length === 0; + +for (j = 0, len1 = cmds.length; j < len1; j++) { + x = cmds[j]; + isdir = /^--dir$/.test(x); + isio = /^--io$/.test(x); + islp = /^--lp$/.test(x); +} // 根据命令, 处理文件, 忽略node_module, 未来根据.gitignore忽略 + + +if (isdefault) { + // 默认是跑测试文件 + console.log(_chalk["default"].cyanBright('默认行为:'), '测试结果: '); +} else if (islp) { + // 修改.zshrc文件, 增加快捷方式 + dolp(0); +} else if (isdir) { + // 建测试目录, 初始化测试文件 + if (files.length === 0) { + dodir('.'); //如果没有任何文件参数, 那么就是从本地搞深度遍历 + } else { + for (k = 0, len2 = files.length; k < len2; k++) { + x = files[k]; + dodir(x); + } + } + + console.log(_chalk["default"].cyanBright('初始化'), '初始化成功: '); +} else if (isio) { + // 增加测试文件 + console.log(_chalk["default"].cyanBright('初始化'), '初始化成功: '); +} else { + console.log(_chalk["default"].redBright('抱歉啊: 不知道你想干啥')); +} +/* +try { + new Function('var {a} = {a: 1}')(); +} catch(error) { + console.error('Your JavaScript runtime does not support some features used by the coffee command. Please use Node 6 or later.'); + process.exit(1); +} + +var path=require('path'); +var fs=require('fs'); + +var potentialPaths=[ + path.join(process.cwd(),), + path.join(process.cwd(),), + path.join(process.cwd(),), + path.join(__dirname,'../lib/c') +]; + +for(var i=0,len=potentialPaths.length;i') + .option('-u, --username ','The user to authenticate as') + .option('-p, --password ','The users password') + .action(function(file) { + console.log('user: %s pass: %s file: %s', + program.username,program.password,file); + }) + .parse(process.argv); +*/ + +/***/ }), + +/***/ "./src/lornpughelp.cs": +/*!****************************!* + !*** ./src/lornpughelp.cs ***! + \****************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.dodir = exports.dolp = exports.iscmd = void 0; + +var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator")); + +var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator")); + +var _chalk = _interopRequireDefault(__webpack_require__(/*! chalk */ "chalk")); + +var _mlib = __webpack_require__(/*! mlib */ "./src/mlib/src/index.cs"); + +var dir1file; + +// -----------------pure function----------------- +// 判断是否有命令参数(--开始的命令参数), 没有--的都是文件 +var iscmd = function iscmd(x) { + return /^--/.test(x); +}; // 处理lp命令 + + +exports.iscmd = iscmd; + +var dolp = /*#__PURE__*/function () { + var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { + var ok, reg, str; + return _regenerator["default"].wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + str = "# \u8214\u72D7\u9879\u76EE\nalias lp=\"lpg\""; + reg = /alias\s*lp="lpg"/; + _context.next = 4; + return _mlib.file.uniqueadd({ + reg: reg, + str: str, + path: '~/.zshrc' + }); + + case 4: + ok = _context.sent; + + if (!ok) { + _context.next = 13; + break; + } + + console.log('命令设置为lp', _chalk["default"].greenBright('成功: '), '需要刷新配置才会生效, 推荐使用快捷重启命令:'); + console.log(_chalk["default"].greenBright('exec zsh'), _chalk["default"].yellow('# 重启当前terminal')); + console.log('如果不能重启terminal: '); + console.log(_chalk["default"].greenBright('source ~/.zshrc'), _chalk["default"].yellow('# 导入配置文件方法一')); + return _context.abrupt("return", console.log(_chalk["default"].greenBright('. ~/.zshrc'), _chalk["default"].yellow('# 导入配置文件方法二'))); + + case 13: + return _context.abrupt("return", console.log(_chalk["default"].redBright('没有'), '进行设置, 可能是配置文件已经存在', _chalk["default"].yellow('请手工检查文件: '), '~/.zshrc')); + + case 14: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function dolp() { + return _ref.apply(this, arguments); + }; +}(); // 处理一个cs或者coffee的初始化 + + +exports.dolp = dolp; + +dir1file = /*#__PURE__*/function () { + var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(path) { + var p; + return _regenerator["default"].wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + p = path + '.lp'; // 判断对应目录是否存在. + + if (!_mlib.file.exist(p)) { + _context2.next = 3; + break; + } + + return _context2.abrupt("return"); + + case 3: + _context2.next = 5; + return _mlib.file.mkdir(p); + + case 5: + _context2.next = 7; + return _mlib.file.cover({ + path: p + '/aaa.0i.cson', + str: '' + }); + + case 7: + _context2.next = 9; + return _mlib.file.cover({ + path: p + '/aaa.0o.cson', + str: '' + }); + + case 9: + _context2.next = 11; + return _mlib.file.cover({ + path: p + '/cto.cson', + str: '' + }); + + case 11: + return _context2.abrupt("return", _context2.sent); + + case 12: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function dir1file(_x) { + return _ref2.apply(this, arguments); + }; +}(); // 处理初始化测试dir + + +var dodir = /*#__PURE__*/function () { + var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(path) { + var i, len, ref, stat, x; + return _regenerator["default"].wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + _context3.next = 2; + return _mlib.file.filetype(path); + + case 2: + stat = _context3.sent; + + if (!stat.isfile) { + _context3.next = 7; + break; + } + + if (/\.coffee$|\.cs$/.test(path)) { + _context3.next = 6; + break; + } + + return _context3.abrupt("return"); + + case 6: + dir1file(path); + + case 7: + if (!stat.isdir) { + _context3.next = 14; + break; + } + + if (!/\./.test(path)) { + _context3.next = 10; + break; + } + + return _context3.abrupt("return"); + + case 10: + _context3.next = 12; + return _mlib.file.readir(path); + + case 12: + ref = _context3.sent; + + // 除了file和dir可能还有其他情况, 比如符号链接 + for (i = 0, len = ref.length; i < len; i++) { + x = ref[i]; // 读取目录, 逐项处理 + + dodir(x); + } + + case 14: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + + return function dodir(_x2) { + return _ref3.apply(this, arguments); + }; +}(); + +exports.dodir = dodir; +var _default = { + iscmd: iscmd, + dolp: dolp, + dodir: dodir +}; +exports.default = _default; +dodir('.'); + +/***/ }), + +/***/ "./src/mlib/src/color.cs": +/*!*******************************!* + !*** ./src/mlib/src/color.cs ***! + \*******************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.samergbstr = exports.getdark = exports.getlight = exports.lrgb = exports.lstr = exports.rgbok = void 0; + +var _colorname = _interopRequireDefault(__webpack_require__(/*! ./colorname.cson */ "./src/mlib/src/colorname.cson")); + +/* + * 关于颜色的库, 这个库会被重写, 因为hsl的亮度判断可以认为是错的. 所以可以保留hsl相关的函数, 但是, 实际应用函数需要重写. + * + */ + +/** + * 拿到视觉暗度 + * 用来判断颜色是否够暗 + * + */ + +/** + * 拿到视觉亮度 + * 用来判断颜色是否够亮 + * 未来用荧光体发光能量来计算数值. + */ + +/* + * 从16进制到rgb + * #fc2 #fc29 #fc292923 #fc2929, 3,4,6,8都有可能 + */ + +/** + * lightrgb核心亮度处理函数 + * * 亮度处理逻辑 t=max(100-g, 200-r), t+r, t+g, t+b + * * 暗度处理逻辑 t=max(g-60, r-100, b-150), r-t, g-t, b-t + * 废弃return false并不合理 + */ + +/** + * 从str到调亮的颜色str + * 这里处理一个style string的亮度 + * 纯函数 + * str: 一个颜色字符串 + * isback: 是否为背景 + * 废弃 return false 并不合理 + */ + +/* +* 从rgb到str +* */ + +/** +* 3种情况 +* 1. rgb情况: 从"rgb(154, 154, 0)"转化为: {r:154,g:154,b:0,} +* "rgba(0, 0, 0, 0)" 还需兼容此种情况 +* 2. 16进制情况: #fc2 #fc29 #fc292923 #fc2929 +* 3. 颜色名: white, black, organge +* */ +var darkcolor, getrgbdark, getrgblight, hex2rgb, lightcolor, lightrgb, lightstr, mlight, rgb2str, str2rgb, test; +darkcolor = 'rgba(44,44,44,1)'; //dark的基础颜色 + +lightcolor = 'rgba(200,200,200,1)'; +/** +* ---------------------单独处理前景或者背景, 配合darkcss的思路--------------------------- +* 亮度判断逻辑 g>100, r>200, 或者g+r>300 +* 亮度处理逻辑 t=max(100-g, 200-r), t+r, t+g, t+b +* +* 暗度判断逻辑 g<60 r<100 b<150 +* 暗度处理逻辑 t=max(g-60, r-100, b-150), r-t, g-t, b-t +* + */ + +/** +* rgbok +* 判断颜色是否需要处理 +* * 亮度判断逻辑 g>100, r>200, 或者g+r>300 +* * 暗度判断逻辑 g<60 r<100 b<150 +* 参数 +* rgb:{r,g,b} +* isback: 是否为背景图片 +* 返回值 +* true: 不需要处理 +* false: 需要处理 + */ + +var rgbok = function rgbok(_ref) { + var rgb = _ref.rgb, + _ref$isback = _ref.isback, + isback = _ref$isback === void 0 ? true : _ref$isback; + var b, g, r; + r = rgb.r; + g = rgb.g; + b = rgb.b; + + if (isback) { + return g < 60 && r < 100 && b < 150; + } else { + return r + g > 300; + } +}; //暗度判断 +//光明模式, 如果亮度<0.7则需要处理, 否则就不需要处理 + +/** + * 从str到调亮的颜色str + * 这里处理一个style string的亮度 + * 纯函数 + * str: 一个颜色字符串 + * isback: 是否为背景 + * 废弃 return false 并不合理 + */ + + +exports.rgbok = rgbok; + +var lstr = function lstr(_ref2) { + var str = _ref2.str, + _ref2$isback = _ref2.isback, + isback = _ref2$isback === void 0 ? true : _ref2$isback; + var l; + + if (!str) { + return false; + } + + if (str === "initial") { + //如果是initial, 那么直接用我的值. + return isback ? darkcolor : lightcolor; + } + + if (/var\(--/.test(str)) { + //fixme 暂时在这里忽略css var #todo + return isback ? darkcolor : lightcolor; + } + + l = lrgb({ + rgb: str2rgb(str), + isback: isback + }); + return rgb2str(l); +}; +/** + * lightrgb核心亮度处理函数 + * * 亮度处理逻辑 t=max(100-g, 200-r), t+r, t+g, t+b + * * 暗度处理逻辑 t=max(g-60, r-100, b-150), r-t, g-t, b-t + * 废弃return false并不合理 + */ + + +exports.lstr = lstr; + +var lrgb = function lrgb(_ref3) { + var rgb = _ref3.rgb, + _ref3$isback = _ref3.isback, + isback = _ref3$isback === void 0 ? true : _ref3$isback; + var b, g, r, t; + + if (rgbok({ + rgb: rgb, + isback: isback + })) { + return rgb; + } + + r = rgb.r; + g = rgb.g; + b = rgb.b; + + if (isback) { + //处理暗黑背景 + t = Math.max(g - 60, r - 100, b - 150); + r -= t; + g -= t; + b -= t; //处理明亮前景 + } else { + t = Math.max(100 - g, 200 - r); + r += t; + g += t; + b += t; + } + + return { + r: r, + g: g, + b: b + }; +}; + +exports.lrgb = lrgb; + +lightstr = function lightstr(_ref4) { + var str = _ref4.str, + _ref4$isback = _ref4.isback, + isback = _ref4$isback === void 0 ? true : _ref4$isback; + var l; + + if (!str) { + return false; + } + + if (str === "initial") { + //如果是initial, 那么直接用我的值. + return isback ? darkcolor : lightcolor; + } + + if (/var\(--/.test(str)) { + //fixme 暂时在这里忽略css var #todo + return isback ? darkcolor : lightcolor; + } + + l = lightrgb({ + rgb: str2rgb(str), + isback: isback + }); + + if (l) { + return rgb2str(l); + } else { + return false; + } +}; + +lightrgb = function lightrgb(_ref5) { + var rgb = _ref5.rgb, + _ref5$isback = _ref5.isback, + isback = _ref5$isback === void 0 ? true : _ref5$isback; + var b, g, r, t; + + if (rgbok({ + rgb: rgb, + isback: isback + })) { + return false; + } + + r = rgb.r; + g = rgb.g; + b = rgb.b; + + if (isback) { + //处理暗黑背景 + t = Math.max(g - 60, r - 100, b - 150); + r -= t; + g -= t; + b -= t; //处理明亮前景 + } else { + t = Math.max(100 - g, 200 - r); + r += t; + g += t; + b += t; + } + + return { + r: r, + g: g, + b: b + }; +}; +/** + * --------------对比度逻辑, 配合darkstyle----------------- + * 这里的计算未必合适. + */ + +/** +* 从str到亮度 + */ + + +var getlight = function getlight(str) { + return getrgblight(str2rgb(str)); +}; + +exports.getlight = getlight; + +var getdark = function getdark(str) { + return getrgbdark(str2rgb(str)); +}; + +exports.getdark = getdark; + +getrgblight = function getrgblight(_ref6) { + var r = _ref6.r, + g = _ref6.g, + b = _ref6.b; + r = r * 1.2; + g = g * 1.7; + return mlight({ + r: r, + g: g, + b: b + }).light; +}; + +getrgbdark = function getrgbdark(_ref7) { + var r = _ref7.r, + g = _ref7.g, + b = _ref7.b; + r = r * 1.3; + g = g * 1.2; + return mlight({ + r: r, + g: g, + b: b + }).light; +}; + +mlight = function mlight(_ref8) { + var r = _ref8.r, + g = _ref8.g, + b = _ref8.b; + var b1, b2, b3; + + if (r > g) { + b1 = r; + b2 = g; + } else { + b1 = g; + b2 = r; + } + + if (b < b2) { + b3 = b; + } else if (b < b1) { + b3 = b2; + b2 = b; + } else { + b3 = b2; + b2 = b1; + b1 = b; + } + + return { + // 这里很不严谨, 亮度的心理阈限测量或许能让这个计算更精确. + light: (b1 + b2 / 6) * 2 / 3, + max: [b1, b2, b3] + }; +}; +/* + * 基础工具函数------------------------------------------------------- + * 判断两个rgbstr实际相等 + */ + + +var samergbstr = function samergbstr(rgbstr1, rgbstr2) { + var b1, b2, g1, g2, r1, r2; + + var _str2rgb = str2rgb(rgbstr1); + + r1 = _str2rgb.r; + g1 = _str2rgb.g; + b1 = _str2rgb.b; + + var _str2rgb2 = str2rgb(rgbstr2); + + r2 = _str2rgb2.r; + g2 = _str2rgb2.g; + b2 = _str2rgb2.b; + return r1 === r2 && g1 === g2 && b1 === b2; +}; + +exports.samergbstr = samergbstr; + +str2rgb = function str2rgb(str) { + var a, c, reg; //"rgb(154, 154, 0)" + + reg = /rgba?\(([0-9]{1,3}), ?([0-9]{1,3}), ?([0-9]{1,3})(, ?([0-9.%]+))?\)/i; + c = reg.exec(str); //16进制颜色 + + if (c == null) { + c = hex2rgb(str); + } //再判断名字颜色: + + + if (c == null) { + c = _colorname["default"][str] && hex2rgb(hex); + } + + if (c == null) { + return false; + } //透明度 + + + a = c[5] != null ? c[5] : 1; + return { + r: +c[1], + g: +c[2], + b: +c[3], + a: a //这里用+是为了把字符串转为数字, 不然会发生很隐蔽的bug. + + }; +}; + +rgb2str = function rgb2str(_ref9) { + var r = _ref9.r, + g = _ref9.g, + b = _ref9.b, + _ref9$a = _ref9.a, + a = _ref9$a === void 0 ? 1 : _ref9$a; + + if (a > 0.99) { + return "rgb(" + r + "," + g + "," + b + ")"; + } else { + return "rgba(" + r + "," + g + "," + b + "," + a + ")"; + } +}; + +hex2rgb = function hex2rgb(str) { + var c, reg, x, y; + reg = /#([^#]*)/i; //判断#62fa89这种类似方式的颜色值 + + c = reg.exec(str); + + if ((c != null ? c[1] : void 0) == null) { + return false; + } + + x = c[1]; + y = []; + + switch (x.length) { + case 3: + y[1] = parseInt('' + x[0] + x[0], 16); + y[2] = parseInt('' + x[1] + x[1], 16); + y[3] = parseInt('' + x[2] + x[2], 16); + break; + + case 4: + //y[1]=parseInt(x[0],16); /20201028修正错误, 这个会把fff转化为 r15g15b15, 其实应该是r255g255b255 + y[1] = parseInt('' + x[0] + x[0], 16); + y[2] = parseInt('' + x[1] + x[1], 16); + y[3] = parseInt('' + x[2] + x[2], 16); + y[5] = parseInt(x[3], 16) / 255; + break; + + case 6: + y[1] = parseInt('' + x[0] + x[1], 16); + y[2] = parseInt('' + x[2] + x[3], 16); + y[3] = parseInt('' + x[4] + x[5], 16); + break; + + case 8: + y[1] = parseInt('' + x[0] + x[1], 16); + y[2] = parseInt('' + x[2] + x[3], 16); + y[3] = parseInt('' + x[4] + x[5], 16); + y[5] = parseInt('' + x[6] + x[7], 16) / 255; + break; + + default: + //不满足上面四个情况, 直接返回false + return false; + } + + return y; +}; //console.log(str2rgb('white')); #test + + +test = function test() { + var result; + result = window.luoclr.lightstr({ + str: 'white', + isback: true + }); + return console.log({ + result: result + }); +}; //lightstr +//lightrgb + + +var _default = { + lstr: lstr, + lrgb: lrgb, + getlight: getlight, + getdark: getdark, + samergbstr: samergbstr +}; +exports.default = _default; + +/***/ }), + +/***/ "./src/mlib/src/file.cs": +/*!******************************!* + !*** ./src/mlib/src/file.cs ***! + \******************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.allfile = exports.readfile = exports.readir = exports.newdir = exports.mkdir = exports.exist = exports.filetype = exports.uniqueadd = exports.cover = exports.realpath = exports.savefile = void 0; + +var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator")); + +var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator")); + +var _promises = _interopRequireDefault(__webpack_require__(/*! fs/promises */ "fs/promises")); + +var _fs = _interopRequireDefault(__webpack_require__(/*! fs */ "fs")); + +var _os = _interopRequireDefault(__webpack_require__(/*! os */ "os")); + +//import {log} from './log.js' +var home, log; +home = _os["default"].homedir(); +log = console.log; // todo 保存文件 + +var savefile = function savefile(_ref) { + var json = _ref.json, + _ref$filename = _ref.filename, + filename = _ref$filename === void 0 ? "temptest.txt" : _ref$filename; + return _promises["default"].writeFile(filename, JSON.stringify(json), function (err) { + log('文件写入', filename); + + if (err) { + return log(err); + } + }); +}; // 拿到真正的path + + +exports.savefile = savefile; + +var realpath = function realpath(path) { + // home文件夹~, node不认, 要调整为os.homedir + if (/^~/.test(path)) { + return path.replace(/^~/, home); + } else { + return path; + } +}; // 加文件内容, 覆盖式 + + +exports.realpath = realpath; + +var cover = /*#__PURE__*/function () { + var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(_ref2) { + var path, str, _ref2$options, options; + + return _regenerator["default"].wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + path = _ref2.path, str = _ref2.str, _ref2$options = _ref2.options, options = _ref2$options === void 0 ? { + encoding: 'utf8' + } : _ref2$options; + _context.next = 3; + return _promises["default"].writeFile(realpath(path), str, options); + + case 3: + return _context.abrupt("return", true); + + case 4: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function cover(_x) { + return _ref3.apply(this, arguments); + }; +}(); // 追加文件内容, 保证追加内容不重复 + + +exports.cover = cover; + +var uniqueadd = /*#__PURE__*/function () { + var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref4) { + var path, reg, str, _ref4$options, options, fstr, rpath; + + return _regenerator["default"].wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + path = _ref4.path, reg = _ref4.reg, str = _ref4.str, _ref4$options = _ref4.options, options = _ref4$options === void 0 ? { + encoding: 'utf8' + } : _ref4$options; + // home文件夹~, node不认, 要调整为os.homedir + rpath = realpath(path); // 读取文件 + + _context2.next = 4; + return _promises["default"].readFile(rpath, options); + + case 4: + fstr = _context2.sent; + + if (!reg.test(fstr)) { + _context2.next = 7; + break; + } + + return _context2.abrupt("return", false); + + case 7: + _context2.next = 9; + return _promises["default"].appendFile(rpath, str != null ? str : reg.source, options); + + case 9: + return _context2.abrupt("return", true); + + case 10: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function uniqueadd(_x2) { + return _ref5.apply(this, arguments); + }; +}(); // 判断是文件/目录 + + +exports.uniqueadd = uniqueadd; + +var filetype = /*#__PURE__*/function () { + var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(path) { + var stat; + return _regenerator["default"].wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + _context3.next = 2; + return _promises["default"].lstat(realpath(path)); + + case 2: + stat = _context3.sent; + return _context3.abrupt("return", { + isfile: stat.isFile(), + isdir: stat.isDirectory() + }); + + case 4: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + + return function filetype(_x3) { + return _ref6.apply(this, arguments); + }; +}(); // 判断文件/目录是否存在 + + +exports.filetype = filetype; + +var exist = function exist(path) { + return _fs["default"].existsSync(realpath(path)); +}; // 建一个目录 + + +exports.exist = exist; + +var mkdir = /*#__PURE__*/function () { + var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(path) { + return _regenerator["default"].wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + _context4.next = 2; + return _promises["default"].mkdir(realpath(path), { + recursive: true + }); + + case 2: + return _context4.abrupt("return", _context4.sent); + + case 3: + case "end": + return _context4.stop(); + } + } + }, _callee4); + })); + + return function mkdir(_x4) { + return _ref7.apply(this, arguments); + }; +}(); // 如果不存在就建一个目录 + + +exports.mkdir = mkdir; + +var newdir = /*#__PURE__*/function () { + var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(path) { + return _regenerator["default"].wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + if (!exist(path)) { + _context5.next = 2; + break; + } + + return _context5.abrupt("return", false); + + case 2: + _context5.next = 4; + return _promises["default"].mkdir(realpath(path)); + + case 4: + return _context5.abrupt("return", _context5.sent); + + case 5: + case "end": + return _context5.stop(); + } + } + }, _callee5); + })); + + return function newdir(_x5) { + return _ref8.apply(this, arguments); + }; +}(); // 读取目录 + + +exports.newdir = newdir; + +var readir = /*#__PURE__*/function () { + var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(path) { + return _regenerator["default"].wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + _context6.next = 2; + return _promises["default"].readdir(realpath(path)); + + case 2: + return _context6.abrupt("return", _context6.sent); + + case 3: + case "end": + return _context6.stop(); + } + } + }, _callee6); + })); + + return function readir(_x6) { + return _ref9.apply(this, arguments); + }; +}(); // 读取文件 + + +exports.readir = readir; + +var readfile = /*#__PURE__*/function () { + var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(path) { + var fstr; + return _regenerator["default"].wrap(function _callee7$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + _context7.next = 2; + return _promises["default"].readFile(realpath(path), { + encoding: 'utf8' + }); + + case 2: + return _context7.abrupt("return", fstr = _context7.sent); + + case 3: + case "end": + return _context7.stop(); + } + } + }, _callee7); + })); + + return function readfile(_x7) { + return _ref10.apply(this, arguments); + }; +}(); // todo 读取目录中所有问题, 深度遍历 + + +exports.readfile = readfile; + +var allfile = function allfile(_ref11) { + var path = _ref11.path, + _ref11$reg = _ref11.reg, + reg = _ref11$reg === void 0 ? false : _ref11$reg, + _ref11$options = _ref11.options, + options = _ref11$options === void 0 ? { + encoding: 'utf8' + } : _ref11$options; + // 如果没传reg, 那么就是要所有文件 + return readdir(path, options); +}; + +exports.allfile = allfile; +var _default = { + savefile: savefile, + cover: cover, + uniqueadd: uniqueadd, + filetype: filetype, + exist: exist, + mkdir: mkdir, + readir: readir, + readfile: readfile, + allfile: allfile +}; +exports.default = _default; + +/***/ }), + +/***/ "./src/mlib/src/index.cs": +/*!*******************************!* + !*** ./src/mlib/src/index.cs ***! + \*******************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +Object.defineProperty(exports, "color", ({ + enumerable: true, + get: function get() { + return _color["default"]; + } +})); +Object.defineProperty(exports, "random", ({ + enumerable: true, + get: function get() { + return _random["default"]; + } +})); +Object.defineProperty(exports, "time", ({ + enumerable: true, + get: function get() { + return _time["default"]; + } +})); +Object.defineProperty(exports, "file", ({ + enumerable: true, + get: function get() { + return _file["default"]; + } +})); + +var _color = _interopRequireDefault(__webpack_require__(/*! ./color.cs */ "./src/mlib/src/color.cs")); + +var _random = _interopRequireDefault(__webpack_require__(/*! ./random.cs */ "./src/mlib/src/random.cs")); + +var _time = _interopRequireDefault(__webpack_require__(/*! ./time.cs */ "./src/mlib/src/time.cs")); + +var _file = _interopRequireDefault(__webpack_require__(/*! ./file.cs */ "./src/mlib/src/file.cs")); + +/***/ }), + +/***/ "./src/mlib/src/random.cs": +/*!********************************!* + !*** ./src/mlib/src/random.cs ***! + \********************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.randomlight = exports.randomcolor = exports.randomember = exports.randomint = void 0; + +var _color = __webpack_require__(/*! ./color.cs */ "./src/mlib/src/color.cs"); + +/* +* 拿到整数版本的随机数 +* 因为random不包含1, 因此, 这个随机数也不包含max +* 因此传入数组的长度正好合适作为数组的索引 + */ +var randomint = function randomint(max) { + return Math.random() * max >> 0; +}; +/* +数组中取一个随机element +*/ + + +exports.randomint = randomint; + +var randomember = function randomember(p) { + return p[randomint(p.length)]; +}; // 随机一个颜色 + + +exports.randomember = randomember; + +var randomcolor = function randomcolor() { + return "rgb(" + randomint(256) + "," + randomint(256) + "," + randomint(256) + ")"; +}; // 随机一个明亮颜色 + + +exports.randomcolor = randomcolor; + +var randomlight = function randomlight() { + return (0, _color.lstr)({ + str: randomcolor(0), + isback: false + }); +}; + +exports.randomlight = randomlight; +var _default = { + randomint: randomint, + randomember: randomember, + randomcolor: randomcolor, + randomlight: randomlight +}; +exports.default = _default; + +/***/ }), + +/***/ "./src/mlib/src/time.cs": +/*!******************************!* + !*** ./src/mlib/src/time.cs ***! + \******************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.gethhmmss = exports.gethhmm = exports.sleep = void 0; + +var sleep = function sleep(ms) { + return new Promise(function (resolve) { + return setTimeout(resolve, ms); + }); +}; + +exports.sleep = sleep; + +var gethhmm = function gethhmm() { + var timestamp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Date.now(); + var t; + t = new Date(+timestamp); + return t.getHours() + ':' + t.getMinutes(); +}; + +exports.gethhmm = gethhmm; + +var gethhmmss = function gethhmmss() { + var timestamp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Date.now(); + var t; + t = new Date(+timestamp); + return t.getHours() + ':' + t.getMinutes() + ':' + t.getSeconds(); +}; + +exports.gethhmmss = gethhmmss; +var _default = { + sleep: sleep, + gethhmm: gethhmm, + gethhmmss: gethhmmss +}; +exports.default = _default; + +/***/ }), + +/***/ "./src/mlib/src/colorname.cson": +/*!*************************************!* + !*** ./src/mlib/src/colorname.cson ***! + \*************************************/ +/***/ ((module) => { + +module.exports = {"black":"#000","silver":"#c0c0c0","gray":"#808080","white":"#fff","maroon":"#800000","red":"#ff0000","purple":"#800080","fuchsia":"#ff00ff","green":"#008000","lime":"#00ff00","olive":"#808000","yellow":"#ffff00","navy":"#000080","blue":"#0000ff","teal":"#008080","aqua":"#00ffff","orange":"#ffa500","aliceblue":"#f0f8ff","antiquewhite":"#faebd7","aquamarine":"#7fffd4","azure":"#f0ffff","beige":"#f5f5dc","bisque":"#ffe4c4","blanchedalmond":"#ffebcd","blueviolet":"#8a2be2","brown":"#a52a2a","burlywood":"#deb887","cadetblue":"#5f9ea0","chartreuse":"#7fff00","chocolate":"#d2691e","coral":"#ff7f50","cornflowerblue":"#6495ed","cornsilk":"#fff8dc","crimson":"#dc143c","cyan":"#00ffff","darkblue":"#00008b","darkcyan":"#008b8b","darkgoldenrod":"#b8860b","darkgray":"#a9a9a9","darkgreen":"#006400","darkgrey":"#a9a9a9","darkkhaki":"#bdb76b","darkmagenta":"#8b008b","darkolivegreen":"#556b2f","darkorange":"#ff8c00","darkorchid":"#9932cc","darkred":"#8b0000","darksalmon":"#e9967a","darkseagreen":"#8fbc8f","darkslateblue":"#483d8b","darkslategray":"#2f4f4f","darkslategrey":"#2f4f4f","darkturquoise":"#00ced1","darkviolet":"#9400d3","deeppink":"#ff1493","deepskyblue":"#00bfff","dimgray":"#696969","dimgrey":"#696969","dodgerblue":"#1e90ff","firebrick":"#b22222","floralwhite":"#fffaf0","forestgreen":"#228b22","gainsboro":"#dcdcdc","ghostwhite":"#f8f8ff","gold":"#ffd700","goldenrod":"#daa520","greenyellow":"#adff2f","grey":"#808080","honeydew":"#f0fff0","hotpink":"#ff69b4","indianred":"#cd5c5c","indigo":"#4b0082","ivory":"#fffff0","khaki":"#f0e68c","lavender":"#e6e6fa","lavenderblush":"#fff0f5","lawngreen":"#7cfc00","lemonchiffon":"#fffacd","lightblue":"#add8e6","lightcoral":"#f08080","lightcyan":"#e0ffff","lightgoldenrodyellow":"#fafad2","lightgray":"#d3d3d3","lightgreen":"#90ee90","lightgrey":"#d3d3d3","lightpink":"#ffb6c1","lightsalmon":"#ffa07a","lightseagreen":"#20b2aa","lightskyblue":"#87cefa","lightslategray":"#778899","lightslategrey":"#778899","lightsteelblue":"#b0c4de","lightyellow":"#ffffe0","limegreen":"#32cd32","linen":"#faf0e6","magenta":"#ff00ff","mediumaquamarine":"#66cdaa","mediumblue":"#0000cd","mediumorchid":"#ba55d3","mediumpurple":"#9370db","mediumseagreen":"#3cb371","mediumslateblue":"#7b68ee","mediumspringgreen":"#00fa9a","mediumturquoise":"#48d1cc","mediumvioletred":"#c71585","midnightblue":"#191970","mintcream":"#f5fffa","mistyrose":"#ffe4e1","moccasin":"#ffe4b5","navajowhite":"#ffdead","oldlace":"#fdf5e6","olivedrab":"#6b8e23","orangered":"#ff4500","orchid":"#da70d6","palegoldenrod":"#eee8aa","palegreen":"#98fb98","paleturquoise":"#afeeee","palevioletred":"#db7093","papayawhip":"#ffefd5","peachpuff":"#ffdab9","peru":"#cd853f","pink":"#ffc0cb","plum":"#dda0dd","powderblue":"#b0e0e6","rosybrown":"#bc8f8f","royalblue":"#4169e1","saddlebrown":"#8b4513","salmon":"#fa8072","sandybrown":"#f4a460","seagreen":"#2e8b57","seashell":"#fff5ee","sienna":"#a0522d","skyblue":"#87ceeb","slateblue":"#6a5acd","slategray":"#708090","slategrey":"#708090","snow":"#fffafa","springgreen":"#00ff7f","steelblue":"#4682b4","tan":"#d2b48c","thistle":"#d8bfd8","tomato":"#ff6347","transparent":"#0000","turquoise":"#40e0d0","violet":"#ee82ee","wheat":"#f5deb3","whitesmoke":"#f5f5f5","yellowgreen":"#9acd32","rebeccapurple":"#663399"} + +/***/ }), + +/***/ "@babel/runtime/helpers/asyncToGenerator": +/*!**********************************************************!* + !*** external "@babel/runtime/helpers/asyncToGenerator" ***! + \**********************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("@babel/runtime/helpers/asyncToGenerator");; + +/***/ }), + +/***/ "@babel/runtime/helpers/interopRequireDefault": +/*!***************************************************************!* + !*** external "@babel/runtime/helpers/interopRequireDefault" ***! + \***************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("@babel/runtime/helpers/interopRequireDefault");; + +/***/ }), + +/***/ "@babel/runtime/regenerator": +/*!*********************************************!* + !*** external "@babel/runtime/regenerator" ***! + \*********************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("@babel/runtime/regenerator");; + +/***/ }), + +/***/ "chalk": +/*!************************!* + !*** external "chalk" ***! + \************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("chalk");; + +/***/ }), + +/***/ "fs": +/*!*********************!* + !*** external "fs" ***! + \*********************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("fs");; + +/***/ }), + +/***/ "fs/promises": +/*!******************************!* + !*** external "fs/promises" ***! + \******************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("fs/promises");; + +/***/ }), + +/***/ "os": +/*!*********************!* + !*** external "os" ***! + \*********************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("os");; + +/***/ }) + +}; +; + +// load runtime +var __webpack_require__ = require("../runtime/runtime.js"); +__webpack_require__.C(exports); +return __webpack_require__.X([], "./src/lornpug.cs"); +})(); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tbGliL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9tbGliLy4vc3JjL2xvcm5wdWcuY3MiLCJ3ZWJwYWNrOi8vbWxpYi8uL3NyYy9sb3JucHVnaGVscC5jcyIsIndlYnBhY2s6Ly9tbGliLy4vc3JjL21saWIvc3JjL2NvbG9yLmNzIiwid2VicGFjazovL21saWIvLi9zcmMvbWxpYi9zcmMvZmlsZS5jcyIsIndlYnBhY2s6Ly9tbGliLy4vc3JjL21saWIvc3JjL2luZGV4LmNzIiwid2VicGFjazovL21saWIvLi9zcmMvbWxpYi9zcmMvcmFuZG9tLmNzIiwid2VicGFjazovL21saWIvLi9zcmMvbWxpYi9zcmMvdGltZS5jcyIsIndlYnBhY2s6Ly9tbGliLy4vc3JjL21saWIvc3JjL2NvbG9ybmFtZS5jc29uIiwid2VicGFjazovL21saWIvZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIiIsIndlYnBhY2s6Ly9tbGliL2V4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIiIsIndlYnBhY2s6Ly9tbGliL2V4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIiIsIndlYnBhY2s6Ly9tbGliL2V4dGVybmFsIFwiY2hhbGtcIiIsIndlYnBhY2s6Ly9tbGliL2V4dGVybmFsIFwiZnNcIiIsIndlYnBhY2s6Ly9tbGliL2V4dGVybmFsIFwiZnMvcHJvbWlzZXNcIiIsIndlYnBhY2s6Ly9tbGliL2V4dGVybmFsIFwib3NcIiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7O0FBR0E7O0FBSEE7QUFLQSxLLEdBTEEsdUIsQ0FLQSxLO0FBQUEsSSxHQUxBLHVC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QUFELFk7QUFGRixDQUFoQjs7OztBQUlBLElBQU8sWUFBVyxTQUFYLFNBQVc7QUFBQSxNQUFDLFNBQUQsdUVBQVcsSUFBSSxDQUFmLEdBQVcsRUFBWDtBQUNsQjtBQUFDLE1BQUUsU0FBUyxDQUFULFVBQUY7U0FDQSxDQUFDLENBQUQsbUJBQWlCLENBQUMsQ0FBbEIsVUFBaUIsRUFBakIsU0FBb0MsQ0FBQyxDQUFELFk7QUFGbkIsQ0FBbEI7OztlQU9lO0FBQ2QsT0FEYyxFQUNkLEtBRGM7QUFFZCxTQUZjLEVBRWQsT0FGYztBQUdkLFdBSGMsRUFHZDtBQUhjLEM7Ozs7Ozs7Ozs7O0FDaEJmLGtCQUFrQiw4ckc7Ozs7Ozs7Ozs7O0FDQWxCLHFFOzs7Ozs7Ozs7OztBQ0FBLDBFOzs7Ozs7Ozs7OztBQ0FBLHdEOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLGdDOzs7Ozs7Ozs7OztBQ0FBLHlDOzs7Ozs7Ozs7OztBQ0FBLGdDIiwiZmlsZSI6Imxvcm5wdWcvbG9ybnB1Zy5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIm1saWJcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wibWxpYlwiXSA9IGZhY3RvcnkoKTtcbn0pKGdsb2JhbCwgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuI2NoYWxrID0gcmVxdWlyZSgnY2hhbGsnKVxuI2ltcG9ydCB7ZmlsZX0gZnJvbSAnbWxpYidcbmltcG9ydCBscGggZnJvbSAnLi9sb3JucHVnaGVscC5jcydcblxue2lzY21kLCBkb2xwLCBkb2Rpcn09bHBoXG5cblxuIyAtLS0tLS0tLS0tLS0tLS0tLS1pbml0LS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5hcmc9cHJvY2Vzcy5hcmd2WzIuLl1cbmNvbnNvbGUubG9nICfnjq/looPlkozlj4LmlbDkv6Hmga86J1xuY29uc29sZS50YWJsZSBbXG5cdHsn6ZSuOiAnOidwcm9jZXNzLmN3ZCgpJywgJ+WAvDogJzogcHJvY2Vzcy5jd2QoKX1cblx0eyfplK46ICc6J19fZGlybmFtZScsICflgLw6ICc6X19kaXJuYW1lfVxuXHR7J+mUrjogJzoncHJvY2Vzcy5hcmd2JywgJ+WAvDogJzpwcm9jZXNzLmFyZ3Z9XG5cdHsn6ZSuOiAnOifnnJ/lj4LmlbAnLCAn5YC8OiAnOmFyZ31cbl1cblxuY21kcz1bXSAjIOS8oOWFpeeahOWPguaVsOeahOWRveS7pOaVsOe7hFxuZmlsZXM9W10gIyDkvKDlhaXnmoTmlofku7bmlbDnu4RcblxuZm9yIHggaW4gYXJnXG5cdGlmIGlzY21kIHggdGhlbiBjbWRzLnB1c2ggeCBlbHNlIGZpbGVzLnB1c2ggeFxuXG5cbmNvbnNvbGUubG9nIGNoYWxrLmJsdWVCcmlnaHQgXCLlkb3ku6Q6ICAje2NtZHN9IFwiXG5jb25zb2xlLmxvZyBjaGFsay55ZWxsb3dCcmlnaHQgXCLmlofku7Y6ICN7ZmlsZXN9IFwiXG5cblxuIyDlpITnkIblkb3ku6RcbmlzZGVmYXVsdCA9IGNtZHMubGVuZ3RoID09MFxuZm9yIHggaW4gY21kc1xuXHRpc2Rpcj0vXi0tZGlyJC8udGVzdCB4XG5cdGlzaW89L14tLWlvJC8udGVzdCB4XG5cdGlzbHA9L14tLWxwJC8udGVzdCB4XG5cblxuXG5cbiMg5qC55o2u5ZG95LukLCDlpITnkIbmlofku7YsIOW/veeVpW5vZGVfbW9kdWxlLCDmnKrmnaXmoLnmja4uZ2l0aWdub3Jl5b+955WlXG5pZiBpc2RlZmF1bHQgIyDpu5jorqTmmK/ot5HmtYvor5Xmlofku7Zcblx0Y29uc29sZS5sb2cgKGNoYWxrLmN5YW5CcmlnaHQgJ+m7mOiupOihjOS4ujonKSwgJ+a1i+ivlee7k+aenDogJ1xuXG5lbHNlIGlmIGlzbHAgIyDkv67mlLkuenNocmPmlofku7YsIOWinuWKoOW/q+aNt+aWueW8j1xuXHRkb2xwIDBcbmVsc2UgaWYgaXNkaXIgIyDlu7rmtYvor5Xnm67lvZUsIOWIneWni+WMlua1i+ivleaWh+S7tlxuXHRpZiBmaWxlcy5sZW5ndGg9PTBcblx0XHRkb2RpciAnLicgI+WmguaenOayoeacieS7u+S9leaWh+S7tuWPguaVsCwg6YKj5LmI5bCx5piv5LuO5pys5Zyw5pCe5rex5bqm6YGN5Y6GXG5cdGVsc2Vcblx0XHRkb2RpciB4IGZvciB4IGluIGZpbGVzXG5cdFx0XG5cdGNvbnNvbGUubG9nIChjaGFsay5jeWFuQnJpZ2h0ICfliJ3lp4vljJYnKSwgJ+WIneWni+WMluaIkOWKnzogJ1xuXG5lbHNlIGlmIGlzaW8gIyDlop7liqDmtYvor5Xmlofku7Zcblx0Y29uc29sZS5sb2cgKGNoYWxrLmN5YW5CcmlnaHQgJ+WIneWni+WMlicpLCAn5Yid5aeL5YyW5oiQ5YqfOiAnXG5cdFxuZWxzZVxuXHRjb25zb2xlLmxvZyBjaGFsay5yZWRCcmlnaHQgJ+aKseatieWVijog5LiN55+l6YGT5L2g5oOz5bmy5ZWlJ1xuXG5cblxuXG4jIyNcbnRyeSB7XG5cdG5ldyBGdW5jdGlvbigndmFyIHthfSA9IHthOiAxfScpKCk7XG59IGNhdGNoKGVycm9yKSB7XG5cdGNvbnNvbGUuZXJyb3IoJ1lvdXIgSmF2YVNjcmlwdCBydW50aW1lIGRvZXMgbm90IHN1cHBvcnQgc29tZSBmZWF0dXJlcyB1c2VkIGJ5IHRoZSBjb2ZmZWUgY29tbWFuZC4gUGxlYXNlIHVzZSBOb2RlIDYgb3IgbGF0ZXIuJyk7XG5cdHByb2Nlc3MuZXhpdCgxKTtcbn1cblxudmFyIHBhdGg9cmVxdWlyZSgncGF0aCcpO1xudmFyIGZzPXJlcXVpcmUoJ2ZzJyk7XG5cbnZhciBwb3RlbnRpYWxQYXRocz1bXG5cdHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCksXG5cdHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCksXG5cdHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCksXG5cdHBhdGguam9pbihfX2Rpcm5hbWUsJy4uL2xpYi9jJylcbl07XG5cbmZvcih2YXIgaT0wLGxlbj1wb3RlbnRpYWxQYXRocy5sZW5ndGg7aTxsZW47aSsrKSB7XG5cdGlmKGZzLmV4aXN0c1N5bmMocG90ZW50aWFsUGF0aHNbaV0pKSB7XG5cdFx0cmVxdWlyZShwb3RlbnRpYWxQYXRoc1tpXSsnL2NvbW1hbmQnKS5ydW4oKTtcblx0XHRicmVhaztcblx0fVxufVxuXG5cbi8v5Lyg5Y+C5pWwXG52YXIgcHJvZ3JhbT1yZXF1aXJlKCdjb21tYW5kZXInKTtcblxucHJvZ3JhbVxuXHQuYXJndW1lbnRzKCc8ZmlsZT4nKVxuXHQub3B0aW9uKCctdSwgLS11c2VybmFtZSA8dXNlcm5hbWU+JywnVGhlIHVzZXIgdG8gYXV0aGVudGljYXRlIGFzJylcblx0Lm9wdGlvbignLXAsIC0tcGFzc3dvcmQgPHBhc3N3b3JkPicsJ1RoZSB1c2VycyBwYXNzd29yZCcpXG5cdFx0LmFjdGlvbihmdW5jdGlvbihmaWxlKSB7XG5cdFx0XHRjb25zb2xlLmxvZygndXNlcjogJXMgcGFzczogJXMgZmlsZTogJXMnLFxuXHRcdFx0XHRwcm9ncmFtLnVzZXJuYW1lLHByb2dyYW0ucGFzc3dvcmQsZmlsZSk7XG5cdFx0fSlcblx0XHQucGFyc2UocHJvY2Vzcy5hcmd2KTtcbiMjI1xuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuI2NoYWxrID0gcmVxdWlyZSgnY2hhbGsnKVxuaW1wb3J0IHtmaWxlfSBmcm9tICdtbGliJ1xuXG4jIC0tLS0tLS0tLS0tLS0tLS0tcHVyZSBmdW5jdGlvbi0tLS0tLS0tLS0tLS0tLS0tXG4jIOWIpOaWreaYr+WQpuacieWRveS7pOWPguaVsCgtLeW8gOWni+eahOWRveS7pOWPguaVsCksIOayoeaciS0t55qE6YO95piv5paH5Lu2XG5leHBvcnQgaXNjbWQ9ICh4KS0+XG5cdC9eLS0vLnRlc3QgeFxuXG4jIOWkhOeQhmxw5ZG95LukXG5leHBvcnQgZG9scCA9IC0+XG5cdHN0cj0nJydcblx0IyDoiJTni5fpobnnm65cblx0YWxpYXMgbHA9XCJscGdcIlxuXHQnJydcblx0cmVnPS9hbGlhc1xccypscD1cImxwZ1wiL1xuXHRvaz1hd2FpdCBmaWxlLnVuaXF1ZWFkZCB7XG5cdFx0cmVnXG5cdFx0c3RyXG5cdFx0cGF0aDonfi8uenNocmMnXG5cdFx0I3BhdGg6ICdSRUFETUUubWQnXG5cdH1cblx0aWYgb2tcblx0XHRjb25zb2xlLmxvZyAoICflkb3ku6Torr7nva7kuLpscCcpLCAoY2hhbGsuZ3JlZW5CcmlnaHQgJ+aIkOWKnzogJyksJ+mcgOimgeWIt+aWsOmFjee9ruaJjeS8mueUn+aViCwg5o6o6I2Q5L2/55So5b+r5o236YeN5ZCv5ZG95LukOidcblx0XHRjb25zb2xlLmxvZyAoY2hhbGsuZ3JlZW5CcmlnaHQgJ2V4ZWMgenNoJyksKGNoYWxrLnllbGxvdyAnIyDph43lkK/lvZPliY10ZXJtaW5hbCcpXG5cblx0XHRjb25zb2xlLmxvZyAgJ+WmguaenOS4jeiDvemHjeWQr3Rlcm1pbmFsOiAnXG5cdFx0Y29uc29sZS4gbG9nIChjaGFsay5ncmVlbkJyaWdodCAnc291cmNlIH4vLnpzaHJjJyksIChjaGFsay55ZWxsb3cgJyMg5a+85YWl6YWN572u5paH5Lu25pa55rOV5LiAJylcblx0XHRjb25zb2xlLiBsb2cgKGNoYWxrLmdyZWVuQnJpZ2h0ICcuIH4vLnpzaHJjJyksIChjaGFsay55ZWxsb3cgJyMg5a+85YWl6YWN572u5paH5Lu25pa55rOV5LqMJylcblx0ZWxzZVxuXHRcdGNvbnNvbGUubG9nIChjaGFsay5yZWRCcmlnaHQgJ+ayoeaciScpLCAoICfov5vooYzorr7nva4sIOWPr+iDveaYr+mFjee9ruaWh+S7tuW3sue7j+WtmOWcqCcpLCAoY2hhbGsueWVsbG93ICfor7fmiYvlt6Xmo4Dmn6Xmlofku7Y6ICcpLCd+Ly56c2hyYydcblxuIyDlpITnkIbkuIDkuKpjc+aIluiAhWNvZmZlZeeahOWIneWni+WMllxuZGlyMWZpbGUgPSAocGF0aCktPlxuXHRwPSBwYXRoKycubHAnXG5cdCMg5Yik5pat5a+55bqU55uu5b2V5piv5ZCm5a2Y5ZyoLlxuXHRyZXR1cm4gaWYgKGZpbGUuZXhpc3QgcClcblx0IyDmlrDlu7rnm67lvZVcblx0YXdhaXQgZmlsZS5ta2RpciBwXG5cdCMgdG9kb+ivu+WPluaWh+S7tiwg5YiG5p6Q5Ye95pWwLCDlu7rnq4vlr7nlupTnmoTmtYvor5Xmlofku7Zcblx0IyDliJ3lp4vljJbmtYvor5Xmlofku7Zcblx0YXdhaXQgZmlsZS5jb3ZlciBwYXRoOnArJy9hYWEuMGkuY3Nvbicsc3RyOicnXG5cdGF3YWl0IGZpbGUuY292ZXIgcGF0aDpwKycvYWFhLjBvLmNzb24nLHN0cjonJ1xuXHRhd2FpdCBmaWxlLmNvdmVyIHBhdGg6cCsnL2N0by5jc29uJyxzdHI6JydcblxuIyDlpITnkIbliJ3lp4vljJbmtYvor5VkaXJcbmV4cG9ydCBkb2RpciA9IChwYXRoKS0+XG5cdHN0YXQ9IGF3YWl0IGZpbGUuZmlsZXR5cGUgcGF0aFxuXHRpZiBzdGF0LmlzZmlsZSAjIOaWh+S7tuWkhOeQhlxuXHRcdCMg5aSE55CGY29mZmVl5ZKMY3Ncblx0XHRyZXR1cm4gdW5sZXNzIC9cXC5jb2ZmZWUkfFxcLmNzJC8udGVzdCBwYXRoXG5cdFx0ZGlyMWZpbGUgcGF0aFxuXHRpZiBzdGF0LmlzZGlyICMg55uu5b2V5aSE55CGXG5cdFx0IyDpgJLlvZLlpITnkIbnm67lvZUsIOimgemBv+W8gOiHquWKqOeUn+aIkOeahOebruW9lSjlkI3np7Dph4zpnaLluKbngrnnmoQpXG5cdFx0cmV0dXJuIGlmIC9cXC4vLnRlc3QgcGF0aFxuXHRcdCMg6K+75Y+W55uu5b2VLCDpgJDpobnlpITnkIZcblx0XHRkb2RpciB4IGZvciB4IGluIGF3YWl0IGZpbGUucmVhZGlyIHBhdGhcblx0cmV0dXJuICMg6Zmk5LqGZmlsZeWSjGRpcuWPr+iDvei/mOacieWFtuS7luaDheWGtSwg5q+U5aaC56ym5Y+36ZO+5o6lXG5cbmV4cG9ydCBkZWZhdWx0IHtcblx0aXNjbWRcblx0ZG9scFxuXHRkb2RpclxufVxuXG5kb2RpciAnLidcbiIsIiMjI1xuICog5YWz5LqO6aKc6Imy55qE5bqTLCDov5nkuKrlupPkvJrooqvph43lhpksIOWboOS4umhzbOeahOS6ruW6puWIpOaWreWPr+S7peiupOS4uuaYr+mUmeeahC4g5omA5Lul5Y+v5Lul5L+d55WZaHNs55u45YWz55qE5Ye95pWwLCDkvYbmmK8sIOWunumZheW6lOeUqOWHveaVsOmcgOimgemHjeWGmS5cbiAqXG4jIyNcbmltcG9ydCBjb2xvcm5hbWUgZnJvbSAnLi9jb2xvcm5hbWUuY3NvbidcblxuZGFya2NvbG9yPSAncmdiYSg0NCw0NCw0NCwxKScgI2RhcmvnmoTln7rnoYDpopzoibJcbmxpZ2h0Y29sb3I9ICdyZ2JhKDIwMCwyMDAsMjAwLDEpJ1xuXG5cblxuXG5cbiMjIypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLeWNleeLrOWkhOeQhuWJjeaZr+aIluiAheiDjOaZrywg6YWN5ZCIZGFya2Nzc+eahOaAnei3ry0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICog5Lqu5bqm5Yik5pat6YC76L6RIGc+MTAwLCByPjIwMCwg5oiW6ICFZytyPjMwMFxuICog5Lqu5bqm5aSE55CG6YC76L6RIHQ9bWF4KDEwMC1nLCAyMDAtciksIHQrciwgdCtnLCB0K2JcbiAqXG4gKiDmmpfluqbliKTmlq3pgLvovpEgZzw2MCByPDEwMCBiPDE1MFxuICog5pqX5bqm5aSE55CG6YC76L6RIHQ9bWF4KGctNjAsIHItMTAwLCBiLTE1MCksIHItdCwgZy10LCBiLXRcbiAqXG4gIyMjXG5cblx0IyMjKlxuXHQgKiByZ2Jva1xuXHQgKiDliKTmlq3popzoibLmmK/lkKbpnIDopoHlpITnkIZcblx0ICogICog5Lqu5bqm5Yik5pat6YC76L6RIGc+MTAwLCByPjIwMCwg5oiW6ICFZytyPjMwMFxuXHQgKiAgKiDmmpfluqbliKTmlq3pgLvovpEgZzw2MCByPDEwMCBiPDE1MFxuXHQgKiDlj4LmlbBcblx0ICogXHRyZ2I6e3IsZyxifVxuXHQgKiAgaXNiYWNrOiDmmK/lkKbkuLrog4zmma/lm77niYdcblx0ICog6L+U5Zue5YC8XG5cdCAqIFx0XHR0cnVlOiDkuI3pnIDopoHlpITnkIZcblx0ICogXHRcdGZhbHNlOiDpnIDopoHlpITnkIZcblx0ICMjI1xuZXhwb3J0IHJnYm9rPSh7cmdiLGlzYmFjaz10cnVlfSktPlxuXHR7cixnLGJ9PXJnYlxuXHRpZiBpc2JhY2sgdGhlbiBcdGc8NjAgJiYgcjwxMDAgJiYgYjwxNTAgZWxzZSByK2c+MzAwXG5cdFx0XHQj5pqX5bqm5Yik5patXG5cdFx0XHQj5YWJ5piO5qih5byPLCDlpoLmnpzkuq7luqY8MC435YiZ6ZyA6KaB5aSE55CGLCDlkKbliJnlsLHkuI3pnIDopoHlpITnkIZcblxuXG4jIyMqXG4gKiDku45zdHLliLDosIPkuq7nmoTpopzoibJzdHJcbiAqICDov5nph4zlpITnkIbkuIDkuKpzdHlsZSBzdHJpbmfnmoTkuq7luqZcbiAqIOe6r+WHveaVsFxuICogc3RyOiDkuIDkuKrpopzoibLlrZfnrKbkuLJcbiAqIGlzYmFjazog5piv5ZCm5Li66IOM5pmvXG4gKiDlup/lvIMgcmV0dXJuIGZhbHNlIOW5tuS4jeWQiOeQhlxuIyMjXG5leHBvcnQgbHN0cj0oe3N0cixpc2JhY2s9dHJ1ZX0pIC0+XG5cdHJldHVybiBmYWxzZSBpZighc3RyKVxuXHRcblx0I+WmguaenOaYr2luaXRpYWwsIOmCo+S5iOebtOaOpeeUqOaIkeeahOWAvC5cblx0cmV0dXJuIChpZiBpc2JhY2sgdGhlbiBkYXJrY29sb3IgZWxzZSBsaWdodGNvbG9yKSBpZiBzdHI9PVwiaW5pdGlhbFwiXG5cdFxuXHQjZml4bWUg5pqC5pe25Zyo6L+Z6YeM5b+955WlY3NzIHZhciAgI3RvZG9cblx0cmV0dXJuIChpZiBpc2JhY2sgdGhlbiBkYXJrY29sb3IgZWxzZSBsaWdodGNvbG9yKWlmIC92YXJcXCgtLS8udGVzdChzdHIpXG5cblx0bD1scmdiIHtyZ2I6IHN0cjJyZ2Ioc3RyKSxpc2JhY2t9XG5cdHJnYjJzdHIobClcblxuIyMjKlxuXHQgKiBsaWdodHJnYuaguOW/g+S6ruW6puWkhOeQhuWHveaVsFxuXHQgKiAgKiDkuq7luqblpITnkIbpgLvovpEgdD1tYXgoMTAwLWcsIDIwMC1yKSwgdCtyLCB0K2csIHQrYlxuXHQgKiAgKiDmmpfluqblpITnkIbpgLvovpEgdD1tYXgoZy02MCwgci0xMDAsIGItMTUwKSwgci10LCBnLXQsIGItdFxuXHQgKiDlup/lvINyZXR1cm4gZmFsc2XlubbkuI3lkIjnkIZcbiMjI1xuZXhwb3J0IGxyZ2I9KHtyZ2IsaXNiYWNrPXRydWV9KSAtPlxuXHRyZXR1cm4gcmdiIGlmIHJnYm9rIHtyZ2IsaXNiYWNrfVxuXHR7cixnLGJ9PXJnYlxuXHRpZiAoaXNiYWNrKSAgI+WkhOeQhuaal+m7keiDjOaZr1xuXHRcdHQ9IE1hdGgubWF4KGctNjAsci0xMDAsIGItMTUwKVxuXHRcdHItPXRcblx0XHRnLT10XG5cdFx0Yi09dFxuXHRlbHNlICAj5aSE55CG5piO5Lqu5YmN5pmvXG5cdFx0dD0gTWF0aC5tYXgoMTAwLWcsMjAwLXIpXG5cdFx0cis9dFxuXHRcdGcrPXRcblx0XHRiKz10XG5cdHtyLGcsYn1cblxuIyMjKlxuICog5LuOc3Ry5Yiw6LCD5Lqu55qE6aKc6Imyc3RyXG4gKiAg6L+Z6YeM5aSE55CG5LiA5Liqc3R5bGUgc3RyaW5n55qE5Lqu5bqmXG4gKiDnuq/lh73mlbBcbiAqIHN0cjog5LiA5Liq6aKc6Imy5a2X56ym5LiyXG4gKiBpc2JhY2s6IOaYr+WQpuS4uuiDjOaZr1xuICog5bqf5byDIHJldHVybiBmYWxzZSDlubbkuI3lkIjnkIZcbiMjI1xubGlnaHRzdHI9KHtzdHIsaXNiYWNrPXRydWV9KSAtPlxuXHRyZXR1cm4gZmFsc2UgaWYoIXN0cilcblx0XG5cdCPlpoLmnpzmmK9pbml0aWFsLCDpgqPkuYjnm7TmjqXnlKjmiJHnmoTlgLwuXG5cdHJldHVybiAoaWYgaXNiYWNrIHRoZW4gZGFya2NvbG9yIGVsc2UgbGlnaHRjb2xvcikgaWYgc3RyPT1cImluaXRpYWxcIlxuXHRcblx0I2ZpeG1lIOaaguaXtuWcqOi/memHjOW/veeVpWNzcyB2YXIgICN0b2RvXG5cdHJldHVybiAoaWYgaXNiYWNrIHRoZW4gZGFya2NvbG9yIGVsc2UgbGlnaHRjb2xvcilpZiAvdmFyXFwoLS0vLnRlc3Qoc3RyKVxuXHRsPWxpZ2h0cmdiIHtyZ2I6IHN0cjJyZ2Ioc3RyKSxpc2JhY2t9XG5cdGlmIGwgdGhlbiByZ2Iyc3RyKGwpIGVsc2UgZmFsc2VcblxuXG5cbiMjIypcblx0ICogbGlnaHRyZ2LmoLjlv4Pkuq7luqblpITnkIblh73mlbBcblx0ICogICog5Lqu5bqm5aSE55CG6YC76L6RIHQ9bWF4KDEwMC1nLCAyMDAtciksIHQrciwgdCtnLCB0K2Jcblx0ICogICog5pqX5bqm5aSE55CG6YC76L6RIHQ9bWF4KGctNjAsIHItMTAwLCBiLTE1MCksIHItdCwgZy10LCBiLXRcblx0ICog5bqf5byDcmV0dXJuIGZhbHNl5bm25LiN5ZCI55CGXG4jIyNcbmxpZ2h0cmdiPSh7cmdiLGlzYmFjaz10cnVlfSkgLT5cblx0cmV0dXJuIGZhbHNlIGlmKHJnYm9rKHtyZ2IsaXNiYWNrfSkpXG5cdHtyLGcsYn09cmdiXG5cdGlmIChpc2JhY2spICAj5aSE55CG5pqX6buR6IOM5pmvXG5cdFx0dD0gTWF0aC5tYXgoZy02MCxyLTEwMCwgYi0xNTApXG5cdFx0ci09dFxuXHRcdGctPXRcblx0XHRiLT10XG5cdGVsc2UgICPlpITnkIbmmI7kuq7liY3mma9cblx0XHR0PSBNYXRoLm1heCgxMDAtZywyMDAtcilcblx0XHRyKz10XG5cdFx0Zys9dFxuXHRcdGIrPXRcblx0e3IsZyxifVxuXG5cblxuXG5cbiMjIypcbiAqIC0tLS0tLS0tLS0tLS0t5a+55q+U5bqm6YC76L6RLCDphY3lkIhkYXJrc3R5bGUtLS0tLS0tLS0tLS0tLS0tLVxuICog6L+Z6YeM55qE6K6h566X5pyq5b+F5ZCI6YCCLlxuIyMjXG5cblxuXG5cblx0XHQjIyMqXG5cdFx0ICog5LuOc3Ry5Yiw5Lqu5bqmXG5cdFx0ICMjI1xuZXhwb3J0IGdldGxpZ2h0PSAoc3RyKSAtPlxuXHRnZXRyZ2JsaWdodCBzdHIycmdiIHN0clxuXHRcdFxuZXhwb3J0IGdldGRhcms9KHN0cikgLT5cblx0Z2V0cmdiZGFyayBzdHIycmdiIHN0clxuXHRcdFxuXG5cblxuIyMjKlxuXHQqIOaLv+WIsOinhuinieS6ruW6plxuXHQqIOeUqOadpeWIpOaWreminOiJsuaYr+WQpuWkn+S6rlxuXHQqIOacquadpeeUqOiNp+WFieS9k+WPkeWFieiDvemHj+adpeiuoeeul+aVsOWAvC5cbiMjI1xuZ2V0cmdibGlnaHQ9ICh7cixnLGJ9KS0+XG5cdHI9cioxLjJcblx0Zz1nKjEuN1xuXHRtbGlnaHQoe3IsZyxifSkubGlnaHRcblxuIyMjKlxuXHQqIOaLv+WIsOinhuinieaal+W6plxuXHQqIOeUqOadpeWIpOaWreminOiJsuaYr+WQpuWkn+aal1xuXHQqXG4jIyNcbmdldHJnYmRhcms9KHtyLGcsYn0pLT5cblx0cj1yKjEuM1xuXHRnPWcqMS4yXG5cdG1saWdodCh7cixnLGJ9KS5saWdodFxuXG5tbGlnaHQ9KHtyLGcsYn0pLT5cblx0aWYgciA+IGdcblx0XHRiMT1yXG5cdFx0YjI9Z1xuXHRlbHNlXG5cdFx0YjE9Z1xuXHRcdGIyPXJcblx0XG5cdGlmIGIgPCBiMlxuXHRcdGIzPWJcblx0ZWxzZSBpZiBiIDwgYjFcblx0XHRiMz1iMlxuXHRcdGIyPWJcblx0ZWxzZVxuXHRcdGIzPWIyXG5cdFx0YjI9YjFcblx0XHRiMT1iXG5cdFx0XHQjIOi/memHjOW+iOS4jeS4peiwqCwg5Lqu5bqm55qE5b+D55CG6ZiI6ZmQ5rWL6YeP5oiW6K646IO96K6p6L+Z5Liq6K6h566X5pu057K+56GuLlxuXHRsaWdodDogKGIxK2IyLzYpKjIvMyxtYXg6IFtiMSxiMixiM11cblx0XG5cblxuXG5cblxuXG5cblxuIyMjXG5cdCog5Z+656GA5bel5YW35Ye95pWwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQqIOWIpOaWreS4pOS4qnJnYnN0cuWunumZheebuOetiVxuIyMjXG5cbmV4cG9ydCBzYW1lcmdic3RyPShyZ2JzdHIxLHJnYnN0cjIpLT5cblx0e3I6IHIxLGc6IGcxLGI6IGIxfT1zdHIycmdiKHJnYnN0cjEpXG5cdHtyOiByMixnOiBnMixiOiBiMn09c3RyMnJnYihyZ2JzdHIyKVxuXHRyMT09cjImJmcxPT1nMiYmYjE9PWIyXG5cblxuIyMjKlxuKiAz56eN5oOF5Ya1XG4qIDEuIHJnYuaDheWGtTog5LuOXCJyZ2IoMTU0LCAxNTQsIDApXCLovazljJbkuLo6IHtyOjE1NCxnOjE1NCxiOjAsfVxuKiBcInJnYmEoMCwgMCwgMCwgMClcIiDov5jpnIDlhbzlrrnmraTnp43mg4XlhrVcbiogMi4gMTbov5vliLbmg4XlhrU6ICAjZmMyICAjZmMyOSAjZmMyOTI5MjMgI2ZjMjkyOVxuKiAzLiDpopzoibLlkI06IHdoaXRlLCBibGFjaywgb3JnYW5nZVxuKiMjI1xuXG5zdHIycmdiPShzdHIpLT5cblxuXHQjXCJyZ2IoMTU0LCAxNTQsIDApXCJcblx0cmVnPS9yZ2JhP1xcKChbMC05XXsxLDN9KSwgPyhbMC05XXsxLDN9KSwgPyhbMC05XXsxLDN9KSgsID8oWzAtOS4lXSspKT9cXCkvaVxuXHRjPXJlZy5leGVjIHN0clxuXG5cdCMxNui/m+WItuminOiJslxuXHRjPz1oZXgycmdiKHN0cilcblxuXHQj5YaN5Yik5pat5ZCN5a2X6aKc6ImyOlxuXHRjPz0gY29sb3JuYW1lW3N0cl0gJiYgaGV4MnJnYihoZXgpXG5cdFxuXHRyZXR1cm4gZmFsc2UgdW5sZXNzIGM/XG5cblxuXHQj6YCP5piO5bqmXG5cdGE9IGlmIGNbNV0/IHRoZW4gY1s1XSBlbHNlIDFcblx0e3I6ICtjWzFdLGc6ICtjWzJdLGI6ICtjWzNdLGF9ICPov5nph4znlKgr5piv5Li65LqG5oqK5a2X56ym5Liy6L2s5Li65pWw5a2XLCDkuI3nhLbkvJrlj5HnlJ/lvojpmpDolL3nmoRidWcuXG5cblxuXHQjIyNcblx0ICog5LuOcmdi5Yiwc3RyXG5cdCAqIyMjXG5yZ2Iyc3RyPSh7cixnLGIsYT0xfSkgLT5cblx0aWYgYT4wLjk5IHRoZW4gIFwicmdiKFwiK3IrXCIsXCIrZytcIixcIitiK1wiKVwiIGVsc2UgXCJyZ2JhKFwiK3IrXCIsXCIrZytcIixcIitiK1wiLFwiK2ErXCIpXCJcblxuXG5cdCMjI1xuXHQgKiDku44xNui/m+WItuWIsHJnYlxuXHQgKiAgI2ZjMiAgI2ZjMjkgI2ZjMjkyOTIzICNmYzI5MjksIDMsNCw2LDjpg73mnInlj6/og71cblx0IyMjXG5cblxuaGV4MnJnYj0oc3RyKSAtPlxuXHRyZWc9LyMoW14jXSopL2kgI+WIpOaWrSM2MmZhODnov5nnp43nsbvkvLzmlrnlvI/nmoTpopzoibLlgLxcblx0Yz1yZWcuZXhlYyhzdHIpXG5cdHJldHVybiBmYWxzZSB1bmxlc3MgYz9bMV0/IFx0I2Mx5LiN5a2Y5Zyo6ZyA6KaBcmV0dXJuXG5cdHg9Y1sxXVxuXHR5PVtdXG5cdHN3aXRjaCB4Lmxlbmd0aFxuXHRcdHdoZW4gM1xuXHRcdFx0eVsxXT1wYXJzZUludCgnJyt4WzBdK3hbMF0sMTYpXG5cdFx0XHR5WzJdPXBhcnNlSW50KCcnK3hbMV0reFsxXSwxNilcblx0XHRcdHlbM109cGFyc2VJbnQoJycreFsyXSt4WzJdLDE2KVxuXHRcdHdoZW4gNFxuXHRcdFx0I3lbMV09cGFyc2VJbnQoeFswXSwxNik7ICAvMjAyMDEwMjjkv67mraPplJnor68sIOi/meS4quS8muaKimZmZui9rOWMluS4uiByMTVnMTViMTUsIOWFtuWunuW6lOivpeaYr3IyNTVnMjU1YjI1NVxuXHRcdFx0eVsxXT1wYXJzZUludCgnJyt4WzBdK3hbMF0sMTYpXG5cdFx0XHR5WzJdPXBhcnNlSW50KCcnK3hbMV0reFsxXSwxNilcblx0XHRcdHlbM109cGFyc2VJbnQoJycreFsyXSt4WzJdLDE2KVxuXHRcdFx0eVs1XT1wYXJzZUludCh4WzNdLDE2KS8yNTVcblx0XHR3aGVuIDZcblx0XHRcdHlbMV09cGFyc2VJbnQoJycreFswXSt4WzFdLDE2KVxuXHRcdFx0eVsyXT1wYXJzZUludCgnJyt4WzJdK3hbM10sMTYpXG5cdFx0XHR5WzNdPXBhcnNlSW50KCcnK3hbNF0reFs1XSwxNilcblx0XHR3aGVuIDhcblx0XHRcdHlbMV09cGFyc2VJbnQoJycreFswXSt4WzFdLDE2KVxuXHRcdFx0eVsyXT1wYXJzZUludCgnJyt4WzJdK3hbM10sMTYpXG5cdFx0XHR5WzNdPXBhcnNlSW50KCcnK3hbNF0reFs1XSwxNilcblx0XHRcdHlbNV09cGFyc2VJbnQoJycreFs2XSt4WzddLDE2KS8yNTVcblx0XHQj5LiN5ruh6Laz5LiK6Z2i5Zub5Liq5oOF5Ya1LCDnm7TmjqXov5Tlm55mYWxzZVxuXHRcdGVsc2UgcmV0dXJuIGZhbHNlXG5cdHlcblxuXHQjY29uc29sZS5sb2coc3RyMnJnYignd2hpdGUnKSk7ICN0ZXN0XG5cblxuXG5cblxuXG50ZXN0ID0gLT5cblx0cmVzdWx0PXdpbmRvdy5sdW9jbHIubGlnaHRzdHIgc3RyOid3aGl0ZScsIGlzYmFjazp0cnVlXG5cdGNvbnNvbGUubG9nIHtyZXN1bHR9XG5cblxuZXhwb3J0IGRlZmF1bHQge1xuXHQjbGlnaHRzdHJcblx0I2xpZ2h0cmdiXG5cdGxzdHJcblx0bHJnYlxuXHRnZXRsaWdodFxuXHRnZXRkYXJrXG5cdHNhbWVyZ2JzdHJcblxufVxuIiwiI2ltcG9ydCB7bG9nfSBmcm9tICcuL2xvZy5qcydcblxuaW1wb3J0IGZzIGZyb20gJ2ZzL3Byb21pc2VzJ1xuaW1wb3J0IGZ0cyBmcm9tICdmcydcblxuaW1wb3J0IG9zIGZyb20gJ29zJ1xuXG5ob21lID0gb3MuaG9tZWRpcigpXG5sb2c9Y29uc29sZS5sb2dcblxuXG4jIHRvZG8g5L+d5a2Y5paH5Lu2XG5leHBvcnQgc2F2ZWZpbGU9KHtqc29uLGZpbGVuYW1lPVwidGVtcHRlc3QudHh0XCJ9KS0+XG5cdGZzLndyaXRlRmlsZSBmaWxlbmFtZSxKU09OLnN0cmluZ2lmeShqc29uKSwoZXJyKS0+XG5cdFx0bG9nICfmlofku7blhpnlhaUnLGZpbGVuYW1lXG5cdFx0bG9nIGVyciBpZiBlcnJcblxuIyDmi7/liLDnnJ/mraPnmoRwYXRoXG5leHBvcnQgcmVhbHBhdGg9KHBhdGgpLT5cblx0IyBob21l5paH5Lu25aS5fiwgbm9kZeS4jeiupCwg6KaB6LCD5pW05Li6b3MuaG9tZWRpclxuXHRpZiAvXn4vLnRlc3QgcGF0aCB0aGVuIHBhdGgucmVwbGFjZSAvXn4vLCBob21lICBlbHNlIHBhdGhcblxuXG4jIOWKoOaWh+S7tuWGheWuuSwg6KaG55uW5byPXG5leHBvcnQgY292ZXI9KHtwYXRoLCBzdHIsIG9wdGlvbnM9ZW5jb2Rpbmc6J3V0ZjgnfSkgLT5cblxuXHQjIOimhuebluW8j+WGmeWFpVxuXHRhd2FpdCBmcy53cml0ZUZpbGUgKHJlYWxwYXRoIHBhdGgpLCBzdHIsIG9wdGlvbnNcblx0dHJ1ZVxuIyDov73liqDmlofku7blhoXlrrksIOS/neivgei/veWKoOWGheWuueS4jemHjeWkjVxuZXhwb3J0IHVuaXF1ZWFkZD0oe3BhdGgsIHJlZywgc3RyLCBvcHRpb25zPWVuY29kaW5nOid1dGY4J30pIC0+XG5cblx0IyBob21l5paH5Lu25aS5fiwgbm9kZeS4jeiupCwg6KaB6LCD5pW05Li6b3MuaG9tZWRpclxuXHRycGF0aCA9cmVhbHBhdGggcGF0aFxuXG5cdCMg6K+75Y+W5paH5Lu2XG5cdGZzdHI9YXdhaXQgZnMucmVhZEZpbGUgcnBhdGgsIG9wdGlvbnNcblx0IyDmraPliJnliKTmlq1cblx0cmV0dXJuIGZhbHNlIGlmIHJlZy50ZXN0IGZzdHJcblxuXHQjIOS4jemHjeWkjeWwseaPkuWFpVxuXHRhd2FpdCBmcy5hcHBlbmRGaWxlIHJwYXRoLCBzdHIgPyByZWcuc291cmNlLCBvcHRpb25zXG5cdHRydWVcblxuIyDliKTmlq3mmK/mlofku7Yv55uu5b2VXG5leHBvcnQgZmlsZXR5cGUgPSAocGF0aCktPlxuXHRzdGF0PWF3YWl0IGZzLmxzdGF0IHJlYWxwYXRoIHBhdGhcblx0cmV0dXJuIGlzZmlsZTogc3RhdC5pc0ZpbGUoKSwgaXNkaXI6IHN0YXQuaXNEaXJlY3RvcnkoKVxuXG4jIOWIpOaWreaWh+S7ti/nm67lvZXmmK/lkKblrZjlnKhcbmV4cG9ydCBleGlzdCA9IChwYXRoKS0+XG5cdGZ0cy5leGlzdHNTeW5jIHJlYWxwYXRoIHBhdGhcblxuIyDlu7rkuIDkuKrnm67lvZVcbmV4cG9ydCBta2Rpcj0ocGF0aCktPlxuXHRhd2FpdCBmcy5ta2RpciAocmVhbHBhdGggcGF0aCkscmVjdXJzaXZlOnRydWVcblxuIyDlpoLmnpzkuI3lrZjlnKjlsLHlu7rkuIDkuKrnm67lvZVcbmV4cG9ydCBuZXdkaXI9KHBhdGgpLT5cblx0cmV0dXJuIGZhbHNlIGlmIGV4aXN0IHBhdGhcblx0YXdhaXQgZnMubWtkaXIgcmVhbHBhdGggcGF0aFxuXG4jIOivu+WPluebruW9lVxuZXhwb3J0IHJlYWRpciA9IChwYXRoKS0+XG5cdGF3YWl0IGZzLnJlYWRkaXIgcmVhbHBhdGggcGF0aFxuIyDor7vlj5bmlofku7ZcbmV4cG9ydCByZWFkZmlsZSA9IChwYXRoKS0+XG5cdGZzdHI9YXdhaXQgZnMucmVhZEZpbGUgKHJlYWxwYXRoIHBhdGgpLCBlbmNvZGluZzondXRmOCdcblxuXG4jIHRvZG8g6K+75Y+W55uu5b2V5Lit5omA5pyJ6Zeu6aKYLCDmt7HluqbpgY3ljoZcbmV4cG9ydCBhbGxmaWxlID0gKHtwYXRoLCByZWc9ZmFsc2Usb3B0aW9ucz1lbmNvZGluZzondXRmOCd9KS0+XG5cdCMg5aaC5p6c5rKh5LygcmVnLCDpgqPkuYjlsLHmmK/opoHmiYDmnInmlofku7Zcblx0cmVhZGRpcihwYXRoLCBvcHRpb25zKVxuXG5cblxuXG5leHBvcnQgZGVmYXVsdCB7XG5cdHNhdmVmaWxlXG5cdGNvdmVyXG5cdHVuaXF1ZWFkZFxuXHRmaWxldHlwZVxuXHRleGlzdFxuXHRta2RpclxuXHRyZWFkaXJcblx0cmVhZGZpbGVcblx0YWxsZmlsZVxufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIGNvbG9yfSBmcm9tICcuL2NvbG9yLmNzJ1xuZXhwb3J0IHtkZWZhdWx0IGFzIHJhbmRvbX0gZnJvbSBcdCcuL3JhbmRvbS5jcydcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0aW1lfSBmcm9tIFx0Jy4vdGltZS5jcydcbmV4cG9ydCB7ZGVmYXVsdCBhcyBmaWxlfSBmcm9tIFx0Jy4vZmlsZS5jcydcbiIsIlxuIyMjXG4qIOaLv+WIsOaVtOaVsOeJiOacrOeahOmaj+acuuaVsFxuKiDlm6DkuLpyYW5kb23kuI3ljIXlkKsxLCDlm6DmraQsIOi/meS4qumaj+acuuaVsOS5n+S4jeWMheWQq21heFxuKiDlm6DmraTkvKDlhaXmlbDnu4TnmoTplb/luqbmraPlpb3lkIjpgILkvZzkuLrmlbDnu4TnmoTntKLlvJVcbiMjI1xuaW1wb3J0IHtsc3RyfSBmcm9tICcuL2NvbG9yLmNzJ1xuXG5leHBvcnQgcmFuZG9taW50PShtYXgpIC0+XG5cdChNYXRoLnJhbmRvbSgpKm1heCk+PjBcblxuIyMjXG7mlbDnu4TkuK3lj5bkuIDkuKrpmo/mnLplbGVtZW50XG4jIyNcbmV4cG9ydCByYW5kb21lbWJlciA9IChwKSAtPlxuXHRwW3JhbmRvbWludCBwLmxlbmd0aF1cblxuIyDpmo/mnLrkuIDkuKrpopzoibJcbmV4cG9ydCByYW5kb21jb2xvciA9IC0+XG5cdFwicmdiKFwiKyAocmFuZG9taW50IDI1NikrXCIsXCIrKHJhbmRvbWludCAyNTYgKStcIixcIisocmFuZG9taW50IDI1NikrXCIpXCJcblxuXG4jIOmaj+acuuS4gOS4quaYjuS6ruminOiJslxuZXhwb3J0IHJhbmRvbWxpZ2h0ID0gLT5cblx0bHN0clxuXHRcdHN0cjpyYW5kb21jb2xvciAwXG5cdFx0aXNiYWNrOmZhbHNlXG5cblxuXG5cbmV4cG9ydCBkZWZhdWx0IHtcblx0cmFuZG9taW50XG5cdHJhbmRvbWVtYmVyXG5cdHJhbmRvbWNvbG9yXG5cdHJhbmRvbWxpZ2h0XG59XG4iLCJleHBvcnQgc2xlZXAgPSAobXMpIC0+XG5cdG5ldyBQcm9taXNlIChyZXNvbHZlKSAtPlxuXHRcdHNldFRpbWVvdXQgcmVzb2x2ZSwgbXNcblxuXG5leHBvcnQgZ2V0aGhtbSA9KHRpbWVzdGFtcD1EYXRlLm5vdygpKS0+XG5cdHQ9bmV3IERhdGUoK3RpbWVzdGFtcClcblx0dC5nZXRIb3VycygpKyc6Jyt0LmdldE1pbnV0ZXMoKVxuXG5leHBvcnQgZ2V0aGhtbXNzID0odGltZXN0YW1wPURhdGUubm93KCkpLT5cblx0dD1uZXcgRGF0ZSgrdGltZXN0YW1wKVxuXHR0LmdldEhvdXJzKCkrJzonK3QuZ2V0TWludXRlcygpKyc6Jyt0LmdldFNlY29uZHMoKVxuXG5cblxuXG5leHBvcnQgZGVmYXVsdCB7XG5cdHNsZWVwXG5cdGdldGhobW1cblx0Z2V0aGhtbXNzXG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcImJsYWNrXCI6XCIjMDAwXCIsXCJzaWx2ZXJcIjpcIiNjMGMwYzBcIixcImdyYXlcIjpcIiM4MDgwODBcIixcIndoaXRlXCI6XCIjZmZmXCIsXCJtYXJvb25cIjpcIiM4MDAwMDBcIixcInJlZFwiOlwiI2ZmMDAwMFwiLFwicHVycGxlXCI6XCIjODAwMDgwXCIsXCJmdWNoc2lhXCI6XCIjZmYwMGZmXCIsXCJncmVlblwiOlwiIzAwODAwMFwiLFwibGltZVwiOlwiIzAwZmYwMFwiLFwib2xpdmVcIjpcIiM4MDgwMDBcIixcInllbGxvd1wiOlwiI2ZmZmYwMFwiLFwibmF2eVwiOlwiIzAwMDA4MFwiLFwiYmx1ZVwiOlwiIzAwMDBmZlwiLFwidGVhbFwiOlwiIzAwODA4MFwiLFwiYXF1YVwiOlwiIzAwZmZmZlwiLFwib3JhbmdlXCI6XCIjZmZhNTAwXCIsXCJhbGljZWJsdWVcIjpcIiNmMGY4ZmZcIixcImFudGlxdWV3aGl0ZVwiOlwiI2ZhZWJkN1wiLFwiYXF1YW1hcmluZVwiOlwiIzdmZmZkNFwiLFwiYXp1cmVcIjpcIiNmMGZmZmZcIixcImJlaWdlXCI6XCIjZjVmNWRjXCIsXCJiaXNxdWVcIjpcIiNmZmU0YzRcIixcImJsYW5jaGVkYWxtb25kXCI6XCIjZmZlYmNkXCIsXCJibHVldmlvbGV0XCI6XCIjOGEyYmUyXCIsXCJicm93blwiOlwiI2E1MmEyYVwiLFwiYnVybHl3b29kXCI6XCIjZGViODg3XCIsXCJjYWRldGJsdWVcIjpcIiM1ZjllYTBcIixcImNoYXJ0cmV1c2VcIjpcIiM3ZmZmMDBcIixcImNob2NvbGF0ZVwiOlwiI2QyNjkxZVwiLFwiY29yYWxcIjpcIiNmZjdmNTBcIixcImNvcm5mbG93ZXJibHVlXCI6XCIjNjQ5NWVkXCIsXCJjb3Juc2lsa1wiOlwiI2ZmZjhkY1wiLFwiY3JpbXNvblwiOlwiI2RjMTQzY1wiLFwiY3lhblwiOlwiIzAwZmZmZlwiLFwiZGFya2JsdWVcIjpcIiMwMDAwOGJcIixcImRhcmtjeWFuXCI6XCIjMDA4YjhiXCIsXCJkYXJrZ29sZGVucm9kXCI6XCIjYjg4NjBiXCIsXCJkYXJrZ3JheVwiOlwiI2E5YTlhOVwiLFwiZGFya2dyZWVuXCI6XCIjMDA2NDAwXCIsXCJkYXJrZ3JleVwiOlwiI2E5YTlhOVwiLFwiZGFya2toYWtpXCI6XCIjYmRiNzZiXCIsXCJkYXJrbWFnZW50YVwiOlwiIzhiMDA4YlwiLFwiZGFya29saXZlZ3JlZW5cIjpcIiM1NTZiMmZcIixcImRhcmtvcmFuZ2VcIjpcIiNmZjhjMDBcIixcImRhcmtvcmNoaWRcIjpcIiM5OTMyY2NcIixcImRhcmtyZWRcIjpcIiM4YjAwMDBcIixcImRhcmtzYWxtb25cIjpcIiNlOTk2N2FcIixcImRhcmtzZWFncmVlblwiOlwiIzhmYmM4ZlwiLFwiZGFya3NsYXRlYmx1ZVwiOlwiIzQ4M2Q4YlwiLFwiZGFya3NsYXRlZ3JheVwiOlwiIzJmNGY0ZlwiLFwiZGFya3NsYXRlZ3JleVwiOlwiIzJmNGY0ZlwiLFwiZGFya3R1cnF1b2lzZVwiOlwiIzAwY2VkMVwiLFwiZGFya3Zpb2xldFwiOlwiIzk0MDBkM1wiLFwiZGVlcHBpbmtcIjpcIiNmZjE0OTNcIixcImRlZXBza3libHVlXCI6XCIjMDBiZmZmXCIsXCJkaW1ncmF5XCI6XCIjNjk2OTY5XCIsXCJkaW1ncmV5XCI6XCIjNjk2OTY5XCIsXCJkb2RnZXJibHVlXCI6XCIjMWU5MGZmXCIsXCJmaXJlYnJpY2tcIjpcIiNiMjIyMjJcIixcImZsb3JhbHdoaXRlXCI6XCIjZmZmYWYwXCIsXCJmb3Jlc3RncmVlblwiOlwiIzIyOGIyMlwiLFwiZ2FpbnNib3JvXCI6XCIjZGNkY2RjXCIsXCJnaG9zdHdoaXRlXCI6XCIjZjhmOGZmXCIsXCJnb2xkXCI6XCIjZmZkNzAwXCIsXCJnb2xkZW5yb2RcIjpcIiNkYWE1MjBcIixcImdyZWVueWVsbG93XCI6XCIjYWRmZjJmXCIsXCJncmV5XCI6XCIjODA4MDgwXCIsXCJob25leWRld1wiOlwiI2YwZmZmMFwiLFwiaG90cGlua1wiOlwiI2ZmNjliNFwiLFwiaW5kaWFucmVkXCI6XCIjY2Q1YzVjXCIsXCJpbmRpZ29cIjpcIiM0YjAwODJcIixcIml2b3J5XCI6XCIjZmZmZmYwXCIsXCJraGFraVwiOlwiI2YwZTY4Y1wiLFwibGF2ZW5kZXJcIjpcIiNlNmU2ZmFcIixcImxhdmVuZGVyYmx1c2hcIjpcIiNmZmYwZjVcIixcImxhd25ncmVlblwiOlwiIzdjZmMwMFwiLFwibGVtb25jaGlmZm9uXCI6XCIjZmZmYWNkXCIsXCJsaWdodGJsdWVcIjpcIiNhZGQ4ZTZcIixcImxpZ2h0Y29yYWxcIjpcIiNmMDgwODBcIixcImxpZ2h0Y3lhblwiOlwiI2UwZmZmZlwiLFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjpcIiNmYWZhZDJcIixcImxpZ2h0Z3JheVwiOlwiI2QzZDNkM1wiLFwibGlnaHRncmVlblwiOlwiIzkwZWU5MFwiLFwibGlnaHRncmV5XCI6XCIjZDNkM2QzXCIsXCJsaWdodHBpbmtcIjpcIiNmZmI2YzFcIixcImxpZ2h0c2FsbW9uXCI6XCIjZmZhMDdhXCIsXCJsaWdodHNlYWdyZWVuXCI6XCIjMjBiMmFhXCIsXCJsaWdodHNreWJsdWVcIjpcIiM4N2NlZmFcIixcImxpZ2h0c2xhdGVncmF5XCI6XCIjNzc4ODk5XCIsXCJsaWdodHNsYXRlZ3JleVwiOlwiIzc3ODg5OVwiLFwibGlnaHRzdGVlbGJsdWVcIjpcIiNiMGM0ZGVcIixcImxpZ2h0eWVsbG93XCI6XCIjZmZmZmUwXCIsXCJsaW1lZ3JlZW5cIjpcIiMzMmNkMzJcIixcImxpbmVuXCI6XCIjZmFmMGU2XCIsXCJtYWdlbnRhXCI6XCIjZmYwMGZmXCIsXCJtZWRpdW1hcXVhbWFyaW5lXCI6XCIjNjZjZGFhXCIsXCJtZWRpdW1ibHVlXCI6XCIjMDAwMGNkXCIsXCJtZWRpdW1vcmNoaWRcIjpcIiNiYTU1ZDNcIixcIm1lZGl1bXB1cnBsZVwiOlwiIzkzNzBkYlwiLFwibWVkaXVtc2VhZ3JlZW5cIjpcIiMzY2IzNzFcIixcIm1lZGl1bXNsYXRlYmx1ZVwiOlwiIzdiNjhlZVwiLFwibWVkaXVtc3ByaW5nZ3JlZW5cIjpcIiMwMGZhOWFcIixcIm1lZGl1bXR1cnF1b2lzZVwiOlwiIzQ4ZDFjY1wiLFwibWVkaXVtdmlvbGV0cmVkXCI6XCIjYzcxNTg1XCIsXCJtaWRuaWdodGJsdWVcIjpcIiMxOTE5NzBcIixcIm1pbnRjcmVhbVwiOlwiI2Y1ZmZmYVwiLFwibWlzdHlyb3NlXCI6XCIjZmZlNGUxXCIsXCJtb2NjYXNpblwiOlwiI2ZmZTRiNVwiLFwibmF2YWpvd2hpdGVcIjpcIiNmZmRlYWRcIixcIm9sZGxhY2VcIjpcIiNmZGY1ZTZcIixcIm9saXZlZHJhYlwiOlwiIzZiOGUyM1wiLFwib3JhbmdlcmVkXCI6XCIjZmY0NTAwXCIsXCJvcmNoaWRcIjpcIiNkYTcwZDZcIixcInBhbGVnb2xkZW5yb2RcIjpcIiNlZWU4YWFcIixcInBhbGVncmVlblwiOlwiIzk4ZmI5OFwiLFwicGFsZXR1cnF1b2lzZVwiOlwiI2FmZWVlZVwiLFwicGFsZXZpb2xldHJlZFwiOlwiI2RiNzA5M1wiLFwicGFwYXlhd2hpcFwiOlwiI2ZmZWZkNVwiLFwicGVhY2hwdWZmXCI6XCIjZmZkYWI5XCIsXCJwZXJ1XCI6XCIjY2Q4NTNmXCIsXCJwaW5rXCI6XCIjZmZjMGNiXCIsXCJwbHVtXCI6XCIjZGRhMGRkXCIsXCJwb3dkZXJibHVlXCI6XCIjYjBlMGU2XCIsXCJyb3N5YnJvd25cIjpcIiNiYzhmOGZcIixcInJveWFsYmx1ZVwiOlwiIzQxNjllMVwiLFwic2FkZGxlYnJvd25cIjpcIiM4YjQ1MTNcIixcInNhbG1vblwiOlwiI2ZhODA3MlwiLFwic2FuZHlicm93blwiOlwiI2Y0YTQ2MFwiLFwic2VhZ3JlZW5cIjpcIiMyZThiNTdcIixcInNlYXNoZWxsXCI6XCIjZmZmNWVlXCIsXCJzaWVubmFcIjpcIiNhMDUyMmRcIixcInNreWJsdWVcIjpcIiM4N2NlZWJcIixcInNsYXRlYmx1ZVwiOlwiIzZhNWFjZFwiLFwic2xhdGVncmF5XCI6XCIjNzA4MDkwXCIsXCJzbGF0ZWdyZXlcIjpcIiM3MDgwOTBcIixcInNub3dcIjpcIiNmZmZhZmFcIixcInNwcmluZ2dyZWVuXCI6XCIjMDBmZjdmXCIsXCJzdGVlbGJsdWVcIjpcIiM0NjgyYjRcIixcInRhblwiOlwiI2QyYjQ4Y1wiLFwidGhpc3RsZVwiOlwiI2Q4YmZkOFwiLFwidG9tYXRvXCI6XCIjZmY2MzQ3XCIsXCJ0cmFuc3BhcmVudFwiOlwiIzAwMDBcIixcInR1cnF1b2lzZVwiOlwiIzQwZTBkMFwiLFwidmlvbGV0XCI6XCIjZWU4MmVlXCIsXCJ3aGVhdFwiOlwiI2Y1ZGViM1wiLFwid2hpdGVzbW9rZVwiOlwiI2Y1ZjVmNVwiLFwieWVsbG93Z3JlZW5cIjpcIiM5YWNkMzJcIixcInJlYmVjY2FwdXJwbGVcIjpcIiM2NjMzOTlcIn0iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIik7OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpOzsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTs7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2hhbGtcIik7OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZzXCIpOzsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmcy9wcm9taXNlc1wiKTs7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwib3NcIik7OyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/coffee/api/lornpughelp/lornpughelp.js b/coffee/api/lornpughelp/lornpughelp.js new file mode 100644 index 0000000..6797756 --- /dev/null +++ b/coffee/api/lornpughelp/lornpughelp.js @@ -0,0 +1,1318 @@ +#!/usr/bin/env node +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["mlib"] = factory(); + else + root["mlib"] = factory(); +})(global, function() { +return (() => { +var exports = {}; +exports.id = "lornpughelp"; +exports.ids = ["lornpughelp"]; +exports.modules = { + +/***/ "./src/lornpughelp.cs": +/*!****************************!* + !*** ./src/lornpughelp.cs ***! + \****************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.dodir = exports.dolp = exports.iscmd = void 0; + +var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator")); + +var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator")); + +var _chalk = _interopRequireDefault(__webpack_require__(/*! chalk */ "chalk")); + +var _mlib = __webpack_require__(/*! mlib */ "./src/mlib/src/index.cs"); + +var dir1file; + +// -----------------pure function----------------- +// 判断是否有命令参数(--开始的命令参数), 没有--的都是文件 +var iscmd = function iscmd(x) { + return /^--/.test(x); +}; // 处理lp命令 + + +exports.iscmd = iscmd; + +var dolp = /*#__PURE__*/function () { + var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { + var ok, reg, str; + return _regenerator["default"].wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + str = "# \u8214\u72D7\u9879\u76EE\nalias lp=\"lpg\""; + reg = /alias\s*lp="lpg"/; + _context.next = 4; + return _mlib.file.uniqueadd({ + reg: reg, + str: str, + path: '~/.zshrc' + }); + + case 4: + ok = _context.sent; + + if (!ok) { + _context.next = 13; + break; + } + + console.log('命令设置为lp', _chalk["default"].greenBright('成功: '), '需要刷新配置才会生效, 推荐使用快捷重启命令:'); + console.log(_chalk["default"].greenBright('exec zsh'), _chalk["default"].yellow('# 重启当前terminal')); + console.log('如果不能重启terminal: '); + console.log(_chalk["default"].greenBright('source ~/.zshrc'), _chalk["default"].yellow('# 导入配置文件方法一')); + return _context.abrupt("return", console.log(_chalk["default"].greenBright('. ~/.zshrc'), _chalk["default"].yellow('# 导入配置文件方法二'))); + + case 13: + return _context.abrupt("return", console.log(_chalk["default"].redBright('没有'), '进行设置, 可能是配置文件已经存在', _chalk["default"].yellow('请手工检查文件: '), '~/.zshrc')); + + case 14: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function dolp() { + return _ref.apply(this, arguments); + }; +}(); // 处理一个cs或者coffee的初始化 + + +exports.dolp = dolp; + +dir1file = /*#__PURE__*/function () { + var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(path) { + var p; + return _regenerator["default"].wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + p = path + '.lp'; // 判断对应目录是否存在. + + if (!_mlib.file.exist(p)) { + _context2.next = 3; + break; + } + + return _context2.abrupt("return"); + + case 3: + _context2.next = 5; + return _mlib.file.mkdir(p); + + case 5: + _context2.next = 7; + return _mlib.file.cover({ + path: p + '/aaa.0i.cson', + str: '' + }); + + case 7: + _context2.next = 9; + return _mlib.file.cover({ + path: p + '/aaa.0o.cson', + str: '' + }); + + case 9: + _context2.next = 11; + return _mlib.file.cover({ + path: p + '/cto.cson', + str: '' + }); + + case 11: + return _context2.abrupt("return", _context2.sent); + + case 12: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function dir1file(_x) { + return _ref2.apply(this, arguments); + }; +}(); // 处理初始化测试dir + + +var dodir = /*#__PURE__*/function () { + var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(path) { + var i, len, ref, stat, x; + return _regenerator["default"].wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + _context3.next = 2; + return _mlib.file.filetype(path); + + case 2: + stat = _context3.sent; + + if (!stat.isfile) { + _context3.next = 7; + break; + } + + if (/\.coffee$|\.cs$/.test(path)) { + _context3.next = 6; + break; + } + + return _context3.abrupt("return"); + + case 6: + dir1file(path); + + case 7: + if (!stat.isdir) { + _context3.next = 14; + break; + } + + if (!/\./.test(path)) { + _context3.next = 10; + break; + } + + return _context3.abrupt("return"); + + case 10: + _context3.next = 12; + return _mlib.file.readir(path); + + case 12: + ref = _context3.sent; + + // 除了file和dir可能还有其他情况, 比如符号链接 + for (i = 0, len = ref.length; i < len; i++) { + x = ref[i]; // 读取目录, 逐项处理 + + dodir(x); + } + + case 14: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + + return function dodir(_x2) { + return _ref3.apply(this, arguments); + }; +}(); + +exports.dodir = dodir; +var _default = { + iscmd: iscmd, + dolp: dolp, + dodir: dodir +}; +exports.default = _default; +dodir('.'); + +/***/ }), + +/***/ "./src/mlib/src/color.cs": +/*!*******************************!* + !*** ./src/mlib/src/color.cs ***! + \*******************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.samergbstr = exports.getdark = exports.getlight = exports.lrgb = exports.lstr = exports.rgbok = void 0; + +var _colorname = _interopRequireDefault(__webpack_require__(/*! ./colorname.cson */ "./src/mlib/src/colorname.cson")); + +/* + * 关于颜色的库, 这个库会被重写, 因为hsl的亮度判断可以认为是错的. 所以可以保留hsl相关的函数, 但是, 实际应用函数需要重写. + * + */ + +/** + * 拿到视觉暗度 + * 用来判断颜色是否够暗 + * + */ + +/** + * 拿到视觉亮度 + * 用来判断颜色是否够亮 + * 未来用荧光体发光能量来计算数值. + */ + +/* + * 从16进制到rgb + * #fc2 #fc29 #fc292923 #fc2929, 3,4,6,8都有可能 + */ + +/** + * lightrgb核心亮度处理函数 + * * 亮度处理逻辑 t=max(100-g, 200-r), t+r, t+g, t+b + * * 暗度处理逻辑 t=max(g-60, r-100, b-150), r-t, g-t, b-t + * 废弃return false并不合理 + */ + +/** + * 从str到调亮的颜色str + * 这里处理一个style string的亮度 + * 纯函数 + * str: 一个颜色字符串 + * isback: 是否为背景 + * 废弃 return false 并不合理 + */ + +/* +* 从rgb到str +* */ + +/** +* 3种情况 +* 1. rgb情况: 从"rgb(154, 154, 0)"转化为: {r:154,g:154,b:0,} +* "rgba(0, 0, 0, 0)" 还需兼容此种情况 +* 2. 16进制情况: #fc2 #fc29 #fc292923 #fc2929 +* 3. 颜色名: white, black, organge +* */ +var darkcolor, getrgbdark, getrgblight, hex2rgb, lightcolor, lightrgb, lightstr, mlight, rgb2str, str2rgb, test; +darkcolor = 'rgba(44,44,44,1)'; //dark的基础颜色 + +lightcolor = 'rgba(200,200,200,1)'; +/** +* ---------------------单独处理前景或者背景, 配合darkcss的思路--------------------------- +* 亮度判断逻辑 g>100, r>200, 或者g+r>300 +* 亮度处理逻辑 t=max(100-g, 200-r), t+r, t+g, t+b +* +* 暗度判断逻辑 g<60 r<100 b<150 +* 暗度处理逻辑 t=max(g-60, r-100, b-150), r-t, g-t, b-t +* + */ + +/** +* rgbok +* 判断颜色是否需要处理 +* * 亮度判断逻辑 g>100, r>200, 或者g+r>300 +* * 暗度判断逻辑 g<60 r<100 b<150 +* 参数 +* rgb:{r,g,b} +* isback: 是否为背景图片 +* 返回值 +* true: 不需要处理 +* false: 需要处理 + */ + +var rgbok = function rgbok(_ref) { + var rgb = _ref.rgb, + _ref$isback = _ref.isback, + isback = _ref$isback === void 0 ? true : _ref$isback; + var b, g, r; + r = rgb.r; + g = rgb.g; + b = rgb.b; + + if (isback) { + return g < 60 && r < 100 && b < 150; + } else { + return r + g > 300; + } +}; //暗度判断 +//光明模式, 如果亮度<0.7则需要处理, 否则就不需要处理 + +/** + * 从str到调亮的颜色str + * 这里处理一个style string的亮度 + * 纯函数 + * str: 一个颜色字符串 + * isback: 是否为背景 + * 废弃 return false 并不合理 + */ + + +exports.rgbok = rgbok; + +var lstr = function lstr(_ref2) { + var str = _ref2.str, + _ref2$isback = _ref2.isback, + isback = _ref2$isback === void 0 ? true : _ref2$isback; + var l; + + if (!str) { + return false; + } + + if (str === "initial") { + //如果是initial, 那么直接用我的值. + return isback ? darkcolor : lightcolor; + } + + if (/var\(--/.test(str)) { + //fixme 暂时在这里忽略css var #todo + return isback ? darkcolor : lightcolor; + } + + l = lrgb({ + rgb: str2rgb(str), + isback: isback + }); + return rgb2str(l); +}; +/** + * lightrgb核心亮度处理函数 + * * 亮度处理逻辑 t=max(100-g, 200-r), t+r, t+g, t+b + * * 暗度处理逻辑 t=max(g-60, r-100, b-150), r-t, g-t, b-t + * 废弃return false并不合理 + */ + + +exports.lstr = lstr; + +var lrgb = function lrgb(_ref3) { + var rgb = _ref3.rgb, + _ref3$isback = _ref3.isback, + isback = _ref3$isback === void 0 ? true : _ref3$isback; + var b, g, r, t; + + if (rgbok({ + rgb: rgb, + isback: isback + })) { + return rgb; + } + + r = rgb.r; + g = rgb.g; + b = rgb.b; + + if (isback) { + //处理暗黑背景 + t = Math.max(g - 60, r - 100, b - 150); + r -= t; + g -= t; + b -= t; //处理明亮前景 + } else { + t = Math.max(100 - g, 200 - r); + r += t; + g += t; + b += t; + } + + return { + r: r, + g: g, + b: b + }; +}; + +exports.lrgb = lrgb; + +lightstr = function lightstr(_ref4) { + var str = _ref4.str, + _ref4$isback = _ref4.isback, + isback = _ref4$isback === void 0 ? true : _ref4$isback; + var l; + + if (!str) { + return false; + } + + if (str === "initial") { + //如果是initial, 那么直接用我的值. + return isback ? darkcolor : lightcolor; + } + + if (/var\(--/.test(str)) { + //fixme 暂时在这里忽略css var #todo + return isback ? darkcolor : lightcolor; + } + + l = lightrgb({ + rgb: str2rgb(str), + isback: isback + }); + + if (l) { + return rgb2str(l); + } else { + return false; + } +}; + +lightrgb = function lightrgb(_ref5) { + var rgb = _ref5.rgb, + _ref5$isback = _ref5.isback, + isback = _ref5$isback === void 0 ? true : _ref5$isback; + var b, g, r, t; + + if (rgbok({ + rgb: rgb, + isback: isback + })) { + return false; + } + + r = rgb.r; + g = rgb.g; + b = rgb.b; + + if (isback) { + //处理暗黑背景 + t = Math.max(g - 60, r - 100, b - 150); + r -= t; + g -= t; + b -= t; //处理明亮前景 + } else { + t = Math.max(100 - g, 200 - r); + r += t; + g += t; + b += t; + } + + return { + r: r, + g: g, + b: b + }; +}; +/** + * --------------对比度逻辑, 配合darkstyle----------------- + * 这里的计算未必合适. + */ + +/** +* 从str到亮度 + */ + + +var getlight = function getlight(str) { + return getrgblight(str2rgb(str)); +}; + +exports.getlight = getlight; + +var getdark = function getdark(str) { + return getrgbdark(str2rgb(str)); +}; + +exports.getdark = getdark; + +getrgblight = function getrgblight(_ref6) { + var r = _ref6.r, + g = _ref6.g, + b = _ref6.b; + r = r * 1.2; + g = g * 1.7; + return mlight({ + r: r, + g: g, + b: b + }).light; +}; + +getrgbdark = function getrgbdark(_ref7) { + var r = _ref7.r, + g = _ref7.g, + b = _ref7.b; + r = r * 1.3; + g = g * 1.2; + return mlight({ + r: r, + g: g, + b: b + }).light; +}; + +mlight = function mlight(_ref8) { + var r = _ref8.r, + g = _ref8.g, + b = _ref8.b; + var b1, b2, b3; + + if (r > g) { + b1 = r; + b2 = g; + } else { + b1 = g; + b2 = r; + } + + if (b < b2) { + b3 = b; + } else if (b < b1) { + b3 = b2; + b2 = b; + } else { + b3 = b2; + b2 = b1; + b1 = b; + } + + return { + // 这里很不严谨, 亮度的心理阈限测量或许能让这个计算更精确. + light: (b1 + b2 / 6) * 2 / 3, + max: [b1, b2, b3] + }; +}; +/* + * 基础工具函数------------------------------------------------------- + * 判断两个rgbstr实际相等 + */ + + +var samergbstr = function samergbstr(rgbstr1, rgbstr2) { + var b1, b2, g1, g2, r1, r2; + + var _str2rgb = str2rgb(rgbstr1); + + r1 = _str2rgb.r; + g1 = _str2rgb.g; + b1 = _str2rgb.b; + + var _str2rgb2 = str2rgb(rgbstr2); + + r2 = _str2rgb2.r; + g2 = _str2rgb2.g; + b2 = _str2rgb2.b; + return r1 === r2 && g1 === g2 && b1 === b2; +}; + +exports.samergbstr = samergbstr; + +str2rgb = function str2rgb(str) { + var a, c, reg; //"rgb(154, 154, 0)" + + reg = /rgba?\(([0-9]{1,3}), ?([0-9]{1,3}), ?([0-9]{1,3})(, ?([0-9.%]+))?\)/i; + c = reg.exec(str); //16进制颜色 + + if (c == null) { + c = hex2rgb(str); + } //再判断名字颜色: + + + if (c == null) { + c = _colorname["default"][str] && hex2rgb(hex); + } + + if (c == null) { + return false; + } //透明度 + + + a = c[5] != null ? c[5] : 1; + return { + r: +c[1], + g: +c[2], + b: +c[3], + a: a //这里用+是为了把字符串转为数字, 不然会发生很隐蔽的bug. + + }; +}; + +rgb2str = function rgb2str(_ref9) { + var r = _ref9.r, + g = _ref9.g, + b = _ref9.b, + _ref9$a = _ref9.a, + a = _ref9$a === void 0 ? 1 : _ref9$a; + + if (a > 0.99) { + return "rgb(" + r + "," + g + "," + b + ")"; + } else { + return "rgba(" + r + "," + g + "," + b + "," + a + ")"; + } +}; + +hex2rgb = function hex2rgb(str) { + var c, reg, x, y; + reg = /#([^#]*)/i; //判断#62fa89这种类似方式的颜色值 + + c = reg.exec(str); + + if ((c != null ? c[1] : void 0) == null) { + return false; + } + + x = c[1]; + y = []; + + switch (x.length) { + case 3: + y[1] = parseInt('' + x[0] + x[0], 16); + y[2] = parseInt('' + x[1] + x[1], 16); + y[3] = parseInt('' + x[2] + x[2], 16); + break; + + case 4: + //y[1]=parseInt(x[0],16); /20201028修正错误, 这个会把fff转化为 r15g15b15, 其实应该是r255g255b255 + y[1] = parseInt('' + x[0] + x[0], 16); + y[2] = parseInt('' + x[1] + x[1], 16); + y[3] = parseInt('' + x[2] + x[2], 16); + y[5] = parseInt(x[3], 16) / 255; + break; + + case 6: + y[1] = parseInt('' + x[0] + x[1], 16); + y[2] = parseInt('' + x[2] + x[3], 16); + y[3] = parseInt('' + x[4] + x[5], 16); + break; + + case 8: + y[1] = parseInt('' + x[0] + x[1], 16); + y[2] = parseInt('' + x[2] + x[3], 16); + y[3] = parseInt('' + x[4] + x[5], 16); + y[5] = parseInt('' + x[6] + x[7], 16) / 255; + break; + + default: + //不满足上面四个情况, 直接返回false + return false; + } + + return y; +}; //console.log(str2rgb('white')); #test + + +test = function test() { + var result; + result = window.luoclr.lightstr({ + str: 'white', + isback: true + }); + return console.log({ + result: result + }); +}; //lightstr +//lightrgb + + +var _default = { + lstr: lstr, + lrgb: lrgb, + getlight: getlight, + getdark: getdark, + samergbstr: samergbstr +}; +exports.default = _default; + +/***/ }), + +/***/ "./src/mlib/src/file.cs": +/*!******************************!* + !*** ./src/mlib/src/file.cs ***! + \******************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.allfile = exports.readfile = exports.readir = exports.newdir = exports.mkdir = exports.exist = exports.filetype = exports.uniqueadd = exports.cover = exports.realpath = exports.savefile = void 0; + +var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "@babel/runtime/regenerator")); + +var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "@babel/runtime/helpers/asyncToGenerator")); + +var _promises = _interopRequireDefault(__webpack_require__(/*! fs/promises */ "fs/promises")); + +var _fs = _interopRequireDefault(__webpack_require__(/*! fs */ "fs")); + +var _os = _interopRequireDefault(__webpack_require__(/*! os */ "os")); + +//import {log} from './log.js' +var home, log; +home = _os["default"].homedir(); +log = console.log; // todo 保存文件 + +var savefile = function savefile(_ref) { + var json = _ref.json, + _ref$filename = _ref.filename, + filename = _ref$filename === void 0 ? "temptest.txt" : _ref$filename; + return _promises["default"].writeFile(filename, JSON.stringify(json), function (err) { + log('文件写入', filename); + + if (err) { + return log(err); + } + }); +}; // 拿到真正的path + + +exports.savefile = savefile; + +var realpath = function realpath(path) { + // home文件夹~, node不认, 要调整为os.homedir + if (/^~/.test(path)) { + return path.replace(/^~/, home); + } else { + return path; + } +}; // 加文件内容, 覆盖式 + + +exports.realpath = realpath; + +var cover = /*#__PURE__*/function () { + var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(_ref2) { + var path, str, _ref2$options, options; + + return _regenerator["default"].wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + path = _ref2.path, str = _ref2.str, _ref2$options = _ref2.options, options = _ref2$options === void 0 ? { + encoding: 'utf8' + } : _ref2$options; + _context.next = 3; + return _promises["default"].writeFile(realpath(path), str, options); + + case 3: + return _context.abrupt("return", true); + + case 4: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function cover(_x) { + return _ref3.apply(this, arguments); + }; +}(); // 追加文件内容, 保证追加内容不重复 + + +exports.cover = cover; + +var uniqueadd = /*#__PURE__*/function () { + var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref4) { + var path, reg, str, _ref4$options, options, fstr, rpath; + + return _regenerator["default"].wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + path = _ref4.path, reg = _ref4.reg, str = _ref4.str, _ref4$options = _ref4.options, options = _ref4$options === void 0 ? { + encoding: 'utf8' + } : _ref4$options; + // home文件夹~, node不认, 要调整为os.homedir + rpath = realpath(path); // 读取文件 + + _context2.next = 4; + return _promises["default"].readFile(rpath, options); + + case 4: + fstr = _context2.sent; + + if (!reg.test(fstr)) { + _context2.next = 7; + break; + } + + return _context2.abrupt("return", false); + + case 7: + _context2.next = 9; + return _promises["default"].appendFile(rpath, str != null ? str : reg.source, options); + + case 9: + return _context2.abrupt("return", true); + + case 10: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function uniqueadd(_x2) { + return _ref5.apply(this, arguments); + }; +}(); // 判断是文件/目录 + + +exports.uniqueadd = uniqueadd; + +var filetype = /*#__PURE__*/function () { + var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(path) { + var stat; + return _regenerator["default"].wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + _context3.next = 2; + return _promises["default"].lstat(realpath(path)); + + case 2: + stat = _context3.sent; + return _context3.abrupt("return", { + isfile: stat.isFile(), + isdir: stat.isDirectory() + }); + + case 4: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + + return function filetype(_x3) { + return _ref6.apply(this, arguments); + }; +}(); // 判断文件/目录是否存在 + + +exports.filetype = filetype; + +var exist = function exist(path) { + return _fs["default"].existsSync(realpath(path)); +}; // 建一个目录 + + +exports.exist = exist; + +var mkdir = /*#__PURE__*/function () { + var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(path) { + return _regenerator["default"].wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + _context4.next = 2; + return _promises["default"].mkdir(realpath(path), { + recursive: true + }); + + case 2: + return _context4.abrupt("return", _context4.sent); + + case 3: + case "end": + return _context4.stop(); + } + } + }, _callee4); + })); + + return function mkdir(_x4) { + return _ref7.apply(this, arguments); + }; +}(); // 如果不存在就建一个目录 + + +exports.mkdir = mkdir; + +var newdir = /*#__PURE__*/function () { + var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(path) { + return _regenerator["default"].wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + if (!exist(path)) { + _context5.next = 2; + break; + } + + return _context5.abrupt("return", false); + + case 2: + _context5.next = 4; + return _promises["default"].mkdir(realpath(path)); + + case 4: + return _context5.abrupt("return", _context5.sent); + + case 5: + case "end": + return _context5.stop(); + } + } + }, _callee5); + })); + + return function newdir(_x5) { + return _ref8.apply(this, arguments); + }; +}(); // 读取目录 + + +exports.newdir = newdir; + +var readir = /*#__PURE__*/function () { + var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(path) { + return _regenerator["default"].wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + _context6.next = 2; + return _promises["default"].readdir(realpath(path)); + + case 2: + return _context6.abrupt("return", _context6.sent); + + case 3: + case "end": + return _context6.stop(); + } + } + }, _callee6); + })); + + return function readir(_x6) { + return _ref9.apply(this, arguments); + }; +}(); // 读取文件 + + +exports.readir = readir; + +var readfile = /*#__PURE__*/function () { + var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(path) { + var fstr; + return _regenerator["default"].wrap(function _callee7$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + _context7.next = 2; + return _promises["default"].readFile(realpath(path), { + encoding: 'utf8' + }); + + case 2: + return _context7.abrupt("return", fstr = _context7.sent); + + case 3: + case "end": + return _context7.stop(); + } + } + }, _callee7); + })); + + return function readfile(_x7) { + return _ref10.apply(this, arguments); + }; +}(); // todo 读取目录中所有问题, 深度遍历 + + +exports.readfile = readfile; + +var allfile = function allfile(_ref11) { + var path = _ref11.path, + _ref11$reg = _ref11.reg, + reg = _ref11$reg === void 0 ? false : _ref11$reg, + _ref11$options = _ref11.options, + options = _ref11$options === void 0 ? { + encoding: 'utf8' + } : _ref11$options; + // 如果没传reg, 那么就是要所有文件 + return readdir(path, options); +}; + +exports.allfile = allfile; +var _default = { + savefile: savefile, + cover: cover, + uniqueadd: uniqueadd, + filetype: filetype, + exist: exist, + mkdir: mkdir, + readir: readir, + readfile: readfile, + allfile: allfile +}; +exports.default = _default; + +/***/ }), + +/***/ "./src/mlib/src/index.cs": +/*!*******************************!* + !*** ./src/mlib/src/index.cs ***! + \*******************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +Object.defineProperty(exports, "color", ({ + enumerable: true, + get: function get() { + return _color["default"]; + } +})); +Object.defineProperty(exports, "random", ({ + enumerable: true, + get: function get() { + return _random["default"]; + } +})); +Object.defineProperty(exports, "time", ({ + enumerable: true, + get: function get() { + return _time["default"]; + } +})); +Object.defineProperty(exports, "file", ({ + enumerable: true, + get: function get() { + return _file["default"]; + } +})); + +var _color = _interopRequireDefault(__webpack_require__(/*! ./color.cs */ "./src/mlib/src/color.cs")); + +var _random = _interopRequireDefault(__webpack_require__(/*! ./random.cs */ "./src/mlib/src/random.cs")); + +var _time = _interopRequireDefault(__webpack_require__(/*! ./time.cs */ "./src/mlib/src/time.cs")); + +var _file = _interopRequireDefault(__webpack_require__(/*! ./file.cs */ "./src/mlib/src/file.cs")); + +/***/ }), + +/***/ "./src/mlib/src/random.cs": +/*!********************************!* + !*** ./src/mlib/src/random.cs ***! + \********************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.randomlight = exports.randomcolor = exports.randomember = exports.randomint = void 0; + +var _color = __webpack_require__(/*! ./color.cs */ "./src/mlib/src/color.cs"); + +/* +* 拿到整数版本的随机数 +* 因为random不包含1, 因此, 这个随机数也不包含max +* 因此传入数组的长度正好合适作为数组的索引 + */ +var randomint = function randomint(max) { + return Math.random() * max >> 0; +}; +/* +数组中取一个随机element +*/ + + +exports.randomint = randomint; + +var randomember = function randomember(p) { + return p[randomint(p.length)]; +}; // 随机一个颜色 + + +exports.randomember = randomember; + +var randomcolor = function randomcolor() { + return "rgb(" + randomint(256) + "," + randomint(256) + "," + randomint(256) + ")"; +}; // 随机一个明亮颜色 + + +exports.randomcolor = randomcolor; + +var randomlight = function randomlight() { + return (0, _color.lstr)({ + str: randomcolor(0), + isback: false + }); +}; + +exports.randomlight = randomlight; +var _default = { + randomint: randomint, + randomember: randomember, + randomcolor: randomcolor, + randomlight: randomlight +}; +exports.default = _default; + +/***/ }), + +/***/ "./src/mlib/src/time.cs": +/*!******************************!* + !*** ./src/mlib/src/time.cs ***! + \******************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.default = exports.gethhmmss = exports.gethhmm = exports.sleep = void 0; + +var sleep = function sleep(ms) { + return new Promise(function (resolve) { + return setTimeout(resolve, ms); + }); +}; + +exports.sleep = sleep; + +var gethhmm = function gethhmm() { + var timestamp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Date.now(); + var t; + t = new Date(+timestamp); + return t.getHours() + ':' + t.getMinutes(); +}; + +exports.gethhmm = gethhmm; + +var gethhmmss = function gethhmmss() { + var timestamp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Date.now(); + var t; + t = new Date(+timestamp); + return t.getHours() + ':' + t.getMinutes() + ':' + t.getSeconds(); +}; + +exports.gethhmmss = gethhmmss; +var _default = { + sleep: sleep, + gethhmm: gethhmm, + gethhmmss: gethhmmss +}; +exports.default = _default; + +/***/ }), + +/***/ "./src/mlib/src/colorname.cson": +/*!*************************************!* + !*** ./src/mlib/src/colorname.cson ***! + \*************************************/ +/***/ ((module) => { + +module.exports = {"black":"#000","silver":"#c0c0c0","gray":"#808080","white":"#fff","maroon":"#800000","red":"#ff0000","purple":"#800080","fuchsia":"#ff00ff","green":"#008000","lime":"#00ff00","olive":"#808000","yellow":"#ffff00","navy":"#000080","blue":"#0000ff","teal":"#008080","aqua":"#00ffff","orange":"#ffa500","aliceblue":"#f0f8ff","antiquewhite":"#faebd7","aquamarine":"#7fffd4","azure":"#f0ffff","beige":"#f5f5dc","bisque":"#ffe4c4","blanchedalmond":"#ffebcd","blueviolet":"#8a2be2","brown":"#a52a2a","burlywood":"#deb887","cadetblue":"#5f9ea0","chartreuse":"#7fff00","chocolate":"#d2691e","coral":"#ff7f50","cornflowerblue":"#6495ed","cornsilk":"#fff8dc","crimson":"#dc143c","cyan":"#00ffff","darkblue":"#00008b","darkcyan":"#008b8b","darkgoldenrod":"#b8860b","darkgray":"#a9a9a9","darkgreen":"#006400","darkgrey":"#a9a9a9","darkkhaki":"#bdb76b","darkmagenta":"#8b008b","darkolivegreen":"#556b2f","darkorange":"#ff8c00","darkorchid":"#9932cc","darkred":"#8b0000","darksalmon":"#e9967a","darkseagreen":"#8fbc8f","darkslateblue":"#483d8b","darkslategray":"#2f4f4f","darkslategrey":"#2f4f4f","darkturquoise":"#00ced1","darkviolet":"#9400d3","deeppink":"#ff1493","deepskyblue":"#00bfff","dimgray":"#696969","dimgrey":"#696969","dodgerblue":"#1e90ff","firebrick":"#b22222","floralwhite":"#fffaf0","forestgreen":"#228b22","gainsboro":"#dcdcdc","ghostwhite":"#f8f8ff","gold":"#ffd700","goldenrod":"#daa520","greenyellow":"#adff2f","grey":"#808080","honeydew":"#f0fff0","hotpink":"#ff69b4","indianred":"#cd5c5c","indigo":"#4b0082","ivory":"#fffff0","khaki":"#f0e68c","lavender":"#e6e6fa","lavenderblush":"#fff0f5","lawngreen":"#7cfc00","lemonchiffon":"#fffacd","lightblue":"#add8e6","lightcoral":"#f08080","lightcyan":"#e0ffff","lightgoldenrodyellow":"#fafad2","lightgray":"#d3d3d3","lightgreen":"#90ee90","lightgrey":"#d3d3d3","lightpink":"#ffb6c1","lightsalmon":"#ffa07a","lightseagreen":"#20b2aa","lightskyblue":"#87cefa","lightslategray":"#778899","lightslategrey":"#778899","lightsteelblue":"#b0c4de","lightyellow":"#ffffe0","limegreen":"#32cd32","linen":"#faf0e6","magenta":"#ff00ff","mediumaquamarine":"#66cdaa","mediumblue":"#0000cd","mediumorchid":"#ba55d3","mediumpurple":"#9370db","mediumseagreen":"#3cb371","mediumslateblue":"#7b68ee","mediumspringgreen":"#00fa9a","mediumturquoise":"#48d1cc","mediumvioletred":"#c71585","midnightblue":"#191970","mintcream":"#f5fffa","mistyrose":"#ffe4e1","moccasin":"#ffe4b5","navajowhite":"#ffdead","oldlace":"#fdf5e6","olivedrab":"#6b8e23","orangered":"#ff4500","orchid":"#da70d6","palegoldenrod":"#eee8aa","palegreen":"#98fb98","paleturquoise":"#afeeee","palevioletred":"#db7093","papayawhip":"#ffefd5","peachpuff":"#ffdab9","peru":"#cd853f","pink":"#ffc0cb","plum":"#dda0dd","powderblue":"#b0e0e6","rosybrown":"#bc8f8f","royalblue":"#4169e1","saddlebrown":"#8b4513","salmon":"#fa8072","sandybrown":"#f4a460","seagreen":"#2e8b57","seashell":"#fff5ee","sienna":"#a0522d","skyblue":"#87ceeb","slateblue":"#6a5acd","slategray":"#708090","slategrey":"#708090","snow":"#fffafa","springgreen":"#00ff7f","steelblue":"#4682b4","tan":"#d2b48c","thistle":"#d8bfd8","tomato":"#ff6347","transparent":"#0000","turquoise":"#40e0d0","violet":"#ee82ee","wheat":"#f5deb3","whitesmoke":"#f5f5f5","yellowgreen":"#9acd32","rebeccapurple":"#663399"} + +/***/ }), + +/***/ "@babel/runtime/helpers/asyncToGenerator": +/*!**********************************************************!* + !*** external "@babel/runtime/helpers/asyncToGenerator" ***! + \**********************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("@babel/runtime/helpers/asyncToGenerator");; + +/***/ }), + +/***/ "@babel/runtime/helpers/interopRequireDefault": +/*!***************************************************************!* + !*** external "@babel/runtime/helpers/interopRequireDefault" ***! + \***************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("@babel/runtime/helpers/interopRequireDefault");; + +/***/ }), + +/***/ "@babel/runtime/regenerator": +/*!*********************************************!* + !*** external "@babel/runtime/regenerator" ***! + \*********************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("@babel/runtime/regenerator");; + +/***/ }), + +/***/ "chalk": +/*!************************!* + !*** external "chalk" ***! + \************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("chalk");; + +/***/ }), + +/***/ "fs": +/*!*********************!* + !*** external "fs" ***! + \*********************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("fs");; + +/***/ }), + +/***/ "fs/promises": +/*!******************************!* + !*** external "fs/promises" ***! + \******************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("fs/promises");; + +/***/ }), + +/***/ "os": +/*!*********************!* + !*** external "os" ***! + \*********************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("os");; + +/***/ }) + +}; +; + +// load runtime +var __webpack_require__ = require("../runtime/runtime.js"); +__webpack_require__.C(exports); +return __webpack_require__.X([], "./src/lornpughelp.cs"); +})(); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tbGliL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9tbGliLy4vc3JjL2xvcm5wdWdoZWxwLmNzIiwid2VicGFjazovL21saWIvLi9zcmMvbWxpYi9zcmMvY29sb3IuY3MiLCJ3ZWJwYWNrOi8vbWxpYi8uL3NyYy9tbGliL3NyYy9maWxlLmNzIiwid2VicGFjazovL21saWIvLi9zcmMvbWxpYi9zcmMvaW5kZXguY3MiLCJ3ZWJwYWNrOi8vbWxpYi8uL3NyYy9tbGliL3NyYy9yYW5kb20uY3MiLCJ3ZWJwYWNrOi8vbWxpYi8uL3NyYy9tbGliL3NyYy90aW1lLmNzIiwid2VicGFjazovL21saWIvLi9zcmMvbWxpYi9zcmMvY29sb3JuYW1lLmNzb24iLCJ3ZWJwYWNrOi8vbWxpYi9leHRlcm5hbCBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiIiwid2VicGFjazovL21saWIvZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiIiwid2VicGFjazovL21saWIvZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiIiwid2VicGFjazovL21saWIvZXh0ZXJuYWwgXCJjaGFsa1wiIiwid2VicGFjazovL21saWIvZXh0ZXJuYWwgXCJmc1wiIiwid2VicGFjazovL21saWIvZXh0ZXJuYWwgXCJmcy9wcm9taXNlc1wiIiwid2VicGFjazovL21saWIvZXh0ZXJuYWwgXCJvc1wiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNWQTs7QUFFQTs7QUFGQTs7OztBQU1BLElBQU8sUUFBTyxTQUFQLEtBQU87U0FDYixhO0FBUEQsQ0FNQSxDOzs7OztBQUlBLElBQU87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QUFGbkIsQ0FBbEI7OztlQU9lO0FBQ2QsT0FEYyxFQUNkLEtBRGM7QUFFZCxTQUZjLEVBRWQsT0FGYztBQUdkLFdBSGMsRUFHZDtBQUhjLEM7Ozs7Ozs7Ozs7O0FDaEJmLGtCQUFrQiw4ckc7Ozs7Ozs7Ozs7O0FDQWxCLHFFOzs7Ozs7Ozs7OztBQ0FBLDBFOzs7Ozs7Ozs7OztBQ0FBLHdEOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLGdDOzs7Ozs7Ozs7OztBQ0FBLHlDOzs7Ozs7Ozs7OztBQ0FBLGdDIiwiZmlsZSI6Imxvcm5wdWdoZWxwL2xvcm5wdWdoZWxwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wibWxpYlwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJtbGliXCJdID0gZmFjdG9yeSgpO1xufSkoZ2xvYmFsLCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG4jY2hhbGsgPSByZXF1aXJlKCdjaGFsaycpXG5pbXBvcnQge2ZpbGV9IGZyb20gJ21saWInXG5cbiMgLS0tLS0tLS0tLS0tLS0tLS1wdXJlIGZ1bmN0aW9uLS0tLS0tLS0tLS0tLS0tLS1cbiMg5Yik5pat5piv5ZCm5pyJ5ZG95Luk5Y+C5pWwKC0t5byA5aeL55qE5ZG95Luk5Y+C5pWwKSwg5rKh5pyJLS3nmoTpg73mmK/mlofku7ZcbmV4cG9ydCBpc2NtZD0gKHgpLT5cblx0L14tLS8udGVzdCB4XG5cbiMg5aSE55CGbHDlkb3ku6RcbmV4cG9ydCBkb2xwID0gLT5cblx0c3RyPScnJ1xuXHQjIOiIlOeLl+mhueebrlxuXHRhbGlhcyBscD1cImxwZ1wiXG5cdCcnJ1xuXHRyZWc9L2FsaWFzXFxzKmxwPVwibHBnXCIvXG5cdG9rPWF3YWl0IGZpbGUudW5pcXVlYWRkIHtcblx0XHRyZWdcblx0XHRzdHJcblx0XHRwYXRoOid+Ly56c2hyYydcblx0XHQjcGF0aDogJ1JFQURNRS5tZCdcblx0fVxuXHRpZiBva1xuXHRcdGNvbnNvbGUubG9nICggJ+WRveS7pOiuvue9ruS4umxwJyksIChjaGFsay5ncmVlbkJyaWdodCAn5oiQ5YqfOiAnKSwn6ZyA6KaB5Yi35paw6YWN572u5omN5Lya55Sf5pWILCDmjqjojZDkvb/nlKjlv6vmjbfph43lkK/lkb3ku6Q6J1xuXHRcdGNvbnNvbGUubG9nIChjaGFsay5ncmVlbkJyaWdodCAnZXhlYyB6c2gnKSwoY2hhbGsueWVsbG93ICcjIOmHjeWQr+W9k+WJjXRlcm1pbmFsJylcblxuXHRcdGNvbnNvbGUubG9nICAn5aaC5p6c5LiN6IO96YeN5ZCvdGVybWluYWw6ICdcblx0XHRjb25zb2xlLiBsb2cgKGNoYWxrLmdyZWVuQnJpZ2h0ICdzb3VyY2Ugfi8uenNocmMnKSwgKGNoYWxrLnllbGxvdyAnIyDlr7zlhaXphY3nva7mlofku7bmlrnms5XkuIAnKVxuXHRcdGNvbnNvbGUuIGxvZyAoY2hhbGsuZ3JlZW5CcmlnaHQgJy4gfi8uenNocmMnKSwgKGNoYWxrLnllbGxvdyAnIyDlr7zlhaXphY3nva7mlofku7bmlrnms5XkuownKVxuXHRlbHNlXG5cdFx0Y29uc29sZS5sb2cgKGNoYWxrLnJlZEJyaWdodCAn5rKh5pyJJyksICggJ+i/m+ihjOiuvue9riwg5Y+v6IO95piv6YWN572u5paH5Lu25bey57uP5a2Y5ZyoJyksIChjaGFsay55ZWxsb3cgJ+ivt+aJi+W3peajgOafpeaWh+S7tjogJyksJ34vLnpzaHJjJ1xuXG4jIOWkhOeQhuS4gOS4qmNz5oiW6ICFY29mZmVl55qE5Yid5aeL5YyWXG5kaXIxZmlsZSA9IChwYXRoKS0+XG5cdHA9IHBhdGgrJy5scCdcblx0IyDliKTmlq3lr7nlupTnm67lvZXmmK/lkKblrZjlnKguXG5cdHJldHVybiBpZiAoZmlsZS5leGlzdCBwKVxuXHQjIOaWsOW7uuebruW9lVxuXHRhd2FpdCBmaWxlLm1rZGlyIHBcblx0IyB0b2Rv6K+75Y+W5paH5Lu2LCDliIbmnpDlh73mlbAsIOW7uueri+WvueW6lOeahOa1i+ivleaWh+S7tlxuXHQjIOWIneWni+WMlua1i+ivleaWh+S7tlxuXHRhd2FpdCBmaWxlLmNvdmVyIHBhdGg6cCsnL2FhYS4waS5jc29uJyxzdHI6Jydcblx0YXdhaXQgZmlsZS5jb3ZlciBwYXRoOnArJy9hYWEuMG8uY3Nvbicsc3RyOicnXG5cdGF3YWl0IGZpbGUuY292ZXIgcGF0aDpwKycvY3RvLmNzb24nLHN0cjonJ1xuXG4jIOWkhOeQhuWIneWni+WMlua1i+ivlWRpclxuZXhwb3J0IGRvZGlyID0gKHBhdGgpLT5cblx0c3RhdD0gYXdhaXQgZmlsZS5maWxldHlwZSBwYXRoXG5cdGlmIHN0YXQuaXNmaWxlICMg5paH5Lu25aSE55CGXG5cdFx0IyDlpITnkIZjb2ZmZWXlkoxjc1xuXHRcdHJldHVybiB1bmxlc3MgL1xcLmNvZmZlZSR8XFwuY3MkLy50ZXN0IHBhdGhcblx0XHRkaXIxZmlsZSBwYXRoXG5cdGlmIHN0YXQuaXNkaXIgIyDnm67lvZXlpITnkIZcblx0XHQjIOmAkuW9kuWkhOeQhuebruW9lSwg6KaB6YG/5byA6Ieq5Yqo55Sf5oiQ55qE55uu5b2VKOWQjeensOmHjOmdouW4pueCueeahClcblx0XHRyZXR1cm4gaWYgL1xcLi8udGVzdCBwYXRoXG5cdFx0IyDor7vlj5bnm67lvZUsIOmAkOmhueWkhOeQhlxuXHRcdGRvZGlyIHggZm9yIHggaW4gYXdhaXQgZmlsZS5yZWFkaXIgcGF0aFxuXHRyZXR1cm4gIyDpmaTkuoZmaWxl5ZKMZGly5Y+v6IO96L+Y5pyJ5YW25LuW5oOF5Ya1LCDmr5TlpoLnrKblj7fpk77mjqVcblxuZXhwb3J0IGRlZmF1bHQge1xuXHRpc2NtZFxuXHRkb2xwXG5cdGRvZGlyXG59XG5cbmRvZGlyICcuJ1xuIiwiIyMjXG4gKiDlhbPkuo7popzoibLnmoTlupMsIOi/meS4quW6k+S8muiiq+mHjeWGmSwg5Zug5Li6aHNs55qE5Lqu5bqm5Yik5pat5Y+v5Lul6K6k5Li65piv6ZSZ55qELiDmiYDku6Xlj6/ku6Xkv53nlZloc2znm7jlhbPnmoTlh73mlbAsIOS9huaYrywg5a6e6ZmF5bqU55So5Ye95pWw6ZyA6KaB6YeN5YaZLlxuICpcbiMjI1xuaW1wb3J0IGNvbG9ybmFtZSBmcm9tICcuL2NvbG9ybmFtZS5jc29uJ1xuXG5kYXJrY29sb3I9ICdyZ2JhKDQ0LDQ0LDQ0LDEpJyAjZGFya+eahOWfuuehgOminOiJslxubGlnaHRjb2xvcj0gJ3JnYmEoMjAwLDIwMCwyMDAsMSknXG5cblxuXG5cblxuIyMjKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0t5Y2V54us5aSE55CG5YmN5pmv5oiW6ICF6IOM5pmvLCDphY3lkIhkYXJrY3Nz55qE5oCd6LevLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDkuq7luqbliKTmlq3pgLvovpEgZz4xMDAsIHI+MjAwLCDmiJbogIVnK3I+MzAwXG4gKiDkuq7luqblpITnkIbpgLvovpEgdD1tYXgoMTAwLWcsIDIwMC1yKSwgdCtyLCB0K2csIHQrYlxuICpcbiAqIOaal+W6puWIpOaWremAu+i+kSBnPDYwIHI8MTAwIGI8MTUwXG4gKiDmmpfluqblpITnkIbpgLvovpEgdD1tYXgoZy02MCwgci0xMDAsIGItMTUwKSwgci10LCBnLXQsIGItdFxuICpcbiAjIyNcblxuXHQjIyMqXG5cdCAqIHJnYm9rXG5cdCAqIOWIpOaWreminOiJsuaYr+WQpumcgOimgeWkhOeQhlxuXHQgKiAgKiDkuq7luqbliKTmlq3pgLvovpEgZz4xMDAsIHI+MjAwLCDmiJbogIVnK3I+MzAwXG5cdCAqICAqIOaal+W6puWIpOaWremAu+i+kSBnPDYwIHI8MTAwIGI8MTUwXG5cdCAqIOWPguaVsFxuXHQgKiBcdHJnYjp7cixnLGJ9XG5cdCAqICBpc2JhY2s6IOaYr+WQpuS4uuiDjOaZr+WbvueJh1xuXHQgKiDov5Tlm57lgLxcblx0ICogXHRcdHRydWU6IOS4jemcgOimgeWkhOeQhlxuXHQgKiBcdFx0ZmFsc2U6IOmcgOimgeWkhOeQhlxuXHQgIyMjXG5leHBvcnQgcmdib2s9KHtyZ2IsaXNiYWNrPXRydWV9KS0+XG5cdHtyLGcsYn09cmdiXG5cdGlmIGlzYmFjayB0aGVuIFx0Zzw2MCAmJiByPDEwMCAmJiBiPDE1MCBlbHNlIHIrZz4zMDBcblx0XHRcdCPmmpfluqbliKTmlq1cblx0XHRcdCPlhYnmmI7mqKHlvI8sIOWmguaenOS6ruW6pjwwLjfliJnpnIDopoHlpITnkIYsIOWQpuWImeWwseS4jemcgOimgeWkhOeQhlxuXG5cbiMjIypcbiAqIOS7jnN0cuWIsOiwg+S6rueahOminOiJsnN0clxuICogIOi/memHjOWkhOeQhuS4gOS4qnN0eWxlIHN0cmluZ+eahOS6ruW6plxuICog57qv5Ye95pWwXG4gKiBzdHI6IOS4gOS4quminOiJsuWtl+espuS4slxuICogaXNiYWNrOiDmmK/lkKbkuLrog4zmma9cbiAqIOW6n+W8gyByZXR1cm4gZmFsc2Ug5bm25LiN5ZCI55CGXG4jIyNcbmV4cG9ydCBsc3RyPSh7c3RyLGlzYmFjaz10cnVlfSkgLT5cblx0cmV0dXJuIGZhbHNlIGlmKCFzdHIpXG5cdFxuXHQj5aaC5p6c5pivaW5pdGlhbCwg6YKj5LmI55u05o6l55So5oiR55qE5YC8LlxuXHRyZXR1cm4gKGlmIGlzYmFjayB0aGVuIGRhcmtjb2xvciBlbHNlIGxpZ2h0Y29sb3IpIGlmIHN0cj09XCJpbml0aWFsXCJcblx0XG5cdCNmaXhtZSDmmoLml7blnKjov5nph4zlv73nlaVjc3MgdmFyICAjdG9kb1xuXHRyZXR1cm4gKGlmIGlzYmFjayB0aGVuIGRhcmtjb2xvciBlbHNlIGxpZ2h0Y29sb3IpaWYgL3ZhclxcKC0tLy50ZXN0KHN0cilcblxuXHRsPWxyZ2Ige3JnYjogc3RyMnJnYihzdHIpLGlzYmFja31cblx0cmdiMnN0cihsKVxuXG4jIyMqXG5cdCAqIGxpZ2h0cmdi5qC45b+D5Lqu5bqm5aSE55CG5Ye95pWwXG5cdCAqICAqIOS6ruW6puWkhOeQhumAu+i+kSB0PW1heCgxMDAtZywgMjAwLXIpLCB0K3IsIHQrZywgdCtiXG5cdCAqICAqIOaal+W6puWkhOeQhumAu+i+kSB0PW1heChnLTYwLCByLTEwMCwgYi0xNTApLCByLXQsIGctdCwgYi10XG5cdCAqIOW6n+W8g3JldHVybiBmYWxzZeW5tuS4jeWQiOeQhlxuIyMjXG5leHBvcnQgbHJnYj0oe3JnYixpc2JhY2s9dHJ1ZX0pIC0+XG5cdHJldHVybiByZ2IgaWYgcmdib2sge3JnYixpc2JhY2t9XG5cdHtyLGcsYn09cmdiXG5cdGlmIChpc2JhY2spICAj5aSE55CG5pqX6buR6IOM5pmvXG5cdFx0dD0gTWF0aC5tYXgoZy02MCxyLTEwMCwgYi0xNTApXG5cdFx0ci09dFxuXHRcdGctPXRcblx0XHRiLT10XG5cdGVsc2UgICPlpITnkIbmmI7kuq7liY3mma9cblx0XHR0PSBNYXRoLm1heCgxMDAtZywyMDAtcilcblx0XHRyKz10XG5cdFx0Zys9dFxuXHRcdGIrPXRcblx0e3IsZyxifVxuXG4jIyMqXG4gKiDku45zdHLliLDosIPkuq7nmoTpopzoibJzdHJcbiAqICDov5nph4zlpITnkIbkuIDkuKpzdHlsZSBzdHJpbmfnmoTkuq7luqZcbiAqIOe6r+WHveaVsFxuICogc3RyOiDkuIDkuKrpopzoibLlrZfnrKbkuLJcbiAqIGlzYmFjazog5piv5ZCm5Li66IOM5pmvXG4gKiDlup/lvIMgcmV0dXJuIGZhbHNlIOW5tuS4jeWQiOeQhlxuIyMjXG5saWdodHN0cj0oe3N0cixpc2JhY2s9dHJ1ZX0pIC0+XG5cdHJldHVybiBmYWxzZSBpZighc3RyKVxuXHRcblx0I+WmguaenOaYr2luaXRpYWwsIOmCo+S5iOebtOaOpeeUqOaIkeeahOWAvC5cblx0cmV0dXJuIChpZiBpc2JhY2sgdGhlbiBkYXJrY29sb3IgZWxzZSBsaWdodGNvbG9yKSBpZiBzdHI9PVwiaW5pdGlhbFwiXG5cdFxuXHQjZml4bWUg5pqC5pe25Zyo6L+Z6YeM5b+955WlY3NzIHZhciAgI3RvZG9cblx0cmV0dXJuIChpZiBpc2JhY2sgdGhlbiBkYXJrY29sb3IgZWxzZSBsaWdodGNvbG9yKWlmIC92YXJcXCgtLS8udGVzdChzdHIpXG5cdGw9bGlnaHRyZ2Ige3JnYjogc3RyMnJnYihzdHIpLGlzYmFja31cblx0aWYgbCB0aGVuIHJnYjJzdHIobCkgZWxzZSBmYWxzZVxuXG5cblxuIyMjKlxuXHQgKiBsaWdodHJnYuaguOW/g+S6ruW6puWkhOeQhuWHveaVsFxuXHQgKiAgKiDkuq7luqblpITnkIbpgLvovpEgdD1tYXgoMTAwLWcsIDIwMC1yKSwgdCtyLCB0K2csIHQrYlxuXHQgKiAgKiDmmpfluqblpITnkIbpgLvovpEgdD1tYXgoZy02MCwgci0xMDAsIGItMTUwKSwgci10LCBnLXQsIGItdFxuXHQgKiDlup/lvINyZXR1cm4gZmFsc2XlubbkuI3lkIjnkIZcbiMjI1xubGlnaHRyZ2I9KHtyZ2IsaXNiYWNrPXRydWV9KSAtPlxuXHRyZXR1cm4gZmFsc2UgaWYocmdib2soe3JnYixpc2JhY2t9KSlcblx0e3IsZyxifT1yZ2Jcblx0aWYgKGlzYmFjaykgICPlpITnkIbmmpfpu5Hog4zmma9cblx0XHR0PSBNYXRoLm1heChnLTYwLHItMTAwLCBiLTE1MClcblx0XHRyLT10XG5cdFx0Zy09dFxuXHRcdGItPXRcblx0ZWxzZSAgI+WkhOeQhuaYjuS6ruWJjeaZr1xuXHRcdHQ9IE1hdGgubWF4KDEwMC1nLDIwMC1yKVxuXHRcdHIrPXRcblx0XHRnKz10XG5cdFx0Yis9dFxuXHR7cixnLGJ9XG5cblxuXG5cblxuIyMjKlxuICogLS0tLS0tLS0tLS0tLS3lr7nmr5TluqbpgLvovpEsIOmFjeWQiGRhcmtzdHlsZS0tLS0tLS0tLS0tLS0tLS0tXG4gKiDov5nph4znmoTorqHnrpfmnKrlv4XlkIjpgIIuXG4jIyNcblxuXG5cblxuXHRcdCMjIypcblx0XHQgKiDku45zdHLliLDkuq7luqZcblx0XHQgIyMjXG5leHBvcnQgZ2V0bGlnaHQ9IChzdHIpIC0+XG5cdGdldHJnYmxpZ2h0IHN0cjJyZ2Igc3RyXG5cdFx0XG5leHBvcnQgZ2V0ZGFyaz0oc3RyKSAtPlxuXHRnZXRyZ2JkYXJrIHN0cjJyZ2Igc3RyXG5cdFx0XG5cblxuXG4jIyMqXG5cdCog5ou/5Yiw6KeG6KeJ5Lqu5bqmXG5cdCog55So5p2l5Yik5pat6aKc6Imy5piv5ZCm5aSf5LquXG5cdCog5pyq5p2l55So6I2n5YWJ5L2T5Y+R5YWJ6IO96YeP5p2l6K6h566X5pWw5YC8LlxuIyMjXG5nZXRyZ2JsaWdodD0gKHtyLGcsYn0pLT5cblx0cj1yKjEuMlxuXHRnPWcqMS43XG5cdG1saWdodCh7cixnLGJ9KS5saWdodFxuXG4jIyMqXG5cdCog5ou/5Yiw6KeG6KeJ5pqX5bqmXG5cdCog55So5p2l5Yik5pat6aKc6Imy5piv5ZCm5aSf5pqXXG5cdCpcbiMjI1xuZ2V0cmdiZGFyaz0oe3IsZyxifSktPlxuXHRyPXIqMS4zXG5cdGc9ZyoxLjJcblx0bWxpZ2h0KHtyLGcsYn0pLmxpZ2h0XG5cbm1saWdodD0oe3IsZyxifSktPlxuXHRpZiByID4gZ1xuXHRcdGIxPXJcblx0XHRiMj1nXG5cdGVsc2Vcblx0XHRiMT1nXG5cdFx0YjI9clxuXHRcblx0aWYgYiA8IGIyXG5cdFx0YjM9YlxuXHRlbHNlIGlmIGIgPCBiMVxuXHRcdGIzPWIyXG5cdFx0YjI9YlxuXHRlbHNlXG5cdFx0YjM9YjJcblx0XHRiMj1iMVxuXHRcdGIxPWJcblx0XHRcdCMg6L+Z6YeM5b6I5LiN5Lil6LCoLCDkuq7luqbnmoTlv4PnkIbpmIjpmZDmtYvph4/miJborrjog73orqnov5nkuKrorqHnrpfmm7Tnsr7noa4uXG5cdGxpZ2h0OiAoYjErYjIvNikqMi8zLG1heDogW2IxLGIyLGIzXVxuXHRcblxuXG5cblxuXG5cblxuXG4jIyNcblx0KiDln7rnoYDlt6Xlhbflh73mlbAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCog5Yik5pat5Lik5Liqcmdic3Ry5a6e6ZmF55u4562JXG4jIyNcblxuZXhwb3J0IHNhbWVyZ2JzdHI9KHJnYnN0cjEscmdic3RyMiktPlxuXHR7cjogcjEsZzogZzEsYjogYjF9PXN0cjJyZ2Iocmdic3RyMSlcblx0e3I6IHIyLGc6IGcyLGI6IGIyfT1zdHIycmdiKHJnYnN0cjIpXG5cdHIxPT1yMiYmZzE9PWcyJiZiMT09YjJcblxuXG4jIyMqXG4qIDPnp43mg4XlhrVcbiogMS4gcmdi5oOF5Ya1OiDku45cInJnYigxNTQsIDE1NCwgMClcIui9rOWMluS4ujoge3I6MTU0LGc6MTU0LGI6MCx9XG4qIFwicmdiYSgwLCAwLCAwLCAwKVwiIOi/mOmcgOWFvOWuueatpOenjeaDheWGtVxuKiAyLiAxNui/m+WItuaDheWGtTogICNmYzIgICNmYzI5ICNmYzI5MjkyMyAjZmMyOTI5XG4qIDMuIOminOiJsuWQjTogd2hpdGUsIGJsYWNrLCBvcmdhbmdlXG4qIyMjXG5cbnN0cjJyZ2I9KHN0ciktPlxuXG5cdCNcInJnYigxNTQsIDE1NCwgMClcIlxuXHRyZWc9L3JnYmE/XFwoKFswLTldezEsM30pLCA/KFswLTldezEsM30pLCA/KFswLTldezEsM30pKCwgPyhbMC05LiVdKykpP1xcKS9pXG5cdGM9cmVnLmV4ZWMgc3RyXG5cblx0IzE26L+b5Yi26aKc6ImyXG5cdGM/PWhleDJyZ2Ioc3RyKVxuXG5cdCPlho3liKTmlq3lkI3lrZfpopzoibI6XG5cdGM/PSBjb2xvcm5hbWVbc3RyXSAmJiBoZXgycmdiKGhleClcblx0XG5cdHJldHVybiBmYWxzZSB1bmxlc3MgYz9cblxuXG5cdCPpgI/mmI7luqZcblx0YT0gaWYgY1s1XT8gdGhlbiBjWzVdIGVsc2UgMVxuXHR7cjogK2NbMV0sZzogK2NbMl0sYjogK2NbM10sYX0gI+i/memHjOeUqCvmmK/kuLrkuobmiorlrZfnrKbkuLLovazkuLrmlbDlrZcsIOS4jeeEtuS8muWPkeeUn+W+iOmakOiUveeahGJ1Zy5cblxuXG5cdCMjI1xuXHQgKiDku45yZ2LliLBzdHJcblx0ICojIyNcbnJnYjJzdHI9KHtyLGcsYixhPTF9KSAtPlxuXHRpZiBhPjAuOTkgdGhlbiAgXCJyZ2IoXCIrcitcIixcIitnK1wiLFwiK2IrXCIpXCIgZWxzZSBcInJnYmEoXCIrcitcIixcIitnK1wiLFwiK2IrXCIsXCIrYStcIilcIlxuXG5cblx0IyMjXG5cdCAqIOS7jjE26L+b5Yi25YiwcmdiXG5cdCAqICAjZmMyICAjZmMyOSAjZmMyOTI5MjMgI2ZjMjkyOSwgMyw0LDYsOOmDveacieWPr+iDvVxuXHQjIyNcblxuXG5oZXgycmdiPShzdHIpIC0+XG5cdHJlZz0vIyhbXiNdKikvaSAj5Yik5patIzYyZmE4Oei/meenjeexu+S8vOaWueW8j+eahOminOiJsuWAvFxuXHRjPXJlZy5leGVjKHN0cilcblx0cmV0dXJuIGZhbHNlIHVubGVzcyBjP1sxXT8gXHQjYzHkuI3lrZjlnKjpnIDopoFyZXR1cm5cblx0eD1jWzFdXG5cdHk9W11cblx0c3dpdGNoIHgubGVuZ3RoXG5cdFx0d2hlbiAzXG5cdFx0XHR5WzFdPXBhcnNlSW50KCcnK3hbMF0reFswXSwxNilcblx0XHRcdHlbMl09cGFyc2VJbnQoJycreFsxXSt4WzFdLDE2KVxuXHRcdFx0eVszXT1wYXJzZUludCgnJyt4WzJdK3hbMl0sMTYpXG5cdFx0d2hlbiA0XG5cdFx0XHQjeVsxXT1wYXJzZUludCh4WzBdLDE2KTsgIC8yMDIwMTAyOOS/ruato+mUmeivrywg6L+Z5Liq5Lya5oqKZmZm6L2s5YyW5Li6IHIxNWcxNWIxNSwg5YW25a6e5bqU6K+l5pivcjI1NWcyNTViMjU1XG5cdFx0XHR5WzFdPXBhcnNlSW50KCcnK3hbMF0reFswXSwxNilcblx0XHRcdHlbMl09cGFyc2VJbnQoJycreFsxXSt4WzFdLDE2KVxuXHRcdFx0eVszXT1wYXJzZUludCgnJyt4WzJdK3hbMl0sMTYpXG5cdFx0XHR5WzVdPXBhcnNlSW50KHhbM10sMTYpLzI1NVxuXHRcdHdoZW4gNlxuXHRcdFx0eVsxXT1wYXJzZUludCgnJyt4WzBdK3hbMV0sMTYpXG5cdFx0XHR5WzJdPXBhcnNlSW50KCcnK3hbMl0reFszXSwxNilcblx0XHRcdHlbM109cGFyc2VJbnQoJycreFs0XSt4WzVdLDE2KVxuXHRcdHdoZW4gOFxuXHRcdFx0eVsxXT1wYXJzZUludCgnJyt4WzBdK3hbMV0sMTYpXG5cdFx0XHR5WzJdPXBhcnNlSW50KCcnK3hbMl0reFszXSwxNilcblx0XHRcdHlbM109cGFyc2VJbnQoJycreFs0XSt4WzVdLDE2KVxuXHRcdFx0eVs1XT1wYXJzZUludCgnJyt4WzZdK3hbN10sMTYpLzI1NVxuXHRcdCPkuI3mu6HotrPkuIrpnaLlm5vkuKrmg4XlhrUsIOebtOaOpei/lOWbnmZhbHNlXG5cdFx0ZWxzZSByZXR1cm4gZmFsc2Vcblx0eVxuXG5cdCNjb25zb2xlLmxvZyhzdHIycmdiKCd3aGl0ZScpKTsgI3Rlc3RcblxuXG5cblxuXG5cbnRlc3QgPSAtPlxuXHRyZXN1bHQ9d2luZG93Lmx1b2Nsci5saWdodHN0ciBzdHI6J3doaXRlJywgaXNiYWNrOnRydWVcblx0Y29uc29sZS5sb2cge3Jlc3VsdH1cblxuXG5leHBvcnQgZGVmYXVsdCB7XG5cdCNsaWdodHN0clxuXHQjbGlnaHRyZ2Jcblx0bHN0clxuXHRscmdiXG5cdGdldGxpZ2h0XG5cdGdldGRhcmtcblx0c2FtZXJnYnN0clxuXG59XG4iLCIjaW1wb3J0IHtsb2d9IGZyb20gJy4vbG9nLmpzJ1xuXG5pbXBvcnQgZnMgZnJvbSAnZnMvcHJvbWlzZXMnXG5pbXBvcnQgZnRzIGZyb20gJ2ZzJ1xuXG5pbXBvcnQgb3MgZnJvbSAnb3MnXG5cbmhvbWUgPSBvcy5ob21lZGlyKClcbmxvZz1jb25zb2xlLmxvZ1xuXG5cbiMgdG9kbyDkv53lrZjmlofku7ZcbmV4cG9ydCBzYXZlZmlsZT0oe2pzb24sZmlsZW5hbWU9XCJ0ZW1wdGVzdC50eHRcIn0pLT5cblx0ZnMud3JpdGVGaWxlIGZpbGVuYW1lLEpTT04uc3RyaW5naWZ5KGpzb24pLChlcnIpLT5cblx0XHRsb2cgJ+aWh+S7tuWGmeWFpScsZmlsZW5hbWVcblx0XHRsb2cgZXJyIGlmIGVyclxuXG4jIOaLv+WIsOecn+ato+eahHBhdGhcbmV4cG9ydCByZWFscGF0aD0ocGF0aCktPlxuXHQjIGhvbWXmlofku7blpLl+LCBub2Rl5LiN6K6kLCDopoHosIPmlbTkuLpvcy5ob21lZGlyXG5cdGlmIC9efi8udGVzdCBwYXRoIHRoZW4gcGF0aC5yZXBsYWNlIC9efi8sIGhvbWUgIGVsc2UgcGF0aFxuXG5cbiMg5Yqg5paH5Lu25YaF5a65LCDopobnm5blvI9cbmV4cG9ydCBjb3Zlcj0oe3BhdGgsIHN0ciwgb3B0aW9ucz1lbmNvZGluZzondXRmOCd9KSAtPlxuXG5cdCMg6KaG55uW5byP5YaZ5YWlXG5cdGF3YWl0IGZzLndyaXRlRmlsZSAocmVhbHBhdGggcGF0aCksIHN0ciwgb3B0aW9uc1xuXHR0cnVlXG4jIOi/veWKoOaWh+S7tuWGheWuuSwg5L+d6K+B6L+95Yqg5YaF5a655LiN6YeN5aSNXG5leHBvcnQgdW5pcXVlYWRkPSh7cGF0aCwgcmVnLCBzdHIsIG9wdGlvbnM9ZW5jb2Rpbmc6J3V0ZjgnfSkgLT5cblxuXHQjIGhvbWXmlofku7blpLl+LCBub2Rl5LiN6K6kLCDopoHosIPmlbTkuLpvcy5ob21lZGlyXG5cdHJwYXRoID1yZWFscGF0aCBwYXRoXG5cblx0IyDor7vlj5bmlofku7Zcblx0ZnN0cj1hd2FpdCBmcy5yZWFkRmlsZSBycGF0aCwgb3B0aW9uc1xuXHQjIOato+WImeWIpOaWrVxuXHRyZXR1cm4gZmFsc2UgaWYgcmVnLnRlc3QgZnN0clxuXG5cdCMg5LiN6YeN5aSN5bCx5o+S5YWlXG5cdGF3YWl0IGZzLmFwcGVuZEZpbGUgcnBhdGgsIHN0ciA/IHJlZy5zb3VyY2UsIG9wdGlvbnNcblx0dHJ1ZVxuXG4jIOWIpOaWreaYr+aWh+S7ti/nm67lvZVcbmV4cG9ydCBmaWxldHlwZSA9IChwYXRoKS0+XG5cdHN0YXQ9YXdhaXQgZnMubHN0YXQgcmVhbHBhdGggcGF0aFxuXHRyZXR1cm4gaXNmaWxlOiBzdGF0LmlzRmlsZSgpLCBpc2Rpcjogc3RhdC5pc0RpcmVjdG9yeSgpXG5cbiMg5Yik5pat5paH5Lu2L+ebruW9leaYr+WQpuWtmOWcqFxuZXhwb3J0IGV4aXN0ID0gKHBhdGgpLT5cblx0ZnRzLmV4aXN0c1N5bmMgcmVhbHBhdGggcGF0aFxuXG4jIOW7uuS4gOS4quebruW9lVxuZXhwb3J0IG1rZGlyPShwYXRoKS0+XG5cdGF3YWl0IGZzLm1rZGlyIChyZWFscGF0aCBwYXRoKSxyZWN1cnNpdmU6dHJ1ZVxuXG4jIOWmguaenOS4jeWtmOWcqOWwseW7uuS4gOS4quebruW9lVxuZXhwb3J0IG5ld2Rpcj0ocGF0aCktPlxuXHRyZXR1cm4gZmFsc2UgaWYgZXhpc3QgcGF0aFxuXHRhd2FpdCBmcy5ta2RpciByZWFscGF0aCBwYXRoXG5cbiMg6K+75Y+W55uu5b2VXG5leHBvcnQgcmVhZGlyID0gKHBhdGgpLT5cblx0YXdhaXQgZnMucmVhZGRpciByZWFscGF0aCBwYXRoXG4jIOivu+WPluaWh+S7tlxuZXhwb3J0IHJlYWRmaWxlID0gKHBhdGgpLT5cblx0ZnN0cj1hd2FpdCBmcy5yZWFkRmlsZSAocmVhbHBhdGggcGF0aCksIGVuY29kaW5nOid1dGY4J1xuXG5cbiMgdG9kbyDor7vlj5bnm67lvZXkuK3miYDmnInpl67popgsIOa3seW6pumBjeWOhlxuZXhwb3J0IGFsbGZpbGUgPSAoe3BhdGgsIHJlZz1mYWxzZSxvcHRpb25zPWVuY29kaW5nOid1dGY4J30pLT5cblx0IyDlpoLmnpzmsqHkvKByZWcsIOmCo+S5iOWwseaYr+imgeaJgOacieaWh+S7tlxuXHRyZWFkZGlyKHBhdGgsIG9wdGlvbnMpXG5cblxuXG5cbmV4cG9ydCBkZWZhdWx0IHtcblx0c2F2ZWZpbGVcblx0Y292ZXJcblx0dW5pcXVlYWRkXG5cdGZpbGV0eXBlXG5cdGV4aXN0XG5cdG1rZGlyXG5cdHJlYWRpclxuXHRyZWFkZmlsZVxuXHRhbGxmaWxlXG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgY29sb3J9IGZyb20gJy4vY29sb3IuY3MnXG5leHBvcnQge2RlZmF1bHQgYXMgcmFuZG9tfSBmcm9tIFx0Jy4vcmFuZG9tLmNzJ1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRpbWV9IGZyb20gXHQnLi90aW1lLmNzJ1xuZXhwb3J0IHtkZWZhdWx0IGFzIGZpbGV9IGZyb20gXHQnLi9maWxlLmNzJ1xuIiwiXG4jIyNcbiog5ou/5Yiw5pW05pWw54mI5pys55qE6ZqP5py65pWwXG4qIOWboOS4unJhbmRvbeS4jeWMheWQqzEsIOWboOatpCwg6L+Z5Liq6ZqP5py65pWw5Lmf5LiN5YyF5ZCrbWF4XG4qIOWboOatpOS8oOWFpeaVsOe7hOeahOmVv+W6puato+WlveWQiOmAguS9nOS4uuaVsOe7hOeahOe0ouW8lVxuIyMjXG5pbXBvcnQge2xzdHJ9IGZyb20gJy4vY29sb3IuY3MnXG5cbmV4cG9ydCByYW5kb21pbnQ9KG1heCkgLT5cblx0KE1hdGgucmFuZG9tKCkqbWF4KT4+MFxuXG4jIyNcbuaVsOe7hOS4reWPluS4gOS4qumaj+acumVsZW1lbnRcbiMjI1xuZXhwb3J0IHJhbmRvbWVtYmVyID0gKHApIC0+XG5cdHBbcmFuZG9taW50IHAubGVuZ3RoXVxuXG4jIOmaj+acuuS4gOS4quminOiJslxuZXhwb3J0IHJhbmRvbWNvbG9yID0gLT5cblx0XCJyZ2IoXCIrIChyYW5kb21pbnQgMjU2KStcIixcIisocmFuZG9taW50IDI1NiApK1wiLFwiKyhyYW5kb21pbnQgMjU2KStcIilcIlxuXG5cbiMg6ZqP5py65LiA5Liq5piO5Lqu6aKc6ImyXG5leHBvcnQgcmFuZG9tbGlnaHQgPSAtPlxuXHRsc3RyXG5cdFx0c3RyOnJhbmRvbWNvbG9yIDBcblx0XHRpc2JhY2s6ZmFsc2VcblxuXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuXHRyYW5kb21pbnRcblx0cmFuZG9tZW1iZXJcblx0cmFuZG9tY29sb3Jcblx0cmFuZG9tbGlnaHRcbn1cbiIsImV4cG9ydCBzbGVlcCA9IChtcykgLT5cblx0bmV3IFByb21pc2UgKHJlc29sdmUpIC0+XG5cdFx0c2V0VGltZW91dCByZXNvbHZlLCBtc1xuXG5cbmV4cG9ydCBnZXRoaG1tID0odGltZXN0YW1wPURhdGUubm93KCkpLT5cblx0dD1uZXcgRGF0ZSgrdGltZXN0YW1wKVxuXHR0LmdldEhvdXJzKCkrJzonK3QuZ2V0TWludXRlcygpXG5cbmV4cG9ydCBnZXRoaG1tc3MgPSh0aW1lc3RhbXA9RGF0ZS5ub3coKSktPlxuXHR0PW5ldyBEYXRlKCt0aW1lc3RhbXApXG5cdHQuZ2V0SG91cnMoKSsnOicrdC5nZXRNaW51dGVzKCkrJzonK3QuZ2V0U2Vjb25kcygpXG5cblxuXG5cbmV4cG9ydCBkZWZhdWx0IHtcblx0c2xlZXBcblx0Z2V0aGhtbVxuXHRnZXRoaG1tc3Ncbn1cbiIsIm1vZHVsZS5leHBvcnRzID0ge1wiYmxhY2tcIjpcIiMwMDBcIixcInNpbHZlclwiOlwiI2MwYzBjMFwiLFwiZ3JheVwiOlwiIzgwODA4MFwiLFwid2hpdGVcIjpcIiNmZmZcIixcIm1hcm9vblwiOlwiIzgwMDAwMFwiLFwicmVkXCI6XCIjZmYwMDAwXCIsXCJwdXJwbGVcIjpcIiM4MDAwODBcIixcImZ1Y2hzaWFcIjpcIiNmZjAwZmZcIixcImdyZWVuXCI6XCIjMDA4MDAwXCIsXCJsaW1lXCI6XCIjMDBmZjAwXCIsXCJvbGl2ZVwiOlwiIzgwODAwMFwiLFwieWVsbG93XCI6XCIjZmZmZjAwXCIsXCJuYXZ5XCI6XCIjMDAwMDgwXCIsXCJibHVlXCI6XCIjMDAwMGZmXCIsXCJ0ZWFsXCI6XCIjMDA4MDgwXCIsXCJhcXVhXCI6XCIjMDBmZmZmXCIsXCJvcmFuZ2VcIjpcIiNmZmE1MDBcIixcImFsaWNlYmx1ZVwiOlwiI2YwZjhmZlwiLFwiYW50aXF1ZXdoaXRlXCI6XCIjZmFlYmQ3XCIsXCJhcXVhbWFyaW5lXCI6XCIjN2ZmZmQ0XCIsXCJhenVyZVwiOlwiI2YwZmZmZlwiLFwiYmVpZ2VcIjpcIiNmNWY1ZGNcIixcImJpc3F1ZVwiOlwiI2ZmZTRjNFwiLFwiYmxhbmNoZWRhbG1vbmRcIjpcIiNmZmViY2RcIixcImJsdWV2aW9sZXRcIjpcIiM4YTJiZTJcIixcImJyb3duXCI6XCIjYTUyYTJhXCIsXCJidXJseXdvb2RcIjpcIiNkZWI4ODdcIixcImNhZGV0Ymx1ZVwiOlwiIzVmOWVhMFwiLFwiY2hhcnRyZXVzZVwiOlwiIzdmZmYwMFwiLFwiY2hvY29sYXRlXCI6XCIjZDI2OTFlXCIsXCJjb3JhbFwiOlwiI2ZmN2Y1MFwiLFwiY29ybmZsb3dlcmJsdWVcIjpcIiM2NDk1ZWRcIixcImNvcm5zaWxrXCI6XCIjZmZmOGRjXCIsXCJjcmltc29uXCI6XCIjZGMxNDNjXCIsXCJjeWFuXCI6XCIjMDBmZmZmXCIsXCJkYXJrYmx1ZVwiOlwiIzAwMDA4YlwiLFwiZGFya2N5YW5cIjpcIiMwMDhiOGJcIixcImRhcmtnb2xkZW5yb2RcIjpcIiNiODg2MGJcIixcImRhcmtncmF5XCI6XCIjYTlhOWE5XCIsXCJkYXJrZ3JlZW5cIjpcIiMwMDY0MDBcIixcImRhcmtncmV5XCI6XCIjYTlhOWE5XCIsXCJkYXJra2hha2lcIjpcIiNiZGI3NmJcIixcImRhcmttYWdlbnRhXCI6XCIjOGIwMDhiXCIsXCJkYXJrb2xpdmVncmVlblwiOlwiIzU1NmIyZlwiLFwiZGFya29yYW5nZVwiOlwiI2ZmOGMwMFwiLFwiZGFya29yY2hpZFwiOlwiIzk5MzJjY1wiLFwiZGFya3JlZFwiOlwiIzhiMDAwMFwiLFwiZGFya3NhbG1vblwiOlwiI2U5OTY3YVwiLFwiZGFya3NlYWdyZWVuXCI6XCIjOGZiYzhmXCIsXCJkYXJrc2xhdGVibHVlXCI6XCIjNDgzZDhiXCIsXCJkYXJrc2xhdGVncmF5XCI6XCIjMmY0ZjRmXCIsXCJkYXJrc2xhdGVncmV5XCI6XCIjMmY0ZjRmXCIsXCJkYXJrdHVycXVvaXNlXCI6XCIjMDBjZWQxXCIsXCJkYXJrdmlvbGV0XCI6XCIjOTQwMGQzXCIsXCJkZWVwcGlua1wiOlwiI2ZmMTQ5M1wiLFwiZGVlcHNreWJsdWVcIjpcIiMwMGJmZmZcIixcImRpbWdyYXlcIjpcIiM2OTY5NjlcIixcImRpbWdyZXlcIjpcIiM2OTY5NjlcIixcImRvZGdlcmJsdWVcIjpcIiMxZTkwZmZcIixcImZpcmVicmlja1wiOlwiI2IyMjIyMlwiLFwiZmxvcmFsd2hpdGVcIjpcIiNmZmZhZjBcIixcImZvcmVzdGdyZWVuXCI6XCIjMjI4YjIyXCIsXCJnYWluc2Jvcm9cIjpcIiNkY2RjZGNcIixcImdob3N0d2hpdGVcIjpcIiNmOGY4ZmZcIixcImdvbGRcIjpcIiNmZmQ3MDBcIixcImdvbGRlbnJvZFwiOlwiI2RhYTUyMFwiLFwiZ3JlZW55ZWxsb3dcIjpcIiNhZGZmMmZcIixcImdyZXlcIjpcIiM4MDgwODBcIixcImhvbmV5ZGV3XCI6XCIjZjBmZmYwXCIsXCJob3RwaW5rXCI6XCIjZmY2OWI0XCIsXCJpbmRpYW5yZWRcIjpcIiNjZDVjNWNcIixcImluZGlnb1wiOlwiIzRiMDA4MlwiLFwiaXZvcnlcIjpcIiNmZmZmZjBcIixcImtoYWtpXCI6XCIjZjBlNjhjXCIsXCJsYXZlbmRlclwiOlwiI2U2ZTZmYVwiLFwibGF2ZW5kZXJibHVzaFwiOlwiI2ZmZjBmNVwiLFwibGF3bmdyZWVuXCI6XCIjN2NmYzAwXCIsXCJsZW1vbmNoaWZmb25cIjpcIiNmZmZhY2RcIixcImxpZ2h0Ymx1ZVwiOlwiI2FkZDhlNlwiLFwibGlnaHRjb3JhbFwiOlwiI2YwODA4MFwiLFwibGlnaHRjeWFuXCI6XCIjZTBmZmZmXCIsXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOlwiI2ZhZmFkMlwiLFwibGlnaHRncmF5XCI6XCIjZDNkM2QzXCIsXCJsaWdodGdyZWVuXCI6XCIjOTBlZTkwXCIsXCJsaWdodGdyZXlcIjpcIiNkM2QzZDNcIixcImxpZ2h0cGlua1wiOlwiI2ZmYjZjMVwiLFwibGlnaHRzYWxtb25cIjpcIiNmZmEwN2FcIixcImxpZ2h0c2VhZ3JlZW5cIjpcIiMyMGIyYWFcIixcImxpZ2h0c2t5Ymx1ZVwiOlwiIzg3Y2VmYVwiLFwibGlnaHRzbGF0ZWdyYXlcIjpcIiM3Nzg4OTlcIixcImxpZ2h0c2xhdGVncmV5XCI6XCIjNzc4ODk5XCIsXCJsaWdodHN0ZWVsYmx1ZVwiOlwiI2IwYzRkZVwiLFwibGlnaHR5ZWxsb3dcIjpcIiNmZmZmZTBcIixcImxpbWVncmVlblwiOlwiIzMyY2QzMlwiLFwibGluZW5cIjpcIiNmYWYwZTZcIixcIm1hZ2VudGFcIjpcIiNmZjAwZmZcIixcIm1lZGl1bWFxdWFtYXJpbmVcIjpcIiM2NmNkYWFcIixcIm1lZGl1bWJsdWVcIjpcIiMwMDAwY2RcIixcIm1lZGl1bW9yY2hpZFwiOlwiI2JhNTVkM1wiLFwibWVkaXVtcHVycGxlXCI6XCIjOTM3MGRiXCIsXCJtZWRpdW1zZWFncmVlblwiOlwiIzNjYjM3MVwiLFwibWVkaXVtc2xhdGVibHVlXCI6XCIjN2I2OGVlXCIsXCJtZWRpdW1zcHJpbmdncmVlblwiOlwiIzAwZmE5YVwiLFwibWVkaXVtdHVycXVvaXNlXCI6XCIjNDhkMWNjXCIsXCJtZWRpdW12aW9sZXRyZWRcIjpcIiNjNzE1ODVcIixcIm1pZG5pZ2h0Ymx1ZVwiOlwiIzE5MTk3MFwiLFwibWludGNyZWFtXCI6XCIjZjVmZmZhXCIsXCJtaXN0eXJvc2VcIjpcIiNmZmU0ZTFcIixcIm1vY2Nhc2luXCI6XCIjZmZlNGI1XCIsXCJuYXZham93aGl0ZVwiOlwiI2ZmZGVhZFwiLFwib2xkbGFjZVwiOlwiI2ZkZjVlNlwiLFwib2xpdmVkcmFiXCI6XCIjNmI4ZTIzXCIsXCJvcmFuZ2VyZWRcIjpcIiNmZjQ1MDBcIixcIm9yY2hpZFwiOlwiI2RhNzBkNlwiLFwicGFsZWdvbGRlbnJvZFwiOlwiI2VlZThhYVwiLFwicGFsZWdyZWVuXCI6XCIjOThmYjk4XCIsXCJwYWxldHVycXVvaXNlXCI6XCIjYWZlZWVlXCIsXCJwYWxldmlvbGV0cmVkXCI6XCIjZGI3MDkzXCIsXCJwYXBheWF3aGlwXCI6XCIjZmZlZmQ1XCIsXCJwZWFjaHB1ZmZcIjpcIiNmZmRhYjlcIixcInBlcnVcIjpcIiNjZDg1M2ZcIixcInBpbmtcIjpcIiNmZmMwY2JcIixcInBsdW1cIjpcIiNkZGEwZGRcIixcInBvd2RlcmJsdWVcIjpcIiNiMGUwZTZcIixcInJvc3licm93blwiOlwiI2JjOGY4ZlwiLFwicm95YWxibHVlXCI6XCIjNDE2OWUxXCIsXCJzYWRkbGVicm93blwiOlwiIzhiNDUxM1wiLFwic2FsbW9uXCI6XCIjZmE4MDcyXCIsXCJzYW5keWJyb3duXCI6XCIjZjRhNDYwXCIsXCJzZWFncmVlblwiOlwiIzJlOGI1N1wiLFwic2Vhc2hlbGxcIjpcIiNmZmY1ZWVcIixcInNpZW5uYVwiOlwiI2EwNTIyZFwiLFwic2t5Ymx1ZVwiOlwiIzg3Y2VlYlwiLFwic2xhdGVibHVlXCI6XCIjNmE1YWNkXCIsXCJzbGF0ZWdyYXlcIjpcIiM3MDgwOTBcIixcInNsYXRlZ3JleVwiOlwiIzcwODA5MFwiLFwic25vd1wiOlwiI2ZmZmFmYVwiLFwic3ByaW5nZ3JlZW5cIjpcIiMwMGZmN2ZcIixcInN0ZWVsYmx1ZVwiOlwiIzQ2ODJiNFwiLFwidGFuXCI6XCIjZDJiNDhjXCIsXCJ0aGlzdGxlXCI6XCIjZDhiZmQ4XCIsXCJ0b21hdG9cIjpcIiNmZjYzNDdcIixcInRyYW5zcGFyZW50XCI6XCIjMDAwMFwiLFwidHVycXVvaXNlXCI6XCIjNDBlMGQwXCIsXCJ2aW9sZXRcIjpcIiNlZTgyZWVcIixcIndoZWF0XCI6XCIjZjVkZWIzXCIsXCJ3aGl0ZXNtb2tlXCI6XCIjZjVmNWY1XCIsXCJ5ZWxsb3dncmVlblwiOlwiIzlhY2QzMlwiLFwicmViZWNjYXB1cnBsZVwiOlwiIzY2MzM5OVwifSIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiKTs7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCIpOzsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjaGFsa1wiKTs7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZzL3Byb21pc2VzXCIpOzsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJvc1wiKTs7Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/coffee/api/runtime/runtime.js b/coffee/api/runtime/runtime.js new file mode 100644 index 0000000..1d581b6 --- /dev/null +++ b/coffee/api/runtime/runtime.js @@ -0,0 +1,107 @@ +#!/usr/bin/env node +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({}); +/************************************************************************/ +/******/ // 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] = { +/******/ // no module.id needed +/******/ // 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; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks and sibling chunks for the entrypoint +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return undefined; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop) +/******/ })(); +/******/ +/******/ /* webpack/runtime/startup entrypoint */ +/******/ (() => { +/******/ __webpack_require__.X = (chunkIds, moduleId) => { +/******/ chunkIds.map(__webpack_require__.e, __webpack_require__) +/******/ return __webpack_require__(moduleId) +/******/ } +/******/ })(); +/******/ +/******/ /* webpack/runtime/require chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded chunks +/******/ // "1" means "loaded", otherwise not loaded yet +/******/ var installedChunks = { +/******/ "runtime": 1 +/******/ }; +/******/ +/******/ var installChunk = (chunk) => { +/******/ var moreModules = chunk.modules, chunkIds = chunk.ids, runtime = chunk.runtime; +/******/ for(var moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) runtime(__webpack_require__); +/******/ for(var i = 0; i < chunkIds.length; i++) +/******/ installedChunks[chunkIds[i]] = 1; +/******/ }; +/******/ +/******/ // require() chunk loading for javascript +/******/ __webpack_require__.f.require = function(chunkId, promises) { +/******/ installedChunks[chunkId] = 1; +/******/ }; +/******/ +/******/ module.exports = __webpack_require__; +/******/ __webpack_require__.C = installChunk; +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ })(); +/******/ +/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tbGliL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL21saWIvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9tbGliL3dlYnBhY2svcnVudGltZS9nZXQgamF2YXNjcmlwdCBjaHVuayBmaWxlbmFtZSIsIndlYnBhY2s6Ly9tbGliL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vbWxpYi93ZWJwYWNrL3J1bnRpbWUvc3RhcnR1cCBlbnRyeXBvaW50Iiwid2VicGFjazovL21saWIvd2VicGFjay9ydW50aW1lL3JlcXVpcmUgY2h1bmsgbG9hZGluZyIsIndlYnBhY2s6Ly9tbGliL3dlYnBhY2svc3RhcnR1cCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztVQUFBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOztVQUVBO1VBQ0E7Ozs7O1dDeEJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRUFBRTtXQUNGLEU7Ozs7O1dDUkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ0pBLHNGOzs7OztXQ0FBO1dBQ0E7V0FDQTtXQUNBLEM7Ozs7O1dDSEE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsZUFBZSxxQkFBcUI7V0FDcEM7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBOztXQUVBOztXQUVBLGtCOzs7O1VDOUJBIiwiZmlsZSI6InJ1bnRpbWUvcnVudGltZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdGlmKF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0pIHtcblx0XHRyZXR1cm4gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbiIsIl9fd2VicGFja19yZXF1aXJlX18uZiA9IHt9O1xuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuLy8gVGhlIGNodW5rIGxvYWRpbmcgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmUgPSAoY2h1bmtJZCkgPT4ge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5mKS5yZWR1Y2UoKHByb21pc2VzLCBrZXkpID0+IHtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmZba2V5XShjaHVua0lkLCBwcm9taXNlcyk7XG5cdFx0cmV0dXJuIHByb21pc2VzO1xuXHR9LCBbXSkpO1xufTsiLCIvLyBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIHJlZmVyZW5jZSBhc3luYyBjaHVua3MgYW5kIHNpYmxpbmcgY2h1bmtzIGZvciB0aGUgZW50cnlwb2ludFxuX193ZWJwYWNrX3JlcXVpcmVfXy51ID0gKGNodW5rSWQpID0+IHtcblx0Ly8gcmV0dXJuIHVybCBmb3IgZmlsZW5hbWVzIGJhc2VkIG9uIHRlbXBsYXRlXG5cdHJldHVybiB1bmRlZmluZWQ7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApIiwiX193ZWJwYWNrX3JlcXVpcmVfXy5YID0gKGNodW5rSWRzLCBtb2R1bGVJZCkgPT4ge1xuXHRjaHVua0lkcy5tYXAoX193ZWJwYWNrX3JlcXVpcmVfXy5lLCBfX3dlYnBhY2tfcmVxdWlyZV9fKVxuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZClcbn0iLCIvLyBubyBiYXNlVVJJXG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgY2h1bmtzXG4vLyBcIjFcIiBtZWFucyBcImxvYWRlZFwiLCBvdGhlcndpc2Ugbm90IGxvYWRlZCB5ZXRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwicnVudGltZVwiOiAxXG59O1xuXG52YXIgaW5zdGFsbENodW5rID0gKGNodW5rKSA9PiB7XG5cdHZhciBtb3JlTW9kdWxlcyA9IGNodW5rLm1vZHVsZXMsIGNodW5rSWRzID0gY2h1bmsuaWRzLCBydW50aW1lID0gY2h1bmsucnVudGltZTtcblx0Zm9yKHZhciBtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdH1cblx0fVxuXHRpZihydW50aW1lKSBydW50aW1lKF9fd2VicGFja19yZXF1aXJlX18pO1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgY2h1bmtJZHMubGVuZ3RoOyBpKyspXG5cdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRzW2ldXSA9IDE7XG59O1xuXG4vLyByZXF1aXJlKCkgY2h1bmsgbG9hZGluZyBmb3IgamF2YXNjcmlwdFxuX193ZWJwYWNrX3JlcXVpcmVfXy5mLnJlcXVpcmUgPSBmdW5jdGlvbihjaHVua0lkLCBwcm9taXNlcykge1xuaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXztcbl9fd2VicGFja19yZXF1aXJlX18uQyA9IGluc3RhbGxDaHVuaztcblxuLy8gbm8gSE1SXG5cbi8vIG5vIEhNUiBtYW5pZmVzdCIsIi8vIG1vZHVsZSBleHBvcnRzIG11c3QgYmUgcmV0dXJuZWQgZnJvbSBydW50aW1lIHNvIGVudHJ5IGlubGluaW5nIGlzIGRpc2FibGVkXG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/coffee/api/top/top.js b/coffee/api/top/top.js new file mode 100644 index 0000000..c06d28c --- /dev/null +++ b/coffee/api/top/top.js @@ -0,0 +1,130 @@ +#!/usr/bin/env node +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["mlib"] = factory(); + else + root["mlib"] = factory(); +})(global, function() { +return (() => { +var exports = {}; +exports.id = "top"; +exports.ids = ["top"]; +exports.modules = { + +/***/ "./src/top.cs": +/*!********************!* + !*** ./src/top.cs ***! + \********************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "@babel/runtime/helpers/interopRequireDefault"); + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.top1 = void 0; + +var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "@babel/runtime/helpers/toConsumableArray")); + +/* + * 这里是寻找某个位置的点的函数, 比如中位数, 1/4位数等等 + * @param {输入的用来寻找的数组} arra + * @param {每个元素拿值的方法} valu + * @param {要找到顶部的第几个元素} top + * 这个算法类似于快速排序. 每次只排一边, 知道找到需要的值. + * 最终返回的是满足条件的值. + * 目标是统计数据的提取, 比如中位数, 3/4位数等等. + +export function top(arra, valu, top) { + if (arra.length === 0) return []; + const lesser = []; + const greater = []; + const p = arra[0]; + for (let i = 1; i < arra.length; i++) { + if (valu(arra[i]) > valu(p)) { + greater.push(arra[i]); + } else { + lesser.push(arra[i]); + } + } + + // 终结条件很重要, p是第top个, 或者less==top个, 其实都可以返回了.这样就是正好top个或者多一个. + if (top - 2 < lesser.length && lesser.length < top + 1) return p; + if (lesser.length > top) { + return top(lesser, valu, top); + } + return top(greater, valu, top - lesser.length - 1); // 这里要把p的位置减掉, 不然就bug了. +} + */ +var big; + +big = function big(a, b) { + return a > b; //默认这个是找最大的数字. +}; + +var top1 = function top1(_ref) { + var arr = _ref.arr, + _ref$xwiny = _ref.xwiny, + xwiny = _ref$xwiny === void 0 ? big : _ref$xwiny; + var a, e, i, j, len; + a = (0, _toConsumableArray2["default"])(arr); // 不改变输入的纯函数 + + e = a.shift(0); + + for (i = 0, len = a.length; i < len; i++) { + j = a[i]; + + if (xwiny(j, e)) { + e = j; + } + } + + return e; +}; // 另一个纯函数, 但是重复判断了第一个元素, 不过很可能效率更好 +//e=arr[0] +// e =j for j in arr when xwiny j,e + + +exports.top1 = top1; + +/***/ }), + +/***/ "@babel/runtime/helpers/interopRequireDefault": +/*!***************************************************************!* + !*** external "@babel/runtime/helpers/interopRequireDefault" ***! + \***************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("@babel/runtime/helpers/interopRequireDefault");; + +/***/ }), + +/***/ "@babel/runtime/helpers/toConsumableArray": +/*!***********************************************************!* + !*** external "@babel/runtime/helpers/toConsumableArray" ***! + \***********************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("@babel/runtime/helpers/toConsumableArray");; + +/***/ }) + +}; +; + +// load runtime +var __webpack_require__ = require("../runtime/runtime.js"); +__webpack_require__.C(exports); +return __webpack_require__.X([], "./src/top.cs"); +})(); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tbGliL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9tbGliLy4vc3JjL3RvcC5jcyIsIndlYnBhY2s6Ly9tbGliL2V4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIiIsIndlYnBhY2s6Ly9tbGliL2V4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDc0JHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFFSCxNQUFLO1NBQVUsSUFBVixDLENBQUE7QUFBQSxDQUFMOztBQUNBLElBQU8sT0FBTyxTQUFQLElBQU87QUFBQSxNQUFDLEdBQUQsUUFBQyxHQUFEO0FBQUEsd0JBQU0sS0FBTjtBQUFBLE1BQU0sS0FBTjtBQUNkO0FBQUMsMENBQUQsR0FBQyxFQURhLENBQ2Q7O0FBQ0MsTUFBRSxDQUFDLENBQUQsUUFBRjs7QUFDQTs7O1FBQXNCLFcsRUFBQTtBQUF0QixVQUFJLENBQUo7O0FBQUE7O1NBQ0EsQztBQUphLENBQWQsQyxDQUhHOzs7Ozs7Ozs7Ozs7Ozs7O0FDaENILDBFOzs7Ozs7Ozs7OztBQ0FBLHNFIiwiZmlsZSI6InRvcC90b3AuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJtbGliXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIm1saWJcIl0gPSBmYWN0b3J5KCk7XG59KShnbG9iYWwsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIlxuXG4jIyNcbiAqIOi/memHjOaYr+Wvu+aJvuafkOS4quS9jee9rueahOeCueeahOWHveaVsCwg5q+U5aaC5Lit5L2N5pWwLCAxLzTkvY3mlbDnrYnnrYlcbiAqIEBwYXJhbSB76L6T5YWl55qE55So5p2l5a+75om+55qE5pWw57uEfSBhcnJhXG4gKiBAcGFyYW0ge+avj+S4quWFg+e0oOaLv+WAvOeahOaWueazlX0gdmFsdVxuICogQHBhcmFtIHvopoHmib7liLDpobbpg6jnmoTnrKzlh6DkuKrlhYPntKB9IHRvcFxuICog6L+Z5Liq566X5rOV57G75Ly85LqO5b+r6YCf5o6S5bqPLiDmr4/mrKHlj6rmjpLkuIDovrksIOefpemBk+aJvuWIsOmcgOimgeeahOWAvC5cbiAqIOacgOe7iOi/lOWbnueahOaYr+a7oei2s+adoeS7tueahOWAvC5cbiAqIOebruagh+aYr+e7n+iuoeaVsOaNrueahOaPkOWPliwg5q+U5aaC5Lit5L2N5pWwLCAzLzTkvY3mlbDnrYnnrYkuXG4gXG5cbmV4cG9ydCBmdW5jdGlvbiB0b3AoYXJyYSwgdmFsdSwgdG9wKSB7XG5cdGlmIChhcnJhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXHRjb25zdCBsZXNzZXIgPSBbXTtcblx0Y29uc3QgZ3JlYXRlciA9IFtdO1xuXHRjb25zdCBwID0gYXJyYVswXTtcblx0Zm9yIChsZXQgaSA9IDE7IGkgPCBhcnJhLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKHZhbHUoYXJyYVtpXSkgPiB2YWx1KHApKSB7XG5cdFx0XHRncmVhdGVyLnB1c2goYXJyYVtpXSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxlc3Nlci5wdXNoKGFycmFbaV0pO1xuXHRcdH1cblx0fVxuXG5cdC8vIOe7iOe7k+adoeS7tuW+iOmHjeimgSwgcOaYr+esrHRvcOS4qiwg5oiW6ICFbGVzcz09dG9w5LiqLCDlhbblrp7pg73lj6/ku6Xov5Tlm57kuoYu6L+Z5qC35bCx5piv5q2j5aW9dG9w5Liq5oiW6ICF5aSa5LiA5LiqLlxuXHRpZiAodG9wIC0gMiA8IGxlc3Nlci5sZW5ndGggJiYgbGVzc2VyLmxlbmd0aCA8IHRvcCArIDEpIHJldHVybiBwO1xuXHRpZiAobGVzc2VyLmxlbmd0aCA+IHRvcCkge1xuXHRcdHJldHVybiB0b3AobGVzc2VyLCB2YWx1LCB0b3ApO1xuXHR9XG5cdHJldHVybiB0b3AoZ3JlYXRlciwgdmFsdSwgdG9wIC0gbGVzc2VyLmxlbmd0aCAtIDEpOyAvLyDov5nph4zopoHmiopw55qE5L2N572u5YeP5o6JLCDkuI3nhLblsLFidWfkuoYuXG59XG4jIyNcblxuYmlnPSAoYSwgYikgLT4gYT5iICPpu5jorqTov5nkuKrmmK/mib7mnIDlpKfnmoTmlbDlrZcuXG5leHBvcnQgdG9wMSA9ICh7YXJyLHh3aW55PWJpZ30pLT5cblx0YT1bYXJyLi4uXSAjIOS4jeaUueWPmOi+k+WFpeeahOe6r+WHveaVsFxuXHRlPWEuc2hpZnQgMFxuXHRlID0gaiBmb3IgaiBpbiBhIHdoZW4geHdpbnkgaixlXG5cdGVcblx0IyDlj6bkuIDkuKrnuq/lh73mlbAsIOS9huaYr+mHjeWkjeWIpOaWreS6huesrOS4gOS4quWFg+e0oCwg5LiN6L+H5b6I5Y+v6IO95pWI546H5pu05aW9XG5cdCNlPWFyclswXVxuXHQjXHRlID1qIGZvciBqIGluIGFyciB3aGVuIHh3aW55IGosZVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIik7OyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/coffee/babel.config.json b/coffee/babel.config.json new file mode 100644 index 0000000..6f5a96f --- /dev/null +++ b/coffee/babel.config.json @@ -0,0 +1,17 @@ + +//这个文件是json5 +{ + "presets": [ + "@babel/react", + ["@babel/env", { + "targets": { + //"browsers": "chrome >= 86", + "chrome": "86", + "node": "15" + }, + //告诉babel不要解析模块. 因为webpack会解析 + "modules": false + }] + ], + "plugins": ["@babel/plugin-transform-runtime", "@babel/plugin-proposal-object-rest-spread"] +} diff --git a/coffee/coffeelint.json b/coffee/coffeelint.json new file mode 100644 index 0000000..b8f0d56 --- /dev/null +++ b/coffee/coffeelint.json @@ -0,0 +1,135 @@ +{ + "arrow_spacing": { + "level": "ignore" + }, + "braces_spacing": { + "level": "ignore", + "spaces": 0, + "empty_object_spaces": 0 + }, + "camel_case_classes": { + "level": "error" + }, + "coffeescript_error": { + "level": "error" + }, + "colon_assignment_spacing": { + "level": "ignore", + "spacing": { + "left": 0, + "right": 0 + } + }, + "cyclomatic_complexity": { + "level": "ignore", + "value": 10 + }, + "duplicate_key": { + "level": "error" + }, + "empty_constructor_needs_parens": { + "level": "ignore" + }, + "ensure_comprehensions": { + "level": "ignore" + }, + "eol_last": { + "level": "ignore" + }, + "indentation": { + "value": 1, + "level": "warn" + }, + "line_endings": { + "level": "ignore", + "value": "unix" + }, + "max_line_length": { + "value": 80, + "level": "ignore", + "limitComments": false + }, + "missing_fat_arrows": { + "level": "ignore", + "is_strict": false + }, + "newlines_after_classes": { + "value": 3, + "level": "ignore" + }, + "no_backticks": { + "level": "error" + }, + "no_debugger": { + "level": "warn", + "console": false + }, + "no_empty_functions": { + "level": "ignore" + }, + "no_empty_param_list": { + "level": "ignore" + }, + "no_implicit_braces": { + "level": "ignore", + "strict": true + }, + "no_implicit_parens": { + "level": "ignore", + "strict": true + }, + "no_interpolation_in_single_quotes": { + "level": "ignore" + }, + "no_nested_string_interpolation": { + "level": "ignore" + }, + "no_plusplus": { + "level": "ignore" + }, + "no_private_function_fat_arrows": { + "level": "warn" + }, + "no_stand_alone_at": { + "level": "ignore" + }, + "no_tabs": { + "level": "ignore" + }, + "no_this": { + "level": "error" + }, + "no_throwing_strings": { + "level": "error" + }, + "no_trailing_semicolons": { + "level": "error" + }, + "no_trailing_whitespace": { + "level": "error", + "allowed_in_comments": false, + "allowed_in_empty_lines": true + }, + "no_unnecessary_double_quotes": { + "level": "ignore" + }, + "no_unnecessary_fat_arrows": { + "level": "warn" + }, + "non_empty_constructor_needs_parens": { + "level": "ignore" + }, + "prefer_english_operator": { + "level": "ignore", + "doubleNotLevel": "ignore" + }, + "space_operators": { + "level": "ignore" + }, + "spacing_after_comma": { + "level": "ignore" + }, + "transform_messes_up_line_numbers": { + "level": "warn" + } +} diff --git a/coffee/package.json b/coffee/package.json new file mode 100644 index 0000000..2c5d65c --- /dev/null +++ b/coffee/package.json @@ -0,0 +1,48 @@ +{ + "name": "backdir", + "version": "1.0.0", + "description": "js测试框架: 单身狗", + "private": true, + "keywords": [], + "author": "", + "license": "ISC", + "bin": { + "backdir": "./dist/api/bin.js", + "dir": "./dist/api/bin.js", + "bd": "./dist/api/bin.js" + + }, + "scripts": { + "test": "node ./dist/api/main.js", + "build": "webpack && chmod u+x ./dist/api/bin.js", + "dev": "webpack serve ", + "watch": "webpack --watch ", + "debug": "暂时麽咏nade ./dist" + }, + "devDependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-runtime": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "babel-loader": "^8.2.1", + "clean-webpack-plugin": "^3.0.0", + "coffee-loader": "^1.0.1", + "coffeescript": "^2.5.1", + "cson": "^7.20.0", + "cson-loader": "^0.1.0", + "eslint-plugin-coffee": "^0.1.13", + "eslint-plugin-react": "^7.21.5", + "webpack": "^5.4.0", + "webpack-cli": "^4.2.0", + "webpack-dev-middleware": "^4.0.2", + "webpack-dev-server": "^3.11.0", + "webpack-glob": "^2.0.2", + "webpack-manifest-plugin": "^2.2.0", + "webpack-merge": "^5.4.0", + "webpack-nano": "^1.1.0", + "webpack-node-externals": "^2.5.2" + }, + "dependencies": { + "chalk": "^4.1.0" + } +} diff --git a/coffee/src/backdir.cs b/coffee/src/backdir.cs new file mode 100755 index 0000000..a259dbd --- /dev/null +++ b/coffee/src/backdir.cs @@ -0,0 +1,68 @@ +import chalk from 'chalk' +#chalk = require('chalk') +import {cmd} from 'mlib' +import bdh from './backdirhelp.cs' + + +{disklist, afs,info,list,back}=bdh + + +# ------------------init--------------------- +arg=process.argv[2..] +console.log '环境和参数信息:' +console.table [ + {'键: ':'process.cwd()', '值: ': process.cwd()} + {'键: ':'__dirname', '值: ':__dirname} + {'键: ':'process.argv', '值: ':process.argv} + {'键: ':'真参数', '值: ':arg} +] + +cmds=[] # 传入的参数的命令数组 +files=[] # 传入的文件数组 + +for x in arg + if cmd.iscmd x then cmds.push x else files.push x + + +console.log chalk.blueBright "命令: #{cmds} " +console.log chalk.yellowBright "文件: #{files} " + + +# 处理命令 +isdefault = cmds.length ==0 +for x in cmds + switch x + when '--disklist' # 列出系统挂载的disk + disklist 0 + when '--afs' # 列出系统挂载的disk + afs files[0] + when '--info' # 列出系统挂载的disk + info files[0] + when '--list' # 列出系统挂载的disk + list disk:files[0], dir:files[1] + when '--back' # 列出系统挂载的disk + # 命令行的引号不重要 + #bd --back disk4 /地图/元素周期表-timg-3.jpeg /Volumes/wd4black/back/bbb.jpeg + #bd --back disk4 "/地图/元素周期表-timg-3.jpeg" "/Volumes/wd4black/back/aaa.jpeg" + back disk:files[0], frompath:files[1],topath:files[2] + else console.log chalk.redBright '抱歉啊, 不知道你想干啥:', x + + +# isdisklist=isdisklist ||/^--disklist$/.test x +# isafs=isafs||/^--afs$/.test x + +#isnothing= !isdefault && !isdisklist && !isafs + +# 根据命令, 处理文件, 忽略node_module, 未来根据.gitignore忽略 +if isdefault # 默认是跑测试文件 + console.log '默认行为:', chalk.cyanBright '啥也不干' +#if isdisklist # 列出系统挂载的disk +# disklist 0 +#if isafs # 列出系统挂载的disk +# afs 0 + +#if isnothing +# console.log chalk.redBright '抱歉啊: 不知道你想干啥' + + + diff --git a/coffee/src/backdirhelp.cs b/coffee/src/backdirhelp.cs new file mode 100644 index 0000000..b5cb6f1 --- /dev/null +++ b/coffee/src/backdirhelp.cs @@ -0,0 +1,66 @@ +import chalk from 'chalk' +#chalk = require('chalk') +import {file} from 'mlib' +import { spawn,exec } from 'child_process' +import util from 'util' + +px = util.promisify exec + + + +# -----------------pure function----------------- +# 输出 +log= ({ stdout, stderr })-> + console.log 'stdout:', chalk.greenBright stdout + console.error 'stderr:', chalk.redBright stderr +# -----------------export function----------------- + + +# 处理disklist命令: bd --disklist +export disklist = -> + { stdout, stderr } = await px 'diskutil list' + console.log chalk.yellowBright "处理命令: disklist" + log { stdout, stderr } + + +# 处理afs命令: bd --afs +export afs = (disk)-> + { stdout, stderr } = await px "sudo fsck_apfs /dev/#{disk}" + console.log chalk.yellowBright "处理命令: afs" + log { stdout, stderr } + + +# 处理info命令: bd --info +export info = (disk)-> + { stdout, stderr } = await px "sudo ../bin/apfs-inspect /dev/#{disk}" + console.log chalk.yellowBright "处理命令: info" + log { stdout, stderr } + +# 处理列表命令, 列出目录下所有内容, 包含文件和文件夹: bd --list +export list = ({disk, dir})-> + { stdout, stderr } = await px "sudo ../bin/apfs-list /dev/#{disk} 0 #{dir}" + console.log chalk.yellowBright "处理命令: list" + log { stdout, stderr } + +# 备份单独一个文件的命令, bd --back + +export back = ({disk, frompath, topath})-> + # 判断目录是否存在, 如果不存在就新建目录 + await file.newdir topath + # 组装命令 + cmd="sudo ../bin/apfs-recover /dev/#{disk} 0 \"#{frompath}\" > \"#{topath}\"" + console.log chalk.yellowBright "--------命令行-------",cmd + { stdout, stderr } = await px cmd + + console.log chalk.yellowBright "处理命令: back" + #log { stdout, stderr } + +export default { + + disklist + afs + info + list + back +} + diff --git "a/coffee/src/\346\212\200\346\234\257\346\226\271\346\241\210.coffee" "b/coffee/src/\346\212\200\346\234\257\346\226\271\346\241\210.coffee" new file mode 100755 index 0000000..7060fdf --- /dev/null +++ "b/coffee/src/\346\212\200\346\234\257\346\226\271\346\241\210.coffee" @@ -0,0 +1,135 @@ +import chalk from 'chalk' +#chalk = require('chalk') +#import {file} from 'mlib' +import lph from './lornpughelp.cs' +import { spawn,exec } from 'child_process' +import util from 'util' + +{iscmd, dolp, dodir}=lph + + +# ------------------init--------------------- +arg=process.argv[2..] +console.log '环境和参数信息:' +console.table [ + {'键: ':'process.cwd()', '值: ': process.cwd()} + {'键: ':'__dirname', '值: ':__dirname} + {'键: ':'process.argv', '值: ':process.argv} + {'键: ':'真参数', '值: ':arg} +] + +cmds=[] # 传入的参数的命令数组 +files=[] # 传入的文件数组 + +for x in arg + if iscmd x then cmds.push x else files.push x + + +console.log chalk.blueBright "命令: #{cmds} " +console.log chalk.yellowBright "文件: #{files} " + + +# 处理命令 +isdefault = cmds.length ==0 +for x in cmds + isdir=/^--dir$/.test x + isio=/^--io$/.test x + islp=/^--lp$/.test x + + + + +# 根据命令, 处理文件, 忽略node_module, 未来根据.gitignore忽略 +if isdefault # 默认是跑测试文件 + console.log (chalk.cyanBright '默认行为:'), '测试结果: ' + +else if islp # 修改.zshrc文件, 增加快捷方式 + dolp 0 +else if isdir # 建测试目录, 初始化测试文件 + if files.length==0 + dodir '.' #如果没有任何文件参数, 那么就是从本地搞深度遍历 + else + dodir x for x in files + + console.log (chalk.cyanBright '初始化'), '初始化成功: ' + +else if isio # 增加测试文件 + console.log (chalk.cyanBright '初始化'), '初始化成功: ' + +else + console.log chalk.redBright '抱歉啊: 不知道你想干啥' + + + + + +# 调用外部命令 +ls = spawn('ls', ['-lh', '/usr']) +ls.stdout.on 'data', (data) -> + console.log chalk.yellowBright "spawn" + console.log chalk.greenBright "stdout: #{data}" +ls.stderr.on 'data', (data) -> + console.log chalk.yellowBright "spawn" + console.error chalk.redBright "stderr: #{data}" +ls.on 'close', (code) -> + console.log chalk.yellowBright "spawn" + console.log chalk.yellowBright "child process exited with code #{code}" +# exec方式 +exec 'cat *.js missing_file | wc -l', (error, stdout, stderr) -> + if error + console.log chalk.yellowBright "exec" + console.error chalk.redBright "exec error: #{error}" + return + console.log chalk.yellowBright "exec" + console.log chalk.greenBright "stdout: #{stdout}" + console.error chalk.redBright "stderr: #{stderr}" + +# promise的exec +px = util.promisify exec +do -> + { stdout, stderr } = await px 'ls -a .*' + console.log chalk.yellowBright "execpromise" + console.log 'stdout:', chalk.greenBright stdout + console.error 'stderr:', chalk.redBright stderr + + + +### +try { + new Function('var {a} = {a: 1}')(); +} catch(error) { + console.error('Your JavaScript runtime does not support some features used by the coffee command. Please use Node 6 or later.'); + process.exit(1); +} + +var path=require('path'); +var fs=require('fs'); + +var potentialPaths=[ + path.join(process.cwd(),), + path.join(process.cwd(),), + path.join(process.cwd(),), + path.join(__dirname,'../lib/c') +]; + +for(var i=0,len=potentialPaths.length;i') + .option('-u, --username ','The user to authenticate as') + .option('-p, --password ','The users password') + .action(function(file) { + console.log('user: %s pass: %s file: %s', + program.username,program.password,file); + }) + .parse(process.argv); +### diff --git a/coffee/webpack.config.coffee b/coffee/webpack.config.coffee new file mode 100644 index 0000000..87fab93 --- /dev/null +++ b/coffee/webpack.config.coffee @@ -0,0 +1,64 @@ +{ CleanWebpackPlugin } = require 'clean-webpack-plugin' +nodeExternals = require 'webpack-node-externals' +glob = require "glob" +path = require 'path' +webpack = require 'webpack' + +#先按照测试环境配置, 生产环境是不一样的. +module.exports = + mode: 'development' + devtool: 'inline-source-map' + target: 'node' + + output: + path: path.resolve(__dirname, 'dist/api') + #filename: '[name].[contenthash].js' # 这个会导致vscode的调试不生效. 好神奇. + filename: '[name].js' + library: 'backdir' # 指定library的name + libraryTarget: 'umd' # 指定library编译的兼容性, common, es6, amd, umd, link... + #publicPath: '.' + externals:[ + nodeExternals() #这个很有用, 排除所有node_modules + /^library\/.+$/ + ] + entry: {# 生成多个entry, 对象格式 + bin: './src/backdir.cs' + (glob.sync('./src/**.cs').reduce (obj, el)-> + obj[path.parse(el).name] = el + obj + ,{})... + } + plugins: [ + new CleanWebpackPlugin cleanStaleWebpackAssets: false + new webpack.BannerPlugin + banner: '#!/usr/bin/env node' + raw: true + ], + module:rules:[ + { + test: /\.m?js$/ + exclude: /(node_modules|bower_components)/ + use: loader: 'babel-loader' + } + { + test: /\.coffee$|\.cs$/, + exclude: /(node_modules|bower_components)/ + loader: 'coffee-loader' + options: transpile: presets: ['@babel/env',"@babel/react"] + } + { + test: /\.cson$/ + use: loader: 'cson-loader' + } + ] + + optimization: + runtimeChunk: 'single', + splitChunks: cacheGroups: vendor: + test: /[\\/]node_modules[\\/]/ + name: 'vendors' + chunks: 'all' + + resolve: # 解决自动查找index.cs而不是index.js的问题 #lib的配置 + alias: mlib: path.resolve __dirname, '/Users/bergman/git/_X/code/lib/mcktools/src/' + extensions: ['.cs', '.coffee', '.mjs', '.js'] diff --git a/coffee/webpack.config.js b/coffee/webpack.config.js new file mode 100644 index 0000000..eee1048 --- /dev/null +++ b/coffee/webpack.config.js @@ -0,0 +1,96 @@ +(function() { + var CleanWebpackPlugin, glob, nodeExternals, path, webpack; + + ({CleanWebpackPlugin} = require('clean-webpack-plugin')); + + nodeExternals = require('webpack-node-externals'); + + glob = require("glob"); + + path = require('path'); + + webpack = require('webpack'); + + //先按照测试环境配置, 生产环境是不一样的. + module.exports = { + mode: 'development', + devtool: 'inline-source-map', + target: 'node', + output: { + path: path.resolve(__dirname, 'dist/api'), + //filename: '[name].[contenthash].js' # 这个会导致vscode的调试不生效. 好神奇. + filename: '[name].js', + library: 'backdir', // 指定library的name + libraryTarget: 'umd' // 指定library编译的兼容性, common, es6, amd, umd, link... + }, + //publicPath: '.' + externals: [nodeExternals(), /^library\/.+$/], //这个很有用, 排除所有node_modules + entry: { + bin: './src/backdir.cs', + ...(glob.sync('./src/**.cs').reduce(function(obj, el) { + obj[path.parse(el).name] = el; + return obj; + }, {})) + }, + plugins: [ + new CleanWebpackPlugin({ + cleanStaleWebpackAssets: false + }), + new webpack.BannerPlugin({ + banner: '#!/usr/bin/env node', + raw: true + }) + ], + module: { + rules: [ + { + test: /\.m?js$/, + exclude: /(node_modules|bower_components)/, + use: { + loader: 'babel-loader' + } + }, + { + test: /\.coffee$|\.cs$/, + exclude: /(node_modules|bower_components)/, + loader: 'coffee-loader', + options: { + transpile: { + presets: ['@babel/env', + "@babel/react"] + } + } + }, + { + test: /\.cson$/, + use: { + loader: 'cson-loader' + } + } + ] + }, + optimization: { + runtimeChunk: 'single', + splitChunks: { + cacheGroups: { + vendor: { + test: /[\\\/]node_modules[\\\/]/, + name: 'vendors', + chunks: 'all' + } + } + } + }, + resolve: { + alias: { + mlib: path.resolve(__dirname, '/Users/bergman/git/_X/code/lib/mcktools/src/') + }, + extensions: ['.cs', '.coffee', '.mjs', '.js'] + } + }; + +}).call(this); + + +//# sourceMappingURL=webpack.config.js.map +//# sourceURL=coffeescript \ No newline at end of file diff --git a/coffee/webpack.config.js.map b/coffee/webpack.config.js.map new file mode 100644 index 0000000..89af635 --- /dev/null +++ b/coffee/webpack.config.js.map @@ -0,0 +1 @@ +{"version":3,"file":"webpack.config.js","sourceRoot":"","sources":["webpack.config.coffee"],"names":[],"mappings":"AAAA;AAAA,MAAA,kBAAA,EAAA,IAAA,EAAA,aAAA,EAAA,IAAA,EAAA;;EAAA,CAAA,CAAE,kBAAF,CAAA,GAAyB,OAAA,CAAQ,sBAAR,CAAzB;;EACA,aAAA,GAAgB,OAAA,CAAQ,wBAAR;;EAChB,IAAA,GAAO,OAAA,CAAQ,MAAR;;EACP,IAAA,GAAO,OAAA,CAAQ,MAAR;;EACP,OAAA,GAAU,OAAA,CAAQ,SAAR,EAJV;;;EAOA,MAAM,CAAC,OAAP,GACC;IAAA,IAAA,EAAM,aAAN;IACA,OAAA,EAAS,mBADT;IAEA,MAAA,EAAQ,MAFR;IAIA,MAAA,EACC;MAAA,IAAA,EAAM,IAAI,CAAC,OAAL,CAAa,SAAb,EAAwB,UAAxB,CAAN;;MAEA,QAAA,EAAU,WAFV;MAGA,OAAA,EAAS,SAHT;MAIA,aAAA,EAAe,KAJf;IAAA,CALD;;IAWA,SAAA,EAAU,CACT,aAAA,CAAA,CADS,EAET,eAFS,CAXV;IAeA,KAAA,EAAO;MACN,GAAA,EAAK,kBADC;MAEN,GAAA,CAAC,IAAI,CAAC,IAAL,CAAU,aAAV,CAAwB,CAAC,MAAzB,CAAgC,QAAA,CAAC,GAAD,EAAM,EAAN,CAAA;QAChC,GAAI,CAAA,IAAI,CAAC,KAAL,CAAW,EAAX,CAAc,CAAC,IAAf,CAAJ,GAA2B;eAC3B;MAFgC,CAAhC,EAGA,CAAA,CAHA,CAAD;IAFM,CAfP;IAsBA,OAAA,EAAS;MACR,IAAI,kBAAJ,CAAuB;QAAA,uBAAA,EAAyB;MAAzB,CAAvB,CADQ;MAER,IAAI,OAAO,CAAC,YAAZ,CACC;QAAA,MAAA,EAAQ,qBAAR;QACA,GAAA,EAAK;MADL,CADD,CAFQ;KAtBT;IA4BA,MAAA,EAAO;MAAA,KAAA,EAAM;QACZ;UACC,IAAA,EAAM,SADP;UAEC,OAAA,EAAS,iCAFV;UAGC,GAAA,EAAK;YAAA,MAAA,EAAQ;UAAR;QAHN,CADY;QAMZ;UACC,IAAA,EAAM,iBADP;UAEC,OAAA,EAAS,iCAFV;UAGC,MAAA,EAAQ,eAHT;UAIC,OAAA,EAAS;YAAA,SAAA,EAAW;cAAA,OAAA,EAAS,CAAC,YAAD;QAAc,cAAd;YAAT;UAAX;QAJV,CANY;QAYZ;UACC,IAAA,EAAM,SADP;UAEC,GAAA,EAAK;YAAA,MAAA,EAAQ;UAAR;QAFN,CAZY;;IAAN,CA5BP;IA8CA,YAAA,EACC;MAAA,YAAA,EAAc,QAAd;MACA,WAAA,EAAa;QAAA,WAAA,EAAa;UAAA,MAAA,EACzB;YAAA,IAAA,EAAM,0BAAN;YACA,IAAA,EAAM,SADN;YAEA,MAAA,EAAQ;UAFR;QADyB;MAAb;IADb,CA/CD;IAqDA,OAAA,EACC;MAAA,KAAA,EAAO;QAAA,IAAA,EAAM,IAAI,CAAC,OAAL,CAAa,SAAb,EAAwB,8CAAxB;MAAN,CAAP;MACA,UAAA,EAAY,CAAC,KAAD,EAAQ,SAAR,EAAmB,MAAnB,EAA2B,KAA3B;IADZ;EAtDD;AARD"} \ No newline at end of file diff --git "a/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" "b/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" new file mode 100644 index 0000000..fe7de9d --- /dev/null +++ "b/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" @@ -0,0 +1,78 @@ +> 原本的项目没有提供可以操作目录的脚本, 另外一个同学提供的python脚本因为几个月没有更新也无法正常运转. 因此, 弄一个coffee的脚本copy文件. + +###### 20201230 +- 开工 + +``` +yarn # 安装依赖包 +yarn build # 编译项目 +yarn link # 给脚本快捷运行命令 +``` + +###### 20201231 + +- coffee操作系统命令 +- 被master/main坑了, 合并分支. + +###### 20210105 + +```js +//child_process.exec实际调用了下面这个 +module.exports.execFile //实际还是调用了spawn +//另一个child_process.spawn()调用了internalBinding +``` + +- https://medium.com/front-end-weekly/internals-of-node-advance-node-%EF%B8%8F-8612f6a957d7 +- https://nodejs.org/dist/latest-v15.x/docs/api/child_process.html + +```js +const { spawn } = require('child_process'); +const ls = spawn('ls', ['-lh', '/usr']); + +ls.stdout.on('data', (data) => { + console.log(`stdout: ${data}`); +}); + +ls.stderr.on('data', (data) => { + console.error(`stderr: ${data}`); +}); + +ls.on('close', (code) => { + console.log(`child process exited with code ${code}`); +}); +``` + +###### 20210107 + +- 继续操作命令行 +- 有四个函数对spawn进行了包装. + - child_process.spawn(), + - child_process.fork()执行并且建立一个IPC channel, 可以传消息 + - child_process.exec()包装spawn, 并且使用新的shell + - child_process.execFile()包装spawn, 但是不使用新的shell +- 这四个函数都返回childprocess实例 + - 这个对象实现了eventEmitter + - 因此可以注册listener + - exec和execfile还可以传入一个回调函数, 在完成命令后回调 +- 命令行调用部分形成blog. + +###### 20210108 + +- 包装我的常用函数 + +```sh +diskutil list +sudo fsck_apfs /dev/disk4 +sudo ./bin/apfs-inspect /dev/disk4 +sudo ./bin/apfs-list /dev/disk3s2 0 / + +sudo ../bin/apfs-recover /dev/disk4 0 "/地图/元素周期表-timg-3.jpeg" > "/Volumes/wd4black/back/地图/元素周期表-timg-3.jpeg" +mkdir /Volumes/wd4black/back/地图 # 新建目录, 如果目录不存在会报错 + +#不论是否有引号都可以正常执行. +bd --back disk4 "/地图/元素周期表-timg-3.jpeg" "/Volumes/wd4black/back/aaa.jpeg" +bd --back disk4 /地图/元素周期表-timg-3.jpeg /Volumes/wd4black/back/bbb.jpeg +``` + +- iscmd需要抽取出来 +- 单独备份初步完成, 下一步是根据目录情况进行备份. \ No newline at end of file From 2a2d5ca912bf912aed66cec446e8803e6a776357 Mon Sep 17 00:00:00 2001 From: bergman Date: Sun, 10 Jan 2021 20:58:55 +0800 Subject: [PATCH 03/10] lgo --- coffee/src/backdir.cs | 94 +++++++------------ coffee/src/backdirhelp.cs | 26 +++-- ...15\344\275\234\347\233\256\345\275\225.md" | 41 +++++++- 3 files changed, 92 insertions(+), 69 deletions(-) diff --git a/coffee/src/backdir.cs b/coffee/src/backdir.cs index a259dbd..d433154 100755 --- a/coffee/src/backdir.cs +++ b/coffee/src/backdir.cs @@ -4,65 +4,37 @@ import chalk from 'chalk' import bdh from './backdirhelp.cs' -{disklist, afs,info,list,back}=bdh - - +{disklist, afs,info,list,back, bd}=bdh # ------------------init--------------------- -arg=process.argv[2..] -console.log '环境和参数信息:' -console.table [ - {'键: ':'process.cwd()', '值: ': process.cwd()} - {'键: ':'__dirname', '值: ':__dirname} - {'键: ':'process.argv', '值: ':process.argv} - {'键: ':'真参数', '值: ':arg} -] - -cmds=[] # 传入的参数的命令数组 -files=[] # 传入的文件数组 - -for x in arg - if cmd.iscmd x then cmds.push x else files.push x - - -console.log chalk.blueBright "命令: #{cmds} " -console.log chalk.yellowBright "文件: #{files} " - - -# 处理命令 -isdefault = cmds.length ==0 -for x in cmds - switch x - when '--disklist' # 列出系统挂载的disk - disklist 0 - when '--afs' # 列出系统挂载的disk - afs files[0] - when '--info' # 列出系统挂载的disk - info files[0] - when '--list' # 列出系统挂载的disk - list disk:files[0], dir:files[1] - when '--back' # 列出系统挂载的disk - # 命令行的引号不重要 - #bd --back disk4 /地图/元素周期表-timg-3.jpeg /Volumes/wd4black/back/bbb.jpeg - #bd --back disk4 "/地图/元素周期表-timg-3.jpeg" "/Volumes/wd4black/back/aaa.jpeg" - back disk:files[0], frompath:files[1],topath:files[2] - else console.log chalk.redBright '抱歉啊, 不知道你想干啥:', x - - -# isdisklist=isdisklist ||/^--disklist$/.test x -# isafs=isafs||/^--afs$/.test x - -#isnothing= !isdefault && !isdisklist && !isafs - -# 根据命令, 处理文件, 忽略node_module, 未来根据.gitignore忽略 -if isdefault # 默认是跑测试文件 - console.log '默认行为:', chalk.cyanBright '啥也不干' -#if isdisklist # 列出系统挂载的disk -# disklist 0 -#if isafs # 列出系统挂载的disk -# afs 0 - -#if isnothing -# console.log chalk.redBright '抱歉啊: 不知道你想干啥' - - - +do -> + + {cmds, files}=cmd.initcmd 0 + + # 处理默认的备份目录命令 + #bd --back disk4 /地图 /Volumes/wd4black/back + #bd --back disk4 "/地图" "/Volumes/wd4black/back" + if cmds.length ==0 # 默认是跑测试文件 + console.log chalk.cyanBright '进行目录备份' + if files.length!=3 + console.log chalk.redBright '参数数量错误', files.length, files + return + bd disk:files[0], frompath:files[1],topath:files[2] + return 0 + + # 处理命令 + for x in cmds + switch x + when '--disklist' # 列出系统挂载的disk: bd --disklist + disklist 0 + when '--afs' # 列出某个disk的afs信息: bd --afs disk4 + afs files[0] + when '--info' # 列出某个disk的详细afs信息: bd --info disk4 + info files[0] + when '--list' # 列出某个disk的某个dir的详细信息: bd --list disk4 / + list disk:files[0], dir:files[1] + when '--back' + # 备份某个单独的文件, 需要参数: disk, 要被备份的文件路径, 备份copy的目标路径. 命令行的引号不重要 + #bd --back disk4 /地图/元素周期表-timg-3.jpeg /Volumes/wd4black/back/bbb.jpeg + #bd --back disk4 "/地图/元素周期表-timg-3.jpeg" "/Volumes/wd4black/back/aaa.jpeg" + back disk:files[0], frompath:files[1],topath:files[2] + else console.log chalk.redBright '抱歉啊, 不知道你想干啥:', x diff --git a/coffee/src/backdirhelp.cs b/coffee/src/backdirhelp.cs index b5cb6f1..e9db21c 100644 --- a/coffee/src/backdirhelp.cs +++ b/coffee/src/backdirhelp.cs @@ -3,10 +3,11 @@ import chalk from 'chalk' import {file} from 'mlib' import { spawn,exec } from 'child_process' import util from 'util' +import pa from 'path' px = util.promisify exec - +cmdpath= pa.resolve(__dirname, '../../../bin') # -----------------pure function----------------- # 输出 @@ -32,29 +33,42 @@ import util from 'util' # 处理info命令: bd --info export info = (disk)-> - { stdout, stderr } = await px "sudo ../bin/apfs-inspect /dev/#{disk}" + { stdout, stderr } = await px "sudo #{cmdpath}/apfs-inspect /dev/#{disk}" console.log chalk.yellowBright "处理命令: info" log { stdout, stderr } +# 得到列表 +getlist = ({disk, dir})-> + { stdout, stderr } = await px "sudo #{cmdpath}/apfs-list /dev/#{disk} 0 #{dir}" + # 处理列表命令, 列出目录下所有内容, 包含文件和文件夹: bd --list export list = ({disk, dir})-> - { stdout, stderr } = await px "sudo ../bin/apfs-list /dev/#{disk} 0 #{dir}" console.log chalk.yellowBright "处理命令: list" - log { stdout, stderr } + log await getlist {disk, dir} # 备份单独一个文件的命令, bd --back - export back = ({disk, frompath, topath})-> # 判断目录是否存在, 如果不存在就新建目录 await file.newdir topath # 组装命令 - cmd="sudo ../bin/apfs-recover /dev/#{disk} 0 \"#{frompath}\" > \"#{topath}\"" + cmd="sudo #{cmdpath}/apfs-recover /dev/#{disk} 0 \"#{frompath}\" > \"#{topath}\"" console.log chalk.yellowBright "--------命令行-------",cmd { stdout, stderr } = await px cmd console.log chalk.yellowBright "处理命令: back" #log { stdout, stderr } +# 默认的处理目录备份的接口 +export bd = ({disk, frompath, topath})-> + # 判断目录是否存在, 如果不存在就新建目录 + await file.newdir topath + # 组装命令 + cmd="sudo #{cmdpath}/apfs-recover /dev/#{disk} 0 \"#{frompath}\" > \"#{topath}\"" + console.log chalk.yellowBright "--------命令行-------",cmd + { stdout, stderr } = await px cmd + + console.log chalk.yellowBright "处理命令: back" + #log { stdout, stderr } export default { disklist diff --git "a/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" "b/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" index fe7de9d..c0fd31b 100644 --- "a/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" +++ "b/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" @@ -1,6 +1,42 @@ > 原本的项目没有提供可以操作目录的脚本, 另外一个同学提供的python脚本因为几个月没有更新也无法正常运转. 因此, 弄一个coffee的脚本copy文件. +### 编译 + +```sh +yarn # 安装依赖库 +yarn build # 编译 +yarn link # 命令行链接 +``` + +### 基础用法 + +``` +bd disk4 /地图 /Volumes/wd4black/back +bd disk4 "/地图" "/Volumes/wd4black/back" +``` + + + +### 更多命令 + +```sh +# 列出系统挂载的disk: +bd --disklist +# 列出某个disk的afs信息: +bd --afs disk4 +# 列出某个disk的详细afs信息: +bd --info disk4 +# 列出某个disk的某个dir的详细信息: +bd --list disk4 / +# 备份某个单独的文件, 需要参数: disk, 要被备份的文件路径, 备份copy的目标路径. 命令行的引号不重要 +bd --back disk4 /地图/元素周期表-timg-3.jpeg /Volumes/wd4black/back/bbb.jpeg +bd --back disk4 "/地图/元素周期表-timg-3.jpeg" "/Volumes/wd4black/back/ooo/xxx/xox/aaa.jpeg" +``` + +### log + ###### 20201230 + - 开工 ``` @@ -74,5 +110,6 @@ bd --back disk4 "/地图/元素周期表-timg-3.jpeg" "/Volumes/wd4black/back/aa bd --back disk4 /地图/元素周期表-timg-3.jpeg /Volumes/wd4black/back/bbb.jpeg ``` -- iscmd需要抽取出来 -- 单独备份初步完成, 下一步是根据目录情况进行备份. \ No newline at end of file +- iscmd需要抽取出来 done +- 单独备份初步完成, 下一步是根据目录情况进行备份. + From 595fe3cca4e87231dc7c1d02f9dd332547270723 Mon Sep 17 00:00:00 2001 From: bergman Date: Mon, 11 Jan 2021 10:04:31 +0800 Subject: [PATCH 04/10] test ok --- coffee/src/backdirhelp.cs | 80 ++++++++++++++---- ...15\344\275\234\347\233\256\345\275\225.md" | 83 ++++++++++++++++++- 2 files changed, 146 insertions(+), 17 deletions(-) diff --git a/coffee/src/backdirhelp.cs b/coffee/src/backdirhelp.cs index e9db21c..2e554c4 100644 --- a/coffee/src/backdirhelp.cs +++ b/coffee/src/backdirhelp.cs @@ -37,37 +37,88 @@ import pa from 'path' console.log chalk.yellowBright "处理命令: info" log { stdout, stderr } -# 得到列表 +# 解析字符串, 拿到{filelist, dirlist} +str2list= (s) -> + filelist=[] + dirlist=[] + reg= /^- INODE$([\s\S]*)^END: All done\.$/gm + arr = [(s.matchAll reg)...] + if arr.length!=1 + console.log chalk.redBright "出错了, list匹配结果数量不对#{arr.length} \n 匹配数组: #{arr}" + console.log chalk.yellowBright "出错的原始输入: #{s}" + return {filelist:[], dirlist:[]} + ss= arr[0][1] + # 解析单行 + #- DIR REC || Dirctry || target ID = 0x19 || name = .fseventsd + #- DIR REC || Dirctry || target ID = 0x27d743 || name = .DocumentRevisions-V100 + #- DIR REC || RegFile || target ID = 0x234dac || name = tmbootpicker.efi + #- DIR REC || Dirctry || target ID = 0x20000003f || name = 音乐 + # 需要排除的文件, 目录 + #- DIR REC || RegFile || target ID = 0x8b || name = .DS_Store + #- DIR REC || Dirctry || target ID = 0x879d0b || name = $RECYCLE.BIN + + # 文件 + #- DIR REC || RegFile || target ID = 0xa4 || name = 地图-National Map.jp2 + regf= /^- DIR REC \|\| RegFile \|\| target ID =[ x0-9a-f]+\|\| name = ([^.$][^\n\r]*)$/gm + f= [(ss.matchAll regf)...] + filelist.push x[1] for x in f + + # 目录 + #- DIR REC || Dirctry || target ID = 0x8c || name = ghost in the shell + regr= /^- DIR REC \|\| Dirctry \|\| target ID =[ x0-9a-f]+\|\| name = ([^.$][^\n\r]*)$/gm + r= [(ss.matchAll regr)...] + dirlist.push x[1] for x in r + + {filelist, dirlist} + +# 得到文件和目录列表 getlist = ({disk, dir})-> - { stdout, stderr } = await px "sudo #{cmdpath}/apfs-list /dev/#{disk} 0 #{dir}" + try + { stdout, stderr } = await px "sudo #{cmdpath}/apfs-list /dev/#{disk} 0 \"#{dir}\"" + {filelist, dirlist} = str2list stdout+stderr + return {filelist, dirlist} + catch err + console.log chalk.redBright "list error:#{dir}" + return {filelist:[], dirlist:[]} # 处理列表命令, 列出目录下所有内容, 包含文件和文件夹: bd --list export list = ({disk, dir})-> console.log chalk.yellowBright "处理命令: list" - log await getlist {disk, dir} - + {filelist, dirlist} = await getlist {disk, dir} + log { stdout:filelist, stderr:dirlist} # 备份单独一个文件的命令, bd --back export back = ({disk, frompath, topath})-> # 判断目录是否存在, 如果不存在就新建目录 await file.newdir topath # 组装命令 cmd="sudo #{cmdpath}/apfs-recover /dev/#{disk} 0 \"#{frompath}\" > \"#{topath}\"" - console.log chalk.yellowBright "--------命令行-------",cmd - { stdout, stderr } = await px cmd - - console.log chalk.yellowBright "处理命令: back" + #console.log chalk.yellowBright "--------命令行-------",cmd + try + { stdout, stderr } = await px cmd + catch err + console.log chalk.redBright "copy error:#{frompath}" + + console.log chalk.yellowBright "copy file : #{chalk.cyanBright frompath} >>>>>>> #{chalk.cyanBright topath}" #log { stdout, stderr } + + +# 处理目录 +bdir = ({disk, frompath, topath})-> + {filelist, dirlist} = await getlist {disk, dir:frompath} + await back {disk, frompath:"#{frompath}/#{x}", topath:"#{topath}/#{x}"} for x in filelist + bdir {disk, frompath:"#{frompath}/#{x}", topath:"#{topath}/#{x}"} for x in dirlist + + + # 默认的处理目录备份的接口 export bd = ({disk, frompath, topath})-> - # 判断目录是否存在, 如果不存在就新建目录 + # 判断目录是否存在, 如果不存在就新建目录 await file.newdir topath - # 组装命令 - cmd="sudo #{cmdpath}/apfs-recover /dev/#{disk} 0 \"#{frompath}\" > \"#{topath}\"" - console.log chalk.yellowBright "--------命令行-------",cmd - { stdout, stderr } = await px cmd + bdir {disk, frompath, topath} + - console.log chalk.yellowBright "处理命令: back" + #log { stdout, stderr } export default { @@ -76,5 +127,6 @@ await file.newdir topath info list back + bd } diff --git "a/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" "b/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" index c0fd31b..b9f2a3b 100644 --- "a/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" +++ "b/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" @@ -10,12 +10,15 @@ yarn link # 命令行链接 ### 基础用法 -``` +```sh bd disk4 /地图 /Volumes/wd4black/back -bd disk4 "/地图" "/Volumes/wd4black/back" -``` +# 文件或者目录名有空格的时候, 需要双引号 +bd disk4 "/地图" "/Volumes/wd4black/back" +# 备份disk4的所有内容 +bd disk4 / /Volumes/wd4black/back +``` ### 更多命令 @@ -113,3 +116,77 @@ bd --back disk4 /地图/元素周期表-timg-3.jpeg /Volumes/wd4black/back/bbb.j - iscmd需要抽取出来 done - 单独备份初步完成, 下一步是根据目录情况进行备份. +###### 0110 + +- 继续处理目录备份 + +```sh +# 目录拿到的是这个: +Records for file-system object 0x2 -- `/` -- +- INODE +- DIR REC || Dirctry || target ID = 0x10 || name = .Spotlight-V100 +- DIR REC || RegFile || target ID = 0x88 || name = .DS_Store +- DIR REC || Dirctry || target ID = 0x8a || name = 地图 +- DIR REC || Dirctry || target ID = 0x13 || name = .fseventsd + +END: All done. + +# 文件拿到的是这个: +Records for file-system object 0x99 -- `/地图/元素周期表-timg-3.jpeg` -- +- INODE +- XATTR +- XATTR +- XATTR +- DSTREAM ID || file ID = 0x99 || ref. count = 1 +- FILE EXTENT || file ID = 0x99 || log. addr. = 0 || length = 237568 B = 0x3a000 B = 58 blocks = 0x3a blocks || phys. block = 0x405d3 + +END: All done. + +# 以地图目录距离 +Records for file-system object 0x8a -- `/地图` -- +- INODE +- DIR REC || RegFile || target ID = 0x99 || name = 元素周期表-timg-3.jpeg +- DIR REC || RegFile || target ID = 0xa0 || name = 地图-National Geographic Mars Reference Map.jp2 +- DIR REC || RegFile || target ID = 0x8b || name = .DS_Store +- DIR REC || RegFile || target ID = 0x97 || name = 元素周期表-0173b05b768daca801218d32832f21.jpg@3000w_1l_0o_100sh.jpg +- DIR REC || RegFile || target ID = 0x9c || name = 地图-hst207_01b_pic.jpg +- DIR REC || RegFile || target ID = 0x98 || name = 元素周期表-timg-2.jpeg +- DIR REC || RegFile || target ID = 0xa4 || name = 地图-National Geographic World Satellite Map.jp2 +- DIR REC || Dirctry || target ID = 0x8c || name = ghost in the shell +- DIR REC || RegFile || target ID = 0x9e || name = 地图-National Geographic Earth at Night Map.jp2 +- DIR REC || RegFile || target ID = 0xa2 || name = 地图-National Geographic Universe Reference Map.jp2 +- DIR REC || RegFile || target ID = 0x9d || name = 地图-National Geographic Antarctica Satellite Map.jpg +- DIR REC || RegFile || target ID = 0xa1 || name = 地图-National Geographic Milky Way Reference Map.jp2 +- DIR REC || RegFile || target ID = 0x9b || name = 地图-5db71113h68962619fda1.jpeg +- DIR REC || RegFile || target ID = 0x9f || name = 地图-National Geographic Earth's Fractured Surface Map.jp2 +- DIR REC || RegFile || target ID = 0x9a || name = 元素周期表-timg.jpeg +- DIR REC || RegFile || target ID = 0xa5 || name = 地图-v2-5a05688930961118ce12e8801ccfb6a2_r.jpg +- DIR REC || RegFile || target ID = 0xa3 || name = 地图-National Geographic World Physical Ocean Floor.jp2 + +END: All done. + + +# 神啊, 还有这种情况: +- INODE +- XATTR +- DIR REC || Dirctry || target ID = 0x943e61 || name = 电影电视剧 +- DIR REC || Dirctry || target ID = 0x13 || name = .HFS+ Private Directory Data +- DIR REC || Dirctry || target ID = 0x15 || name = .Spotlight-V100 +- DIR REC || RegFile || target ID = 0xb9 || name = .DS_Store +- DIR REC || RegFile || target ID = 0x234dae || name = .disk_label_2x +- DIR REC || Dirctry || target ID = 0x879d0b || name = $RECYCLE.BIN +- DIR REC || Dirctry || target ID = 0x14 || name = .Trashes +- DIR REC || Dirctry || target ID = 0x5e9a || name = 百度云同步盘3 +- DIR REC || RegFile || target ID = 0x234daf || name = .VolumeIcon.icns +- DIR REC || Dirctry || target ID = 0x19 || name = .fseventsd +- DIR REC || Dirctry || target ID = 0x27d743 || name = .DocumentRevisions-V100 +- DIR REC || RegFile || target ID = 0x234dac || name = tmbootpicker.efi +- DIR REC || RegFile || target ID = 0x234dad || name = .disk_label +- DIR REC || Dirctry || target ID = 0x8a6105 || name = 备份 +- DIR REC || Dirctry || target ID = 0x20000003f || name = 音乐 +- DIR REC || Dirctry || target ID = 0x27d746 || name = .TemporaryItems +- DIR REC || RegFile || target ID = 0x893ac9 || name = .apdisk + +END: All done. +``` + From f66f755ddcedaead8ecad771de9dec86a9dd00c9 Mon Sep 17 00:00:00 2001 From: bergman Date: Mon, 11 Jan 2021 16:28:32 +0800 Subject: [PATCH 05/10] log --- ...15\344\275\234\347\233\256\345\275\225.md" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" "b/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" index b9f2a3b..bf32f88 100644 --- "a/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" +++ "b/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" @@ -190,3 +190,27 @@ END: All done. END: All done. ``` +###### 0111 + +```sh +碰到问题: +node:events:353 + throw er; // Unhandled 'error' event + ^ + +Error: read ENOTCONN +``` + +```sh +rm -rf node_modules +rm package-lock.json yarn.lock +npm cache clear --force +npm install + +# kill nodejs相关进程 +killall node +ps aux | grep node +kill -9 PID +``` + +- 然后重启试图解决这个问题 \ No newline at end of file From c22037b90830a1e56b60f86a4dc06d568b5a2e06 Mon Sep 17 00:00:00 2001 From: bergman Date: Mon, 11 Jan 2021 17:55:43 +0800 Subject: [PATCH 06/10] lgo --- coffee/src/backdirhelp.cs | 1 + ...46\223\215\344\275\234\347\233\256\345\275\225.md" | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/coffee/src/backdirhelp.cs b/coffee/src/backdirhelp.cs index 2e554c4..f9c4a0f 100644 --- a/coffee/src/backdirhelp.cs +++ b/coffee/src/backdirhelp.cs @@ -106,6 +106,7 @@ await file.newdir topath # 处理目录 bdir = ({disk, frompath, topath})-> {filelist, dirlist} = await getlist {disk, dir:frompath} + # todo 如果path=/ 那么下面的语句会导致 //xxx这种, 如果用if判断又比较丑陋, 没想好咋搞. await back {disk, frompath:"#{frompath}/#{x}", topath:"#{topath}/#{x}"} for x in filelist bdir {disk, frompath:"#{frompath}/#{x}", topath:"#{topath}/#{x}"} for x in dirlist diff --git "a/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" "b/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" index bf32f88..88686f8 100644 --- "a/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" +++ "b/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" @@ -213,4 +213,13 @@ ps aux | grep node kill -9 PID ``` -- 然后重启试图解决这个问题 \ No newline at end of file +- 然后重启试图解决这个问题 + +- todo, 记录另一个如果用/作为目录会引起的bug, 没有想好怎么修复 + +```sh +# todo 如果path=/ 那么下面的语句会导致 //xxx这种, 如果用if判断又比较丑陋, 没想好咋搞. +await back {disk, frompath:"#{frompath}/#{x}", topath:"#{topath}/#{x}"} for x in filelist +bdir {disk, frompath:"#{frompath}/#{x}", topath:"#{topath}/#{x}"} for x in dirlist +``` + From 089a5f8e0db7a6f4d5044ec6b15cbfe4ec5e1cdd Mon Sep 17 00:00:00 2001 From: bergman Date: Mon, 11 Jan 2021 21:35:12 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=9A=84stack=20overflow=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- coffee/src/backdirhelp.cs | 4 ++-- ...15\344\275\234\347\233\256\345\275\225.md" | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/coffee/src/backdirhelp.cs b/coffee/src/backdirhelp.cs index f9c4a0f..a644834 100644 --- a/coffee/src/backdirhelp.cs +++ b/coffee/src/backdirhelp.cs @@ -108,7 +108,7 @@ await file.newdir topath {filelist, dirlist} = await getlist {disk, dir:frompath} # todo 如果path=/ 那么下面的语句会导致 //xxx这种, 如果用if判断又比较丑陋, 没想好咋搞. await back {disk, frompath:"#{frompath}/#{x}", topath:"#{topath}/#{x}"} for x in filelist - bdir {disk, frompath:"#{frompath}/#{x}", topath:"#{topath}/#{x}"} for x in dirlist + await bdir {disk, frompath:"#{frompath}/#{x}", topath:"#{topath}/#{x}"} for x in dirlist @@ -116,7 +116,7 @@ await file.newdir topath export bd = ({disk, frompath, topath})-> # 判断目录是否存在, 如果不存在就新建目录 await file.newdir topath - bdir {disk, frompath, topath} + await bdir {disk, frompath, topath} diff --git "a/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" "b/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" index 88686f8..bdd080b 100644 --- "a/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" +++ "b/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" @@ -36,6 +36,29 @@ bd --back disk4 /地图/元素周期表-timg-3.jpeg /Volumes/wd4black/back/bbb.j bd --back disk4 "/地图/元素周期表-timg-3.jpeg" "/Volumes/wd4black/back/ooo/xxx/xox/aaa.jpeg" ``` +###### 程序发生错误时, 需要用到的工具 + +```sh +# 查看多少apfs-tools死在进程中 +ps aux | grep apfs-tools +# 根据死在进程中的具体内容, 决定杀掉哪些, 可能这么做就万事大吉了 +killall apfs-recover + +# 如果遇到node报错: node:events:353 throw er; +# 原因是node的child_process新建子进程stack overflow了, 需要用下面的命令清理 +rm -rf node_modules +rm package-lock.json yarn.lock +npm cache clear --force +npm install # 或者yarn + +# kill nodejs相关进程 +killall node +ps aux | grep node +kill -9 PID +``` + + + ### log ###### 20201230 @@ -223,3 +246,4 @@ await back {disk, frompath:"#{frompath}/#{x}", topath:"#{topath}/#{x}"} for x in bdir {disk, frompath:"#{frompath}/#{x}", topath:"#{topath}/#{x}"} for x in dirlist ``` +- 仔细检查, 发现了一个异步引起的问题, 因为异步调用了child_process, 所以会导致资源占用过多, stack_overflow, 由此导致node报错. \ No newline at end of file From 7e2483ee970c10343a39665910ab0b43b2c4847d Mon Sep 17 00:00:00 2001 From: bergman Date: Mon, 11 Jan 2021 22:16:47 +0800 Subject: [PATCH 08/10] delete no use file --- coffee/README.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 coffee/README.md diff --git a/coffee/README.md b/coffee/README.md deleted file mode 100644 index 15c8e87..0000000 --- a/coffee/README.md +++ /dev/null @@ -1,5 +0,0 @@ - -# lornpug -# 舔狗项目 -# 舔狗项目 -alias lp="lpg" \ No newline at end of file From 6e4d40bc7007b2267c799cb523f0236f2448ef39 Mon Sep 17 00:00:00 2001 From: bergman Date: Wed, 13 Jan 2021 16:50:23 +0800 Subject: [PATCH 09/10] fix bug --- coffee/src/backdirhelp.cs | 6 ++++-- ...4\346\223\215\344\275\234\347\233\256\345\275\225.md" | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/coffee/src/backdirhelp.cs b/coffee/src/backdirhelp.cs index a644834..43f409f 100644 --- a/coffee/src/backdirhelp.cs +++ b/coffee/src/backdirhelp.cs @@ -76,6 +76,7 @@ import pa from 'path' try { stdout, stderr } = await px "sudo #{cmdpath}/apfs-list /dev/#{disk} 0 \"#{dir}\"" {filelist, dirlist} = str2list stdout+stderr + console.log chalk.yellowBright "扫描目录 : #{chalk.cyanBright dir} >>>>>>> 文件备份中: #{chalk.cyanBright filelist} " return {filelist, dirlist} catch err console.log chalk.redBright "list error:#{dir}" @@ -98,7 +99,7 @@ await file.newdir topath catch err console.log chalk.redBright "copy error:#{frompath}" - console.log chalk.yellowBright "copy file : #{chalk.cyanBright frompath} >>>>>>> #{chalk.cyanBright topath}" + #console.log chalk.yellowBright "copy file : #{chalk.cyanBright frompath} >>>>>>> #{chalk.cyanBright topath}" #log { stdout, stderr } @@ -117,7 +118,8 @@ await file.newdir topath # 判断目录是否存在, 如果不存在就新建目录 await file.newdir topath await bdir {disk, frompath, topath} - + + console.log chalk.yellowBright "backfinish, you can check error, that write in red word" #log { stdout, stderr } diff --git "a/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" "b/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" index bdd080b..e6ec91c 100644 --- "a/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" +++ "b/coffee/\350\204\232\346\234\254\346\223\215\344\275\234\347\233\256\345\275\225.md" @@ -11,12 +11,13 @@ yarn link # 命令行链接 ### 基础用法 ```sh +# 正常使用 bd disk4 /地图 /Volumes/wd4black/back # 文件或者目录名有空格的时候, 需要双引号 bd disk4 "/地图" "/Volumes/wd4black/back" -# 备份disk4的所有内容 +# 备份disk4的所有内容, 强烈不建议使用 bd disk4 / /Volumes/wd4black/back ``` @@ -246,4 +247,8 @@ await back {disk, frompath:"#{frompath}/#{x}", topath:"#{topath}/#{x}"} for x in bdir {disk, frompath:"#{frompath}/#{x}", topath:"#{topath}/#{x}"} for x in dirlist ``` -- 仔细检查, 发现了一个异步引起的问题, 因为异步调用了child_process, 所以会导致资源占用过多, stack_overflow, 由此导致node报错. \ No newline at end of file +- 仔细检查, 发现了一个异步引起的问题, 因为异步调用了child_process, 所以会导致资源占用过多, stack_overflow, 由此导致node报错. + +###### 0112 + +- 打印每一个copy的file, 导致了这个备份过于缓慢. 改为仅仅打印目录. done \ No newline at end of file From 1954993c0d3395bb79fc71e021fa916d19ec8dc7 Mon Sep 17 00:00:00 2001 From: bergman Date: Mon, 25 Jan 2021 16:06:43 +0800 Subject: [PATCH 10/10] use mcktools an external lib --- coffee/package.json | 4 ++-- coffee/src/backdir.cs | 2 +- coffee/src/backdirhelp.cs | 2 +- coffee/webpack.config.coffee | 6 +++--- coffee/webpack.config.js | 10 ++++------ coffee/webpack.config.js.map | 2 +- 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/coffee/package.json b/coffee/package.json index 2c5d65c..a8bf1d7 100644 --- a/coffee/package.json +++ b/coffee/package.json @@ -10,7 +10,6 @@ "backdir": "./dist/api/bin.js", "dir": "./dist/api/bin.js", "bd": "./dist/api/bin.js" - }, "scripts": { "test": "node ./dist/api/main.js", @@ -43,6 +42,7 @@ "webpack-node-externals": "^2.5.2" }, "dependencies": { - "chalk": "^4.1.0" + "chalk": "^4.1.0", + "mcktools": "^1.1.0" } } diff --git a/coffee/src/backdir.cs b/coffee/src/backdir.cs index d433154..c9544b1 100755 --- a/coffee/src/backdir.cs +++ b/coffee/src/backdir.cs @@ -1,6 +1,6 @@ import chalk from 'chalk' #chalk = require('chalk') -import {cmd} from 'mlib' +import {cmd} from 'mcktools/cmd' import bdh from './backdirhelp.cs' diff --git a/coffee/src/backdirhelp.cs b/coffee/src/backdirhelp.cs index 43f409f..0465305 100644 --- a/coffee/src/backdirhelp.cs +++ b/coffee/src/backdirhelp.cs @@ -1,6 +1,6 @@ import chalk from 'chalk' #chalk = require('chalk') -import {file} from 'mlib' +import {file} from 'mcktools/cmd' import { spawn,exec } from 'child_process' import util from 'util' import pa from 'path' diff --git a/coffee/webpack.config.coffee b/coffee/webpack.config.coffee index 87fab93..7a1c047 100644 --- a/coffee/webpack.config.coffee +++ b/coffee/webpack.config.coffee @@ -59,6 +59,6 @@ module.exports = name: 'vendors' chunks: 'all' - resolve: # 解决自动查找index.cs而不是index.js的问题 #lib的配置 - alias: mlib: path.resolve __dirname, '/Users/bergman/git/_X/code/lib/mcktools/src/' - extensions: ['.cs', '.coffee', '.mjs', '.js'] + #resolve: # 解决自动查找index.cs而不是index.js的问题 #lib的配置 + # alias: mlib: path.resolve __dirname, '/Users/bergman/git/_X/code/lib/mcktools/src/' + # extensions: ['.cs', '.coffee', '.mjs', '.js'] diff --git a/coffee/webpack.config.js b/coffee/webpack.config.js index eee1048..1d5d01d 100644 --- a/coffee/webpack.config.js +++ b/coffee/webpack.config.js @@ -80,15 +80,13 @@ } } } - }, - resolve: { - alias: { - mlib: path.resolve(__dirname, '/Users/bergman/git/_X/code/lib/mcktools/src/') - }, - extensions: ['.cs', '.coffee', '.mjs', '.js'] } }; + //resolve: # 解决自动查找index.cs而不是index.js的问题 #lib的配置 +// alias: mlib: path.resolve __dirname, '/Users/bergman/git/_X/code/lib/mcktools/src/' +// extensions: ['.cs', '.coffee', '.mjs', '.js'] + }).call(this); diff --git a/coffee/webpack.config.js.map b/coffee/webpack.config.js.map index 89af635..21d36df 100644 --- a/coffee/webpack.config.js.map +++ b/coffee/webpack.config.js.map @@ -1 +1 @@ -{"version":3,"file":"webpack.config.js","sourceRoot":"","sources":["webpack.config.coffee"],"names":[],"mappings":"AAAA;AAAA,MAAA,kBAAA,EAAA,IAAA,EAAA,aAAA,EAAA,IAAA,EAAA;;EAAA,CAAA,CAAE,kBAAF,CAAA,GAAyB,OAAA,CAAQ,sBAAR,CAAzB;;EACA,aAAA,GAAgB,OAAA,CAAQ,wBAAR;;EAChB,IAAA,GAAO,OAAA,CAAQ,MAAR;;EACP,IAAA,GAAO,OAAA,CAAQ,MAAR;;EACP,OAAA,GAAU,OAAA,CAAQ,SAAR,EAJV;;;EAOA,MAAM,CAAC,OAAP,GACC;IAAA,IAAA,EAAM,aAAN;IACA,OAAA,EAAS,mBADT;IAEA,MAAA,EAAQ,MAFR;IAIA,MAAA,EACC;MAAA,IAAA,EAAM,IAAI,CAAC,OAAL,CAAa,SAAb,EAAwB,UAAxB,CAAN;;MAEA,QAAA,EAAU,WAFV;MAGA,OAAA,EAAS,SAHT;MAIA,aAAA,EAAe,KAJf;IAAA,CALD;;IAWA,SAAA,EAAU,CACT,aAAA,CAAA,CADS,EAET,eAFS,CAXV;IAeA,KAAA,EAAO;MACN,GAAA,EAAK,kBADC;MAEN,GAAA,CAAC,IAAI,CAAC,IAAL,CAAU,aAAV,CAAwB,CAAC,MAAzB,CAAgC,QAAA,CAAC,GAAD,EAAM,EAAN,CAAA;QAChC,GAAI,CAAA,IAAI,CAAC,KAAL,CAAW,EAAX,CAAc,CAAC,IAAf,CAAJ,GAA2B;eAC3B;MAFgC,CAAhC,EAGA,CAAA,CAHA,CAAD;IAFM,CAfP;IAsBA,OAAA,EAAS;MACR,IAAI,kBAAJ,CAAuB;QAAA,uBAAA,EAAyB;MAAzB,CAAvB,CADQ;MAER,IAAI,OAAO,CAAC,YAAZ,CACC;QAAA,MAAA,EAAQ,qBAAR;QACA,GAAA,EAAK;MADL,CADD,CAFQ;KAtBT;IA4BA,MAAA,EAAO;MAAA,KAAA,EAAM;QACZ;UACC,IAAA,EAAM,SADP;UAEC,OAAA,EAAS,iCAFV;UAGC,GAAA,EAAK;YAAA,MAAA,EAAQ;UAAR;QAHN,CADY;QAMZ;UACC,IAAA,EAAM,iBADP;UAEC,OAAA,EAAS,iCAFV;UAGC,MAAA,EAAQ,eAHT;UAIC,OAAA,EAAS;YAAA,SAAA,EAAW;cAAA,OAAA,EAAS,CAAC,YAAD;QAAc,cAAd;YAAT;UAAX;QAJV,CANY;QAYZ;UACC,IAAA,EAAM,SADP;UAEC,GAAA,EAAK;YAAA,MAAA,EAAQ;UAAR;QAFN,CAZY;;IAAN,CA5BP;IA8CA,YAAA,EACC;MAAA,YAAA,EAAc,QAAd;MACA,WAAA,EAAa;QAAA,WAAA,EAAa;UAAA,MAAA,EACzB;YAAA,IAAA,EAAM,0BAAN;YACA,IAAA,EAAM,SADN;YAEA,MAAA,EAAQ;UAFR;QADyB;MAAb;IADb,CA/CD;IAqDA,OAAA,EACC;MAAA,KAAA,EAAO;QAAA,IAAA,EAAM,IAAI,CAAC,OAAL,CAAa,SAAb,EAAwB,8CAAxB;MAAN,CAAP;MACA,UAAA,EAAY,CAAC,KAAD,EAAQ,SAAR,EAAmB,MAAnB,EAA2B,KAA3B;IADZ;EAtDD;AARD"} \ No newline at end of file +{"version":3,"file":"webpack.config.js","sourceRoot":"","sources":["webpack.config.coffee"],"names":[],"mappings":"AAAA;AAAA,MAAA,kBAAA,EAAA,IAAA,EAAA,aAAA,EAAA,IAAA,EAAA;;EAAA,CAAA,CAAE,kBAAF,CAAA,GAAyB,OAAA,CAAQ,sBAAR,CAAzB;;EACA,aAAA,GAAgB,OAAA,CAAQ,wBAAR;;EAChB,IAAA,GAAO,OAAA,CAAQ,MAAR;;EACP,IAAA,GAAO,OAAA,CAAQ,MAAR;;EACP,OAAA,GAAU,OAAA,CAAQ,SAAR,EAJV;;;EAOA,MAAM,CAAC,OAAP,GACC;IAAA,IAAA,EAAM,aAAN;IACA,OAAA,EAAS,mBADT;IAEA,MAAA,EAAQ,MAFR;IAIA,MAAA,EACC;MAAA,IAAA,EAAM,IAAI,CAAC,OAAL,CAAa,SAAb,EAAwB,UAAxB,CAAN;;MAEA,QAAA,EAAU,WAFV;MAGA,OAAA,EAAS,SAHT;MAIA,aAAA,EAAe,KAJf;IAAA,CALD;;IAWA,SAAA,EAAU,CACT,aAAA,CAAA,CADS,EAET,eAFS,CAXV;IAeA,KAAA,EAAO;MACN,GAAA,EAAK,kBADC;MAEN,GAAA,CAAC,IAAI,CAAC,IAAL,CAAU,aAAV,CAAwB,CAAC,MAAzB,CAAgC,QAAA,CAAC,GAAD,EAAM,EAAN,CAAA;QAChC,GAAI,CAAA,IAAI,CAAC,KAAL,CAAW,EAAX,CAAc,CAAC,IAAf,CAAJ,GAA2B;eAC3B;MAFgC,CAAhC,EAGA,CAAA,CAHA,CAAD;IAFM,CAfP;IAsBA,OAAA,EAAS;MACR,IAAI,kBAAJ,CAAuB;QAAA,uBAAA,EAAyB;MAAzB,CAAvB,CADQ;MAER,IAAI,OAAO,CAAC,YAAZ,CACC;QAAA,MAAA,EAAQ,qBAAR;QACA,GAAA,EAAK;MADL,CADD,CAFQ;KAtBT;IA4BA,MAAA,EAAO;MAAA,KAAA,EAAM;QACZ;UACC,IAAA,EAAM,SADP;UAEC,OAAA,EAAS,iCAFV;UAGC,GAAA,EAAK;YAAA,MAAA,EAAQ;UAAR;QAHN,CADY;QAMZ;UACC,IAAA,EAAM,iBADP;UAEC,OAAA,EAAS,iCAFV;UAGC,MAAA,EAAQ,eAHT;UAIC,OAAA,EAAS;YAAA,SAAA,EAAW;cAAA,OAAA,EAAS,CAAC,YAAD;QAAc,cAAd;YAAT;UAAX;QAJV,CANY;QAYZ;UACC,IAAA,EAAM,SADP;UAEC,GAAA,EAAK;YAAA,MAAA,EAAQ;UAAR;QAFN,CAZY;;IAAN,CA5BP;IA8CA,YAAA,EACC;MAAA,YAAA,EAAc,QAAd;MACA,WAAA,EAAa;QAAA,WAAA,EAAa;UAAA,MAAA,EACzB;YAAA,IAAA,EAAM,0BAAN;YACA,IAAA,EAAM,SADN;YAEA,MAAA,EAAQ;UAFR;QADyB;MAAb;IADb;EA/CD;;EARD;;;AAAA"} \ No newline at end of file