Showing preview only (4,081K chars total). Download the full file or copy to clipboard to get everything.
Repository: sup-fiveyear/Notes
Branch: master
Commit: 55525b4f3ca7
Files: 334
Total size: 3.6 MB
Directory structure:
gitextract_l21fk2d5/
├── .gitignore
├── .obsidian/
│ ├── app.json
│ ├── appearance.json
│ ├── community-plugins.json
│ ├── core-plugins.json
│ ├── daily-notes.json
│ ├── graph.json
│ ├── hotkeys.json
│ ├── page-preview.json
│ ├── plugins/
│ │ ├── file-explorer-note-count/
│ │ │ ├── data.json
│ │ │ ├── main.js
│ │ │ ├── manifest.json
│ │ │ └── styles.css
│ │ ├── obsidian-outliner/
│ │ │ ├── data.json
│ │ │ ├── main.js
│ │ │ ├── manifest.json
│ │ │ └── styles.css
│ │ ├── recent-files-obsidian/
│ │ │ ├── data.json
│ │ │ ├── main.js
│ │ │ ├── manifest.json
│ │ │ └── styles.css
│ │ └── table-editor-obsidian/
│ │ ├── data.json
│ │ ├── main.js
│ │ ├── manifest.json
│ │ └── styles.css
│ ├── starred.json
│ ├── templates.json
│ ├── themes/
│ │ ├── Atom.css
│ │ └── Obsidian Nord.css
│ ├── workspace
│ └── workspaces.json
├── 1. cs/
│ ├── 《CSAPP》/
│ │ └── chapter 6 - the memory hierarchy.md
│ ├── 《Problem solving with algorithms and Data Structures Using Python》/
│ │ ├── index.md
│ │ ├── 何为数据结构与算法?.md
│ │ └── 线性数据结构/
│ │ ├── index.md
│ │ ├── my_stack.py
│ │ └── 栈.md
│ └── 存储体系.md
├── 2. coding/
│ ├── 1-beginner/
│ │ ├── 0. 贪心/
│ │ │ └── 455. assign-cookies.md
│ │ ├── 1. sorting/
│ │ │ ├── 26. 删除有序数组中的重复项.md
│ │ │ ├── 283. 移动零.md
│ │ │ ├── 475. 供暖器.md
│ │ │ ├── 56. 合并区间.md
│ │ │ ├── 80. 删除有序数组中的重复项 II.md
│ │ │ ├── 881. 救生艇.md
│ │ │ ├── 912. 排序数组.md
│ │ │ ├── Array Deduplication III.md
│ │ │ └── pointer.md
│ │ ├── 3. linked-list/
│ │ │ └── 206. 反转链表.md
│ │ ├── 4. queue & stack/
│ │ │ └── 1047. 删除字符串中的所有相邻重复项.md
│ │ ├── binary-search/
│ │ │ └── 704. Binary Search.md
│ │ ├── dp/
│ │ │ ├── 1139. 最大的以 1 为边界的正方形.md
│ │ │ ├── 139. 单词拆分.md
│ │ │ ├── 221. 最大正方形.md
│ │ │ ├── 45.跳跃游戏 II.md
│ │ │ ├── 485. 最大连续 1 的个数.md
│ │ │ ├── 53.最大子数组和.md
│ │ │ ├── 55.跳跃游戏.md
│ │ │ ├── 72. 编辑距离.md
│ │ │ ├── 764. 最大加号标志.md
│ │ │ ├── Longest Ascending SubArray.md
│ │ │ ├── temp.js
│ │ │ ├── 剑指 Offer 14- I. 剪绳子.md
│ │ │ └── 面试题 17.24. 最大子矩阵.md
│ │ └── recursion/
│ │ ├── 25. K 个一组翻转链表.md
│ │ ├── 344. 反转字符串.md
│ │ ├── 408. 有效单词缩写.md
│ │ ├── 50. Pow(x, n).md
│ │ ├── 509. 斐波那契数.md
│ │ ├── 51. N 皇后.md
│ │ ├── 59. 螺旋矩阵 II.md
│ │ └── 92. 反转链表 II.md
│ ├── 2-training/
│ │ ├── 1014.最佳观光组合.md
│ │ ├── 103. 二叉树的锯齿形层序遍历.md
│ │ ├── 1154. 一年中的第几天.md
│ │ ├── 121. 买卖股票的最佳时机#P0#3.md
│ │ ├── 1609. 奇偶树.md
│ │ ├── 1644. 二叉树的最近公共祖先 II.md
│ │ ├── 1705. 吃苹果的最大数目.md
│ │ ├── 198.打家劫舍.md
│ │ ├── 2100. 适合打劫银行的日子.md
│ │ ├── 2109. 向字符串添加空格.md
│ │ ├── 236. 二叉树的最近公共祖先.md
│ │ ├── 300.最长递增子序列.md
│ │ ├── 846. 一手顺子.js
│ │ ├── index.md
│ │ └── 面试题 02.06. 回文链表.md
│ ├── 3-contest/
│ │ ├── 273/
│ │ │ ├── 1.js
│ │ │ ├── 2 copy.js
│ │ │ ├── 2.js
│ │ │ ├── 3 copy.js
│ │ │ └── 3.js
│ │ ├── 274/
│ │ │ ├── 1.js
│ │ │ ├── 2.js
│ │ │ ├── 3.js
│ │ │ └── 4.js
│ │ ├── test.js
│ │ ├── 第 273 场周赛.md
│ │ └── 第二题模拟练习/
│ │ ├── 1.js
│ │ ├── 2.js
│ │ └── 3.js
│ ├── 4-books/
│ │ └── 《挑战程序设计竞赛》/
│ │ ├── 1. 抽签.js
│ │ ├── 2. 三角形.js
│ │ └── tempCodeRunnerFile.js
│ ├── 51. N 皇后.md
│ ├── 59. 螺旋矩阵 II.md
│ └── index.md
├── 3. sd/
│ └── FE/
│ └── index.md
├── DOM检查 ?react 解析器?开源工具?.md
├── README.md
├── temp/
│ ├── 1维 - 动态规划.md
│ ├── leetcode 拷贝题目模板.md
│ ├── 内推模板.md
│ └── 大部头读书笔记.md
├── todo/
│ └── fe/
│ ├── TODO/
│ │ └── 10月第一周.md
│ ├── fe-README.md
│ ├── koa_/
│ │ ├── app.js
│ │ ├── my_koa/
│ │ │ ├── package.json
│ │ │ └── src/
│ │ │ ├── Application.js
│ │ │ ├── context.js
│ │ │ ├── request.js
│ │ │ └── response.js
│ │ └── package.json
│ ├── notes-JavaScript/
│ │ ├── DOM/
│ │ │ └── DOM汇总.md
│ │ ├── ES5/
│ │ │ ├── ES5 - new & instanceof 实现.md
│ │ │ ├── ES5 - 你说一下你对原型的认识.md
│ │ │ ├── ES5-this & call & apply & bind.md
│ │ │ ├── ES5-原型原型链.md
│ │ │ ├── ES5-变量提升.md
│ │ │ ├── ES5-数据类型.md
│ │ │ ├── ES5-继承.md
│ │ │ └── ES5-闭包.md
│ │ ├── ES6/
│ │ │ ├── ES6 - class 总结.md
│ │ │ ├── ES6 - extends 总结.md
│ │ │ ├── Promise/
│ │ │ │ ├── Promise - 实现 Promise.race() && Promise.all() && Promise.allsettled().md
│ │ │ │ ├── promiseA+.js
│ │ │ │ ├── promise练习.md
│ │ │ │ ├── promisify.md
│ │ │ │ ├── 实现PromiseA+.md
│ │ │ │ └── 来一沓Promise.md
│ │ │ ├── README.MD
│ │ │ └── 新增数据结构/
│ │ │ ├── map/
│ │ │ │ └── map.md
│ │ │ └── set/
│ │ │ └── set.md
│ │ ├── README.md
│ │ ├── 函数式编程/
│ │ │ └── README.md
│ │ ├── 实现极简发布订阅.md
│ │ ├── 数组常见API及实现.md
│ │ ├── 说说async的原理.md
│ │ ├── 高阶函数之after函数.md
│ │ ├── 高阶函数之函数柯里化.md
│ │ └── 高阶函数之初见AOP.md
│ ├── notes-nodeJs/
│ │ ├── 1. NodeJs有哪些特点?应用场景又有哪些?.md
│ │ ├── 2. V8 libuv 和 Nodejs之间的关系?.md
│ │ ├── 3. 说说你对global 以及global.process的理解?.md
│ │ ├── 4. 说一下Liubv的事件循环机制.md
│ │ ├── 5. 说说你对模块化的理解?.md
│ │ ├── README.md
│ │ ├── notes-htmlcss/
│ │ │ ├── flex 布局.md
│ │ │ ├── html汇总.md
│ │ │ └── 常见居中.md
│ │ ├── npm有了解吗?.md
│ │ ├── 说一下Nodejs的异步编程吧.md
│ │ └── 请你实现一下Event模块.md
│ ├── notes-vue/
│ │ ├── $mount和模板编译原理.md
│ │ ├── $watch和computed.md
│ │ ├── vue-router.md
│ │ ├── vuex.md
│ │ ├── 响应式原理.md
│ │ ├── 常见面试题汇总.md
│ │ ├── 来,唠一下生命周期.md
│ │ ├── 渲染详细流程.md
│ │ ├── 虚拟DOM.md
│ │ ├── 说一下nextTick?.md
│ │ ├── 说一下你对$nextTick的理解.md
│ │ ├── 说说指令的原理.md
│ │ └── 面试题.md
│ ├── notes-性能优化/
│ │ └── 浏览器/
│ │ ├── README.md
│ │ ├── 函数节流.md
│ │ └── 函数防抖.md
│ ├── notes-浏览器/
│ │ ├── DOM.md
│ │ ├── README.md
│ │ ├── 浏览器基础/
│ │ │ ├── 说一下AJAX.md
│ │ │ ├── 说一下垃圾回收策略?.md
│ │ │ ├── 说一下浏览器事件循环.md
│ │ │ ├── 跨域通信.md
│ │ │ └── 输入URL后发生了什么.md
│ │ └── 浏览器性能优化/
│ │ └── README.md
│ ├── notes-网络/
│ │ ├── HTTP/
│ │ │ ├── 1.你是如何理解HTTP的?特点有哪些?.md
│ │ │ ├── 10.说一下 HTTP 的内容协商?.md
│ │ │ ├── 11.HTTP 重定向有了解吗?.md
│ │ │ ├── 12.了解HTTP长连接吧?那队头阻塞呢?.md
│ │ │ ├── 13.HTTP传输大文件有了解过吗?.md
│ │ │ ├── 2. 你知道HTTP都有哪些版本吗?.md
│ │ │ ├── 3.说一下你对域名的理解?.md
│ │ │ ├── 4.说说你对URL 和 URI 的理解.md
│ │ │ ├── 5. 描述一下HTTP报文结构.md
│ │ │ ├── 6. 如何理解请求(响应)上下文?.md
│ │ │ ├── 7. 请求方法和状态码有哪些?.md
│ │ │ ├── 8.说说你对cookie的理解.md
│ │ │ ├── 9.说下你了解的缓存策略.md
│ │ │ ├── HTTP 性能优化方向有哪些?.md
│ │ │ ├── README.md
│ │ │ ├── index.md
│ │ │ ├── 摘出的笔记.md
│ │ │ └── 说说HTTP2 和HTTP3.md
│ │ ├── HTTPS/
│ │ │ ├── HTTP 和 HTTPS 有什么区别?.md
│ │ │ ├── HTTPS优化策略有了解吗?.md
│ │ │ ├── README.md
│ │ │ ├── TLS 握手讲一下吧?.md
│ │ │ ├── 摘要算法&数据签名.md
│ │ │ └── 说说对称加密和非对称加密的理解?.md
│ │ ├── IP/
│ │ │ ├── TCP建立连接?.md
│ │ │ └── 说说你是如何理解TCP的?.md
│ │ └── TCP/
│ │ ├── README.md
│ │ ├── TCP如何做到多路复用.md
│ │ ├── TCP建立连接?.md
│ │ ├── 知道TCP的keepalive机制吗.md
│ │ ├── 知道慢启动、拥塞避免、快速重传和快速恢复吗.md
│ │ ├── 简述一下TCP报文结构.md
│ │ ├── 说一下TCP的滑动窗口.md
│ │ ├── 说说TCP三次握手吧.md
│ │ ├── 说说TCP挥手过程.md
│ │ ├── 说说你对MSS的理解.md
│ │ ├── 说说你对滑动窗口的理解.md
│ │ ├── 说说你对超时重传的理解.md
│ │ ├── 说说你是如何理解TCP的?.md
│ │ ├── 说说如何减少网络过程中的小报文?.md
│ │ └── 那你知道选择性重传算法(SACK)吗?.md
│ ├── notes-设计模式/
│ │ ├── README.MD
│ │ └── 创建模式/
│ │ ├── README.md
│ │ └── Singleton.ts
│ ├── vue 手写/
│ │ ├── hash和history原理.html
│ │ └── src/
│ │ ├── compiler/
│ │ │ ├── index.js
│ │ │ └── parser-html.js
│ │ ├── index.js
│ │ ├── init.js
│ │ ├── lifecycle.js
│ │ ├── observer/
│ │ │ ├── array.js
│ │ │ ├── dep.js
│ │ │ ├── index.js
│ │ │ └── watcher.js
│ │ ├── render.js
│ │ ├── state.js
│ │ ├── util/
│ │ │ └── index.js
│ │ └── vdom/
│ │ ├── create-element.js
│ │ └── patch.js
│ ├── webpack/
│ │ ├── 原理 - 懒加载:单入口文件和多入口文件实现懒加载.md
│ │ ├── 原理 - 模块化:如何同时支持CommonJs规范和ES module规范.md
│ │ └── 基础总结.md
│ ├── webpack 手写/
│ │ └── 实现打包器/
│ │ ├── bin/
│ │ │ └── packer.js
│ │ ├── lib/
│ │ │ ├── Compilar.js
│ │ │ └── template.ejs
│ │ └── package.json
│ ├── 待迁移-ES6/
│ │ └── class编译/
│ │ ├── extends.js
│ │ └── 基础设施.js
│ ├── 待迁移-强化代码/
│ │ ├── Observer.js
│ │ ├── bind函数.js
│ │ ├── deepClone.js
│ │ ├── eventEmitter.js
│ │ ├── flatten.js
│ │ ├── index.html
│ │ ├── lastEvent.js
│ │ └── 发布订阅.js
│ ├── 正则表达式/
│ │ └── 元字符.md
│ ├── 练习-CSS面试部分/
│ │ ├── FlexIndex.html
│ │ ├── Grid.css
│ │ ├── Grid.html
│ │ ├── flex.css
│ │ ├── grid练习/
│ │ │ ├── index.htm.html
│ │ │ └── 九宫格.css
│ │ ├── 三角形.css
│ │ ├── 外边距合并.css
│ │ ├── 布局方案/
│ │ │ ├── 三栏布局.html
│ │ │ └── 两栏布局.html
│ │ └── 水平垂直居中/
│ │ ├── index.html
│ │ └── 定宽高.css
│ ├── 练习-JavaScript部分/
│ │ ├── AJAX.js
│ │ ├── ES6 class编译/
│ │ │ └── extends.js
│ │ ├── tools.js
│ │ ├── 功能函数汇总/
│ │ │ ├── index.md
│ │ │ ├── 函数深度比较.js
│ │ │ ├── 函数节流.js
│ │ │ ├── 函数防抖.js
│ │ │ ├── 数组平拍.js
│ │ │ ├── 浅拷贝和深拷贝.js
│ │ │ └── 解析URL参数.js
│ │ ├── 图片懒加载.js
│ │ ├── 手写assign.js
│ │ ├── 手写create.js
│ │ ├── 手写instanceof.js
│ │ ├── 手写new.js
│ │ ├── 手写深拷贝.js
│ │ ├── 继承/
│ │ │ ├── 1. 原型链继承.js
│ │ │ ├── 2. 借用构造函数继承.js
│ │ │ ├── 3. 组合继承.js
│ │ │ ├── 4. 原型式继承.js
│ │ │ └── 5. 寄生组合式继承.js
│ │ ├── 请你实现一个LRU缓存算法.js
│ │ └── 跨域.html
│ ├── 练习-Nodejs/
│ │ ├── eventEmitter.js
│ │ └── globalObj.js
│ ├── 练习-实际开发/
│ │ └── 渲染10W节点/
│ │ ├── README.md
│ │ ├── 傻循环.html
│ │ └── 时间分片.html
│ ├── 练习-数据结构算法刷题/
│ │ └── 链表/
│ │ ├── 160. 相交链表.js
│ │ ├── 203. 移除链表元素.js
│ │ ├── 4.插入有序链表.js
│ │ ├── 445. 两数相加 II.js
│ │ ├── 9. 两两交换链表中的节点.js
│ │ ├── x. 回文链表.js
│ │ ├── 两数相加/
│ │ │ ├── 2. 两数相加.js
│ │ │ └── 两数相加.md
│ │ ├── 临时.md
│ │ ├── 分隔链表/
│ │ │ ├── 86. 分隔链表.js
│ │ │ └── README.md
│ │ ├── 合并两个有序链表/
│ │ │ ├── 21. 合并两个有序链表.js
│ │ │ └── README.md
│ │ ├── 环形链表/
│ │ │ ├── 141. 环形链表.js
│ │ │ └── README.md
│ │ ├── 翻转链表/
│ │ │ ├── 25. K 个一组翻转链表.js
│ │ │ ├── 92. 反转链表 II.js
│ │ │ ├── README.md
│ │ │ └── 面试题24. 反转链表.js
│ │ ├── 重排链表/
│ │ │ ├── 143. 重排链表.js
│ │ │ └── README.md
│ │ ├── 链表的中间结点/
│ │ │ ├── 876.链表中间节点.js
│ │ │ └── README.md
│ │ ├── 面试题18. 删除链表的节点.js
│ │ └── 面试题22. 链表中倒数第k个节点.js
│ ├── 组件/
│ │ └── vue-懒加载/
│ │ ├── Note.md
│ │ └── v-lazy.js
│ └── 记录-面试DEMO/
│ └── 01.md
├── 操作系统层面的调用栈管理?.md
└── 浏览器历史管理.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
.vscode
.idea
================================================
FILE: .obsidian/app.json
================================================
{
"vimMode": true,
"attachmentFolderPath": "静态",
"alwaysUpdateLinks": true,
"promptDelete": false,
"autoPairBrackets": true,
"foldIndent": true,
"defaultViewMode": "preview",
"showLineNumber": true,
"emacsyKeys": false,
"readableLineLength": false,
"legacyEditor": false,
"livePreview": false,
"foldHeading": true
}
================================================
FILE: .obsidian/appearance.json
================================================
{
"baseFontSize": 19,
"theme": "obsidian",
"translucency": false,
"baseFontSizeAction": true,
"cssTheme": "Atom"
}
================================================
FILE: .obsidian/community-plugins.json
================================================
[
"file-explorer-note-count",
"obsidian-outliner",
"recent-files-obsidian",
"table-editor-obsidian"
]
================================================
FILE: .obsidian/core-plugins.json
================================================
[
"file-explorer",
"global-search",
"switcher",
"graph",
"backlink",
"page-preview",
"templates",
"note-composer",
"command-palette",
"starred",
"markdown-importer",
"outline",
"word-count",
"open-with-default-app",
"workspaces",
"file-recovery"
]
================================================
FILE: .obsidian/daily-notes.json
================================================
{
"autorun": true,
"folder": "log/2021",
"template": ""
}
================================================
FILE: .obsidian/graph.json
================================================
{
"collapse-filter": false,
"search": "path:/new",
"showTags": false,
"showAttachments": false,
"hideUnresolved": true,
"showOrphans": true,
"collapse-color-groups": false,
"colorGroups": [
{
"query": "path:coding",
"color": {
"a": 1,
"rgb": 14048348
}
},
{
"query": "path:/",
"color": {
"a": 1,
"rgb": 11392604
}
}
],
"collapse-display": false,
"showArrow": true,
"textFadeMultiplier": 0,
"nodeSizeMultiplier": 1.05488061797753,
"lineSizeMultiplier": 2.87336397058824,
"collapse-forces": false,
"centerStrength": 0.545863970588235,
"repelStrength": 10,
"linkStrength": 0.635110294117647,
"linkDistance": 250,
"scale": 1.4056547396473347,
"close": true
}
================================================
FILE: .obsidian/hotkeys.json
================================================
{
"table-editor-obsidian:format-all-tables": [
{
"modifiers": [
"Alt",
"Ctrl",
"Shift"
],
"key": "T"
}
],
"editor:toggle-fold": [
{
"modifiers": [
"Ctrl",
"Mod"
],
"key": "-"
}
]
}
================================================
FILE: .obsidian/page-preview.json
================================================
{
"preview": true
}
================================================
FILE: .obsidian/plugins/file-explorer-note-count/data.json
================================================
{
"showAllNumbers": true,
"filterList": [
"md"
],
"blacklist": false,
"filterFolderNote": true
}
================================================
FILE: .obsidian/plugins/file-explorer-note-count/main.js
================================================
/*
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
if you want to view the source visit the plugins github repository
*/
'use strict';
var require$$0 = require('obsidian');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0);
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
function createCommonjsModule(fn) {
var module = { exports: {} };
return fn(module, module.exports), module.exports;
}
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source visit the plugins github repository
*/
var lib = createCommonjsModule(function (module, exports) {
var a=Object.create;var n=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var g=Object.getPrototypeOf,f=Object.prototype.hasOwnProperty;var d=e=>n(e,"__esModule",{value:!0});var p=(e,o)=>{d(e);for(var t in o)n(e,t,{get:o[t],enumerable:!0});},u=(e,o,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of F(o))!f.call(e,r)&&r!=="default"&&n(e,r,{get:()=>o[r],enumerable:!(t=s(o,r))||t.enumerable});return e},T=e=>u(d(n(e!=null?a(g(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);p(exports,{NoteLoc:()=>l,getApi:()=>i,isPluginEnabled:()=>N,registerApi:()=>P});T(require$$0__default['default']);var l;(function(r){r[r.Index=0]="Index",r[r.Inside=1]="Inside",r[r.Outside=2]="Outside";})(l||(l={}));var i=e=>{var o;return e?(o=e.app.plugins.plugins["folder-note-core"])==null?void 0:o.api:window.FolderNoteAPIv0},N=e=>e.app.plugins.enabledPlugins.has("folder-note-core"),P=(e,o)=>(e.app.vault.on("folder-note:api-ready",o),i(e));
});
// 'path' module extracted from Node.js v8.11.1 (only the posix part)
function assertPath(path) {
if (typeof path !== 'string') {
throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));
}
}
// Resolves . and .. elements in a path with directory names
function normalizeStringPosix(path, allowAboveRoot) {
var res = '';
var lastSegmentLength = 0;
var lastSlash = -1;
var dots = 0;
var code;
for (var i = 0; i <= path.length; ++i) {
if (i < path.length)
code = path.charCodeAt(i);
else if (code === 47 /*/*/)
break;
else
code = 47 /*/*/;
if (code === 47 /*/*/) {
if (lastSlash === i - 1 || dots === 1) ; else if (lastSlash !== i - 1 && dots === 2) {
if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {
if (res.length > 2) {
var lastSlashIndex = res.lastIndexOf('/');
if (lastSlashIndex !== res.length - 1) {
if (lastSlashIndex === -1) {
res = '';
lastSegmentLength = 0;
} else {
res = res.slice(0, lastSlashIndex);
lastSegmentLength = res.length - 1 - res.lastIndexOf('/');
}
lastSlash = i;
dots = 0;
continue;
}
} else if (res.length === 2 || res.length === 1) {
res = '';
lastSegmentLength = 0;
lastSlash = i;
dots = 0;
continue;
}
}
if (allowAboveRoot) {
if (res.length > 0)
res += '/..';
else
res = '..';
lastSegmentLength = 2;
}
} else {
if (res.length > 0)
res += '/' + path.slice(lastSlash + 1, i);
else
res = path.slice(lastSlash + 1, i);
lastSegmentLength = i - lastSlash - 1;
}
lastSlash = i;
dots = 0;
} else if (code === 46 /*.*/ && dots !== -1) {
++dots;
} else {
dots = -1;
}
}
return res;
}
function _format(sep, pathObject) {
var dir = pathObject.dir || pathObject.root;
var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');
if (!dir) {
return base;
}
if (dir === pathObject.root) {
return dir + base;
}
return dir + sep + base;
}
var posix = {
// path.resolve([from ...], to)
resolve: function resolve() {
var resolvedPath = '';
var resolvedAbsolute = false;
var cwd;
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
var path;
if (i >= 0)
path = arguments[i];
else {
if (cwd === undefined)
cwd = process.cwd();
path = cwd;
}
assertPath(path);
// Skip empty entries
if (path.length === 0) {
continue;
}
resolvedPath = path + '/' + resolvedPath;
resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;
}
// At this point the path should be resolved to a full absolute path, but
// handle relative paths to be safe (might happen when process.cwd() fails)
// Normalize the path
resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);
if (resolvedAbsolute) {
if (resolvedPath.length > 0)
return '/' + resolvedPath;
else
return '/';
} else if (resolvedPath.length > 0) {
return resolvedPath;
} else {
return '.';
}
},
normalize: function normalize(path) {
assertPath(path);
if (path.length === 0) return '.';
var isAbsolute = path.charCodeAt(0) === 47 /*/*/;
var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;
// Normalize the path
path = normalizeStringPosix(path, !isAbsolute);
if (path.length === 0 && !isAbsolute) path = '.';
if (path.length > 0 && trailingSeparator) path += '/';
if (isAbsolute) return '/' + path;
return path;
},
isAbsolute: function isAbsolute(path) {
assertPath(path);
return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;
},
join: function join() {
if (arguments.length === 0)
return '.';
var joined;
for (var i = 0; i < arguments.length; ++i) {
var arg = arguments[i];
assertPath(arg);
if (arg.length > 0) {
if (joined === undefined)
joined = arg;
else
joined += '/' + arg;
}
}
if (joined === undefined)
return '.';
return posix.normalize(joined);
},
relative: function relative(from, to) {
assertPath(from);
assertPath(to);
if (from === to) return '';
from = posix.resolve(from);
to = posix.resolve(to);
if (from === to) return '';
// Trim any leading backslashes
var fromStart = 1;
for (; fromStart < from.length; ++fromStart) {
if (from.charCodeAt(fromStart) !== 47 /*/*/)
break;
}
var fromEnd = from.length;
var fromLen = fromEnd - fromStart;
// Trim any leading backslashes
var toStart = 1;
for (; toStart < to.length; ++toStart) {
if (to.charCodeAt(toStart) !== 47 /*/*/)
break;
}
var toEnd = to.length;
var toLen = toEnd - toStart;
// Compare paths to find the longest common path from root
var length = fromLen < toLen ? fromLen : toLen;
var lastCommonSep = -1;
var i = 0;
for (; i <= length; ++i) {
if (i === length) {
if (toLen > length) {
if (to.charCodeAt(toStart + i) === 47 /*/*/) {
// We get here if `from` is the exact base path for `to`.
// For example: from='/foo/bar'; to='/foo/bar/baz'
return to.slice(toStart + i + 1);
} else if (i === 0) {
// We get here if `from` is the root
// For example: from='/'; to='/foo'
return to.slice(toStart + i);
}
} else if (fromLen > length) {
if (from.charCodeAt(fromStart + i) === 47 /*/*/) {
// We get here if `to` is the exact base path for `from`.
// For example: from='/foo/bar/baz'; to='/foo/bar'
lastCommonSep = i;
} else if (i === 0) {
// We get here if `to` is the root.
// For example: from='/foo'; to='/'
lastCommonSep = 0;
}
}
break;
}
var fromCode = from.charCodeAt(fromStart + i);
var toCode = to.charCodeAt(toStart + i);
if (fromCode !== toCode)
break;
else if (fromCode === 47 /*/*/)
lastCommonSep = i;
}
var out = '';
// Generate the relative path based on the path difference between `to`
// and `from`
for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {
if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {
if (out.length === 0)
out += '..';
else
out += '/..';
}
}
// Lastly, append the rest of the destination (`to`) path that comes after
// the common path parts
if (out.length > 0)
return out + to.slice(toStart + lastCommonSep);
else {
toStart += lastCommonSep;
if (to.charCodeAt(toStart) === 47 /*/*/)
++toStart;
return to.slice(toStart);
}
},
_makeLong: function _makeLong(path) {
return path;
},
dirname: function dirname(path) {
assertPath(path);
if (path.length === 0) return '.';
var code = path.charCodeAt(0);
var hasRoot = code === 47 /*/*/;
var end = -1;
var matchedSlash = true;
for (var i = path.length - 1; i >= 1; --i) {
code = path.charCodeAt(i);
if (code === 47 /*/*/) {
if (!matchedSlash) {
end = i;
break;
}
} else {
// We saw the first non-path separator
matchedSlash = false;
}
}
if (end === -1) return hasRoot ? '/' : '.';
if (hasRoot && end === 1) return '//';
return path.slice(0, end);
},
basename: function basename(path, ext) {
if (ext !== undefined && typeof ext !== 'string') throw new TypeError('"ext" argument must be a string');
assertPath(path);
var start = 0;
var end = -1;
var matchedSlash = true;
var i;
if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {
if (ext.length === path.length && ext === path) return '';
var extIdx = ext.length - 1;
var firstNonSlashEnd = -1;
for (i = path.length - 1; i >= 0; --i) {
var code = path.charCodeAt(i);
if (code === 47 /*/*/) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if (!matchedSlash) {
start = i + 1;
break;
}
} else {
if (firstNonSlashEnd === -1) {
// We saw the first non-path separator, remember this index in case
// we need it if the extension ends up not matching
matchedSlash = false;
firstNonSlashEnd = i + 1;
}
if (extIdx >= 0) {
// Try to match the explicit extension
if (code === ext.charCodeAt(extIdx)) {
if (--extIdx === -1) {
// We matched the extension, so mark this as the end of our path
// component
end = i;
}
} else {
// Extension does not match, so our result is the entire path
// component
extIdx = -1;
end = firstNonSlashEnd;
}
}
}
}
if (start === end) end = firstNonSlashEnd;else if (end === -1) end = path.length;
return path.slice(start, end);
} else {
for (i = path.length - 1; i >= 0; --i) {
if (path.charCodeAt(i) === 47 /*/*/) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if (!matchedSlash) {
start = i + 1;
break;
}
} else if (end === -1) {
// We saw the first non-path separator, mark this as the end of our
// path component
matchedSlash = false;
end = i + 1;
}
}
if (end === -1) return '';
return path.slice(start, end);
}
},
extname: function extname(path) {
assertPath(path);
var startDot = -1;
var startPart = 0;
var end = -1;
var matchedSlash = true;
// Track the state of characters (if any) we see before our first dot and
// after any path separator we find
var preDotState = 0;
for (var i = path.length - 1; i >= 0; --i) {
var code = path.charCodeAt(i);
if (code === 47 /*/*/) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if (!matchedSlash) {
startPart = i + 1;
break;
}
continue;
}
if (end === -1) {
// We saw the first non-path separator, mark this as the end of our
// extension
matchedSlash = false;
end = i + 1;
}
if (code === 46 /*.*/) {
// If this is our first dot, mark it as the start of our extension
if (startDot === -1)
startDot = i;
else if (preDotState !== 1)
preDotState = 1;
} else if (startDot !== -1) {
// We saw a non-dot and non-path separator before our dot, so we should
// have a good chance at having a non-empty extension
preDotState = -1;
}
}
if (startDot === -1 || end === -1 ||
// We saw a non-dot character immediately before the dot
preDotState === 0 ||
// The (right-most) trimmed path component is exactly '..'
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
return '';
}
return path.slice(startDot, end);
},
format: function format(pathObject) {
if (pathObject === null || typeof pathObject !== 'object') {
throw new TypeError('The "pathObject" argument must be of type Object. Received type ' + typeof pathObject);
}
return _format('/', pathObject);
},
parse: function parse(path) {
assertPath(path);
var ret = { root: '', dir: '', base: '', ext: '', name: '' };
if (path.length === 0) return ret;
var code = path.charCodeAt(0);
var isAbsolute = code === 47 /*/*/;
var start;
if (isAbsolute) {
ret.root = '/';
start = 1;
} else {
start = 0;
}
var startDot = -1;
var startPart = 0;
var end = -1;
var matchedSlash = true;
var i = path.length - 1;
// Track the state of characters (if any) we see before our first dot and
// after any path separator we find
var preDotState = 0;
// Get non-dir info
for (; i >= start; --i) {
code = path.charCodeAt(i);
if (code === 47 /*/*/) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if (!matchedSlash) {
startPart = i + 1;
break;
}
continue;
}
if (end === -1) {
// We saw the first non-path separator, mark this as the end of our
// extension
matchedSlash = false;
end = i + 1;
}
if (code === 46 /*.*/) {
// If this is our first dot, mark it as the start of our extension
if (startDot === -1) startDot = i;else if (preDotState !== 1) preDotState = 1;
} else if (startDot !== -1) {
// We saw a non-dot and non-path separator before our dot, so we should
// have a good chance at having a non-empty extension
preDotState = -1;
}
}
if (startDot === -1 || end === -1 ||
// We saw a non-dot character immediately before the dot
preDotState === 0 ||
// The (right-most) trimmed path component is exactly '..'
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
if (end !== -1) {
if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end);else ret.base = ret.name = path.slice(startPart, end);
}
} else {
if (startPart === 0 && isAbsolute) {
ret.name = path.slice(1, startDot);
ret.base = path.slice(1, end);
} else {
ret.name = path.slice(startPart, startDot);
ret.base = path.slice(startPart, end);
}
ret.ext = path.slice(startDot, end);
}
if (startPart > 0) ret.dir = path.slice(0, startPart - 1);else if (isAbsolute) ret.dir = '/';
return ret;
},
sep: '/',
delimiter: ':',
win32: null,
posix: null
};
posix.posix = posix;
var pathBrowserify = posix;
const withSubfolderClass = 'oz-with-subfolder';
const showAllNumbersClass = 'oz-show-all-num';
const rootHiddenClass = 'oz-root-hidden';
const isFolder = (item) => item.file instanceof require$$0.TFolder;
const iterateItems = (items, callback) => {
for (const key in items) {
if (!Object.prototype.hasOwnProperty.call(items, key))
continue;
callback(items[key]);
}
};
const getParentPath = (src) => {
if (src === '/')
return null;
const path = pathBrowserify.dirname(src);
if (path === '.')
return '/';
else
return path;
};
const equals = (arr1, arr2) => {
// if the other array is a falsy value, return
if (!Array.isArray(arr1) || !Array.isArray(arr2))
return false;
// compare lengths - can save a lot of time
if (arr1.length != arr2.length)
return false;
return arr1.every((v, i) => v === arr2[i]);
};
const isParent = (parent, child) => {
if (child === parent)
return false;
if (parent === '/')
parent = '';
if (child === '/')
child = '';
const parentTokens = parent.split('/').filter((i) => i.length);
return parentTokens.every((t, i) => child.split('/')[i] === t);
};
function around(obj, factories) {
const removers = Object.keys(factories).map(key => around1(obj, key, factories[key]));
return removers.length === 1 ? removers[0] : function () { removers.forEach(r => r()); };
}
function around1(obj, method, createWrapper) {
const original = obj[method], hadOwn = obj.hasOwnProperty(method);
let current = createWrapper(original);
// Let our wrapper inherit static props from the wrapping method,
// and the wrapping method, props from the original method
if (original)
Object.setPrototypeOf(current, original);
Object.setPrototypeOf(wrapper, current);
obj[method] = wrapper;
// Return a callback to allow safe removal
return remove;
function wrapper(...args) {
// If we have been deactivated and are no longer wrapped, remove ourselves
if (current === original && obj[method] === wrapper)
remove();
return current.apply(this, args);
}
function remove() {
// If no other patches, just do a direct removal
if (obj[method] === wrapper) {
if (hadOwn)
obj[method] = original;
else
delete obj[method];
}
if (current === original)
return;
// Else pass future calls through, and remove wrapper from the prototype chain
current = original;
Object.setPrototypeOf(wrapper, original || Function);
}
}
const countFolderChildren = (folder, filter) => {
let count = 0;
for (const af of folder.children) {
if (filter(af))
count++;
if (af instanceof require$$0.TFolder)
count += countFolderChildren(af, filter);
}
return count;
};
/** filter out all path that is the parent of existing path */
const filterParent = (pathList) => {
const list = Array.from(pathList);
list.sort();
for (let i = 0; i < list.length; i++) {
if (i < list.length - 1 &&
(list[i] === list[i + 1] || isParent(list[i], list[i + 1]))) {
list.shift();
i--;
}
}
return new Set(list);
};
/** get all parents and add to set if not exist */
const getAllParents = (path, set) => {
let parent = getParentPath(path);
while (parent && !set.has(parent)) {
set.add(parent);
parent = getParentPath(parent);
}
};
/**
* Update folder count of target's parent
*/
const updateCount = (targetList, plugin) => {
const set = filterParent(targetList);
for (const path of targetList) {
getAllParents(path, set);
}
// set count of path
const { fileExplorer, fileFilter } = plugin;
if (!fileExplorer) {
console.error('fileExplorer missing');
return;
}
for (const path of set) {
// check if path available
if (!fileExplorer.fileItems[path])
continue;
setCount(fileExplorer.fileItems[path], fileFilter);
}
// empty waitingList
targetList.length = 0;
};
const setupCount = (plugin, revert = false) => {
if (!plugin.fileExplorer)
throw new Error('fileExplorer not found');
iterateItems(plugin.fileExplorer.fileItems, (item) => {
if (!isFolder(item))
return;
if (revert)
removeCount(item);
else
setCount(item, plugin.fileFilter);
});
};
const setCount = (item, filter) => {
// if (item.file.isRoot()) return;
const count = countFolderChildren(item.file, filter);
item.titleEl.dataset['count'] = count.toString();
item.titleEl.toggleClass(withSubfolderClass, Array.isArray(item.file.children) &&
item.file.children.some((af) => af instanceof require$$0.TFolder));
};
const removeCount = (item) => {
if (item.titleEl.dataset['count'])
delete item.titleEl.dataset['count'];
item.titleEl.removeClass(withSubfolderClass);
};
class VaultHandler {
constructor(plugin) {
this.waitingList = [];
this.update = require$$0.debounce(() => updateCount(this.waitingList, this.plugin), 500, true);
this.handler = (...args) => {
var _a;
for (const arg of args) {
const path = arg instanceof require$$0.TAbstractFile ? arg.path : arg;
this.waitingList.push((_a = getParentPath(path)) !== null && _a !== void 0 ? _a : '/');
}
this.update();
};
this.registerVaultEvent = () => {
this.plugin.registerEvent(this.vault.on('create', this.handler));
this.plugin.registerEvent(this.vault.on('rename', this.handler));
this.plugin.registerEvent(this.vault.on('delete', this.handler));
};
this.plugin = plugin;
}
get app() {
return this.plugin.app;
}
get vault() {
return this.plugin.app.vault;
}
}
const DEFAULT_SETTINGS = {
showAllNumbers: false,
filterList: ['md'],
blacklist: false,
filterFolderNote: true,
};
class FENoteCountSettingTab extends require$$0.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
get showOnlyNoteValue() {
const { settings } = this.plugin;
return (settings.blacklist === DEFAULT_SETTINGS.blacklist &&
equals(settings.filterList, DEFAULT_SETTINGS.filterList));
}
set showOnlyNoteValue(value) {
const { blacklist, filterList } = DEFAULT_SETTINGS;
this.plugin.settings.blacklist = blacklist;
if (value) {
// do deep copy
this.plugin.settings.filterList = Array.from(filterList);
}
else {
this.plugin.settings.filterList.length = 0;
}
}
display() {
let { containerEl } = this;
containerEl.empty();
containerEl.createEl('h2', {
text: 'File Explorer Note Count Settings',
});
new require$$0.Setting(containerEl)
.setName('Show All Numbers')
.setDesc('Turn on this option if you want to see the number of notes even after you expand the collapsed folders')
.addToggle((toggle) => toggle
.setValue(this.plugin.settings.showAllNumbers)
.onChange((value) => {
document.body.toggleClass('oz-show-all-num', value);
this.plugin.settings.showAllNumbers = value;
this.plugin.saveSettings();
}));
new require$$0.Setting(containerEl)
.setName('Exclude Folder Note from Counts')
.setDesc(createFragment((frag) => {
frag.appendText('Only work with');
frag.createEl('a', {
href: 'https://github.com/aidenlx/folder-note-core',
text: 'Folder Note Core',
});
frag.appendText(' Installed and Enabled');
}))
.addToggle((toggle) => toggle
.setValue(this.plugin.settings.filterFolderNote)
.onChange((value) => {
this.plugin.settings.filterFolderNote = value;
this.plugin.saveSettings();
}));
this.filterOpt();
}
filterOpt() {
new require$$0.Setting(this.containerEl)
.setName('Show Only Markdown Notes')
.setDesc('Turn off this option to choose file that should be counted')
.addToggle((toggle) => toggle.setValue(this.showOnlyNoteValue).onChange((value) => {
this.showOnlyNoteValue = value;
this.plugin.reloadCount();
this.plugin.saveSettings();
this.display();
}));
if (!this.showOnlyNoteValue) {
new require$$0.Setting(this.containerEl)
.setName('Filter List')
.setDesc(createFragment((descEl) => {
descEl.appendText('Extension list to include/exclude file during counting');
descEl.appendChild(document.createElement('br'));
descEl.appendText('Separated by comma');
}))
.addTextArea((text) => {
const onChange = (value) => __awaiter(this, void 0, void 0, function* () {
const list = value.split(',').map((v) => v.trim());
this.plugin.settings.filterList = list;
this.plugin.reloadCount();
yield this.plugin.saveSettings();
});
text.setPlaceholder('Leave it empty to count all types of files');
text.setValue(this.plugin.settings.filterList.join(', ')).onChange(require$$0.debounce(onChange, 500, true));
text.inputEl.rows = 2;
text.inputEl.cols = 25;
});
new require$$0.Setting(this.containerEl)
.setName('Enable Blacklist')
.setDesc('Turn on this option to use Filter List to exclude files')
.addToggle((toggle) => toggle
.setValue(this.plugin.settings.blacklist)
.onChange((value) => {
this.plugin.settings.blacklist = value;
this.plugin.reloadCount();
this.plugin.saveSettings();
}));
}
}
}
class FileExplorerNoteCount extends require$$0.Plugin {
constructor() {
super(...arguments);
this.settings = DEFAULT_SETTINGS;
this.vaultHandler = new VaultHandler(this);
/** compatible with theme that hide root folder */
this.doHiddenRoot = (revert = false) => {
if (!this.fileExplorer) {
console.error('file-explorer not found');
return;
}
const root = this.fileExplorer.fileItems['/'];
const styles = getComputedStyle(root.titleInnerEl);
const setup = () => {
const shouldHide = styles.display === 'none' ||
styles.color === 'rgba(0, 0, 0, 0)';
root.titleEl.toggleClass(rootHiddenClass, !revert && shouldHide);
};
if (styles.display !== '')
setup();
else {
let count = 0;
const doId = window.setInterval(() => {
if (count > 10) {
console.error('%o styles empty', root.titleInnerEl);
window.clearInterval(doId);
}
else if (styles.display === '') {
count++;
}
else {
setup();
window.clearInterval(doId);
}
}, 100);
}
};
this.initialize = (revert = false) => {
const doWithFileExplorer = (callback) => {
let leaves, count = 0;
const tryGetView = () => {
leaves = this.app.workspace.getLeavesOfType('file-explorer');
if (leaves.length === 0) {
if (count++ > 5)
console.error('failed to get file-explorer');
else {
console.log('file-explorer not found, retrying...');
setTimeout(tryGetView, 500);
}
}
else {
if (leaves.length > 1)
console.warn('more then one file-explorer');
callback(leaves[0].view);
}
};
tryGetView();
};
const getViewHandler = (revert) => (view) => {
this.fileExplorer = view;
setupCount(this, revert);
this.doHiddenRoot(revert);
if (!revert) {
this.registerEvent(this.app.workspace.on('css-change', this.doHiddenRoot));
this.vaultHandler.registerVaultEvent();
if (this.settings.showAllNumbers)
document.body.addClass('oz-show-all-num');
}
else {
for (const el of document.getElementsByClassName(withSubfolderClass)) {
el.removeClass(withSubfolderClass);
}
document.body.removeClass(showAllNumbersClass);
}
if (!revert) {
// when file explorer is closed (workspace changed)
// try to update fehanlder with new file explorer instance
this.register(around(view, {
onClose: (next) => function () {
setTimeout(() => doWithFileExplorer(getViewHandler(false)), 1e3);
return next.apply(this);
},
}));
}
};
doWithFileExplorer(getViewHandler(revert));
};
}
onload() {
return __awaiter(this, void 0, void 0, function* () {
console.log('loading FileExplorerNoteCount');
this.addSettingTab(new FENoteCountSettingTab(this.app, this));
yield this.loadSettings();
this.app.workspace.onLayoutReady(this.initialize);
});
}
onunload() {
console.log('unloading FileExplorerNoteCount');
this.initialize(true);
}
loadSettings() {
return __awaiter(this, void 0, void 0, function* () {
this.settings = Object.assign(Object.assign({}, this.settings), (yield this.loadData()));
});
}
saveSettings() {
return __awaiter(this, void 0, void 0, function* () {
yield this.saveData(this.settings);
});
}
reloadCount() {
setupCount(this);
}
get fileFilter() {
let list = this.settings.filterList;
return (af) => {
if (af instanceof require$$0.TFile) {
let api;
if (this.settings.filterFolderNote &&
(api = lib.getApi(this)) &&
!!api.getFolderFromNote(af)) {
return false;
}
const { extension: target } = af;
// if list is empty, filter nothing
if (list.length === 0)
return true;
else if (this.settings.blacklist)
return !list.includes(target);
else
return list.includes(target);
}
else
return false;
};
}
}
module.exports = FileExplorerNoteCount;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsiLi4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYWlkZW5seC9mb2xkZXItbm90ZS1jb3JlL2xpYi9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wYXRoLWJyb3dzZXJpZnkvaW5kZXguanMiLCIuLi9zcmMvc3JjL21pc2MudHMiLCIuLi9ub2RlX21vZHVsZXMvbW9ua2V5LWFyb3VuZC9tanMvaW5kZXguanMiLCIuLi9zcmMvc3JjL2ZvbGRlci1jb3VudC50cyIsIi4uL3NyYy9zcmMvdmF1bHQtaGFuZGxlci50cyIsIi4uL3NyYy9zcmMvc2V0dGluZ3MudHMiLCIuLi9zcmMvc3JjL2ZlYy1tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpudWxsLCJuYW1lcyI6WyJyZXF1aXJlJCQwIiwiVEZvbGRlciIsImRpcm5hbWUiLCJkZWJvdW5jZSIsIlRBYnN0cmFjdEZpbGUiLCJQbHVnaW5TZXR0aW5nVGFiIiwiU2V0dGluZyIsIlBsdWdpbiIsIlRGaWxlIiwiZ2V0QXBpIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXVEQTtBQUNPLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMvRCxRQUFRLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDbkcsUUFBUSxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDdEcsUUFBUSxTQUFTLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDdEgsUUFBUSxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUUsS0FBSyxDQUFDLENBQUM7QUFDUDs7Ozs7Ozs7Ozs7OztBQ3hFQSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFPLENBQUMsQ0FBQ0EsOEJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVB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
================================================
FILE: .obsidian/plugins/file-explorer-note-count/manifest.json
================================================
{
"id": "file-explorer-note-count",
"name": "File Explorer Note Count",
"version": "1.2.0",
"minAppVersion": "0.11.13",
"description": "The plugin helps you to see the number of notes under each folder within the file explorer.",
"author": "Ozan Tellioglu",
"authorUrl": "https://www.ozan.pl",
"isDesktopOnly": false
}
================================================
FILE: .obsidian/plugins/file-explorer-note-count/styles.css
================================================
.nav-folder-title[data-count]::after {
content: attr(data-count);
display: inline-block;
position: relative;
font-size: calc(100% * 0.8);
margin-right: 4px;
/* border-radius: 3px; */
padding: 2px 0;
/* background-color: var(--background-secondary-alt); */
transition: opacity 100ms ease-in-out;
}
.nav-folder-title.oz-root-hidden[data-count]::after {
display: none;
}
body:not(.oz-show-all-num)
.nav-folder:not(.is-collapsed)
> .nav-folder-title.oz-with-subfolder[data-count]:not([data-path='/'])::after {
opacity: 0;
}
.nav-folder-title[data-count='0']::after {
display: none;
}
.nav-folder-title-content {
flex-grow: 1;
}
================================================
FILE: .obsidian/plugins/obsidian-outliner/data.json
================================================
{
"styleLists": true,
"debug": false,
"stickCursor": true,
"betterEnter": true,
"selectAll": true,
"disableZoomNotification": false,
"hideWarning": false
}
================================================
FILE: .obsidian/plugins/obsidian-outliner/main.js
================================================
'use strict';
var obsidian = require('obsidian');
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
const DEFAULT_SETTINGS = {
styleLists: false,
debug: false,
stickCursor: true,
betterEnter: true,
selectAll: true,
disableZoomNotification: false,
hideWarning: false,
};
class SettingsService {
constructor(storage) {
this.storage = storage;
this.handlers = new Map();
}
get styleLists() {
return this.values.styleLists;
}
set styleLists(value) {
this.set("styleLists", value);
}
get debug() {
return this.values.debug;
}
set debug(value) {
this.set("debug", value);
}
get stickCursor() {
return this.values.stickCursor;
}
set stickCursor(value) {
this.set("stickCursor", value);
}
get betterEnter() {
return this.values.betterEnter;
}
set betterEnter(value) {
this.set("betterEnter", value);
}
get selectAll() {
return this.values.selectAll;
}
set selectAll(value) {
this.set("selectAll", value);
}
get disableZoomNotification() {
return this.values.disableZoomNotification;
}
set disableZoomNotification(value) {
this.set("disableZoomNotification", value);
}
get hideWarning() {
return this.values.hideWarning;
}
set hideWarning(value) {
this.set("hideWarning", value);
}
onChange(key, cb) {
if (!this.handlers.has(key)) {
this.handlers.set(key, new Set());
}
this.handlers.get(key).add(cb);
}
removeCallback(key, cb) {
const handlers = this.handlers.get(key);
if (handlers) {
handlers.delete(cb);
}
}
reset() {
for (const [k, v] of Object.entries(DEFAULT_SETTINGS)) {
this.set(k, v);
}
}
load() {
return __awaiter(this, void 0, void 0, function* () {
this.values = Object.assign({}, DEFAULT_SETTINGS, yield this.storage.loadData());
});
}
save() {
return __awaiter(this, void 0, void 0, function* () {
yield this.storage.saveData(this.values);
});
}
set(key, value) {
this.values[key] = value;
const callbacks = this.handlers.get(key);
if (!callbacks) {
return;
}
for (const cb of callbacks.values()) {
cb(value);
}
}
}
class ObsidianOutlinerPluginSettingTab extends obsidian.PluginSettingTab {
constructor(app, plugin, settings) {
super(app, plugin);
this.settings = settings;
}
display() {
const { containerEl } = this;
containerEl.empty();
new obsidian.Setting(containerEl)
.setName("Improve the style of your lists")
.setDesc("Styles are only compatible with built-in Obsidian themes and may not be compatible with other themes. Styles only work well with tab size 4.")
.addToggle((toggle) => {
toggle.setValue(this.settings.styleLists).onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.settings.styleLists = value;
yield this.settings.save();
}));
});
new obsidian.Setting(containerEl)
.setName("Stick the cursor to the content")
.setDesc("Don't let the cursor move to the bullet position.")
.addToggle((toggle) => {
toggle.setValue(this.settings.stickCursor).onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.settings.stickCursor = value;
yield this.settings.save();
}));
});
new obsidian.Setting(containerEl)
.setName("Enhance the Enter key")
.setDesc("Make the Enter key behave the same as other outliners.")
.addToggle((toggle) => {
toggle.setValue(this.settings.betterEnter).onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.settings.betterEnter = value;
yield this.settings.save();
}));
});
new obsidian.Setting(containerEl)
.setName("Enhance the Ctrl+A or Cmd+A behavior")
.setDesc("Press the hotkey once to select the current list item. Press the hotkey twice to select the entire list.")
.addToggle((toggle) => {
toggle.setValue(this.settings.selectAll).onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.settings.selectAll = value;
yield this.settings.save();
}));
});
new obsidian.Setting(containerEl)
.setName("Disable notification about Obsidian Zoom plugin")
.addToggle((toggle) => {
toggle
.setValue(this.settings.disableZoomNotification)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.settings.disableZoomNotification = value;
yield this.settings.save();
}));
});
new obsidian.Setting(containerEl)
.setName("Hide the warning about four-space tabs")
.addToggle((toggle) => {
toggle.setValue(this.settings.hideWarning).onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.settings.hideWarning = value;
yield this.settings.save();
}));
});
new obsidian.Setting(containerEl)
.setName("Debug mode")
.setDesc("Open DevTools (Command+Option+I or Control+Shift+I) to copy the debug logs.")
.addToggle((toggle) => {
toggle.setValue(this.settings.debug).onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.settings.debug = value;
yield this.settings.save();
}));
});
}
}
class ObsidianService {
constructor(app) {
this.app = app;
}
getObsidianTabsSettigns() {
return Object.assign({ useTab: true, tabSize: 4 }, this.app.vault.config);
}
getObsidianFoldSettigns() {
return Object.assign({ foldIndent: false }, this.app.vault.config);
}
getActiveLeafDisplayText() {
return this.app.workspace.activeLeaf.getDisplayText();
}
createCommandCallback(cb) {
return () => {
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
if (!view) {
return;
}
const editor = view.sourceMode.cmEditor;
const shouldStopPropagation = cb(editor);
if (!shouldStopPropagation &&
window.event &&
window.event.type === "keydown") {
editor.triggerOnKeyDown(window.event);
}
};
}
}
function cmpPos(a, b) {
return a.line - b.line || a.ch - b.ch;
}
function maxPos(a, b) {
return cmpPos(a, b) < 0 ? b : a;
}
function minPos(a, b) {
return cmpPos(a, b) < 0 ? a : b;
}
class List {
constructor(root, indent, bullet, spaceAfterBullet, firstLine, folded) {
this.root = root;
this.indent = indent;
this.bullet = bullet;
this.spaceAfterBullet = spaceAfterBullet;
this.folded = folded;
this.parent = null;
this.children = [];
this.notesIndent = null;
this.lines = [];
this.lines.push(firstLine);
}
getNotesIndent() {
return this.notesIndent;
}
setNotesIndent(notesIndent) {
if (this.notesIndent !== null) {
throw new Error(`Notes indent already provided`);
}
this.notesIndent = notesIndent;
}
addLine(text) {
if (this.notesIndent === null) {
throw new Error(`Unable to add line, notes indent should be provided first`);
}
this.lines.push(text);
}
replaceLines(lines) {
if (lines.length > 1 && this.notesIndent === null) {
throw new Error(`Unable to add line, notes indent should be provided first`);
}
this.lines = lines;
}
getLineCount() {
return this.lines.length;
}
getRoot() {
return this.root;
}
getChildren() {
return this.children.concat();
}
getLinesInfo() {
const startLine = this.root.getContentLinesRangeOf(this)[0];
return this.lines.map((row, i) => {
const line = startLine + i;
const startCh = i === 0 ? this.getContentStartCh() : this.notesIndent.length;
const endCh = startCh + row.length;
return {
text: row,
from: { line, ch: startCh },
to: { line, ch: endCh },
};
});
}
getLines() {
return this.lines.concat();
}
getFirstLineContentStart() {
const startLine = this.root.getContentLinesRangeOf(this)[0];
return {
line: startLine,
ch: this.getContentStartCh(),
};
}
getLastLineContentEnd() {
const endLine = this.root.getContentLinesRangeOf(this)[1];
const endCh = this.lines.length === 1
? this.getContentStartCh() + this.lines[0].length
: this.notesIndent.length + this.lines[this.lines.length - 1].length;
return {
line: endLine,
ch: endCh,
};
}
getContentStartCh() {
return this.indent.length + this.bullet.length + 1;
}
isFolded() {
if (this.folded) {
return true;
}
if (this.parent) {
return this.parent.isFolded();
}
return false;
}
isFoldRoot() {
let parent = this.getParent();
while (parent) {
if (parent.folded) {
return false;
}
parent = parent.getParent();
}
return this.folded;
}
getLevel() {
if (!this.parent) {
return 0;
}
return this.parent.getLevel() + 1;
}
unindentContent(from, till) {
this.indent = this.indent.slice(0, from) + this.indent.slice(till);
if (this.notesIndent !== null) {
this.notesIndent =
this.notesIndent.slice(0, from) + this.notesIndent.slice(till);
}
for (const child of this.children) {
child.unindentContent(from, till);
}
}
indentContent(indentPos, indentChars) {
this.indent =
this.indent.slice(0, indentPos) +
indentChars +
this.indent.slice(indentPos);
if (this.notesIndent !== null) {
this.notesIndent =
this.notesIndent.slice(0, indentPos) +
indentChars +
this.notesIndent.slice(indentPos);
}
for (const child of this.children) {
child.indentContent(indentPos, indentChars);
}
}
getFirstLineIndent() {
return this.indent;
}
getBullet() {
return this.bullet;
}
getSpaceAfterBullet() {
return this.spaceAfterBullet;
}
replateBullet(bullet) {
this.bullet = bullet;
}
getParent() {
return this.parent;
}
addBeforeAll(list) {
this.children.unshift(list);
list.parent = this;
}
addAfterAll(list) {
this.children.push(list);
list.parent = this;
}
removeChild(list) {
const i = this.children.indexOf(list);
this.children.splice(i, 1);
list.parent = null;
}
addBefore(before, list) {
const i = this.children.indexOf(before);
this.children.splice(i, 0, list);
list.parent = this;
}
addAfter(before, list) {
const i = this.children.indexOf(before);
this.children.splice(i + 1, 0, list);
list.parent = this;
}
getPrevSiblingOf(list) {
const i = this.children.indexOf(list);
return i > 0 ? this.children[i - 1] : null;
}
getNextSiblingOf(list) {
const i = this.children.indexOf(list);
return i >= 0 && i < this.children.length ? this.children[i + 1] : null;
}
isEmpty() {
return this.children.length === 0;
}
print() {
let res = "";
for (let i = 0; i < this.lines.length; i++) {
res += i === 0 ? this.indent + this.bullet + this.spaceAfterBullet : this.notesIndent;
res += this.lines[i];
res += "\n";
}
for (const child of this.children) {
res += child.print();
}
return res;
}
}
class Root {
constructor(start, end, selections) {
this.start = start;
this.end = end;
this.rootList = new List(this, "", "", "", "", false);
this.selections = [];
this.replaceSelections(selections);
}
getRootList() {
return this.rootList;
}
getRange() {
return [Object.assign({}, this.start), Object.assign({}, this.end)];
}
getSelections() {
return this.selections.map((s) => ({
anchor: Object.assign({}, s.anchor),
head: Object.assign({}, s.head),
}));
}
hasSingleCursor() {
if (!this.hasSingleSelection()) {
return false;
}
const selection = this.selections[0];
return (selection.anchor.line === selection.head.line &&
selection.anchor.ch === selection.head.ch);
}
hasSingleSelection() {
return this.selections.length === 1;
}
getCursor() {
return Object.assign({}, this.selections[this.selections.length - 1].head);
}
replaceCursor(cursor) {
this.selections = [{ anchor: cursor, head: cursor }];
}
replaceSelections(selections) {
if (selections.length < 1) {
throw new Error(`Unable to create Root without selections`);
}
this.selections = selections;
}
getListUnderCursor() {
return this.getListUnderLine(this.getCursor().line);
}
getListUnderLine(line) {
if (line < this.start.line || line > this.end.line) {
return;
}
let result = null;
let index = this.start.line;
const visitArr = (ll) => {
for (const l of ll) {
const listFromLine = index;
const listTillLine = listFromLine + l.getLineCount() - 1;
if (line >= listFromLine && line <= listTillLine) {
result = l;
}
else {
index = listTillLine + 1;
visitArr(l.getChildren());
}
if (result !== null) {
return;
}
}
};
visitArr(this.rootList.getChildren());
return result;
}
getContentLinesRangeOf(list) {
let result = null;
let line = this.start.line;
const visitArr = (ll) => {
for (const l of ll) {
const listFromLine = line;
const listTillLine = listFromLine + l.getLineCount() - 1;
if (l === list) {
result = [listFromLine, listTillLine];
}
else {
line = listTillLine + 1;
visitArr(l.getChildren());
}
if (result !== null) {
return;
}
}
};
visitArr(this.rootList.getChildren());
return result;
}
getChildren() {
return this.rootList.getChildren();
}
print() {
let res = "";
for (const child of this.rootList.getChildren()) {
res += child.print();
}
return res.replace(/\n$/, "");
}
}
const bulletSign = `(?:[-*+]|\\d+\\.)`;
const listItemWithoutSpacesRe = new RegExp(`^${bulletSign}( |\t)`);
const listItemRe = new RegExp(`^[ \t]*${bulletSign}( |\t)`);
const stringWithSpacesRe = new RegExp(`^[ \t]+`);
const parseListItemRe = new RegExp(`^([ \t]*)(${bulletSign})( |\t)(.*)$`);
class ListsService {
constructor(loggerService, obsidianService) {
this.loggerService = loggerService;
this.obsidianService = obsidianService;
}
evalOperation(root, op, editor) {
op.perform();
if (op.shouldUpdate()) {
this.applyChanges(editor, root);
}
return {
shouldUpdate: op.shouldUpdate(),
shouldStopPropagation: op.shouldStopPropagation(),
};
}
performOperation(cb, editor, cursor = editor.getCursor()) {
const root = this.parseList(editor, cursor);
if (!root) {
return { shouldUpdate: false, shouldStopPropagation: false };
}
const op = cb(root);
return this.evalOperation(root, op, editor);
}
parseList(editor, cursor = editor.getCursor()) {
const d = this.loggerService.bind("parseList");
const error = (msg) => {
d(msg);
return null;
};
const line = editor.getLine(cursor.line);
let listLookingPos = null;
if (this.isListItem(line)) {
listLookingPos = cursor.line;
}
else if (this.isLineWithIndent(line)) {
let listLookingPosSearch = cursor.line - 1;
while (listLookingPosSearch >= editor.firstLine()) {
const line = editor.getLine(listLookingPosSearch);
if (this.isListItem(line)) {
listLookingPos = listLookingPosSearch;
break;
}
else if (this.isLineWithIndent(line)) {
listLookingPosSearch--;
}
else {
break;
}
}
}
if (listLookingPos == null) {
return null;
}
let listStartLine = null;
let listStartLineLookup = listLookingPos;
while (listStartLineLookup >= editor.firstLine()) {
const line = editor.getLine(listStartLineLookup);
if (!this.isListItem(line) && !this.isLineWithIndent(line)) {
break;
}
if (this.isListItemWithoutSpaces(line)) {
listStartLine = listStartLineLookup;
}
listStartLineLookup--;
}
if (listStartLine === null) {
return null;
}
let listEndLine = listLookingPos;
let listEndLineLookup = listLookingPos;
while (listEndLineLookup <= editor.lastLine()) {
const line = editor.getLine(listEndLineLookup);
if (!this.isListItem(line) && !this.isLineWithIndent(line)) {
break;
}
if (!this.isEmptyLine(line)) {
listEndLine = listEndLineLookup;
}
listEndLineLookup++;
}
if (listStartLine > cursor.line || listEndLine < cursor.line) {
return null;
}
const root = new Root({ line: listStartLine, ch: 0 }, { line: listEndLine, ch: editor.getLine(listEndLine).length }, editor.listSelections().map((r) => ({
anchor: { line: r.anchor.line, ch: r.anchor.ch },
head: { line: r.head.line, ch: r.head.ch },
})));
let currentParent = root.getRootList();
let currentList = null;
let currentIndent = "";
for (let l = listStartLine; l <= listEndLine; l++) {
const line = editor.getLine(l);
const matches = parseListItemRe.exec(line);
if (matches) {
const [_, indent, bullet, spaceAfterBullet, content] = matches;
const compareLength = Math.min(currentIndent.length, indent.length);
const indentSlice = indent.slice(0, compareLength);
const currentIndentSlice = currentIndent.slice(0, compareLength);
if (indentSlice !== currentIndentSlice) {
const expected = currentIndentSlice
.replace(/ /g, "S")
.replace(/\t/g, "T");
const got = indentSlice.replace(/ /g, "S").replace(/\t/g, "T");
return error(`Unable to parse list: expected indent "${expected}", got "${got}"`);
}
if (indent.length > currentIndent.length) {
currentParent = currentList;
currentIndent = indent;
}
else if (indent.length < currentIndent.length) {
while (currentParent.getFirstLineIndent().length >= indent.length &&
currentParent.getParent()) {
currentParent = currentParent.getParent();
}
currentIndent = indent;
}
const folded = !!editor.isFolded({
line: Math.min(l + 1, listEndLine),
ch: 0,
});
currentList = new List(root, indent, bullet, spaceAfterBullet, content, folded);
currentParent.addAfterAll(currentList);
}
else if (this.isLineWithIndent(line)) {
if (!currentList) {
return error(`Unable to parse list: expected list item, got empty line`);
}
const indentToCheck = currentList.getNotesIndent() || currentIndent;
if (line.indexOf(indentToCheck) !== 0) {
const expected = indentToCheck.replace(/ /g, "S").replace(/\t/g, "T");
const got = line
.match(/^[ \t]*/)[0]
.replace(/ /g, "S")
.replace(/\t/g, "T");
return error(`Unable to parse list: expected indent "${expected}", got "${got}"`);
}
if (!currentList.getNotesIndent()) {
const matches = line.match(/^[ \t]+/);
if (!matches || matches[0].length <= currentIndent.length) {
return error(`Unable to parse list: expected some indent, got no indent`);
}
currentList.setNotesIndent(matches[0]);
}
currentList.addLine(line.slice(currentList.getNotesIndent().length));
}
else {
return error(`Unable to parse list: expected list item or note, got "${line}"`);
}
}
return root;
}
applyChanges(editor, root) {
const rootRange = root.getRange();
const oldString = editor.getRange(rootRange[0], rootRange[1]);
const newString = root.print();
const fromLine = rootRange[0].line;
const toLine = rootRange[1].line;
for (let l = fromLine; l <= toLine; l++) {
editor.foldCode(l, null, "unfold");
}
let changeFrom = Object.assign({}, rootRange[0]);
let changeTo = Object.assign({}, rootRange[1]);
let oldTmp = oldString;
let newTmp = newString;
while (true) {
const nlIndex = oldTmp.indexOf("\n");
if (nlIndex < 0) {
break;
}
const oldLine = oldTmp.slice(0, nlIndex + 1);
const newLine = newTmp.slice(0, oldLine.length);
if (oldLine !== newLine) {
break;
}
changeFrom.line++;
oldTmp = oldTmp.slice(oldLine.length);
newTmp = newTmp.slice(oldLine.length);
}
while (true) {
const nlIndex = oldTmp.lastIndexOf("\n");
if (nlIndex < 0) {
break;
}
const oldLine = oldTmp.slice(nlIndex);
const newLine = newTmp.slice(-oldLine.length);
if (oldLine !== newLine) {
break;
}
oldTmp = oldTmp.slice(0, -oldLine.length);
newTmp = newTmp.slice(0, -oldLine.length);
const nlIndex2 = oldTmp.lastIndexOf("\n");
changeTo.ch =
nlIndex2 >= 0 ? oldTmp.length - nlIndex2 - 1 : oldTmp.length;
changeTo.line--;
}
if (oldTmp !== newTmp) {
editor.replaceRange(newTmp, changeFrom, changeTo);
}
editor.setSelections(root.getSelections());
// TODO: lines could be different because of deletetion
for (let l = fromLine; l <= toLine; l++) {
const line = root.getListUnderLine(l);
if (line && line.isFoldRoot()) {
editor.foldCode(l);
}
}
}
getDefaultIndentChars() {
const { useTab, tabSize } = this.obsidianService.getObsidianTabsSettigns();
return useTab ? "\t" : new Array(tabSize).fill(" ").join("");
}
isEmptyLine(line) {
return line.length === 0;
}
isLineWithIndent(line) {
return stringWithSpacesRe.test(line);
}
isListItem(line) {
return listItemRe.test(line);
}
isListItemWithoutSpaces(line) {
return listItemWithoutSpacesRe.test(line);
}
}
class LoggerService {
constructor(settingsService) {
this.settingsService = settingsService;
}
log(method, ...args) {
if (!this.settingsService.debug) {
return;
}
console.info(method, ...args);
}
bind(method) {
return (...args) => this.log(method, ...args);
}
}
const STATUS_BAR_TEXT = `Outliner styles only work with four-space tabs. Please check Obsidian settings.`;
class ListsStylesFeature {
constructor(plugin, settingsService, obsidianService) {
this.plugin = plugin;
this.settingsService = settingsService;
this.obsidianService = obsidianService;
this.onStyleListsSettingChange = (styleLists) => {
if (styleLists) {
this.addListsStyles();
}
else {
this.removeListsStyles();
}
};
}
load() {
return __awaiter(this, void 0, void 0, function* () {
if (this.settingsService.styleLists) {
this.addListsStyles();
}
this.settingsService.onChange("styleLists", this.onStyleListsSettingChange);
this.addStatusBarText();
this.startStatusBarInterval();
});
}
unload() {
return __awaiter(this, void 0, void 0, function* () {
clearInterval(this.interval);
if (this.statusBarText.parentElement) {
this.statusBarText.parentElement.removeChild(this.statusBarText);
}
this.settingsService.removeCallback("styleLists", this.onStyleListsSettingChange);
this.removeListsStyles();
});
}
startStatusBarInterval() {
let visible = false;
this.interval = window.setInterval(() => {
const { tabSize } = this.obsidianService.getObsidianTabsSettigns();
const shouldBeVisible = this.settingsService.styleLists &&
!(tabSize === 4) &&
!this.settingsService.hideWarning;
if (shouldBeVisible && !visible) {
this.statusBarText.style.display = "block";
visible = true;
}
else if (!shouldBeVisible && visible) {
this.statusBarText.style.display = "none";
visible = false;
}
}, 1000);
}
addStatusBarText() {
this.statusBarText = this.plugin.addStatusBarItem();
this.statusBarText.style.color = "red";
this.statusBarText.style.display = "none";
this.statusBarText.setText(STATUS_BAR_TEXT);
}
addListsStyles() {
document.body.classList.add("outliner-plugin-bls");
}
removeListsStyles() {
document.body.classList.remove("outliner-plugin-bls");
}
}
function recalculateNumericBullets(root) {
function visit(parent) {
let index = 1;
for (const child of parent.getChildren()) {
if (/\d+\./.test(child.getBullet())) {
child.replateBullet(`${index++}.`);
}
visit(child);
}
}
visit(root);
}
class MoveLeftOperation {
constructor(root) {
this.root = root;
this.stopPropagation = false;
this.updated = false;
}
shouldStopPropagation() {
return this.stopPropagation;
}
shouldUpdate() {
return this.updated;
}
perform() {
const { root } = this;
if (!root.hasSingleCursor()) {
return;
}
this.stopPropagation = true;
const list = root.getListUnderCursor();
const parent = list.getParent();
const grandParent = parent.getParent();
if (!grandParent) {
return;
}
this.updated = true;
const listStartLineBefore = root.getContentLinesRangeOf(list)[0];
const indentRmFrom = parent.getFirstLineIndent().length;
const indentRmTill = list.getFirstLineIndent().length;
parent.removeChild(list);
grandParent.addAfter(parent, list);
list.unindentContent(indentRmFrom, indentRmTill);
const listStartLineAfter = root.getContentLinesRangeOf(list)[0];
const lineDiff = listStartLineAfter - listStartLineBefore;
const chDiff = indentRmTill - indentRmFrom;
const cursor = root.getCursor();
root.replaceCursor({
line: cursor.line + lineDiff,
ch: cursor.ch - chDiff,
});
recalculateNumericBullets(root);
}
}
function isEmptyLineOrEmptyCheckbox(line) {
return line === "" || line === "[ ] ";
}
class OutdentIfLineIsEmptyOperation {
constructor(root) {
this.root = root;
this.moveLeftOp = new MoveLeftOperation(root);
}
shouldStopPropagation() {
return this.moveLeftOp.shouldStopPropagation();
}
shouldUpdate() {
return this.moveLeftOp.shouldUpdate();
}
perform() {
const { root } = this;
if (!root.hasSingleCursor()) {
return;
}
const list = root.getListUnderCursor();
const lines = list.getLines();
if (lines.length > 1 ||
!isEmptyLineOrEmptyCheckbox(lines[0]) ||
list.getLevel() === 1) {
return;
}
this.moveLeftOp.perform();
}
}
function isEnter$1(e) {
return ((e.keyCode === 13 || e.code === "Enter") &&
e.shiftKey === false &&
e.metaKey === false &&
e.altKey === false &&
e.ctrlKey === false);
}
class EnterOutdentIfLineIsEmptyFeature {
constructor(plugin, settingsService, listsService, imeService) {
this.plugin = plugin;
this.settingsService = settingsService;
this.listsService = listsService;
this.imeService = imeService;
this.onKeyDown = (cm, e) => {
if (!this.settingsService.betterEnter ||
!isEnter$1(e) ||
this.imeService.isIMEOpened()) {
return;
}
const { shouldStopPropagation } = this.listsService.performOperation((root) => new OutdentIfLineIsEmptyOperation(root), cm);
if (shouldStopPropagation) {
e.preventDefault();
e.stopPropagation();
}
};
}
load() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.registerCodeMirror((cm) => {
cm.on("keydown", this.onKeyDown);
});
});
}
unload() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.app.workspace.iterateCodeMirrors((cm) => {
cm.off("keydown", this.onKeyDown);
});
});
}
}
class CreateNewItemOperation {
constructor(root) {
this.root = root;
this.stopPropagation = false;
this.updated = false;
}
shouldStopPropagation() {
return this.stopPropagation;
}
shouldUpdate() {
return this.updated;
}
perform() {
const { root } = this;
if (!root.hasSingleCursor()) {
return;
}
const list = root.getListUnderCursor();
const lines = list.getLinesInfo();
if (lines.length === 1 && isEmptyLineOrEmptyCheckbox(lines[0].text)) {
return;
}
const cursor = root.getCursor();
const lineUnderCursor = lines.find((l) => l.from.line === cursor.line);
if (cursor.ch < lineUnderCursor.from.ch) {
return;
}
const { oldLines, newLines } = lines.reduce((acc, line) => {
if (cursor.line > line.from.line) {
acc.oldLines.push(line.text);
}
else if (cursor.line === line.from.line) {
const a = line.text.slice(0, cursor.ch - line.from.ch);
const b = line.text.slice(cursor.ch - line.from.ch);
acc.oldLines.push(a);
acc.newLines.push(b);
}
else if (cursor.line < line.from.line) {
acc.newLines.push(line.text);
}
return acc;
}, {
oldLines: [],
newLines: [],
});
const codeBlockBacticks = oldLines.join("\n").split("```").length - 1;
const isInsideCodeblock = codeBlockBacticks > 0 && codeBlockBacticks % 2 !== 0;
if (isInsideCodeblock) {
return;
}
this.stopPropagation = true;
this.updated = true;
const endPos = list.getLastLineContentEnd();
const onChildLevel = !list.isEmpty() && cursor.line === endPos.line && cursor.ch === endPos.ch;
const indent = onChildLevel
? list.getChildren()[0].getFirstLineIndent()
: list.getFirstLineIndent();
const bullet = onChildLevel
? list.getChildren()[0].getBullet()
: list.getBullet();
const spaceAfterBullet = onChildLevel
? list.getChildren()[0].getSpaceAfterBullet()
: list.getSpaceAfterBullet();
const prefix = oldLines[0].match(/^\[[ x]\]/) ? "[ ] " : "";
const newList = new List(list.getRoot(), indent, bullet, spaceAfterBullet, prefix + newLines.shift(), false);
if (newLines.length > 0) {
newList.setNotesIndent(list.getNotesIndent());
for (const line of newLines) {
newList.addLine(line);
}
}
if (onChildLevel) {
list.addBeforeAll(newList);
}
else {
const children = list.getChildren();
for (const child of children) {
list.removeChild(child);
newList.addAfterAll(child);
}
list.getParent().addAfter(list, newList);
}
list.replaceLines(oldLines);
const newListStart = newList.getFirstLineContentStart();
root.replaceCursor({
line: newListStart.line,
ch: newListStart.ch + prefix.length,
});
recalculateNumericBullets(root);
}
}
function isEnter(e) {
return ((e.keyCode === 13 || e.code === "Enter") &&
e.shiftKey === false &&
e.metaKey === false &&
e.altKey === false &&
e.ctrlKey === false);
}
class EnterShouldCreateNewItemFeature {
constructor(plugin, settingsService, listsService, imeService) {
this.plugin = plugin;
this.settingsService = settingsService;
this.listsService = listsService;
this.imeService = imeService;
this.onKeyDown = (cm, e) => {
if (!this.settingsService.betterEnter ||
!isEnter(e) ||
this.imeService.isIMEOpened()) {
return;
}
const { shouldStopPropagation } = this.listsService.performOperation((root) => new CreateNewItemOperation(root), cm);
if (shouldStopPropagation) {
e.preventDefault();
e.stopPropagation();
}
};
}
load() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.registerCodeMirror((cm) => {
cm.on("keydown", this.onKeyDown);
});
});
}
unload() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.app.workspace.iterateCodeMirrors((cm) => {
cm.off("keydown", this.onKeyDown);
});
});
}
}
class MoveCursorToPreviousUnfoldedLineOperation {
constructor(root) {
this.root = root;
this.stopPropagation = false;
this.updated = false;
}
shouldStopPropagation() {
return this.stopPropagation;
}
shouldUpdate() {
return this.updated;
}
perform() {
const { root } = this;
if (!root.hasSingleCursor()) {
return;
}
const list = this.root.getListUnderCursor();
const cursor = this.root.getCursor();
const lines = list.getLinesInfo();
const lineNo = lines.findIndex((l) => cursor.ch === l.from.ch && cursor.line === l.from.line);
if (lineNo === 0) {
this.moveCursorToPreviousUnfoldedItem(root, cursor);
}
else if (lineNo > 0) {
this.moveCursorToPreviousNoteLine(root, lines, lineNo);
}
}
moveCursorToPreviousNoteLine(root, lines, lineNo) {
this.stopPropagation = true;
this.updated = true;
root.replaceCursor(lines[lineNo - 1].to);
}
moveCursorToPreviousUnfoldedItem(root, cursor) {
const prev = root.getListUnderLine(cursor.line - 1);
if (!prev) {
return;
}
this.stopPropagation = true;
this.updated = true;
if (prev.isFolded()) {
let foldRoot = prev;
while (!foldRoot.isFoldRoot()) {
foldRoot = foldRoot.getParent();
}
const firstLineEnd = foldRoot.getLinesInfo()[0].to;
root.replaceCursor(firstLineEnd);
}
else {
root.replaceCursor(prev.getLastLineContentEnd());
}
}
}
function isArrowLeft(e) {
return ((e.keyCode === 37 || e.code === "ArrowLeft") &&
e.shiftKey === false &&
e.metaKey === false &&
e.altKey === false &&
e.ctrlKey === false);
}
function isCtrlArrowLeft(e) {
return ((e.keyCode === 37 || e.code === "ArrowLeft") &&
e.shiftKey === false &&
e.metaKey === false &&
e.altKey === false &&
e.ctrlKey === true);
}
class MoveCursorToPreviousUnfoldedLineFeature {
constructor(plugin, settingsService, listsService, imeService) {
this.plugin = plugin;
this.settingsService = settingsService;
this.listsService = listsService;
this.imeService = imeService;
this.onKeyDown = (cm, event) => {
if (!this.settingsService.stickCursor || this.imeService.isIMEOpened()) {
return;
}
if (isArrowLeft(event) || (!obsidian.Platform.isMacOS && isCtrlArrowLeft(event))) {
const { shouldStopPropagation } = this.listsService.performOperation((root) => new MoveCursorToPreviousUnfoldedLineOperation(root), cm);
if (shouldStopPropagation) {
event.preventDefault();
event.stopPropagation();
}
}
};
}
load() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.registerCodeMirror((cm) => {
cm.on("keydown", this.onKeyDown);
});
});
}
unload() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.app.workspace.iterateCodeMirrors((cm) => {
cm.off("keydown", this.onKeyDown);
});
});
}
}
class EnsureCursorInListContentOperation {
constructor(root) {
this.root = root;
this.stopPropagation = false;
this.updated = false;
}
shouldStopPropagation() {
return this.stopPropagation;
}
shouldUpdate() {
return this.updated;
}
perform() {
const { root } = this;
if (!root.hasSingleCursor()) {
return;
}
this.stopPropagation = true;
const cursor = root.getCursor();
const list = root.getListUnderCursor();
const contentStart = list.getFirstLineContentStart();
const linePrefix = contentStart.line === cursor.line
? contentStart.ch
: list.getNotesIndent().length;
if (cursor.ch < linePrefix) {
this.updated = true;
root.replaceCursor({
line: cursor.line,
ch: linePrefix,
});
}
}
}
class EnsureCursorIsInUnfoldedLineOperation {
constructor(root) {
this.root = root;
this.stopPropagation = false;
this.updated = false;
}
shouldStopPropagation() {
return this.stopPropagation;
}
shouldUpdate() {
return this.updated;
}
perform() {
const { root } = this;
if (!root.hasSingleCursor()) {
return;
}
this.stopPropagation = true;
const cursor = root.getCursor();
const list = root.getListUnderCursor();
if (!list.isFolded()) {
return;
}
let foldRoot = list;
while (!foldRoot.isFoldRoot()) {
foldRoot = foldRoot.getParent();
}
const firstLineEnd = foldRoot.getLinesInfo()[0].to;
if (cursor.line > firstLineEnd.line) {
this.updated = true;
root.replaceCursor(firstLineEnd);
}
}
}
class EnsureCursorInListContentFeature {
constructor(plugin, settingsService, listsService) {
this.plugin = plugin;
this.settingsService = settingsService;
this.listsService = listsService;
this.handleCursorActivity = (cm) => {
if (!this.settingsService.stickCursor) {
return;
}
this.listsService.performOperation((root) => new EnsureCursorIsInUnfoldedLineOperation(root), cm);
this.listsService.performOperation((root) => new EnsureCursorInListContentOperation(root), cm);
};
}
load() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.registerCodeMirror((cm) => {
cm.on("cursorActivity", this.handleCursorActivity);
});
});
}
unload() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.app.workspace.iterateCodeMirrors((cm) => {
cm.off("cursorActivity", this.handleCursorActivity);
});
});
}
}
class DeleteAndMergeWithPreviousLineOperation {
constructor(root) {
this.root = root;
this.stopPropagation = false;
this.updated = false;
}
shouldStopPropagation() {
return this.stopPropagation;
}
shouldUpdate() {
return this.updated;
}
perform() {
const { root } = this;
if (!root.hasSingleCursor()) {
return;
}
const list = root.getListUnderCursor();
const cursor = root.getCursor();
const lines = list.getLinesInfo();
const lineNo = lines.findIndex((l) => cursor.ch === l.from.ch && cursor.line === l.from.line);
if (lineNo === 0) {
this.mergeWithPreviousItem(root, cursor, list);
}
else if (lineNo > 0) {
this.mergeNotes(root, cursor, list, lines, lineNo);
}
}
mergeNotes(root, cursor, list, lines, lineNo) {
this.stopPropagation = true;
this.updated = true;
const prevLineNo = lineNo - 1;
root.replaceCursor({
line: cursor.line - 1,
ch: lines[prevLineNo].text.length + lines[prevLineNo].from.ch,
});
lines[prevLineNo].text += lines[lineNo].text;
lines.splice(lineNo, 1);
list.replaceLines(lines.map((l) => l.text));
}
mergeWithPreviousItem(root, cursor, list) {
if (root.getChildren()[0] === list && list.getChildren().length === 0) {
return;
}
this.stopPropagation = true;
const prev = root.getListUnderLine(cursor.line - 1);
if (!prev) {
return;
}
const bothAreEmpty = prev.isEmpty() && list.isEmpty();
const prevIsEmptyAndSameLevel = prev.isEmpty() && !list.isEmpty() && prev.getLevel() == list.getLevel();
const listIsEmptyAndPrevIsParent = list.isEmpty() && prev.getLevel() == list.getLevel() - 1;
if (bothAreEmpty || prevIsEmptyAndSameLevel || listIsEmptyAndPrevIsParent) {
this.updated = true;
const parent = list.getParent();
const prevEnd = prev.getLastLineContentEnd();
if (!prev.getNotesIndent() && list.getNotesIndent()) {
prev.setNotesIndent(prev.getFirstLineIndent() +
list.getNotesIndent().slice(list.getFirstLineIndent().length));
}
const oldLines = prev.getLines();
const newLines = list.getLines();
oldLines[oldLines.length - 1] += newLines[0];
const resultLines = oldLines.concat(newLines.slice(1));
prev.replaceLines(resultLines);
parent.removeChild(list);
for (const c of list.getChildren()) {
list.removeChild(c);
prev.addAfterAll(c);
}
root.replaceCursor(prevEnd);
recalculateNumericBullets(root);
}
}
}
class DeleteAndMergeWithNextLineOperation {
constructor(root) {
this.root = root;
this.deleteAndMergeWithPrevious =
new DeleteAndMergeWithPreviousLineOperation(root);
}
shouldStopPropagation() {
return this.deleteAndMergeWithPrevious.shouldStopPropagation();
}
shouldUpdate() {
return this.deleteAndMergeWithPrevious.shouldUpdate();
}
perform() {
const { root } = this;
if (!root.hasSingleCursor()) {
return;
}
const list = root.getListUnderCursor();
const cursor = root.getCursor();
const lines = list.getLinesInfo();
const lineNo = lines.findIndex((l) => cursor.ch === l.to.ch && cursor.line === l.to.line);
if (lineNo === lines.length - 1) {
const nextLine = lines[lineNo].to.line + 1;
const nextList = root.getListUnderLine(nextLine);
root.replaceCursor(nextList.getFirstLineContentStart());
this.deleteAndMergeWithPrevious.perform();
}
else if (lineNo >= 0) {
root.replaceCursor(lines[lineNo + 1].from);
this.deleteAndMergeWithPrevious.perform();
}
}
}
class DeleteTillLineStartOperation {
constructor(root) {
this.root = root;
this.stopPropagation = false;
this.updated = false;
}
shouldStopPropagation() {
return this.stopPropagation;
}
shouldUpdate() {
return this.updated;
}
perform() {
const { root } = this;
if (!root.hasSingleCursor()) {
return;
}
this.stopPropagation = true;
this.updated = true;
const cursor = root.getCursor();
const list = root.getListUnderCursor();
const lines = list.getLinesInfo();
const lineNo = lines.findIndex((l) => l.from.line === cursor.line);
lines[lineNo].text = lines[lineNo].text.slice(cursor.ch - lines[lineNo].from.ch);
list.replaceLines(lines.map((l) => l.text));
root.replaceCursor(lines[lineNo].from);
}
}
function isBackspace(e) {
return ((e.keyCode === 8 || e.code === "Backspace") &&
e.shiftKey === false &&
e.metaKey === false &&
e.altKey === false &&
e.ctrlKey === false);
}
function isCmdBackspace(e) {
return ((e.keyCode === 8 || e.code === "Backspace") &&
e.shiftKey === false &&
e.metaKey === true &&
e.altKey === false &&
e.ctrlKey === false);
}
function isDelete(e) {
return ((e.keyCode === 46 || e.code === "Delete") &&
e.shiftKey === false &&
e.metaKey === false &&
e.altKey === false &&
e.ctrlKey === false);
}
class DeleteShouldIgnoreBulletsFeature {
constructor(plugin, settingsService, listsService, imeService) {
this.plugin = plugin;
this.settingsService = settingsService;
this.listsService = listsService;
this.imeService = imeService;
this.onKeyDown = (cm, event) => {
if (!this.settingsService.stickCursor || this.imeService.isIMEOpened()) {
return;
}
if (isBackspace(event)) {
const { shouldStopPropagation } = this.listsService.performOperation((root) => new DeleteAndMergeWithPreviousLineOperation(root), cm);
if (shouldStopPropagation) {
event.preventDefault();
event.stopPropagation();
}
}
if (obsidian.Platform.isMacOS && isCmdBackspace(event)) {
const { shouldStopPropagation } = this.listsService.performOperation((root) => new DeleteTillLineStartOperation(root), cm);
if (shouldStopPropagation) {
event.preventDefault();
event.stopPropagation();
}
}
if (isDelete(event)) {
const { shouldStopPropagation } = this.listsService.performOperation((root) => new DeleteAndMergeWithNextLineOperation(root), cm);
if (shouldStopPropagation) {
event.preventDefault();
event.stopPropagation();
}
}
};
}
load() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.registerCodeMirror((cm) => {
cm.on("keydown", this.onKeyDown);
});
});
}
unload() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.app.workspace.iterateCodeMirrors((cm) => {
cm.off("keydown", this.onKeyDown);
});
});
}
}
class SelectTillLineStartOperation {
constructor(root) {
this.root = root;
this.stopPropagation = false;
this.updated = false;
}
shouldStopPropagation() {
return this.stopPropagation;
}
shouldUpdate() {
return this.updated;
}
perform() {
const { root } = this;
if (!root.hasSingleCursor()) {
return;
}
this.stopPropagation = true;
this.updated = true;
const cursor = root.getCursor();
const list = root.getListUnderCursor();
const lines = list.getLinesInfo();
const lineNo = lines.findIndex((l) => l.from.line === cursor.line);
root.replaceSelections([{ head: lines[lineNo].from, anchor: cursor }]);
}
}
function isCmdShiftLeft(e) {
return ((e.keyCode === 37 || e.code === "ArrowLeft") &&
e.shiftKey === true &&
e.metaKey === true &&
e.altKey === false &&
e.ctrlKey === false);
}
class SelectionShouldIgnoreBulletsFeature {
constructor(plugin, settingsService, listsService, imeService) {
this.plugin = plugin;
this.settingsService = settingsService;
this.listsService = listsService;
this.imeService = imeService;
this.onKeyDown = (cm, event) => {
if (!this.settingsService.stickCursor || this.imeService.isIMEOpened()) {
return;
}
if (obsidian.Platform.isMacOS && isCmdShiftLeft(event)) {
const { shouldStopPropagation } = this.listsService.performOperation((root) => new SelectTillLineStartOperation(root), cm);
if (shouldStopPropagation) {
event.preventDefault();
event.stopPropagation();
}
}
};
}
load() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.registerCodeMirror((cm) => {
cm.on("keydown", this.onKeyDown);
});
});
}
unload() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.app.workspace.iterateCodeMirrors((cm) => {
cm.off("keydown", this.onKeyDown);
});
});
}
}
function isCmdDotOrCmdShiftDot(e) {
return ((e.keyCode === 190 || e.code === "Period") &&
e.metaKey === true &&
e.altKey === false &&
e.ctrlKey === false);
}
function isCtrlDotOrCtrlShiftDot(e) {
return ((e.keyCode === 190 || e.code === "Period") &&
e.metaKey === false &&
e.altKey === false &&
e.ctrlKey === true);
}
function isModDotOrModShiftDot(e) {
return obsidian.Platform.isMacOS
? isCmdDotOrCmdShiftDot(e)
: isCtrlDotOrCtrlShiftDot(e);
}
class ZoomFeature {
constructor(plugin, settingsService, imeService) {
this.plugin = plugin;
this.settingsService = settingsService;
this.imeService = imeService;
this.onKeyDown = (cm, e) => {
if (window.ObsidianZoomPlugin ||
this.settingsService.disableZoomNotification ||
!isModDotOrModShiftDot(e) ||
this.imeService.isIMEOpened()) {
return;
}
new obsidian.Notice(`Zooming support has been removed from the Obsidian Outliner plugin. Please install the Obsidian Zoom plugin.`, 5000);
};
}
load() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.registerCodeMirror((cm) => {
cm.on("keydown", this.onKeyDown);
});
});
}
unload() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.app.workspace.iterateCodeMirrors((cm) => {
cm.off("keydown", this.onKeyDown);
});
});
}
}
class FoldFeature {
constructor(plugin, obsidianService) {
this.plugin = plugin;
this.obsidianService = obsidianService;
}
load() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.addCommand({
id: "fold",
name: "Fold the list",
callback: this.obsidianService.createCommandCallback(this.fold.bind(this)),
hotkeys: [
{
modifiers: ["Mod"],
key: "ArrowUp",
},
],
});
this.plugin.addCommand({
id: "unfold",
name: "Unfold the list",
callback: this.obsidianService.createCommandCallback(this.unfold.bind(this)),
hotkeys: [
{
modifiers: ["Mod"],
key: "ArrowDown",
},
],
});
});
}
unload() {
return __awaiter(this, void 0, void 0, function* () { });
}
setFold(editor, type) {
if (!this.obsidianService.getObsidianFoldSettigns().foldIndent) {
new obsidian.Notice(`Unable to ${type} because folding is disabled. Please enable "Fold indent" in Obsidian settings.`, 5000);
return true;
}
editor.foldCode(editor.getCursor(), null, type);
return true;
}
fold(editor) {
return this.setFold(editor, "fold");
}
unfold(editor) {
return this.setFold(editor, "unfold");
}
}
class SelectAllOperation {
constructor(root) {
this.root = root;
this.stopPropagation = false;
this.updated = false;
}
shouldStopPropagation() {
return this.stopPropagation;
}
shouldUpdate() {
return this.updated;
}
perform() {
const { root } = this;
if (!root.hasSingleSelection()) {
return;
}
const selection = root.getSelections()[0];
const [rootStart, rootEnd] = root.getRange();
const selectionFrom = minPos(selection.anchor, selection.head);
const selectionTo = maxPos(selection.anchor, selection.head);
if (selectionFrom.line < rootStart.line ||
selectionTo.line > rootEnd.line) {
return false;
}
if (selectionFrom.line === rootStart.line &&
selectionFrom.ch === rootStart.ch &&
selectionTo.line === rootEnd.line &&
selectionTo.ch === rootEnd.ch) {
return false;
}
const list = root.getListUnderCursor();
const contentStart = list.getFirstLineContentStart();
const contentEnd = list.getLastLineContentEnd();
if (selectionFrom.line < contentStart.line ||
selectionTo.line > contentEnd.line) {
return false;
}
this.stopPropagation = true;
this.updated = true;
if (selectionFrom.line === contentStart.line &&
selectionFrom.ch === contentStart.ch &&
selectionTo.line === contentEnd.line &&
selectionTo.ch === contentEnd.ch) {
// select all list
root.replaceSelections([{ anchor: rootStart, head: rootEnd }]);
}
else {
// select all line
root.replaceSelections([{ anchor: contentStart, head: contentEnd }]);
}
return true;
}
}
function isCmdA(e) {
return ((e.keyCode === 65 || e.code === "KeyA") &&
e.shiftKey === false &&
e.metaKey === true &&
e.altKey === false &&
e.ctrlKey === false);
}
function isCtrlA(e) {
return ((e.keyCode === 65 || e.code === "KeyA") &&
e.shiftKey === false &&
e.metaKey === false &&
e.altKey === false &&
e.ctrlKey === true);
}
function isSelectAll(e) {
return obsidian.Platform.isMacOS ? isCmdA(e) : isCtrlA(e);
}
class SelectAllFeature {
constructor(plugin, settingsService, listsService, imeService) {
this.plugin = plugin;
this.settingsService = settingsService;
this.listsService = listsService;
this.imeService = imeService;
this.onKeyDown = (cm, event) => {
if (!this.settingsService.selectAll ||
!isSelectAll(event) ||
this.imeService.isIMEOpened()) {
return;
}
const { shouldStopPropagation } = this.listsService.performOperation((root) => new SelectAllOperation(root), cm);
if (shouldStopPropagation) {
event.preventDefault();
event.stopPropagation();
}
};
}
load() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.registerCodeMirror((cm) => {
cm.on("keydown", this.onKeyDown);
});
});
}
unload() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.app.workspace.iterateCodeMirrors((cm) => {
cm.off("keydown", this.onKeyDown);
});
});
}
}
class MoveRightOperation {
constructor(root, defaultIndentChars) {
this.root = root;
this.defaultIndentChars = defaultIndentChars;
this.stopPropagation = false;
this.updated = false;
}
shouldStopPropagation() {
return this.stopPropagation;
}
shouldUpdate() {
return this.updated;
}
perform() {
const { root } = this;
if (!root.hasSingleCursor()) {
return;
}
this.stopPropagation = true;
const list = root.getListUnderCursor();
const parent = list.getParent();
const prev = parent.getPrevSiblingOf(list);
if (!prev) {
return;
}
this.updated = true;
const listStartLineBefore = root.getContentLinesRangeOf(list)[0];
const indentPos = list.getFirstLineIndent().length;
let indentChars = "";
if (indentChars === "" && !prev.isEmpty()) {
indentChars = prev
.getChildren()[0]
.getFirstLineIndent()
.slice(prev.getFirstLineIndent().length);
}
if (indentChars === "") {
indentChars = list
.getFirstLineIndent()
.slice(parent.getFirstLineIndent().length);
}
if (indentChars === "" && !list.isEmpty()) {
indentChars = list.getChildren()[0].getFirstLineIndent();
}
if (indentChars === "") {
indentChars = this.defaultIndentChars;
}
parent.removeChild(list);
prev.addAfterAll(list);
list.indentContent(indentPos, indentChars);
const listStartLineAfter = root.getContentLinesRangeOf(list)[0];
const lineDiff = listStartLineAfter - listStartLineBefore;
const cursor = root.getCursor();
root.replaceCursor({
line: cursor.line + lineDiff,
ch: cursor.ch + indentChars.length,
});
recalculateNumericBullets(root);
}
}
class MoveDownOperation {
constructor(root) {
this.root = root;
this.stopPropagation = false;
this.updated = false;
}
shouldStopPropagation() {
return this.stopPropagation;
}
shouldUpdate() {
return this.updated;
}
perform() {
const { root } = this;
if (!root.hasSingleCursor()) {
return;
}
this.stopPropagation = true;
const list = root.getListUnderCursor();
const parent = list.getParent();
const grandParent = parent.getParent();
const next = parent.getNextSiblingOf(list);
const listStartLineBefore = root.getContentLinesRangeOf(list)[0];
if (!next && grandParent) {
const newParent = grandParent.getNextSiblingOf(parent);
if (newParent) {
this.updated = true;
parent.removeChild(list);
newParent.addBeforeAll(list);
}
}
else if (next) {
this.updated = true;
parent.removeChild(list);
parent.addAfter(next, list);
}
if (!this.updated) {
return;
}
const listStartLineAfter = root.getContentLinesRangeOf(list)[0];
const lineDiff = listStartLineAfter - listStartLineBefore;
const cursor = root.getCursor();
root.replaceCursor({
line: cursor.line + lineDiff,
ch: cursor.ch,
});
recalculateNumericBullets(root);
}
}
class MoveUpOperation {
constructor(root) {
this.root = root;
this.stopPropagation = false;
this.updated = false;
}
shouldStopPropagation() {
return this.stopPropagation;
}
shouldUpdate() {
return this.updated;
}
perform() {
const { root } = this;
if (!root.hasSingleCursor()) {
return;
}
this.stopPropagation = true;
const list = root.getListUnderCursor();
const parent = list.getParent();
const grandParent = parent.getParent();
const prev = parent.getPrevSiblingOf(list);
const listStartLineBefore = root.getContentLinesRangeOf(list)[0];
if (!prev && grandParent) {
const newParent = grandParent.getPrevSiblingOf(parent);
if (newParent) {
this.updated = true;
parent.removeChild(list);
newParent.addAfterAll(list);
}
}
else if (prev) {
this.updated = true;
parent.removeChild(list);
parent.addBefore(prev, list);
}
if (!this.updated) {
return;
}
const listStartLineAfter = root.getContentLinesRangeOf(list)[0];
const lineDiff = listStartLineAfter - listStartLineBefore;
const cursor = root.getCursor();
root.replaceCursor({
line: cursor.line + lineDiff,
ch: cursor.ch,
});
recalculateNumericBullets(root);
}
}
class MoveItemsFeature {
constructor(plugin, obsidianService, listsService, imeService) {
this.plugin = plugin;
this.obsidianService = obsidianService;
this.listsService = listsService;
this.imeService = imeService;
}
load() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.addCommand({
id: "move-list-item-up",
name: "Move list and sublists up",
callback: this.obsidianService.createCommandCallback(this.moveListElementUp.bind(this)),
hotkeys: [
{
modifiers: ["Mod", "Shift"],
key: "ArrowUp",
},
],
});
this.plugin.addCommand({
id: "move-list-item-down",
name: "Move list and sublists down",
callback: this.obsidianService.createCommandCallback(this.moveListElementDown.bind(this)),
hotkeys: [
{
modifiers: ["Mod", "Shift"],
key: "ArrowDown",
},
],
});
this.plugin.addCommand({
id: "indent-list",
name: "Indent the list and sublists",
callback: this.obsidianService.createCommandCallback(this.moveListElementRight.bind(this)),
hotkeys: [
{
modifiers: [],
key: "Tab",
},
],
});
this.plugin.addCommand({
id: "outdent-list",
name: "Outdent the list and sublists",
callback: this.obsidianService.createCommandCallback(this.moveListElementLeft.bind(this)),
hotkeys: [
{
modifiers: ["Shift"],
key: "Tab",
},
],
});
});
}
unload() {
return __awaiter(this, void 0, void 0, function* () { });
}
moveListElementDown(editor) {
const { shouldStopPropagation } = this.listsService.performOperation((root) => new MoveDownOperation(root), editor);
return shouldStopPropagation;
}
moveListElementUp(editor) {
const { shouldStopPropagation } = this.listsService.performOperation((root) => new MoveUpOperation(root), editor);
return shouldStopPropagation;
}
moveListElementRight(editor) {
if (this.imeService.isIMEOpened()) {
return true;
}
const { shouldStopPropagation } = this.listsService.performOperation((root) => new MoveRightOperation(root, this.listsService.getDefaultIndentChars()), editor);
return shouldStopPropagation;
}
moveListElementLeft(editor) {
if (this.imeService.isIMEOpened()) {
return true;
}
const { shouldStopPropagation } = this.listsService.performOperation((root) => new MoveLeftOperation(root), editor);
return shouldStopPropagation;
}
}
class CreateNoteLineOperation {
constructor(root, defaultIndentChars) {
this.root = root;
this.defaultIndentChars = defaultIndentChars;
this.stopPropagation = false;
this.updated = false;
}
shouldStopPropagation() {
return this.stopPropagation;
}
shouldUpdate() {
return this.updated;
}
perform() {
const { root } = this;
if (!root.hasSingleCursor()) {
return;
}
const cursor = root.getCursor();
const list = root.getListUnderCursor();
const lineUnderCursor = list
.getLinesInfo()
.find((l) => l.from.line === cursor.line);
if (cursor.ch < lineUnderCursor.from.ch) {
return;
}
this.stopPropagation = true;
this.updated = true;
if (!list.getNotesIndent()) {
const indent = list.isEmpty()
? list.getFirstLineIndent() + this.defaultIndentChars
: list.getChildren()[0].getFirstLineIndent();
list.setNotesIndent(indent);
}
const lines = list.getLinesInfo().reduce((acc, line) => {
if (cursor.line === line.from.line) {
acc.push(line.text.slice(0, cursor.ch - line.from.ch));
acc.push(line.text.slice(cursor.ch - line.from.ch));
}
else {
acc.push(line.text);
}
return acc;
}, []);
list.replaceLines(lines);
root.replaceCursor({
line: cursor.line + 1,
ch: list.getNotesIndent().length,
});
}
}
function isShiftEnter(e) {
return ((e.keyCode === 13 || e.code === "Enter") &&
e.shiftKey === true &&
e.metaKey === false &&
e.altKey === false &&
e.ctrlKey === false);
}
class ShiftEnterShouldCreateNoteFeature {
constructor(plugin, settingsService, listsService, imeService) {
this.plugin = plugin;
this.settingsService = settingsService;
this.listsService = listsService;
this.imeService = imeService;
this.onKeyDown = (cm, e) => {
if (!this.settingsService.betterEnter ||
!isShiftEnter(e) ||
this.imeService.isIMEOpened()) {
return;
}
const { shouldStopPropagation } = this.listsService.performOperation((root) => new CreateNoteLineOperation(root, this.listsService.getDefaultIndentChars()), cm);
if (shouldStopPropagation) {
e.preventDefault();
e.stopPropagation();
}
};
}
load() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.registerCodeMirror((cm) => {
cm.on("keydown", this.onKeyDown);
});
});
}
unload() {
return __awaiter(this, void 0, void 0, function* () {
this.plugin.app.workspace.iterateCodeMirrors((cm) => {
cm.off("keydown", this.onKeyDown);
});
});
}
}
class IMEService {
constructor() {
this.composition = false;
this.onCompositionStart = () => {
this.composition = true;
};
this.onCompositionEnd = () => {
this.composition = false;
};
}
load() {
return __awaiter(this, void 0, void 0, function* () {
document.addEventListener("compositionstart", this.onCompositionStart);
document.addEventListener("compositionend", this.onCompositionEnd);
});
}
unload() {
return __awaiter(this, void 0, void 0, function* () {
document.removeEventListener("compositionend", this.onCompositionEnd);
document.removeEventListener("compositionstart", this.onCompositionStart);
});
}
isIMEOpened() {
return this.composition;
}
}
class ObsidianOutlinerPlugin extends obsidian.Plugin {
onload() {
return __awaiter(this, void 0, void 0, function* () {
console.log(`Loading obsidian-outliner`);
this.settingsService = new SettingsService(this);
yield this.settingsService.load();
this.loggerService = new LoggerService(this.settingsService);
this.obsidianService = new ObsidianService(this.app);
this.listsService = new ListsService(this.loggerService, this.obsidianService);
this.imeService = new IMEService();
yield this.imeService.load();
this.addSettingTab(new ObsidianOutlinerPluginSettingTab(this.app, this, this.settingsService));
this.features = [
new ListsStylesFeature(this, this.settingsService, this.obsidianService),
new EnterOutdentIfLineIsEmptyFeature(this, this.settingsService, this.listsService, this.imeService),
new EnterShouldCreateNewItemFeature(this, this.settingsService, this.listsService, this.imeService),
new EnsureCursorInListContentFeature(this, this.settingsService, this.listsService),
new MoveCursorToPreviousUnfoldedLineFeature(this, this.settingsService, this.listsService, this.imeService),
new DeleteShouldIgnoreBulletsFeature(this, this.settingsService, this.listsService, this.imeService),
new SelectionShouldIgnoreBulletsFeature(this, this.settingsService, this.listsService, this.imeService),
new ZoomFeature(this, this.settingsService, this.imeService),
new FoldFeature(this, this.obsidianService),
new SelectAllFeature(this, this.settingsService, this.listsService, this.imeService),
new MoveItemsFeature(this, this.obsidianService, this.listsService, this.imeService),
new ShiftEnterShouldCreateNoteFeature(this, this.settingsService, this.listsService, this.imeService),
];
for (const feature of this.features) {
yield feature.load();
}
});
}
onunload() {
return __awaiter(this, void 0, void 0, function* () {
console.log(`Unloading obsidian-outliner`);
yield this.imeService.unload();
for (const feature of this.features) {
yield feature.unload();
}
});
}
}
module.exports = ObsidianOutlinerPlugin;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9zZXJ2aWNlcy9TZXR0aW5nc1NlcnZpY2UudHMiLCJzcmMvc2VydmljZXMvT2JzaWRpYW5TZXJ2aWNlLnRzIiwic3JjL3Jvb3QvaW5kZXgudHMiLCJzcmMvc2VydmljZXMvTGlzdHNTZXJ2aWNlLnRzIiwic3JjL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCJzcmMvZmVhdHVyZXMvTGlzdHNTdHlsZXNGZWF0dXJlLnRzIiwic3JjL3Jvb3QvcmVjYWxjdWxhdGVOdW1lcmljQnVsbGV0cy50cyIsInNyYy9vcGVyYXRpb25zL01vdmVMZWZ0T3BlcmF0aW9uLnRzIiwic3JjL3V0aWxzL2lzRW1wdHlMaW5lT3JFbXB0eUNoZWNrYm94LnRzIiwic3JjL29wZXJhdGlvbnMvT3V0ZGVudElmTGluZUlzRW1wdHlPcGVyYXRpb24udHMiLCJzcmMvZmVhdHVyZXMvRW50ZXJPdXRkZW50SWZMaW5lSXNFbXB0eUZlYXR1cmUudHMiLCJzcmMvb3BlcmF0aW9ucy9DcmVhdGVOZXdJdGVtT3BlcmF0aW9uLnRzIiwic3JjL2ZlYXR1cmVzL0VudGVyU2hvdWxkQ3JlYXRlTmV3SXRlbU9uQ2hpbGRMZXZlbEZlYXR1cmUudHMiLCJzcmMvb3BlcmF0aW9ucy9Nb3ZlQ3Vyc29yVG9QcmV2aW91c1VuZm9sZGVkTGluZU9wZXJhdGlvbi50cyIsInNyYy9mZWF0dXJlcy9Nb3ZlQ3Vyc29yVG9QcmV2aW91c1VuZm9sZGVkTGluZUZlYXR1cmUudHMiLCJzcmMvb3BlcmF0aW9ucy9FbnN1cmVDdXJzb3JJbkxpc3RDb250ZW50T3BlcmF0aW9uLnRzIiwic3JjL29wZXJhdGlvbnMvRW5zdXJlQ3Vyc29ySXNJblVuZm9sZGVkTGluZU9wZXJhdGlvbi50cyIsInNyYy9mZWF0dXJlcy9FbnN1cmVDdXJzb3JJbkxpc3RDb250ZW50RmVhdHVyZS50cyIsInNyYy9vcGVyYXRpb25zL0RlbGV0ZUFuZE1lcmdlV2l0aFByZXZpb3VzTGluZU9wZXJhdGlvbi50cyIsInNyYy9vcGVyYXRpb25zL0RlbGV0ZUFuZE1lcmdlV2l0aE5leHRMaW5lT3BlcmF0aW9uLnRzIiwic3JjL29wZXJhdGlvbnMvRGVsZXRlVGlsbExpbmVTdGFydE9wZXJhdGlvbi50cyIsInNyYy9mZWF0dXJlcy9EZWxldGVTaG91bGRJZ25vcmVCdWxsZXRzRmVhdHVyZS50cyIsInNyYy9vcGVyYXRpb25zL1NlbGVjdFRpbGxMaW5lU3RhcnRPcGVyYXRpb24udHMiLCJzcmMvZmVhdHVyZXMvU2VsZWN0aW9uU2hvdWxkSWdub3JlQnVsbGV0c0ZlYXR1cmUudHMiLCJzcmMvZmVhdHVyZXMvWm9vbUZlYXR1cmUudHMiLCJzcmMvZmVhdHVyZXMvRm9sZEZlYXR1cmUudHMiLCJzcmMvb3BlcmF0aW9ucy9TZWxlY3RBbGxPcGVyYXRpb24udHMiLCJzcmMvZmVhdHVyZXMvU2VsZWN0QWxsRmVhdHVyZS50cyIsInNyYy9vcGVyYXRpb25zL01vdmVSaWdodE9wZXJhdGlvbi50cyIsInNyYy9vcGVyYXRpb25zL01vdmVEb3duT3BlcmF0aW9uLnRzIiwic3JjL29wZXJhdGlvbnMvTW92ZVVwT3BlcmF0aW9uLnRzIiwic3JjL2ZlYXR1cmVzL01vdmVJdGVtc0ZlYXR1cmUudHMiLCJzcmMvb3BlcmF0aW9ucy9DcmVhdGVOb3RlTGluZU9wZXJhdGlvbi50cyIsInNyYy9mZWF0dXJlcy9TaGlmdEVudGVyU2hvdWxkQ3JlYXRlTm90ZUZlYXR1cmUudHMiLCJzcmMvc2VydmljZXMvSU1FU2VydmljZS50cyIsInNyYy9PYnNpZGlhbk91dGxpbmVyUGx1Z2luLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuIiwiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBQbHVnaW5fMiwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuT3V0bGluZXJQbHVnaW5TZXR0aW5ncyB7XG4gIHN0eWxlTGlzdHM6IGJvb2xlYW47XG4gIGRlYnVnOiBib29sZWFuO1xuICBzdGlja0N1cnNvcjogYm9vbGVhbjtcbiAgYmV0dGVyRW50ZXI6IGJvb2xlYW47XG4gIHNlbGVjdEFsbDogYm9vbGVhbjtcbiAgZGlzYWJsZVpvb21Ob3RpZmljYXRpb246IGJvb2xlYW47XG4gIGhpZGVXYXJuaW5nOiBib29sZWFuO1xufVxuXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBPYnNpZGlhbk91dGxpbmVyUGx1Z2luU2V0dGluZ3MgPSB7XG4gIHN0eWxlTGlzdHM6IGZhbHNlLFxuICBkZWJ1ZzogZmFsc2UsXG4gIHN0aWNrQ3Vyc29yOiB0cnVlLFxuICBiZXR0ZXJFbnRlcjogdHJ1ZSxcbiAgc2VsZWN0QWxsOiB0cnVlLFxuICBkaXNhYmxlWm9vbU5vdGlmaWNhdGlvbjogZmFsc2UsXG4gIGhpZGVXYXJuaW5nOiBmYWxzZSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZSB7XG4gIGxvYWREYXRhKCk6IFByb21pc2U8T2JzaWRpYW5PdXRsaW5lclBsdWdpblNldHRpbmdzPjtcbiAgc2F2ZURhdGEoc2V0dGlnbnM6IE9ic2lkaWFuT3V0bGluZXJQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8dm9pZD47XG59XG5cbnR5cGUgSyA9IGtleW9mIE9ic2lkaWFuT3V0bGluZXJQbHVnaW5TZXR0aW5ncztcbnR5cGUgVjxUIGV4dGVuZHMgSz4gPSBPYnNpZGlhbk91dGxpbmVyUGx1Z2luU2V0dGluZ3NbVF07XG50eXBlIENhbGxiYWNrPFQgZXh0ZW5kcyBLPiA9IChjYjogVjxUPikgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIFNldHRpbmdzU2VydmljZSBpbXBsZW1lbnRzIE9ic2lkaWFuT3V0bGluZXJQbHVnaW5TZXR0aW5ncyB7XG4gIHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZTtcbiAgcHJpdmF0ZSB2YWx1ZXM6IE9ic2lkaWFuT3V0bGluZXJQbHVnaW5TZXR0aW5ncztcbiAgcHJpdmF0ZSBoYW5kbGVyczogTWFwPEssIFNldDxDYWxsYmFjazxLPj4+O1xuXG4gIGNvbnN0cnVjdG9yKHN0b3JhZ2U6IFN0b3JhZ2UpIHtcbiAgICB0aGlzLnN0b3JhZ2UgPSBzdG9yYWdlO1xuICAgIHRoaXMuaGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gIH1cblxuICBnZXQgc3R5bGVMaXN0cygpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMuc3R5bGVMaXN0cztcbiAgfVxuICBzZXQgc3R5bGVMaXN0cyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0KFwic3R5bGVMaXN0c1wiLCB2YWx1ZSk7XG4gIH1cblxuICBnZXQgZGVidWcoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzLmRlYnVnO1xuICB9XG4gIHNldCBkZWJ1Zyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0KFwiZGVidWdcIiwgdmFsdWUpO1xuICB9XG5cbiAgZ2V0IHN0aWNrQ3Vyc29yKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlcy5zdGlja0N1cnNvcjtcbiAgfVxuICBzZXQgc3RpY2tDdXJzb3IodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldChcInN0aWNrQ3Vyc29yXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGdldCBiZXR0ZXJFbnRlcigpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMuYmV0dGVyRW50ZXI7XG4gIH1cbiAgc2V0IGJldHRlckVudGVyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXQoXCJiZXR0ZXJFbnRlclwiLCB2YWx1ZSk7XG4gIH1cblxuICBnZXQgc2VsZWN0QWxsKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlcy5zZWxlY3RBbGw7XG4gIH1cbiAgc2V0IHNlbGVjdEFsbCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0KFwic2VsZWN0QWxsXCIsIHZhbHVlKTtcbiAgfVxuXG4gIGdldCBkaXNhYmxlWm9vbU5vdGlmaWNhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMuZGlzYWJsZVpvb21Ob3RpZmljYXRpb247XG4gIH1cbiAgc2V0IGRpc2FibGVab29tTm90aWZpY2F0aW9uKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXQoXCJkaXNhYmxlWm9vbU5vdGlmaWNhdGlvblwiLCB2YWx1ZSk7XG4gIH1cblxuICBnZXQgaGlkZVdhcm5pbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzLmhpZGVXYXJuaW5nO1xuICB9XG4gIHNldCBoaWRlV2FybmluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0KFwiaGlkZVdhcm5pbmdcIiwgdmFsdWUpO1xuICB9XG5cbiAgb25DaGFuZ2U8VCBleHRlbmRzIEs+KGtleTogVCwgY2I6IENhbGxiYWNrPFQ+KSB7XG4gICAgaWYgKCF0aGlzLmhhbmRsZXJzLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzLnNldChrZXksIG5ldyBTZXQoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVycy5nZXQoa2V5KS5hZGQoY2IpO1xuICB9XG5cbiAgcmVtb3ZlQ2FsbGJhY2s8VCBleHRlbmRzIEs+KGtleTogVCwgY2I6IENhbGxiYWNrPFQ+KTogdm9pZCB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmdldChrZXkpO1xuXG4gICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICBoYW5kbGVycy5kZWxldGUoY2IpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKERFRkFVTFRfU0VUVElOR1MpKSB7XG4gICAgICB0aGlzLnNldChrLCB2KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkKCkge1xuICAgIHRoaXMudmFsdWVzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgREVGQVVMVF9TRVRUSU5HUyxcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5sb2FkRGF0YSgpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgYXdhaXQgdGhpcy5zdG9yYWdlLnNhdmVEYXRhKHRoaXMudmFsdWVzKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0PFQgZXh0ZW5kcyBLPihrZXk6IFQsIHZhbHVlOiBWPEs+KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZXNba2V5XSA9IHZhbHVlO1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMuaGFuZGxlcnMuZ2V0KGtleSk7XG5cbiAgICBpZiAoIWNhbGxiYWNrcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2Igb2YgY2FsbGJhY2tzLnZhbHVlcygpKSB7XG4gICAgICBjYih2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPYnNpZGlhbk91dGxpbmVyUGx1Z2luU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBQbHVnaW5fMiwgcHJpdmF0ZSBzZXR0aW5nczogU2V0dGluZ3NTZXJ2aWNlKSB7XG4gICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICB9XG5cbiAgZGlzcGxheSgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG4gICAgY29udGFpbmVyRWwuZW1wdHkoKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUoXCJJbXByb3ZlIHRoZSBzdHlsZSBvZiB5b3VyIGxpc3RzXCIpXG4gICAgICAuc2V0RGVzYyhcbiAgICAgICAgXCJTdHlsZXMgYXJlIG9ubHkgY29tcGF0aWJsZSB3aXRoIGJ1aWx0LWluIE9ic2lkaWFuIHRoZW1lcyBhbmQgbWF5IG5vdCBiZSBjb21wYXRpYmxlIHdpdGggb3RoZXIgdGhlbWVzLiBTdHlsZXMgb25seSB3b3JrIHdlbGwgd2l0aCB0YWIgc2l6ZSA0LlwiXG4gICAgICApXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMuc2V0dGluZ3Muc3R5bGVMaXN0cykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy5zdHlsZUxpc3RzID0gdmFsdWU7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXR0aW5ncy5zYXZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKFwiU3RpY2sgdGhlIGN1cnNvciB0byB0aGUgY29udGVudFwiKVxuICAgICAgLnNldERlc2MoXCJEb24ndCBsZXQgdGhlIGN1cnNvciBtb3ZlIHRvIHRoZSBidWxsZXQgcG9zaXRpb24uXCIpXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMuc2V0dGluZ3Muc3RpY2tDdXJzb3IpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ3Muc3RpY2tDdXJzb3IgPSB2YWx1ZTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnNhdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUoXCJFbmhhbmNlIHRoZSBFbnRlciBrZXlcIilcbiAgICAgIC5zZXREZXNjKFwiTWFrZSB0aGUgRW50ZXIga2V5IGJlaGF2ZSB0aGUgc2FtZSBhcyBvdGhlciBvdXRsaW5lcnMuXCIpXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMuc2V0dGluZ3MuYmV0dGVyRW50ZXIpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ3MuYmV0dGVyRW50ZXIgPSB2YWx1ZTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnNhdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUoXCJFbmhhbmNlIHRoZSBDdHJsK0Egb3IgQ21kK0EgYmVoYXZpb3JcIilcbiAgICAgIC5zZXREZXNjKFxuICAgICAgICBcIlByZXNzIHRoZSBob3RrZXkgb25jZSB0byBzZWxlY3QgdGhlIGN1cnJlbnQgbGlzdCBpdGVtLiBQcmVzcyB0aGUgaG90a2V5IHR3aWNlIHRvIHNlbGVjdCB0aGUgZW50aXJlIGxpc3QuXCJcbiAgICAgIClcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuICAgICAgICB0b2dnbGUuc2V0VmFsdWUodGhpcy5zZXR0aW5ncy5zZWxlY3RBbGwpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ3Muc2VsZWN0QWxsID0gdmFsdWU7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXR0aW5ncy5zYXZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKFwiRGlzYWJsZSBub3RpZmljYXRpb24gYWJvdXQgT2JzaWRpYW4gWm9vbSBwbHVnaW5cIilcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuICAgICAgICB0b2dnbGVcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5zZXR0aW5ncy5kaXNhYmxlWm9vbU5vdGlmaWNhdGlvbilcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLmRpc2FibGVab29tTm90aWZpY2F0aW9uID0gdmFsdWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnNhdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZShcIkhpZGUgdGhlIHdhcm5pbmcgYWJvdXQgZm91ci1zcGFjZSB0YWJzXCIpXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMuc2V0dGluZ3MuaGlkZVdhcm5pbmcpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ3MuaGlkZVdhcm5pbmcgPSB2YWx1ZTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnNhdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgLnNldE5hbWUoXCJEZWJ1ZyBtb2RlXCIpXG4gICAgICAuc2V0RGVzYyhcbiAgICAgICAgXCJPcGVuIERldlRvb2xzIChDb21tYW5kK09wdGlvbitJIG9yIENvbnRyb2wrU2hpZnQrSSkgdG8gY29weSB0aGUgZGVidWcgbG9ncy5cIlxuICAgICAgKVxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnNldHRpbmdzLmRlYnVnKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICB0aGlzLnNldHRpbmdzLmRlYnVnID0gdmFsdWU7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXR0aW5ncy5zYXZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEFwcCwgTWFya2Rvd25WaWV3IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9ic2lkaWFuVGFic1NldHRpZ25zIHtcbiAgdXNlVGFiOiBib29sZWFuO1xuICB0YWJTaXplOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9ic2lkaWFuRm9sZFNldHRpZ25zIHtcbiAgZm9sZEluZGVudDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIE9ic2lkaWFuU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBwOiBBcHApIHt9XG5cbiAgZ2V0T2JzaWRpYW5UYWJzU2V0dGlnbnMoKTogSU9ic2lkaWFuVGFic1NldHRpZ25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXNlVGFiOiB0cnVlLFxuICAgICAgdGFiU2l6ZTogNCxcbiAgICAgIC4uLih0aGlzLmFwcC52YXVsdCBhcyBhbnkpLmNvbmZpZyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0T2JzaWRpYW5Gb2xkU2V0dGlnbnMoKTogSU9ic2lkaWFuRm9sZFNldHRpZ25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9sZEluZGVudDogZmFsc2UsXG4gICAgICAuLi4odGhpcy5hcHAudmF1bHQgYXMgYW55KS5jb25maWcsXG4gICAgfTtcbiAgfVxuXG4gIGdldEFjdGl2ZUxlYWZEaXNwbGF5VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5hcHAud29ya3NwYWNlLmFjdGl2ZUxlYWYuZ2V0RGlzcGxheVRleHQoKTtcbiAgfVxuXG4gIGNyZWF0ZUNvbW1hbmRDYWxsYmFjayhjYjogKGVkaXRvcjogQ29kZU1pcnJvci5FZGl0b3IpID0+IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG5cbiAgICAgIGlmICghdmlldykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVkaXRvciA9ICh2aWV3IGFzIGFueSkuc291cmNlTW9kZS5jbUVkaXRvcjtcblxuICAgICAgY29uc3Qgc2hvdWxkU3RvcFByb3BhZ2F0aW9uID0gY2IoZWRpdG9yKTtcblxuICAgICAgaWYgKFxuICAgICAgICAhc2hvdWxkU3RvcFByb3BhZ2F0aW9uICYmXG4gICAgICAgIHdpbmRvdy5ldmVudCAmJlxuICAgICAgICB3aW5kb3cuZXZlbnQudHlwZSA9PT0gXCJrZXlkb3duXCJcbiAgICAgICkge1xuICAgICAgICAoZWRpdG9yIGFzIGFueSkudHJpZ2dlck9uS2V5RG93bih3aW5kb3cuZXZlbnQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjbXBQb3MoYTogSVBvc2l0aW9uLCBiOiBJUG9zaXRpb24pIHtcbiAgcmV0dXJuIGEubGluZSAtIGIubGluZSB8fCBhLmNoIC0gYi5jaDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1heFBvcyhhOiBJUG9zaXRpb24sIGI6IElQb3NpdGlvbikge1xuICByZXR1cm4gY21wUG9zKGEsIGIpIDwgMCA/IGIgOiBhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWluUG9zKGE6IElQb3NpdGlvbiwgYjogSVBvc2l0aW9uKSB7XG4gIHJldHVybiBjbXBQb3MoYSwgYikgPCAwID8gYSA6IGI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBvc2l0aW9uIHtcbiAgY2g6IG51bWJlcjtcbiAgbGluZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElMaXN0TGluZSB7XG4gIHRleHQ6IHN0cmluZztcbiAgZnJvbTogSVBvc2l0aW9uO1xuICB0bzogSVBvc2l0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSYW5nZSB7XG4gIGFuY2hvcjogSVBvc2l0aW9uO1xuICBoZWFkOiBJUG9zaXRpb247XG59XG5cbmV4cG9ydCBjbGFzcyBMaXN0IHtcbiAgcHJpdmF0ZSBwYXJlbnQ6IExpc3QgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjaGlsZHJlbjogTGlzdFtdID0gW107XG4gIHByaXZhdGUgbm90ZXNJbmRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm9vdDogUm9vdCxcbiAgICBwcml2YXRlIGluZGVudDogc3RyaW5nLFxuICAgIHByaXZhdGUgYnVsbGV0OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBzcGFjZUFmdGVyQnVsbGV0OiBzdHJpbmcsXG4gICAgZmlyc3RMaW5lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBmb2xkZWQ6IGJvb2xlYW5cbiAgKSB7XG4gICAgdGhpcy5saW5lcy5wdXNoKGZpcnN0TGluZSk7XG4gIH1cblxuICBnZXROb3Rlc0luZGVudCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5ub3Rlc0luZGVudDtcbiAgfVxuXG4gIHNldE5vdGVzSW5kZW50KG5vdGVzSW5kZW50OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5ub3Rlc0luZGVudCAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3RlcyBpbmRlbnQgYWxyZWFkeSBwcm92aWRlZGApO1xuICAgIH1cbiAgICB0aGlzLm5vdGVzSW5kZW50ID0gbm90ZXNJbmRlbnQ7XG4gIH1cblxuICBhZGRMaW5lKHRleHQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm5vdGVzSW5kZW50ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmFibGUgdG8gYWRkIGxpbmUsIG5vdGVzIGluZGVudCBzaG91bGQgYmUgcHJvdmlkZWQgZmlyc3RgXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubGluZXMucHVzaCh0ZXh0KTtcbiAgfVxuXG4gIHJlcGxhY2VMaW5lcyhsaW5lczogc3RyaW5nW10pIHtcbiAgICBpZiAobGluZXMubGVuZ3RoID4gMSAmJiB0aGlzLm5vdGVzSW5kZW50ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmFibGUgdG8gYWRkIGxpbmUsIG5vdGVzIGluZGVudCBzaG91bGQgYmUgcHJvdmlkZWQgZmlyc3RgXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubGluZXMgPSBsaW5lcztcbiAgfVxuXG4gIGdldExpbmVDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5saW5lcy5sZW5ndGg7XG4gIH1cblxuICBnZXRSb290KCkge1xuICAgIHJldHVybiB0aGlzLnJvb3Q7XG4gIH1cblxuICBnZXRDaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5jb25jYXQoKTtcbiAgfVxuXG4gIGdldExpbmVzSW5mbygpOiBJTGlzdExpbmVbXSB7XG4gICAgY29uc3Qgc3RhcnRMaW5lID0gdGhpcy5yb290LmdldENvbnRlbnRMaW5lc1JhbmdlT2YodGhpcylbMF07XG5cbiAgICByZXR1cm4gdGhpcy5saW5lcy5tYXAoKHJvdywgaSkgPT4ge1xuICAgICAgY29uc3QgbGluZSA9IHN0YXJ0TGluZSArIGk7XG4gICAgICBjb25zdCBzdGFydENoID1cbiAgICAgICAgaSA9PT0gMCA/IHRoaXMuZ2V0Q29udGVudFN0YXJ0Q2goKSA6IHRoaXMubm90ZXNJbmRlbnQubGVuZ3RoO1xuICAgICAgY29uc3QgZW5kQ2ggPSBzdGFydENoICsgcm93Lmxlbmd0aDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dDogcm93LFxuICAgICAgICBmcm9tOiB7IGxpbmUsIGNoOiBzdGFydENoIH0sXG4gICAgICAgIHRvOiB7IGxpbmUsIGNoOiBlbmRDaCB9LFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldExpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5saW5lcy5jb25jYXQoKTtcbiAgfVxuXG4gIGdldEZpcnN0TGluZUNvbnRlbnRTdGFydCgpIHtcbiAgICBjb25zdCBzdGFydExpbmUgPSB0aGlzLnJvb3QuZ2V0Q29udGVudExpbmVzUmFuZ2VPZih0aGlzKVswXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBzdGFydExpbmUsXG4gICAgICBjaDogdGhpcy5nZXRDb250ZW50U3RhcnRDaCgpLFxuICAgIH07XG4gIH1cblxuICBnZXRMYXN0TGluZUNvbnRlbnRFbmQoKSB7XG4gICAgY29uc3QgZW5kTGluZSA9IHRoaXMucm9vdC5nZXRDb250ZW50TGluZXNSYW5nZU9mKHRoaXMpWzFdO1xuICAgIGNvbnN0IGVuZENoID1cbiAgICAgIHRoaXMubGluZXMubGVuZ3RoID09PSAxXG4gICAgICAgID8gdGhpcy5nZXRDb250ZW50U3RhcnRDaCgpICsgdGhpcy5saW5lc1swXS5sZW5ndGhcbiAgICAgICAgOiB0aGlzLm5vdGVzSW5kZW50Lmxlbmd0aCArIHRoaXMubGluZXNbdGhpcy5saW5lcy5sZW5ndGggLSAxXS5sZW5ndGg7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGluZTogZW5kTGluZSxcbiAgICAgIGNoOiBlbmRDaCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250ZW50U3RhcnRDaCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRlbnQubGVuZ3RoICsgdGhpcy5idWxsZXQubGVuZ3RoICsgMTtcbiAgfVxuXG4gIGlzRm9sZGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmZvbGRlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQuaXNGb2xkZWQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpc0ZvbGRSb290KCkge1xuICAgIGxldCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpO1xuXG4gICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgaWYgKHBhcmVudC5mb2xkZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZm9sZGVkO1xuICB9XG5cbiAgZ2V0TGV2ZWwoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0TGV2ZWwoKSArIDE7XG4gIH1cblxuICB1bmluZGVudENvbnRlbnQoZnJvbTogbnVtYmVyLCB0aWxsOiBudW1iZXIpIHtcbiAgICB0aGlzLmluZGVudCA9IHRoaXMuaW5kZW50LnNsaWNlKDAsIGZyb20pICsgdGhpcy5pbmRlbnQuc2xpY2UodGlsbCk7XG4gICAgaWYgKHRoaXMubm90ZXNJbmRlbnQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMubm90ZXNJbmRlbnQgPVxuICAgICAgICB0aGlzLm5vdGVzSW5kZW50LnNsaWNlKDAsIGZyb20pICsgdGhpcy5ub3Rlc0luZGVudC5zbGljZSh0aWxsKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkLnVuaW5kZW50Q29udGVudChmcm9tLCB0aWxsKTtcbiAgICB9XG4gIH1cblxuICBpbmRlbnRDb250ZW50KGluZGVudFBvczogbnVtYmVyLCBpbmRlbnRDaGFyczogc3RyaW5nKSB7XG4gICAgdGhpcy5pbmRlbnQgPVxuICAgICAgdGhpcy5pbmRlbnQuc2xpY2UoMCwgaW5kZW50UG9zKSArXG4gICAgICBpbmRlbnRDaGFycyArXG4gICAgICB0aGlzLmluZGVudC5zbGljZShpbmRlbnRQb3MpO1xuICAgIGlmICh0aGlzLm5vdGVzSW5kZW50ICE9PSBudWxsKSB7XG4gICAgICB0aGlzLm5vdGVzSW5kZW50ID1cbiAgICAgICAgdGhpcy5ub3Rlc0luZGVudC5zbGljZSgwLCBpbmRlbnRQb3MpICtcbiAgICAgICAgaW5kZW50Q2hhcnMgK1xuICAgICAgICB0aGlzLm5vdGVzSW5kZW50LnNsaWNlKGluZGVudFBvcyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBjaGlsZC5pbmRlbnRDb250ZW50KGluZGVudFBvcywgaW5kZW50Q2hhcnMpO1xuICAgIH1cbiAgfVxuXG4gIGdldEZpcnN0TGluZUluZGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRlbnQ7XG4gIH1cblxuICBnZXRCdWxsZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVsbGV0O1xuICB9XG5cbiAgZ2V0U3BhY2VBZnRlckJ1bGxldCgpIHtcbiAgICByZXR1cm4gdGhpcy5zcGFjZUFmdGVyQnVsbGV0O1xuICB9XG5cbiAgcmVwbGF0ZUJ1bGxldChidWxsZXQ6IHN0cmluZykge1xuICAgIHRoaXMuYnVsbGV0ID0gYnVsbGV0O1xuICB9XG5cbiAgZ2V0UGFyZW50KCkge1xuICAgIHJldHVybiB0aGlzLnBhcmVudDtcbiAgfVxuXG4gIGFkZEJlZm9yZUFsbChsaXN0OiBMaXN0KSB7XG4gICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGxpc3QpO1xuICAgIGxpc3QucGFyZW50ID0gdGhpcztcbiAgfVxuXG4gIGFkZEFmdGVyQWxsKGxpc3Q6IExpc3QpIHtcbiAgICB0aGlzLmNoaWxkcmVuLnB1c2gobGlzdCk7XG4gICAgbGlzdC5wYXJlbnQgPSB0aGlzO1xuICB9XG5cbiAgcmVtb3ZlQ2hpbGQobGlzdDogTGlzdCkge1xuICAgIGNvbnN0IGkgPSB0aGlzLmNoaWxkcmVuLmluZGV4T2YobGlzdCk7XG4gICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoaSwgMSk7XG4gICAgbGlzdC5wYXJlbnQgPSBudWxsO1xuICB9XG5cbiAgYWRkQmVmb3JlKGJlZm9yZTogTGlzdCwgbGlzdDogTGlzdCkge1xuICAgIGNvbnN0IGkgPSB0aGlzLmNoaWxkcmVuLmluZGV4T2YoYmVmb3JlKTtcbiAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpLCAwLCBsaXN0KTtcbiAgICBsaXN0LnBhcmVudCA9IHRoaXM7XG4gIH1cblxuICBhZGRBZnRlcihiZWZvcmU6IExpc3QsIGxpc3Q6IExpc3QpIHtcbiAgICBjb25zdCBpID0gdGhpcy5jaGlsZHJlbi5pbmRleE9mKGJlZm9yZSk7XG4gICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoaSArIDEsIDAsIGxpc3QpO1xuICAgIGxpc3QucGFyZW50ID0gdGhpcztcbiAgfVxuXG4gIGdldFByZXZTaWJsaW5nT2YobGlzdDogTGlzdCkge1xuICAgIGNvbnN0IGkgPSB0aGlzLmNoaWxkcmVuLmluZGV4T2YobGlzdCk7XG4gICAgcmV0dXJuIGkgPiAwID8gdGhpcy5jaGlsZHJlbltpIC0gMV0gOiBudWxsO1xuICB9XG5cbiAgZ2V0TmV4dFNpYmxpbmdPZihsaXN0OiBMaXN0KSB7XG4gICAgY29uc3QgaSA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZihsaXN0KTtcbiAgICByZXR1cm4gaSA+PSAwICYmIGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aCA/IHRoaXMuY2hpbGRyZW5baSArIDFdIDogbnVsbDtcbiAgfVxuXG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgcHJpbnQoKSB7XG4gICAgbGV0IHJlcyA9IFwiXCI7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcyArPSBpID09PSAwID8gdGhpcy5pbmRlbnQgKyB0aGlzLmJ1bGxldCArIHRoaXMuc3BhY2VBZnRlckJ1bGxldCA6IHRoaXMubm90ZXNJbmRlbnQ7XG4gICAgICByZXMgKz0gdGhpcy5saW5lc1tpXTtcbiAgICAgIHJlcyArPSBcIlxcblwiO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgcmVzICs9IGNoaWxkLnByaW50KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUm9vdCB7XG4gIHByaXZhdGUgcm9vdExpc3QgPSBuZXcgTGlzdCh0aGlzLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBmYWxzZSk7XG4gIHByaXZhdGUgc2VsZWN0aW9uczogSVJhbmdlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0YXJ0OiBJUG9zaXRpb24sXG4gICAgcHJpdmF0ZSBlbmQ6IElQb3NpdGlvbixcbiAgICBzZWxlY3Rpb25zOiBJUmFuZ2VbXVxuICApIHtcbiAgICB0aGlzLnJlcGxhY2VTZWxlY3Rpb25zKHNlbGVjdGlvbnMpO1xuICB9XG5cbiAgZ2V0Um9vdExpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdExpc3Q7XG4gIH1cblxuICBnZXRSYW5nZSgpOiBbSVBvc2l0aW9uLCBJUG9zaXRpb25dIHtcbiAgICByZXR1cm4gW3sgLi4udGhpcy5zdGFydCB9LCB7IC4uLnRoaXMuZW5kIH1dO1xuICB9XG5cbiAgZ2V0U2VsZWN0aW9ucygpOiBJUmFuZ2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9ucy5tYXAoKHMpID0+ICh7XG4gICAgICBhbmNob3I6IHsgLi4ucy5hbmNob3IgfSxcbiAgICAgIGhlYWQ6IHsgLi4ucy5oZWFkIH0sXG4gICAgfSkpO1xuICB9XG5cbiAgaGFzU2luZ2xlQ3Vyc29yKCkge1xuICAgIGlmICghdGhpcy5oYXNTaW5nbGVTZWxlY3Rpb24oKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uc1swXTtcblxuICAgIHJldHVybiAoXG4gICAgICBzZWxlY3Rpb24uYW5jaG9yLmxpbmUgPT09IHNlbGVjdGlvbi5oZWFkLmxpbmUgJiZcbiAgICAgIHNlbGVjdGlvbi5hbmNob3IuY2ggPT09IHNlbGVjdGlvbi5oZWFkLmNoXG4gICAgKTtcbiAgfVxuXG4gIGhhc1NpbmdsZVNlbGVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA9PT0gMTtcbiAgfVxuXG4gIGdldEN1cnNvcigpIHtcbiAgICByZXR1cm4geyAuLi50aGlzLnNlbGVjdGlvbnNbdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCAtIDFdLmhlYWQgfTtcbiAgfVxuXG4gIHJlcGxhY2VDdXJzb3IoY3Vyc29yOiBJUG9zaXRpb24pIHtcbiAgICB0aGlzLnNlbGVjdGlvbnMgPSBbeyBhbmNob3I6IGN1cnNvciwgaGVhZDogY3Vyc29yIH1dO1xuICB9XG5cbiAgcmVwbGFjZVNlbGVjdGlvbnMoc2VsZWN0aW9uczogSVJhbmdlW10pIHtcbiAgICBpZiAoc2VsZWN0aW9ucy5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBjcmVhdGUgUm9vdCB3aXRob3V0IHNlbGVjdGlvbnNgKTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3Rpb25zID0gc2VsZWN0aW9ucztcbiAgfVxuXG4gIGdldExpc3RVbmRlckN1cnNvcigpOiBMaXN0IHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0VW5kZXJMaW5lKHRoaXMuZ2V0Q3Vyc29yKCkubGluZSk7XG4gIH1cblxuICBnZXRMaXN0VW5kZXJMaW5lKGxpbmU6IG51bWJlcikge1xuICAgIGlmIChsaW5lIDwgdGhpcy5zdGFydC5saW5lIHx8IGxpbmUgPiB0aGlzLmVuZC5saW5lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogTGlzdCA9IG51bGw7XG4gICAgbGV0IGluZGV4OiBudW1iZXIgPSB0aGlzLnN0YXJ0LmxpbmU7XG5cbiAgICBjb25zdCB2aXNpdEFyciA9IChsbDogTGlzdFtdKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGwgb2YgbGwpIHtcbiAgICAgICAgY29uc3QgbGlzdEZyb21MaW5lID0gaW5kZXg7XG4gICAgICAgIGNvbnN0IGxpc3RUaWxsTGluZSA9IGxpc3RGcm9tTGluZSArIGwuZ2V0TGluZUNvdW50KCkgLSAxO1xuXG4gICAgICAgIGlmIChsaW5lID49IGxpc3RGcm9tTGluZSAmJiBsaW5lIDw9IGxpc3RUaWxsTGluZSkge1xuICAgICAgICAgIHJlc3VsdCA9IGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5kZXggPSBsaXN0VGlsbExpbmUgKyAxO1xuICAgICAgICAgIHZpc2l0QXJyKGwuZ2V0Q2hpbGRyZW4oKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB2aXNpdEFycih0aGlzLnJvb3RMaXN0LmdldENoaWxkcmVuKCkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldENvbnRlbnRMaW5lc1JhbmdlT2YobGlzdDogTGlzdCk6IFtudW1iZXIsIG51bWJlcl0gfCBudWxsIHtcbiAgICBsZXQgcmVzdWx0OiBbbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuc3RhcnQubGluZTtcblxuICAgIGNvbnN0IHZpc2l0QXJyID0gKGxsOiBMaXN0W10pID0+IHtcbiAgICAgIGZvciAoY29uc3QgbCBvZiBsbCkge1xuICAgICAgICBjb25zdCBsaXN0RnJvbUxpbmUgPSBsaW5lO1xuICAgICAgICBjb25zdCBsaXN0VGlsbExpbmUgPSBsaXN0RnJvbUxpbmUgKyBsLmdldExpbmVDb3VudCgpIC0gMTtcblxuICAgICAgICBpZiAobCA9PT0gbGlzdCkge1xuICAgICAgICAgIHJlc3VsdCA9IFtsaXN0RnJvbUxpbmUsIGxpc3RUaWxsTGluZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGluZSA9IGxpc3RUaWxsTGluZSArIDE7XG4gICAgICAgICAgdmlzaXRBcnIobC5nZXRDaGlsZHJlbigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmlzaXRBcnIodGhpcy5yb290TGlzdC5nZXRDaGlsZHJlbigpKTtcblxuICAgIHJldHVybiByZ
gitextract_l21fk2d5/ ├── .gitignore ├── .obsidian/ │ ├── app.json │ ├── appearance.json │ ├── community-plugins.json │ ├── core-plugins.json │ ├── daily-notes.json │ ├── graph.json │ ├── hotkeys.json │ ├── page-preview.json │ ├── plugins/ │ │ ├── file-explorer-note-count/ │ │ │ ├── data.json │ │ │ ├── main.js │ │ │ ├── manifest.json │ │ │ └── styles.css │ │ ├── obsidian-outliner/ │ │ │ ├── data.json │ │ │ ├── main.js │ │ │ ├── manifest.json │ │ │ └── styles.css │ │ ├── recent-files-obsidian/ │ │ │ ├── data.json │ │ │ ├── main.js │ │ │ ├── manifest.json │ │ │ └── styles.css │ │ └── table-editor-obsidian/ │ │ ├── data.json │ │ ├── main.js │ │ ├── manifest.json │ │ └── styles.css │ ├── starred.json │ ├── templates.json │ ├── themes/ │ │ ├── Atom.css │ │ └── Obsidian Nord.css │ ├── workspace │ └── workspaces.json ├── 1. cs/ │ ├── 《CSAPP》/ │ │ └── chapter 6 - the memory hierarchy.md │ ├── 《Problem solving with algorithms and Data Structures Using Python》/ │ │ ├── index.md │ │ ├── 何为数据结构与算法?.md │ │ └── 线性数据结构/ │ │ ├── index.md │ │ ├── my_stack.py │ │ └── 栈.md │ └── 存储体系.md ├── 2. coding/ │ ├── 1-beginner/ │ │ ├── 0. 贪心/ │ │ │ └── 455. assign-cookies.md │ │ ├── 1. sorting/ │ │ │ ├── 26. 删除有序数组中的重复项.md │ │ │ ├── 283. 移动零.md │ │ │ ├── 475. 供暖器.md │ │ │ ├── 56. 合并区间.md │ │ │ ├── 80. 删除有序数组中的重复项 II.md │ │ │ ├── 881. 救生艇.md │ │ │ ├── 912. 排序数组.md │ │ │ ├── Array Deduplication III.md │ │ │ └── pointer.md │ │ ├── 3. linked-list/ │ │ │ └── 206. 反转链表.md │ │ ├── 4. queue & stack/ │ │ │ └── 1047. 删除字符串中的所有相邻重复项.md │ │ ├── binary-search/ │ │ │ └── 704. Binary Search.md │ │ ├── dp/ │ │ │ ├── 1139. 最大的以 1 为边界的正方形.md │ │ │ ├── 139. 单词拆分.md │ │ │ ├── 221. 最大正方形.md │ │ │ ├── 45.跳跃游戏 II.md │ │ │ ├── 485. 最大连续 1 的个数.md │ │ │ ├── 53.最大子数组和.md │ │ │ ├── 55.跳跃游戏.md │ │ │ ├── 72. 编辑距离.md │ │ │ ├── 764. 最大加号标志.md │ │ │ ├── Longest Ascending SubArray.md │ │ │ ├── temp.js │ │ │ ├── 剑指 Offer 14- I. 剪绳子.md │ │ │ └── 面试题 17.24. 最大子矩阵.md │ │ └── recursion/ │ │ ├── 25. K 个一组翻转链表.md │ │ ├── 344. 反转字符串.md │ │ ├── 408. 有效单词缩写.md │ │ ├── 50. Pow(x, n).md │ │ ├── 509. 斐波那契数.md │ │ ├── 51. N 皇后.md │ │ ├── 59. 螺旋矩阵 II.md │ │ └── 92. 反转链表 II.md │ ├── 2-training/ │ │ ├── 1014.最佳观光组合.md │ │ ├── 103. 二叉树的锯齿形层序遍历.md │ │ ├── 1154. 一年中的第几天.md │ │ ├── 121. 买卖股票的最佳时机#P0#3.md │ │ ├── 1609. 奇偶树.md │ │ ├── 1644. 二叉树的最近公共祖先 II.md │ │ ├── 1705. 吃苹果的最大数目.md │ │ ├── 198.打家劫舍.md │ │ ├── 2100. 适合打劫银行的日子.md │ │ ├── 2109. 向字符串添加空格.md │ │ ├── 236. 二叉树的最近公共祖先.md │ │ ├── 300.最长递增子序列.md │ │ ├── 846. 一手顺子.js │ │ ├── index.md │ │ └── 面试题 02.06. 回文链表.md │ ├── 3-contest/ │ │ ├── 273/ │ │ │ ├── 1.js │ │ │ ├── 2 copy.js │ │ │ ├── 2.js │ │ │ ├── 3 copy.js │ │ │ └── 3.js │ │ ├── 274/ │ │ │ ├── 1.js │ │ │ ├── 2.js │ │ │ ├── 3.js │ │ │ └── 4.js │ │ ├── test.js │ │ ├── 第 273 场周赛.md │ │ └── 第二题模拟练习/ │ │ ├── 1.js │ │ ├── 2.js │ │ └── 3.js │ ├── 4-books/ │ │ └── 《挑战程序设计竞赛》/ │ │ ├── 1. 抽签.js │ │ ├── 2. 三角形.js │ │ └── tempCodeRunnerFile.js │ ├── 51. N 皇后.md │ ├── 59. 螺旋矩阵 II.md │ └── index.md ├── 3. sd/ │ └── FE/ │ └── index.md ├── DOM检查 ?react 解析器?开源工具?.md ├── README.md ├── temp/ │ ├── 1维 - 动态规划.md │ ├── leetcode 拷贝题目模板.md │ ├── 内推模板.md │ └── 大部头读书笔记.md ├── todo/ │ └── fe/ │ ├── TODO/ │ │ └── 10月第一周.md │ ├── fe-README.md │ ├── koa_/ │ │ ├── app.js │ │ ├── my_koa/ │ │ │ ├── package.json │ │ │ └── src/ │ │ │ ├── Application.js │ │ │ ├── context.js │ │ │ ├── request.js │ │ │ └── response.js │ │ └── package.json │ ├── notes-JavaScript/ │ │ ├── DOM/ │ │ │ └── DOM汇总.md │ │ ├── ES5/ │ │ │ ├── ES5 - new & instanceof 实现.md │ │ │ ├── ES5 - 你说一下你对原型的认识.md │ │ │ ├── ES5-this & call & apply & bind.md │ │ │ ├── ES5-原型原型链.md │ │ │ ├── ES5-变量提升.md │ │ │ ├── ES5-数据类型.md │ │ │ ├── ES5-继承.md │ │ │ └── ES5-闭包.md │ │ ├── ES6/ │ │ │ ├── ES6 - class 总结.md │ │ │ ├── ES6 - extends 总结.md │ │ │ ├── Promise/ │ │ │ │ ├── Promise - 实现 Promise.race() && Promise.all() && Promise.allsettled().md │ │ │ │ ├── promiseA+.js │ │ │ │ ├── promise练习.md │ │ │ │ ├── promisify.md │ │ │ │ ├── 实现PromiseA+.md │ │ │ │ └── 来一沓Promise.md │ │ │ ├── README.MD │ │ │ └── 新增数据结构/ │ │ │ ├── map/ │ │ │ │ └── map.md │ │ │ └── set/ │ │ │ └── set.md │ │ ├── README.md │ │ ├── 函数式编程/ │ │ │ └── README.md │ │ ├── 实现极简发布订阅.md │ │ ├── 数组常见API及实现.md │ │ ├── 说说async的原理.md │ │ ├── 高阶函数之after函数.md │ │ ├── 高阶函数之函数柯里化.md │ │ └── 高阶函数之初见AOP.md │ ├── notes-nodeJs/ │ │ ├── 1. NodeJs有哪些特点?应用场景又有哪些?.md │ │ ├── 2. V8 libuv 和 Nodejs之间的关系?.md │ │ ├── 3. 说说你对global 以及global.process的理解?.md │ │ ├── 4. 说一下Liubv的事件循环机制.md │ │ ├── 5. 说说你对模块化的理解?.md │ │ ├── README.md │ │ ├── notes-htmlcss/ │ │ │ ├── flex 布局.md │ │ │ ├── html汇总.md │ │ │ └── 常见居中.md │ │ ├── npm有了解吗?.md │ │ ├── 说一下Nodejs的异步编程吧.md │ │ └── 请你实现一下Event模块.md │ ├── notes-vue/ │ │ ├── $mount和模板编译原理.md │ │ ├── $watch和computed.md │ │ ├── vue-router.md │ │ ├── vuex.md │ │ ├── 响应式原理.md │ │ ├── 常见面试题汇总.md │ │ ├── 来,唠一下生命周期.md │ │ ├── 渲染详细流程.md │ │ ├── 虚拟DOM.md │ │ ├── 说一下nextTick?.md │ │ ├── 说一下你对$nextTick的理解.md │ │ ├── 说说指令的原理.md │ │ └── 面试题.md │ ├── notes-性能优化/ │ │ └── 浏览器/ │ │ ├── README.md │ │ ├── 函数节流.md │ │ └── 函数防抖.md │ ├── notes-浏览器/ │ │ ├── DOM.md │ │ ├── README.md │ │ ├── 浏览器基础/ │ │ │ ├── 说一下AJAX.md │ │ │ ├── 说一下垃圾回收策略?.md │ │ │ ├── 说一下浏览器事件循环.md │ │ │ ├── 跨域通信.md │ │ │ └── 输入URL后发生了什么.md │ │ └── 浏览器性能优化/ │ │ └── README.md │ ├── notes-网络/ │ │ ├── HTTP/ │ │ │ ├── 1.你是如何理解HTTP的?特点有哪些?.md │ │ │ ├── 10.说一下 HTTP 的内容协商?.md │ │ │ ├── 11.HTTP 重定向有了解吗?.md │ │ │ ├── 12.了解HTTP长连接吧?那队头阻塞呢?.md │ │ │ ├── 13.HTTP传输大文件有了解过吗?.md │ │ │ ├── 2. 你知道HTTP都有哪些版本吗?.md │ │ │ ├── 3.说一下你对域名的理解?.md │ │ │ ├── 4.说说你对URL 和 URI 的理解.md │ │ │ ├── 5. 描述一下HTTP报文结构.md │ │ │ ├── 6. 如何理解请求(响应)上下文?.md │ │ │ ├── 7. 请求方法和状态码有哪些?.md │ │ │ ├── 8.说说你对cookie的理解.md │ │ │ ├── 9.说下你了解的缓存策略.md │ │ │ ├── HTTP 性能优化方向有哪些?.md │ │ │ ├── README.md │ │ │ ├── index.md │ │ │ ├── 摘出的笔记.md │ │ │ └── 说说HTTP2 和HTTP3.md │ │ ├── HTTPS/ │ │ │ ├── HTTP 和 HTTPS 有什么区别?.md │ │ │ ├── HTTPS优化策略有了解吗?.md │ │ │ ├── README.md │ │ │ ├── TLS 握手讲一下吧?.md │ │ │ ├── 摘要算法&数据签名.md │ │ │ └── 说说对称加密和非对称加密的理解?.md │ │ ├── IP/ │ │ │ ├── TCP建立连接?.md │ │ │ └── 说说你是如何理解TCP的?.md │ │ └── TCP/ │ │ ├── README.md │ │ ├── TCP如何做到多路复用.md │ │ ├── TCP建立连接?.md │ │ ├── 知道TCP的keepalive机制吗.md │ │ ├── 知道慢启动、拥塞避免、快速重传和快速恢复吗.md │ │ ├── 简述一下TCP报文结构.md │ │ ├── 说一下TCP的滑动窗口.md │ │ ├── 说说TCP三次握手吧.md │ │ ├── 说说TCP挥手过程.md │ │ ├── 说说你对MSS的理解.md │ │ ├── 说说你对滑动窗口的理解.md │ │ ├── 说说你对超时重传的理解.md │ │ ├── 说说你是如何理解TCP的?.md │ │ ├── 说说如何减少网络过程中的小报文?.md │ │ └── 那你知道选择性重传算法(SACK)吗?.md │ ├── notes-设计模式/ │ │ ├── README.MD │ │ └── 创建模式/ │ │ ├── README.md │ │ └── Singleton.ts │ ├── vue 手写/ │ │ ├── hash和history原理.html │ │ └── src/ │ │ ├── compiler/ │ │ │ ├── index.js │ │ │ └── parser-html.js │ │ ├── index.js │ │ ├── init.js │ │ ├── lifecycle.js │ │ ├── observer/ │ │ │ ├── array.js │ │ │ ├── dep.js │ │ │ ├── index.js │ │ │ └── watcher.js │ │ ├── render.js │ │ ├── state.js │ │ ├── util/ │ │ │ └── index.js │ │ └── vdom/ │ │ ├── create-element.js │ │ └── patch.js │ ├── webpack/ │ │ ├── 原理 - 懒加载:单入口文件和多入口文件实现懒加载.md │ │ ├── 原理 - 模块化:如何同时支持CommonJs规范和ES module规范.md │ │ └── 基础总结.md │ ├── webpack 手写/ │ │ └── 实现打包器/ │ │ ├── bin/ │ │ │ └── packer.js │ │ ├── lib/ │ │ │ ├── Compilar.js │ │ │ └── template.ejs │ │ └── package.json │ ├── 待迁移-ES6/ │ │ └── class编译/ │ │ ├── extends.js │ │ └── 基础设施.js │ ├── 待迁移-强化代码/ │ │ ├── Observer.js │ │ ├── bind函数.js │ │ ├── deepClone.js │ │ ├── eventEmitter.js │ │ ├── flatten.js │ │ ├── index.html │ │ ├── lastEvent.js │ │ └── 发布订阅.js │ ├── 正则表达式/ │ │ └── 元字符.md │ ├── 练习-CSS面试部分/ │ │ ├── FlexIndex.html │ │ ├── Grid.css │ │ ├── Grid.html │ │ ├── flex.css │ │ ├── grid练习/ │ │ │ ├── index.htm.html │ │ │ └── 九宫格.css │ │ ├── 三角形.css │ │ ├── 外边距合并.css │ │ ├── 布局方案/ │ │ │ ├── 三栏布局.html │ │ │ └── 两栏布局.html │ │ └── 水平垂直居中/ │ │ ├── index.html │ │ └── 定宽高.css │ ├── 练习-JavaScript部分/ │ │ ├── AJAX.js │ │ ├── ES6 class编译/ │ │ │ └── extends.js │ │ ├── tools.js │ │ ├── 功能函数汇总/ │ │ │ ├── index.md │ │ │ ├── 函数深度比较.js │ │ │ ├── 函数节流.js │ │ │ ├── 函数防抖.js │ │ │ ├── 数组平拍.js │ │ │ ├── 浅拷贝和深拷贝.js │ │ │ └── 解析URL参数.js │ │ ├── 图片懒加载.js │ │ ├── 手写assign.js │ │ ├── 手写create.js │ │ ├── 手写instanceof.js │ │ ├── 手写new.js │ │ ├── 手写深拷贝.js │ │ ├── 继承/ │ │ │ ├── 1. 原型链继承.js │ │ │ ├── 2. 借用构造函数继承.js │ │ │ ├── 3. 组合继承.js │ │ │ ├── 4. 原型式继承.js │ │ │ └── 5. 寄生组合式继承.js │ │ ├── 请你实现一个LRU缓存算法.js │ │ └── 跨域.html │ ├── 练习-Nodejs/ │ │ ├── eventEmitter.js │ │ └── globalObj.js │ ├── 练习-实际开发/ │ │ └── 渲染10W节点/ │ │ ├── README.md │ │ ├── 傻循环.html │ │ └── 时间分片.html │ ├── 练习-数据结构算法刷题/ │ │ └── 链表/ │ │ ├── 160. 相交链表.js │ │ ├── 203. 移除链表元素.js │ │ ├── 4.插入有序链表.js │ │ ├── 445. 两数相加 II.js │ │ ├── 9. 两两交换链表中的节点.js │ │ ├── x. 回文链表.js │ │ ├── 两数相加/ │ │ │ ├── 2. 两数相加.js │ │ │ └── 两数相加.md │ │ ├── 临时.md │ │ ├── 分隔链表/ │ │ │ ├── 86. 分隔链表.js │ │ │ └── README.md │ │ ├── 合并两个有序链表/ │ │ │ ├── 21. 合并两个有序链表.js │ │ │ └── README.md │ │ ├── 环形链表/ │ │ │ ├── 141. 环形链表.js │ │ │ └── README.md │ │ ├── 翻转链表/ │ │ │ ├── 25. K 个一组翻转链表.js │ │ │ ├── 92. 反转链表 II.js │ │ │ ├── README.md │ │ │ └── 面试题24. 反转链表.js │ │ ├── 重排链表/ │ │ │ ├── 143. 重排链表.js │ │ │ └── README.md │ │ ├── 链表的中间结点/ │ │ │ ├── 876.链表中间节点.js │ │ │ └── README.md │ │ ├── 面试题18. 删除链表的节点.js │ │ └── 面试题22. 链表中倒数第k个节点.js │ ├── 组件/ │ │ └── vue-懒加载/ │ │ ├── Note.md │ │ └── v-lazy.js │ └── 记录-面试DEMO/ │ └── 01.md ├── 操作系统层面的调用栈管理?.md └── 浏览器历史管理.md
SYMBOL INDEX (1199 symbols across 66 files)
FILE: .obsidian/plugins/file-explorer-note-count/main.js
function _interopDefaultLegacy (line 10) | function _interopDefaultLegacy (e) { return e && typeof e === 'object' &...
function __awaiter (line 29) | function __awaiter(thisArg, _arguments, P, generator) {
function createCommonjsModule (line 39) | function createCommonjsModule(fn) {
function assertPath (line 55) | function assertPath(path) {
function normalizeStringPosix (line 62) | function normalizeStringPosix(path, allowAboveRoot) {
function _format (line 125) | function _format(sep, pathObject) {
function around (line 597) | function around(obj, factories) {
function around1 (line 601) | function around1(obj, method, createWrapper) {
class VaultHandler (line 713) | class VaultHandler {
method constructor (line 714) | constructor(plugin) {
method app (line 732) | get app() {
method vault (line 735) | get vault() {
constant DEFAULT_SETTINGS (line 740) | const DEFAULT_SETTINGS = {
class FENoteCountSettingTab (line 746) | class FENoteCountSettingTab extends require$$0.PluginSettingTab {
method constructor (line 747) | constructor(app, plugin) {
method showOnlyNoteValue (line 751) | get showOnlyNoteValue() {
method showOnlyNoteValue (line 756) | set showOnlyNoteValue(value) {
method display (line 767) | display() {
method filterOpt (line 801) | filterOpt() {
class FileExplorerNoteCount (line 845) | class FileExplorerNoteCount extends require$$0.Plugin {
method constructor (line 846) | constructor() {
method onload (line 933) | onload() {
method onunload (line 941) | onunload() {
method loadSettings (line 945) | loadSettings() {
method saveSettings (line 950) | saveSettings() {
method reloadCount (line 955) | reloadCount() {
method fileFilter (line 958) | get fileFilter() {
FILE: .obsidian/plugins/obsidian-outliner/main.js
function __awaiter (line 20) | function __awaiter(thisArg, _arguments, P, generator) {
constant DEFAULT_SETTINGS (line 30) | const DEFAULT_SETTINGS = {
class SettingsService (line 39) | class SettingsService {
method constructor (line 40) | constructor(storage) {
method styleLists (line 44) | get styleLists() {
method styleLists (line 47) | set styleLists(value) {
method debug (line 50) | get debug() {
method debug (line 53) | set debug(value) {
method stickCursor (line 56) | get stickCursor() {
method stickCursor (line 59) | set stickCursor(value) {
method betterEnter (line 62) | get betterEnter() {
method betterEnter (line 65) | set betterEnter(value) {
method selectAll (line 68) | get selectAll() {
method selectAll (line 71) | set selectAll(value) {
method disableZoomNotification (line 74) | get disableZoomNotification() {
method disableZoomNotification (line 77) | set disableZoomNotification(value) {
method hideWarning (line 80) | get hideWarning() {
method hideWarning (line 83) | set hideWarning(value) {
method onChange (line 86) | onChange(key, cb) {
method removeCallback (line 92) | removeCallback(key, cb) {
method reset (line 98) | reset() {
method load (line 103) | load() {
method save (line 108) | save() {
method set (line 113) | set(key, value) {
class ObsidianOutlinerPluginSettingTab (line 124) | class ObsidianOutlinerPluginSettingTab extends obsidian.PluginSettingTab {
method constructor (line 125) | constructor(app, plugin, settings) {
method display (line 129) | display() {
class ObsidianService (line 198) | class ObsidianService {
method constructor (line 199) | constructor(app) {
method getObsidianTabsSettigns (line 202) | getObsidianTabsSettigns() {
method getObsidianFoldSettigns (line 205) | getObsidianFoldSettigns() {
method getActiveLeafDisplayText (line 208) | getActiveLeafDisplayText() {
method createCommandCallback (line 211) | createCommandCallback(cb) {
function cmpPos (line 228) | function cmpPos(a, b) {
function maxPos (line 231) | function maxPos(a, b) {
function minPos (line 234) | function minPos(a, b) {
class List (line 237) | class List {
method constructor (line 238) | constructor(root, indent, bullet, spaceAfterBullet, firstLine, folded) {
method getNotesIndent (line 250) | getNotesIndent() {
method setNotesIndent (line 253) | setNotesIndent(notesIndent) {
method addLine (line 259) | addLine(text) {
method replaceLines (line 265) | replaceLines(lines) {
method getLineCount (line 271) | getLineCount() {
method getRoot (line 274) | getRoot() {
method getChildren (line 277) | getChildren() {
method getLinesInfo (line 280) | getLinesInfo() {
method getLines (line 293) | getLines() {
method getFirstLineContentStart (line 296) | getFirstLineContentStart() {
method getLastLineContentEnd (line 303) | getLastLineContentEnd() {
method getContentStartCh (line 313) | getContentStartCh() {
method isFolded (line 316) | isFolded() {
method isFoldRoot (line 325) | isFoldRoot() {
method getLevel (line 335) | getLevel() {
method unindentContent (line 341) | unindentContent(from, till) {
method indentContent (line 351) | indentContent(indentPos, indentChars) {
method getFirstLineIndent (line 366) | getFirstLineIndent() {
method getBullet (line 369) | getBullet() {
method getSpaceAfterBullet (line 372) | getSpaceAfterBullet() {
method replateBullet (line 375) | replateBullet(bullet) {
method getParent (line 378) | getParent() {
method addBeforeAll (line 381) | addBeforeAll(list) {
method addAfterAll (line 385) | addAfterAll(list) {
method removeChild (line 389) | removeChild(list) {
method addBefore (line 394) | addBefore(before, list) {
method addAfter (line 399) | addAfter(before, list) {
method getPrevSiblingOf (line 404) | getPrevSiblingOf(list) {
method getNextSiblingOf (line 408) | getNextSiblingOf(list) {
method isEmpty (line 412) | isEmpty() {
method print (line 415) | print() {
class Root (line 428) | class Root {
method constructor (line 429) | constructor(start, end, selections) {
method getRootList (line 436) | getRootList() {
method getRange (line 439) | getRange() {
method getSelections (line 442) | getSelections() {
method hasSingleCursor (line 448) | hasSingleCursor() {
method hasSingleSelection (line 456) | hasSingleSelection() {
method getCursor (line 459) | getCursor() {
method replaceCursor (line 462) | replaceCursor(cursor) {
method replaceSelections (line 465) | replaceSelections(selections) {
method getListUnderCursor (line 471) | getListUnderCursor() {
method getListUnderLine (line 474) | getListUnderLine(line) {
method getContentLinesRangeOf (line 499) | getContentLinesRangeOf(list) {
method getChildren (line 521) | getChildren() {
method print (line 524) | print() {
class ListsService (line 538) | class ListsService {
method constructor (line 539) | constructor(loggerService, obsidianService) {
method evalOperation (line 543) | evalOperation(root, op, editor) {
method performOperation (line 553) | performOperation(cb, editor, cursor = editor.getCursor()) {
method parseList (line 561) | parseList(editor, cursor = editor.getCursor()) {
method applyChanges (line 689) | applyChanges(editor, root) {
method getDefaultIndentChars (line 745) | getDefaultIndentChars() {
method isEmptyLine (line 749) | isEmptyLine(line) {
method isLineWithIndent (line 752) | isLineWithIndent(line) {
method isListItem (line 755) | isListItem(line) {
method isListItemWithoutSpaces (line 758) | isListItemWithoutSpaces(line) {
class LoggerService (line 763) | class LoggerService {
method constructor (line 764) | constructor(settingsService) {
method log (line 767) | log(method, ...args) {
method bind (line 773) | bind(method) {
constant STATUS_BAR_TEXT (line 778) | const STATUS_BAR_TEXT = `Outliner styles only work with four-space tabs....
class ListsStylesFeature (line 779) | class ListsStylesFeature {
method constructor (line 780) | constructor(plugin, settingsService, obsidianService) {
method load (line 793) | load() {
method unload (line 803) | unload() {
method startStatusBarInterval (line 813) | startStatusBarInterval() {
method addStatusBarText (line 830) | addStatusBarText() {
method addListsStyles (line 836) | addListsStyles() {
method removeListsStyles (line 839) | removeListsStyles() {
function recalculateNumericBullets (line 844) | function recalculateNumericBullets(root) {
class MoveLeftOperation (line 857) | class MoveLeftOperation {
method constructor (line 858) | constructor(root) {
method shouldStopPropagation (line 863) | shouldStopPropagation() {
method shouldUpdate (line 866) | shouldUpdate() {
method perform (line 869) | perform() {
function isEmptyLineOrEmptyCheckbox (line 900) | function isEmptyLineOrEmptyCheckbox(line) {
class OutdentIfLineIsEmptyOperation (line 904) | class OutdentIfLineIsEmptyOperation {
method constructor (line 905) | constructor(root) {
method shouldStopPropagation (line 909) | shouldStopPropagation() {
method shouldUpdate (line 912) | shouldUpdate() {
method perform (line 915) | perform() {
function isEnter$1 (line 931) | function isEnter$1(e) {
class EnterOutdentIfLineIsEmptyFeature (line 938) | class EnterOutdentIfLineIsEmptyFeature {
method constructor (line 939) | constructor(plugin, settingsService, listsService, imeService) {
method load (line 957) | load() {
method unload (line 964) | unload() {
class CreateNewItemOperation (line 973) | class CreateNewItemOperation {
method constructor (line 974) | constructor(root) {
method shouldStopPropagation (line 979) | shouldStopPropagation() {
method shouldUpdate (line 982) | shouldUpdate() {
method perform (line 985) | perform() {
function isEnter (line 1065) | function isEnter(e) {
class EnterShouldCreateNewItemFeature (line 1072) | class EnterShouldCreateNewItemFeature {
method constructor (line 1073) | constructor(plugin, settingsService, listsService, imeService) {
method load (line 1091) | load() {
method unload (line 1098) | unload() {
class MoveCursorToPreviousUnfoldedLineOperation (line 1107) | class MoveCursorToPreviousUnfoldedLineOperation {
method constructor (line 1108) | constructor(root) {
method shouldStopPropagation (line 1113) | shouldStopPropagation() {
method shouldUpdate (line 1116) | shouldUpdate() {
method perform (line 1119) | perform() {
method moveCursorToPreviousNoteLine (line 1135) | moveCursorToPreviousNoteLine(root, lines, lineNo) {
method moveCursorToPreviousUnfoldedItem (line 1140) | moveCursorToPreviousUnfoldedItem(root, cursor) {
function isArrowLeft (line 1161) | function isArrowLeft(e) {
function isCtrlArrowLeft (line 1168) | function isCtrlArrowLeft(e) {
class MoveCursorToPreviousUnfoldedLineFeature (line 1175) | class MoveCursorToPreviousUnfoldedLineFeature {
method constructor (line 1176) | constructor(plugin, settingsService, listsService, imeService) {
method load (line 1194) | load() {
method unload (line 1201) | unload() {
class EnsureCursorInListContentOperation (line 1210) | class EnsureCursorInListContentOperation {
method constructor (line 1211) | constructor(root) {
method shouldStopPropagation (line 1216) | shouldStopPropagation() {
method shouldUpdate (line 1219) | shouldUpdate() {
method perform (line 1222) | perform() {
class EnsureCursorIsInUnfoldedLineOperation (line 1244) | class EnsureCursorIsInUnfoldedLineOperation {
method constructor (line 1245) | constructor(root) {
method shouldStopPropagation (line 1250) | shouldStopPropagation() {
method shouldUpdate (line 1253) | shouldUpdate() {
method perform (line 1256) | perform() {
class EnsureCursorInListContentFeature (line 1279) | class EnsureCursorInListContentFeature {
method constructor (line 1280) | constructor(plugin, settingsService, listsService) {
method load (line 1292) | load() {
method unload (line 1299) | unload() {
class DeleteAndMergeWithPreviousLineOperation (line 1308) | class DeleteAndMergeWithPreviousLineOperation {
method constructor (line 1309) | constructor(root) {
method shouldStopPropagation (line 1314) | shouldStopPropagation() {
method shouldUpdate (line 1317) | shouldUpdate() {
method perform (line 1320) | perform() {
method mergeNotes (line 1336) | mergeNotes(root, cursor, list, lines, lineNo) {
method mergeWithPreviousItem (line 1348) | mergeWithPreviousItem(root, cursor, list) {
class DeleteAndMergeWithNextLineOperation (line 1384) | class DeleteAndMergeWithNextLineOperation {
method constructor (line 1385) | constructor(root) {
method shouldStopPropagation (line 1390) | shouldStopPropagation() {
method shouldUpdate (line 1393) | shouldUpdate() {
method perform (line 1396) | perform() {
class DeleteTillLineStartOperation (line 1418) | class DeleteTillLineStartOperation {
method constructor (line 1419) | constructor(root) {
method shouldStopPropagation (line 1424) | shouldStopPropagation() {
method shouldUpdate (line 1427) | shouldUpdate() {
method perform (line 1430) | perform() {
function isBackspace (line 1447) | function isBackspace(e) {
function isCmdBackspace (line 1454) | function isCmdBackspace(e) {
function isDelete (line 1461) | function isDelete(e) {
class DeleteShouldIgnoreBulletsFeature (line 1468) | class DeleteShouldIgnoreBulletsFeature {
method constructor (line 1469) | constructor(plugin, settingsService, listsService, imeService) {
method load (line 1501) | load() {
method unload (line 1508) | unload() {
class SelectTillLineStartOperation (line 1517) | class SelectTillLineStartOperation {
method constructor (line 1518) | constructor(root) {
method shouldStopPropagation (line 1523) | shouldStopPropagation() {
method shouldUpdate (line 1526) | shouldUpdate() {
method perform (line 1529) | perform() {
function isCmdShiftLeft (line 1544) | function isCmdShiftLeft(e) {
class SelectionShouldIgnoreBulletsFeature (line 1551) | class SelectionShouldIgnoreBulletsFeature {
method constructor (line 1552) | constructor(plugin, settingsService, listsService, imeService) {
method load (line 1570) | load() {
method unload (line 1577) | unload() {
function isCmdDotOrCmdShiftDot (line 1586) | function isCmdDotOrCmdShiftDot(e) {
function isCtrlDotOrCtrlShiftDot (line 1592) | function isCtrlDotOrCtrlShiftDot(e) {
function isModDotOrModShiftDot (line 1598) | function isModDotOrModShiftDot(e) {
class ZoomFeature (line 1603) | class ZoomFeature {
method constructor (line 1604) | constructor(plugin, settingsService, imeService) {
method load (line 1618) | load() {
method unload (line 1625) | unload() {
class FoldFeature (line 1634) | class FoldFeature {
method constructor (line 1635) | constructor(plugin, obsidianService) {
method load (line 1639) | load() {
method unload (line 1665) | unload() {
method setFold (line 1668) | setFold(editor, type) {
method fold (line 1676) | fold(editor) {
method unfold (line 1679) | unfold(editor) {
class SelectAllOperation (line 1684) | class SelectAllOperation {
method constructor (line 1685) | constructor(root) {
method shouldStopPropagation (line 1690) | shouldStopPropagation() {
method shouldUpdate (line 1693) | shouldUpdate() {
method perform (line 1696) | perform() {
function isCmdA (line 1739) | function isCmdA(e) {
function isCtrlA (line 1746) | function isCtrlA(e) {
function isSelectAll (line 1753) | function isSelectAll(e) {
class SelectAllFeature (line 1756) | class SelectAllFeature {
method constructor (line 1757) | constructor(plugin, settingsService, listsService, imeService) {
method load (line 1775) | load() {
method unload (line 1782) | unload() {
class MoveRightOperation (line 1791) | class MoveRightOperation {
method constructor (line 1792) | constructor(root, defaultIndentChars) {
method shouldStopPropagation (line 1798) | shouldStopPropagation() {
method shouldUpdate (line 1801) | shouldUpdate() {
method perform (line 1804) | perform() {
class MoveDownOperation (line 1851) | class MoveDownOperation {
method constructor (line 1852) | constructor(root) {
method shouldStopPropagation (line 1857) | shouldStopPropagation() {
method shouldUpdate (line 1860) | shouldUpdate() {
method perform (line 1863) | perform() {
class MoveUpOperation (line 1901) | class MoveUpOperation {
method constructor (line 1902) | constructor(root) {
method shouldStopPropagation (line 1907) | shouldStopPropagation() {
method shouldUpdate (line 1910) | shouldUpdate() {
method perform (line 1913) | perform() {
class MoveItemsFeature (line 1951) | class MoveItemsFeature {
method constructor (line 1952) | constructor(plugin, obsidianService, listsService, imeService) {
method load (line 1958) | load() {
method unload (line 2006) | unload() {
method moveListElementDown (line 2009) | moveListElementDown(editor) {
method moveListElementUp (line 2013) | moveListElementUp(editor) {
method moveListElementRight (line 2017) | moveListElementRight(editor) {
method moveListElementLeft (line 2024) | moveListElementLeft(editor) {
class CreateNoteLineOperation (line 2033) | class CreateNoteLineOperation {
method constructor (line 2034) | constructor(root, defaultIndentChars) {
method shouldStopPropagation (line 2040) | shouldStopPropagation() {
method shouldUpdate (line 2043) | shouldUpdate() {
method perform (line 2046) | perform() {
function isShiftEnter (line 2085) | function isShiftEnter(e) {
class ShiftEnterShouldCreateNoteFeature (line 2092) | class ShiftEnterShouldCreateNoteFeature {
method constructor (line 2093) | constructor(plugin, settingsService, listsService, imeService) {
method load (line 2111) | load() {
method unload (line 2118) | unload() {
class IMEService (line 2127) | class IMEService {
method constructor (line 2128) | constructor() {
method load (line 2137) | load() {
method unload (line 2143) | unload() {
method isIMEOpened (line 2149) | isIMEOpened() {
class ObsidianOutlinerPlugin (line 2154) | class ObsidianOutlinerPlugin extends obsidian.Plugin {
method onload (line 2155) | onload() {
method onunload (line 2185) | onunload() {
FILE: .obsidian/plugins/recent-files-obsidian/main.js
function __extends (line 28) | function __extends(d, b) {
function __awaiter (line 36) | function __awaiter(thisArg, _arguments, P, generator) {
function __generator (line 46) | function __generator(thisArg, body) {
function RecentFilesListView (line 83) | function RecentFilesListView(leaf, plugin, data) {
function RecentFilesPlugin (line 240) | function RecentFilesPlugin() {
function RecentFilesSettingTab (line 435) | function RecentFilesSettingTab(app, plugin) {
FILE: .obsidian/plugins/table-editor-obsidian/main.js
function __extends (line 30) | function __extends(d, b) {
function __awaiter (line 47) | function __awaiter(thisArg, _arguments, P, generator) {
function __generator (line 57) | function __generator(thisArg, body) {
function createCommonjsModule (line 117) | function createCommonjsModule(fn, basedir, module) {
function getAugmentedNamespace (line 127) | function getAugmentedNamespace(n) {
function commonjsRequire (line 142) | function commonjsRequire () {
class Point (line 152) | class Point {
method constructor (line 159) | constructor(row, column) {
method equals (line 166) | equals(point) {
class Range (line 179) | class Range {
method constructor (line 186) | constructor(start, end) {
method constructor (line 18274) | constructor(ast, table) {
class Focus (line 205) | class Focus {
method constructor (line 213) | constructor(row, column, offset) {
method posEquals (line 222) | posEquals(focus) {
method setRow (line 231) | setRow(row) {
method setColumn (line 240) | setColumn(column) {
method setOffset (line 249) | setOffset(offset) {
class TableCell (line 316) | class TableCell {
method constructor (line 322) | constructor(rawContent) {
method toText (line 339) | toText() {
method isDelimiter (line 348) | isDelimiter() {
method getAlignment (line 356) | getAlignment() {
method computeContentOffset (line 377) | computeContentOffset(rawOffset) {
method computeRawOffset (line 395) | computeRawOffset(contentOffset) {
class TableRow (line 411) | class TableRow {
method constructor (line 419) | constructor(cells, marginLeft, marginRight) {
method getWidth (line 427) | getWidth() {
method getCells (line 433) | getCells() {
method getCellAt (line 442) | getCellAt(index) {
method setCellAt (line 451) | setCellAt(index, value) {
method toText (line 459) | toText() {
method isDelimiter (line 471) | isDelimiter() {
class Ok (line 492) | class Ok {
method constructor (line 493) | constructor(value) {
method isOk (line 497) | isOk() {
method isErr (line 500) | isErr() {
method map (line 503) | map(f) {
method mapErr (line 506) | mapErr(_f) {
method andThen (line 512) | andThen(f) {
method unwrapOr (line 515) | unwrapOr(_v) {
method _unsafeUnwrap (line 518) | _unsafeUnwrap() {
method _unsafeUnwrapErr (line 521) | _unsafeUnwrapErr() {
class Err (line 526) | class Err {
method constructor (line 527) | constructor(error) {
method isOk (line 531) | isOk() {
method isErr (line 534) | isErr() {
method map (line 537) | map(_f) {
method mapErr (line 540) | mapErr(f) {
method andThen (line 543) | andThen(_f) {
method unwrapOr (line 546) | unwrapOr(v) {
method _unsafeUnwrap (line 549) | _unsafeUnwrap() {
method _unsafeUnwrapErr (line 552) | _unsafeUnwrapErr() {
function apply (line 1055) | function apply(func, thisArg, args) {
function arrayAggregator (line 1075) | function arrayAggregator(array, setter, iteratee, accumulator) {
function arrayEach (line 1095) | function arrayEach(array, iteratee) {
function arrayEachRight (line 1116) | function arrayEachRight(array, iteratee) {
function arrayEvery (line 1137) | function arrayEvery(array, predicate) {
function arrayFilter (line 1158) | function arrayFilter(array, predicate) {
function arrayIncludes (line 1182) | function arrayIncludes(array, value) {
function arrayIncludesWith (line 1196) | function arrayIncludesWith(array, value, comparator) {
function arrayMap (line 1217) | function arrayMap(array, iteratee) {
function arrayPush (line 1236) | function arrayPush(array, values) {
function arrayReduce (line 1259) | function arrayReduce(array, iteratee, accumulator, initAccum) {
function arrayReduceRight (line 1284) | function arrayReduceRight(array, iteratee, accumulator, initAccum) {
function arraySome (line 1305) | function arraySome(array, predicate) {
function asciiToArray (line 1333) | function asciiToArray(string) {
function asciiWords (line 1344) | function asciiWords(string) {
function baseFindKey (line 1359) | function baseFindKey(collection, predicate, eachFunc) {
function baseFindIndex (line 1381) | function baseFindIndex(array, predicate, fromIndex, fromRight) {
function baseIndexOf (line 1402) | function baseIndexOf(array, value, fromIndex) {
function baseIndexOfWith (line 1418) | function baseIndexOfWith(array, value, fromIndex, comparator) {
function baseIsNaN (line 1437) | function baseIsNaN(value) {
function baseMean (line 1450) | function baseMean(array, iteratee) {
function baseProperty (line 1462) | function baseProperty(key) {
function basePropertyOf (line 1475) | function basePropertyOf(object) {
function baseReduce (line 1494) | function baseReduce(collection, iteratee, accumulator, initAccum, eachFu...
function baseSortBy (line 1513) | function baseSortBy(array, comparer) {
function baseSum (line 1532) | function baseSum(array, iteratee) {
function baseTimes (line 1555) | function baseTimes(n, iteratee) {
function baseToPairs (line 1574) | function baseToPairs(object, props) {
function baseUnary (line 1587) | function baseUnary(func) {
function baseValues (line 1603) | function baseValues(object, props) {
function cacheHas (line 1617) | function cacheHas(cache, key) {
function charsStartIndex (line 1630) | function charsStartIndex(strSymbols, chrSymbols) {
function charsEndIndex (line 1647) | function charsEndIndex(strSymbols, chrSymbols) {
function countHolders (line 1662) | function countHolders(array, placeholder) {
function escapeStringChar (line 1700) | function escapeStringChar(chr) {
function getValue (line 1712) | function getValue(object, key) {
function hasUnicode (line 1723) | function hasUnicode(string) {
function hasUnicodeWord (line 1734) | function hasUnicodeWord(string) {
function iteratorToArray (line 1745) | function iteratorToArray(iterator) {
function mapToArray (line 1762) | function mapToArray(map) {
function overArg (line 1780) | function overArg(func, transform) {
function replaceHolders (line 1795) | function replaceHolders(array, placeholder) {
function setToArray (line 1818) | function setToArray(set) {
function setToPairs (line 1835) | function setToPairs(set) {
function strictIndexOf (line 1855) | function strictIndexOf(array, value, fromIndex) {
function strictLastIndexOf (line 1877) | function strictLastIndexOf(array, value, fromIndex) {
function stringSize (line 1894) | function stringSize(string) {
function stringToArray (line 1907) | function stringToArray(string) {
function unicodeSize (line 1929) | function unicodeSize(string) {
function unicodeToArray (line 1944) | function unicodeToArray(string) {
function unicodeWords (line 1955) | function unicodeWords(string) {
function lodash (line 2232) | function lodash(value) {
function object (line 2253) | function object() {}
function baseLodash (line 2273) | function baseLodash() {
function LodashWrapper (line 2284) | function LodashWrapper(value, chainAll) {
function LazyWrapper (line 2369) | function LazyWrapper(value) {
function lazyClone (line 2387) | function lazyClone() {
function lazyReverse (line 2406) | function lazyReverse() {
function lazyValue (line 2426) | function lazyValue() {
function Hash (line 2488) | function Hash(entries) {
function hashClear (line 2506) | function hashClear() {
function hashDelete (line 2521) | function hashDelete(key) {
function hashGet (line 2536) | function hashGet(key) {
function hashHas (line 2554) | function hashHas(key) {
function hashSet (line 2569) | function hashSet(key, value) {
function ListCache (line 2592) | function ListCache(entries) {
function listCacheClear (line 2610) | function listCacheClear() {
function listCacheDelete (line 2624) | function listCacheDelete(key) {
function listCacheGet (line 2650) | function listCacheGet(key) {
function listCacheHas (line 2666) | function listCacheHas(key) {
function listCacheSet (line 2680) | function listCacheSet(key, value) {
function MapCache (line 2709) | function MapCache(entries) {
function mapCacheClear (line 2727) | function mapCacheClear() {
function mapCacheDelete (line 2745) | function mapCacheDelete(key) {
function mapCacheGet (line 2760) | function mapCacheGet(key) {
function mapCacheHas (line 2773) | function mapCacheHas(key) {
function mapCacheSet (line 2787) | function mapCacheSet(key, value) {
function SetCache (line 2813) | function SetCache(values) {
function setCacheAdd (line 2833) | function setCacheAdd(value) {
function setCacheHas (line 2847) | function setCacheHas(value) {
function Stack (line 2864) | function Stack(entries) {
function stackClear (line 2876) | function stackClear() {
function stackDelete (line 2890) | function stackDelete(key) {
function stackGet (line 2907) | function stackGet(key) {
function stackHas (line 2920) | function stackHas(key) {
function stackSet (line 2934) | function stackSet(key, value) {
function arrayLikeKeys (line 2967) | function arrayLikeKeys(value, inherited) {
function arraySample (line 3001) | function arraySample(array) {
function arraySampleSize (line 3014) | function arraySampleSize(array, n) {
function arrayShuffle (line 3025) | function arrayShuffle(array) {
function assignMergeValue (line 3038) | function assignMergeValue(object, key, value) {
function assignValue (line 3055) | function assignValue(object, key, value) {
function assocIndexOf (line 3071) | function assocIndexOf(array, key) {
function baseAggregator (line 3092) | function baseAggregator(collection, setter, iteratee, accumulator) {
function baseAssign (line 3108) | function baseAssign(object, source) {
function baseAssignIn (line 3121) | function baseAssignIn(object, source) {
function baseAssignValue (line 3134) | function baseAssignValue(object, key, value) {
function baseAt (line 3155) | function baseAt(object, paths) {
function baseClamp (line 3176) | function baseClamp(number, lower, upper) {
function baseClone (line 3204) | function baseClone(value, bitmask, customizer, key, object, stack) {
function baseConforms (line 3287) | function baseConforms(source) {
function baseConformsTo (line 3302) | function baseConformsTo(object, source, props) {
function baseDelay (line 3330) | function baseDelay(func, wait, args) {
function baseDifference (line 3348) | function baseDifference(array, values, iteratee, comparator) {
function baseEvery (line 3422) | function baseEvery(collection, predicate) {
function baseExtremum (line 3441) | function baseExtremum(array, iteratee, comparator) {
function baseFill (line 3470) | function baseFill(array, value, start, end) {
function baseFilter (line 3496) | function baseFilter(collection, predicate) {
function baseFlatten (line 3517) | function baseFlatten(array, depth, predicate, isStrict, result) {
function baseForOwn (line 3573) | function baseForOwn(object, iteratee) {
function baseForOwnRight (line 3585) | function baseForOwnRight(object, iteratee) {
function baseFunctions (line 3598) | function baseFunctions(object, props) {
function baseGet (line 3612) | function baseGet(object, path) {
function baseGetAllKeys (line 3635) | function baseGetAllKeys(object, keysFunc, symbolsFunc) {
function baseGetTag (line 3647) | function baseGetTag(value) {
function baseGt (line 3665) | function baseGt(value, other) {
function baseHas (line 3677) | function baseHas(object, key) {
function baseHasIn (line 3689) | function baseHasIn(object, key) {
function baseInRange (line 3702) | function baseInRange(number, start, end) {
function baseIntersection (line 3716) | function baseIntersection(arrays, iteratee, comparator) {
function baseInverter (line 3780) | function baseInverter(object, setter, iteratee, accumulator) {
function baseInvoke (line 3797) | function baseInvoke(object, path, args) {
function baseIsArguments (line 3811) | function baseIsArguments(value) {
function baseIsArrayBuffer (line 3822) | function baseIsArrayBuffer(value) {
function baseIsDate (line 3833) | function baseIsDate(value) {
function baseIsEqual (line 3851) | function baseIsEqual(value, other, bitmask, customizer, stack) {
function baseIsEqualDeep (line 3875) | function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, ...
function baseIsMap (line 3927) | function baseIsMap(value) {
function baseIsMatch (line 3941) | function baseIsMatch(object, source, matchData, customizer) {
function baseIsNative (line 3993) | function baseIsNative(value) {
function baseIsRegExp (line 4008) | function baseIsRegExp(value) {
function baseIsSet (line 4019) | function baseIsSet(value) {
function baseIsTypedArray (line 4030) | function baseIsTypedArray(value) {
function baseIteratee (line 4042) | function baseIteratee(value) {
function baseKeys (line 4066) | function baseKeys(object) {
function baseKeysIn (line 4086) | function baseKeysIn(object) {
function baseLt (line 4110) | function baseLt(value, other) {
function baseMap (line 4122) | function baseMap(collection, iteratee) {
function baseMatches (line 4139) | function baseMatches(source) {
function baseMatchesProperty (line 4157) | function baseMatchesProperty(path, srcValue) {
function baseMerge (line 4180) | function baseMerge(object, source, srcIndex, customizer, stack) {
function baseMergeDeep (line 4217) | function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customi...
function baseNth (line 4287) | function baseNth(array, n) {
function baseOrderBy (line 4305) | function baseOrderBy(collection, iteratees, orders) {
function basePick (line 4343) | function basePick(object, paths) {
function basePickBy (line 4358) | function basePickBy(object, paths, predicate) {
function basePropertyDeep (line 4381) | function basePropertyDeep(path) {
function basePullAll (line 4398) | function basePullAll(array, values, iteratee, comparator) {
function basePullAt (line 4434) | function basePullAt(array, indexes) {
function baseRandom (line 4461) | function baseRandom(lower, upper) {
function baseRange (line 4476) | function baseRange(start, end, step, fromRight) {
function baseRepeat (line 4496) | function baseRepeat(string, n) {
function baseRest (line 4524) | function baseRest(func, start) {
function baseSample (line 4535) | function baseSample(collection) {
function baseSampleSize (line 4547) | function baseSampleSize(collection, n) {
function baseSet (line 4562) | function baseSet(object, path, value, customizer) {
function baseShuffle (line 4633) | function baseShuffle(collection) {
function baseSlice (line 4646) | function baseSlice(array, start, end) {
function baseSome (line 4676) | function baseSome(collection, predicate) {
function baseSortedIndex (line 4698) | function baseSortedIndex(array, value, retHighest) {
function baseSortedIndexBy (line 4732) | function baseSortedIndexBy(array, value, iteratee, retHighest) {
function baseSortedUniq (line 4784) | function baseSortedUniq(array, iteratee) {
function baseToNumber (line 4810) | function baseToNumber(value) {
function baseToString (line 4828) | function baseToString(value) {
function baseUniq (line 4853) | function baseUniq(array, iteratee, comparator) {
function baseUnset (line 4913) | function baseUnset(object, path) {
function baseUpdate (line 4929) | function baseUpdate(object, path, updater, customizer) {
function baseWhile (line 4944) | function baseWhile(array, predicate, isDrop, fromRight) {
function baseWrapperValue (line 4966) | function baseWrapperValue(value, actions) {
function baseXor (line 4986) | function baseXor(arrays, iteratee, comparator) {
function baseZipObject (line 5016) | function baseZipObject(props, values, assignFunc) {
function castArrayLikeObject (line 5036) | function castArrayLikeObject(value) {
function castFunction (line 5047) | function castFunction(value) {
function castPath (line 5059) | function castPath(value, object) {
function castSlice (line 5086) | function castSlice(array, start, end) {
function cloneBuffer (line 5110) | function cloneBuffer(buffer, isDeep) {
function cloneArrayBuffer (line 5128) | function cloneArrayBuffer(arrayBuffer) {
function cloneDataView (line 5142) | function cloneDataView(dataView, isDeep) {
function cloneRegExp (line 5154) | function cloneRegExp(regexp) {
function cloneSymbol (line 5167) | function cloneSymbol(symbol) {
function cloneTypedArray (line 5179) | function cloneTypedArray(typedArray, isDeep) {
function compareAscending (line 5192) | function compareAscending(value, other) {
function compareMultiple (line 5236) | function compareMultiple(object, other, orders) {
function composeArgs (line 5274) | function composeArgs(args, partials, holders, isCurried) {
function composeArgsRight (line 5309) | function composeArgsRight(args, partials, holders, isCurried) {
function copyArray (line 5343) | function copyArray(source, array) {
function copyObject (line 5364) | function copyObject(source, props, object, customizer) {
function copySymbols (line 5398) | function copySymbols(source, object) {
function copySymbolsIn (line 5410) | function copySymbolsIn(source, object) {
function createAggregator (line 5422) | function createAggregator(setter, initializer) {
function createAssigner (line 5438) | function createAssigner(assigner) {
function createBaseEach (line 5472) | function createBaseEach(eachFunc, fromRight) {
function createBaseFor (line 5500) | function createBaseFor(fromRight) {
function createBind (line 5527) | function createBind(func, bitmask, thisArg) {
function createCaseFirst (line 5545) | function createCaseFirst(methodName) {
function createCompounder (line 5572) | function createCompounder(callback) {
function createCtor (line 5586) | function createCtor(Ctor) {
function createCurry (line 5620) | function createCurry(func, bitmask, arity) {
function createFind (line 5655) | function createFind(findIndexFunc) {
function createFlow (line 5675) | function createFlow(fromRight) {
function createHybrid (line 5748) | function createHybrid(func, bitmask, thisArg, partials, holders, partial...
function createInverter (line 5810) | function createInverter(setter, toIteratee) {
function createMathOperation (line 5824) | function createMathOperation(operator, defaultValue) {
function createOver (line 5857) | function createOver(arrayFunc) {
function createPadding (line 5878) | function createPadding(length, chars) {
function createPartial (line 5903) | function createPartial(func, bitmask, thisArg, partials) {
function createRange (line 5933) | function createRange(fromRight) {
function createRelationalOperation (line 5958) | function createRelationalOperation(operator) {
function createRecurry (line 5985) | function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, pa...
function createRound (line 6018) | function createRound(methodName) {
function createToPairs (line 6054) | function createToPairs(keysFunc) {
function createWrap (line 6092) | function createWrap(func, bitmask, thisArg, partials, holders, argPos, a...
function customDefaultsAssignIn (line 6159) | function customDefaultsAssignIn(objValue, srcValue, key, object) {
function customDefaultsMerge (line 6181) | function customDefaultsMerge(objValue, srcValue, key, object, source, st...
function customOmitClone (line 6200) | function customOmitClone(value) {
function equalArrays (line 6217) | function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
function equalByTag (line 6296) | function equalByTag(object, other, tag, bitmask, customizer, equalFunc, ...
function equalObjects (line 6374) | function equalObjects(object, other, bitmask, customizer, equalFunc, sta...
function flatRest (line 6446) | function flatRest(func) {
function getAllKeys (line 6457) | function getAllKeys(object) {
function getAllKeysIn (line 6469) | function getAllKeysIn(object) {
function getFuncName (line 6491) | function getFuncName(func) {
function getHolder (line 6513) | function getHolder(func) {
function getIteratee (line 6529) | function getIteratee() {
function getMapData (line 6543) | function getMapData(map, key) {
function getMatchData (line 6557) | function getMatchData(object) {
function getNative (line 6578) | function getNative(object, key) {
function getRawTag (line 6590) | function getRawTag(value) {
function getView (line 6686) | function getView(start, end, transforms) {
function getWrapDetails (line 6711) | function getWrapDetails(source) {
function hasPath (line 6725) | function hasPath(object, path, hasFunc) {
function initCloneArray (line 6754) | function initCloneArray(array) {
function initCloneObject (line 6773) | function initCloneObject(object) {
function initCloneByTag (line 6791) | function initCloneByTag(object, tag, isDeep) {
function insertWrapDetails (line 6835) | function insertWrapDetails(source, details) {
function isFlattenable (line 6853) | function isFlattenable(value) {
function isIndex (line 6866) | function isIndex(value, length) {
function isIterateeCall (line 6886) | function isIterateeCall(value, index, object) {
function isKey (line 6908) | function isKey(value, object) {
function isKeyable (line 6928) | function isKeyable(value) {
function isLaziable (line 6943) | function isLaziable(func) {
function isMasked (line 6964) | function isMasked(func) {
function isPrototype (line 6984) | function isPrototype(value) {
function isStrictComparable (line 6999) | function isStrictComparable(value) {
function matchesStrictComparable (line 7012) | function matchesStrictComparable(key, srcValue) {
function memoizeCapped (line 7030) | function memoizeCapped(func) {
function mergeData (line 7058) | function mergeData(data, source) {
function nativeKeysIn (line 7122) | function nativeKeysIn(object) {
function objectToString (line 7139) | function objectToString(value) {
function overRest (line 7152) | function overRest(func, start, transform) {
function parent (line 7181) | function parent(object, path) {
function reorder (line 7195) | function reorder(array, indexes) {
function safeGet (line 7215) | function safeGet(object, key) {
function setWrapToString (line 7275) | function setWrapToString(wrapper, reference, bitmask) {
function shortOut (line 7289) | function shortOut(func) {
function shuffleSelf (line 7317) | function shuffleSelf(array, size) {
function toKey (line 7359) | function toKey(value) {
function toSource (line 7374) | function toSource(func) {
function updateWrapDetails (line 7394) | function updateWrapDetails(details, bitmask) {
function wrapperClone (line 7411) | function wrapperClone(wrapper) {
function chunk (line 7445) | function chunk(array, size, guard) {
function compact (line 7480) | function compact(array) {
function concat (line 7517) | function concat() {
function drop (line 7653) | function drop(array, n, guard) {
function dropRight (line 7687) | function dropRight(array, n, guard) {
function dropRightWhile (line 7732) | function dropRightWhile(array, predicate) {
function dropWhile (line 7773) | function dropWhile(array, predicate) {
function fill (line 7808) | function fill(array, value, start, end) {
function findIndex (line 7855) | function findIndex(array, predicate, fromIndex) {
function findLastIndex (line 7902) | function findLastIndex(array, predicate, fromIndex) {
function flatten (line 7931) | function flatten(array) {
function flattenDeep (line 7950) | function flattenDeep(array) {
function flattenDepth (line 7975) | function flattenDepth(array, depth) {
function fromPairs (line 7999) | function fromPairs(pairs) {
function head (line 8029) | function head(array) {
function indexOf (line 8056) | function indexOf(array, value, fromIndex) {
function initial (line 8082) | function initial(array) {
function join (line 8197) | function join(array, separator) {
function last (line 8215) | function last(array) {
function lastIndexOf (line 8241) | function lastIndexOf(array, value, fromIndex) {
function nth (line 8277) | function nth(array, n) {
function pullAll (line 8326) | function pullAll(array, values) {
function pullAllBy (line 8355) | function pullAllBy(array, values, iteratee) {
function pullAllWith (line 8384) | function pullAllWith(array, values, comparator) {
function remove (line 8453) | function remove(array, predicate) {
function reverse (line 8497) | function reverse(array) {
function slice (line 8517) | function slice(array, start, end) {
function sortedIndex (line 8550) | function sortedIndex(array, value) {
function sortedIndexBy (line 8579) | function sortedIndexBy(array, value, iteratee) {
function sortedIndexOf (line 8599) | function sortedIndexOf(array, value) {
function sortedLastIndex (line 8628) | function sortedLastIndex(array, value) {
function sortedLastIndexBy (line 8657) | function sortedLastIndexBy(array, value, iteratee) {
function sortedLastIndexOf (line 8677) | function sortedLastIndexOf(array, value) {
function sortedUniq (line 8703) | function sortedUniq(array) {
function sortedUniqBy (line 8725) | function sortedUniqBy(array, iteratee) {
function tail (line 8745) | function tail(array) {
function take (line 8775) | function take(array, n, guard) {
function takeRight (line 8808) | function takeRight(array, n, guard) {
function takeRightWhile (line 8853) | function takeRightWhile(array, predicate) {
function takeWhile (line 8894) | function takeWhile(array, predicate) {
function uniq (line 8996) | function uniq(array) {
function uniqBy (line 9023) | function uniqBy(array, iteratee) {
function uniqWith (line 9047) | function uniqWith(array, comparator) {
function unzip (line 9071) | function unzip(array) {
function unzipWith (line 9108) | function unzipWith(array, iteratee) {
function zipObject (line 9261) | function zipObject(props, values) {
function zipObjectDeep (line 9280) | function zipObjectDeep(props, values) {
function chain (line 9343) | function chain(value) {
function tap (line 9372) | function tap(value, interceptor) {
function thru (line 9400) | function thru(value, interceptor) {
function wrapperChain (line 9471) | function wrapperChain() {
function wrapperCommit (line 9501) | function wrapperCommit() {
function wrapperNext (line 9527) | function wrapperNext() {
function wrapperToIterator (line 9555) | function wrapperToIterator() {
function wrapperPlant (line 9583) | function wrapperPlant(value) {
function wrapperReverse (line 9623) | function wrapperReverse() {
function wrapperValue (line 9655) | function wrapperValue() {
function every (line 9732) | function every(collection, predicate, guard) {
function filter (line 9781) | function filter(collection, predicate) {
function flatMap (line 9866) | function flatMap(collection, iteratee) {
function flatMapDeep (line 9890) | function flatMapDeep(collection, iteratee) {
function flatMapDepth (line 9915) | function flatMapDepth(collection, iteratee, depth) {
function forEach (line 9950) | function forEach(collection, iteratee) {
function forEachRight (line 9975) | function forEachRight(collection, iteratee) {
function includes (line 10041) | function includes(collection, value, fromIndex, guard) {
function map (line 10162) | function map(collection, iteratee) {
function orderBy (line 10196) | function orderBy(collection, iteratees, orders, guard) {
function reduce (line 10287) | function reduce(collection, iteratee, accumulator) {
function reduceRight (line 10316) | function reduceRight(collection, iteratee, accumulator) {
function reject (line 10357) | function reject(collection, predicate) {
function sample (line 10376) | function sample(collection) {
function sampleSize (line 10401) | function sampleSize(collection, n, guard) {
function shuffle (line 10426) | function shuffle(collection) {
function size (line 10452) | function size(collection) {
function some (line 10502) | function some(collection, predicate, guard) {
function after (line 10600) | function after(n, func) {
function ary (line 10629) | function ary(func, n, guard) {
function before (line 10652) | function before(n, func) {
function curry (line 10808) | function curry(func, arity, guard) {
function curryRight (line 10853) | function curryRight(func, arity, guard) {
function debounce (line 10914) | function debounce(func, wait, options) {
function flip (line 11102) | function flip(func) {
function memoize (line 11150) | function memoize(func, resolver) {
function negate (line 11193) | function negate(predicate) {
function once (line 11227) | function once(func) {
function rest (line 11405) | function rest(func, start) {
function spread (line 11447) | function spread(func, start) {
function throttle (line 11507) | function throttle(func, wait, options) {
function unary (line 11540) | function unary(func) {
function wrap (line 11566) | function wrap(value, wrapper) {
function castArray (line 11605) | function castArray() {
function clone (line 11639) | function clone(value) {
function cloneWith (line 11674) | function cloneWith(value, customizer) {
function cloneDeep (line 11697) | function cloneDeep(value) {
function cloneDeepWith (line 11729) | function cloneDeepWith(value, customizer) {
function conformsTo (line 11758) | function conformsTo(object, source) {
function eq (line 11794) | function eq(value, other) {
function isArrayLike (line 11942) | function isArrayLike(value) {
function isArrayLikeObject (line 11971) | function isArrayLikeObject(value) {
function isBoolean (line 11992) | function isBoolean(value) {
function isElement (line 12052) | function isElement(value) {
function isEmpty (line 12089) | function isEmpty(value) {
function isEqual (line 12141) | function isEqual(value, other) {
function isEqualWith (line 12177) | function isEqualWith(value, other, customizer) {
function isError (line 12201) | function isError(value) {
function isFinite (line 12236) | function isFinite(value) {
function isFunction (line 12257) | function isFunction(value) {
function isInteger (line 12293) | function isInteger(value) {
function isLength (line 12323) | function isLength(value) {
function isObject (line 12353) | function isObject(value) {
function isObjectLike (line 12382) | function isObjectLike(value) {
function isMatch (line 12433) | function isMatch(object, source) {
function isMatchWith (line 12469) | function isMatchWith(object, source, customizer) {
function isNaN (line 12502) | function isNaN(value) {
function isNative (line 12535) | function isNative(value) {
function isNull (line 12559) | function isNull(value) {
function isNil (line 12583) | function isNil(value) {
function isNumber (line 12613) | function isNumber(value) {
function isPlainObject (line 12646) | function isPlainObject(value) {
function isSafeInteger (line 12705) | function isSafeInteger(value) {
function isString (line 12745) | function isString(value) {
function isSymbol (line 12767) | function isSymbol(value) {
function isUndefined (line 12808) | function isUndefined(value) {
function isWeakMap (line 12829) | function isWeakMap(value) {
function isWeakSet (line 12850) | function isWeakSet(value) {
function toArray (line 12929) | function toArray(value) {
function toFinite (line 12968) | function toFinite(value) {
function toInteger (line 13006) | function toInteger(value) {
function toLength (line 13040) | function toLength(value) {
function toNumber (line 13067) | function toNumber(value) {
function toPlainObject (line 13112) | function toPlainObject(value) {
function toSafeInteger (line 13140) | function toSafeInteger(value) {
function toString (line 13167) | function toString(value) {
function create (line 13370) | function create(prototype, properties) {
function findKey (line 13486) | function findKey(object, predicate) {
function findLastKey (line 13525) | function findLastKey(object, predicate) {
function forIn (line 13557) | function forIn(object, iteratee) {
function forInRight (line 13589) | function forInRight(object, iteratee) {
function forOwn (line 13623) | function forOwn(object, iteratee) {
function forOwnRight (line 13653) | function forOwnRight(object, iteratee) {
function functions (line 13680) | function functions(object) {
function functionsIn (line 13707) | function functionsIn(object) {
function get (line 13736) | function get(object, path, defaultValue) {
function has (line 13768) | function has(object, path) {
function hasIn (line 13798) | function hasIn(object, path) {
function keys (line 13916) | function keys(object) {
function keysIn (line 13943) | function keysIn(object) {
function mapKeys (line 13968) | function mapKeys(object, iteratee) {
function mapValues (line 14006) | function mapValues(object, iteratee) {
function omitBy (line 14148) | function omitBy(object, predicate) {
function pickBy (line 14191) | function pickBy(object, predicate) {
function result (line 14233) | function result(object, path, defaultValue) {
function set (line 14283) | function set(object, path, value) {
function setWith (line 14311) | function setWith(object, path, value, customizer) {
function transform (line 14398) | function transform(object, iteratee, accumulator) {
function unset (line 14448) | function unset(object, path) {
function update (line 14479) | function update(object, path, updater) {
function updateWith (line 14507) | function updateWith(object, path, updater, customizer) {
function values (line 14538) | function values(object) {
function valuesIn (line 14566) | function valuesIn(object) {
function clamp (line 14591) | function clamp(number, lower, upper) {
function inRange (line 14645) | function inRange(number, start, end) {
function random (line 14688) | function random(lower, upper, floating) {
function capitalize (line 14769) | function capitalize(string) {
function deburr (line 14791) | function deburr(string) {
function endsWith (line 14819) | function endsWith(string, target, position) {
function escape (line 14861) | function escape(string) {
function escapeRegExp (line 14883) | function escapeRegExp(string) {
function pad (line 14981) | function pad(string, length, chars) {
function padEnd (line 15020) | function padEnd(string, length, chars) {
function padStart (line 15053) | function padStart(string, length, chars) {
function parseInt (line 15087) | function parseInt(string, radix, guard) {
function repeat (line 15118) | function repeat(string, n, guard) {
function replace (line 15146) | function replace() {
function split (line 15197) | function split(string, separator, limit) {
function startsWith (line 15266) | function startsWith(string, target, position) {
function template (line 15380) | function template(string, options, guard) {
function toLower (line 15512) | function toLower(value) {
function toUpper (line 15537) | function toUpper(value) {
function trim (line 15563) | function trim(string, chars, guard) {
function trimEnd (line 15598) | function trimEnd(string, chars, guard) {
function trimStart (line 15631) | function trimStart(string, chars, guard) {
function truncate (line 15682) | function truncate(string, options) {
function unescape (line 15757) | function unescape(string) {
function words (line 15826) | function words(string, pattern, guard) {
function cond (line 15931) | function cond(pairs) {
function conforms (line 15977) | function conforms(source) {
function constant (line 16000) | function constant(value) {
function defaultTo (line 16026) | function defaultTo(value, defaultValue) {
function identity (line 16093) | function identity(value) {
function iteratee (line 16139) | function iteratee(func) {
function matches (line 16178) | function matches(source) {
function matchesProperty (line 16215) | function matchesProperty(path, srcValue) {
function mixin (line 16314) | function mixin(object, source, options) {
function noConflict (line 16363) | function noConflict() {
function noop (line 16382) | function noop() {
function nthArg (line 16406) | function nthArg(n) {
function property (line 16518) | function property(path) {
function propertyOf (line 16543) | function propertyOf(object) {
function stubArray (line 16648) | function stubArray() {
function stubFalse (line 16665) | function stubFalse() {
function stubObject (line 16687) | function stubObject() {
function stubString (line 16704) | function stubString() {
function stubTrue (line 16721) | function stubTrue() {
function times (line 16744) | function times(n, iteratee) {
function toPath (line 16779) | function toPath(value) {
function uniqueId (line 16803) | function uniqueId(prefix) {
function max (line 16912) | function max(array) {
function maxBy (line 16941) | function maxBy(array, iteratee) {
function mean (line 16961) | function mean(array) {
function meanBy (line 16988) | function meanBy(array, iteratee) {
function min (line 17010) | function min(array) {
function minBy (line 17039) | function minBy(array, iteratee) {
function sum (line 17120) | function sum(array) {
function sumBy (line 17149) | function sumBy(array, iteratee) {
class Arity (line 17738) | class Arity {
method constructor (line 17739) | constructor(rows, columns) {
class Value (line 17748) | class Value {
method constructor (line 17749) | constructor(val) {
class AlgebraicOperation (line 17789) | class AlgebraicOperation {
method constructor (line 17790) | constructor(ast, table) {
class ConditionalFunctionCall (line 17885) | class ConditionalFunctionCall {
method constructor (line 17886) | constructor(ast, table) {
class Predicate (line 17912) | class Predicate {
method constructor (line 17913) | constructor(ast, table) {
class Constant (line 17981) | class Constant {
method constructor (line 17982) | constructor(ast, table) {
method getValue (line 17997) | getValue(table, currentCell) {
class Column (line 18027) | class Column {
method constructor (line 18028) | constructor() {
class RelativeColumn (line 18038) | class RelativeColumn extends Column {
method constructor (line 18039) | constructor(ast, table) {
class AbsoluteColumn (line 18055) | class AbsoluteColumn extends Column {
method constructor (line 18056) | constructor(ast, table) {
class Row (line 18121) | class Row {
method constructor (line 18122) | constructor() {
class RelativeRow (line 18132) | class RelativeRow extends Row {
method constructor (line 18133) | constructor(ast, table) {
class AbsoluteRow (line 18149) | class AbsoluteRow extends Row {
method constructor (line 18150) | constructor(ast, table) {
class Reference (line 18208) | class Reference {
method constructor (line 18209) | constructor(ast, table) {
class Range (line 18273) | class Range {
method constructor (line 186) | constructor(start, end) {
method constructor (line 18274) | constructor(ast, table) {
class RowDestination (line 18425) | class RowDestination {
method constructor (line 18426) | constructor(ast, table, formatter) {
class ColumnDestination (line 18452) | class ColumnDestination {
method constructor (line 18453) | constructor(ast, table, formatter) {
class CellDestination (line 18479) | class CellDestination {
method constructor (line 18480) | constructor(ast, table, formatter) {
class RangeDestination (line 18508) | class RangeDestination {
method constructor (line 18509) | constructor(ast, table, formatter) {
class DefaultFormatter (line 18551) | class DefaultFormatter {
method constructor (line 18552) | constructor() {
class DisplayDirective (line 18562) | class DisplayDirective {
method constructor (line 18563) | constructor(ast) {
class SingleParamFunctionCall (line 18615) | class SingleParamFunctionCall {
method constructor (line 18616) | constructor(ast, table) {
class TokenError (line 18676) | class TokenError extends Error {
method constructor (line 18677) | constructor(message, token) {
method inspect (line 18686) | inspect() {
function readToken (line 18703) | function readToken(txt, expr) {
function escapeRegExp (line 18723) | function escapeRegExp(str) {
function fixRest (line 18727) | function fixRest(token) {
function fixPositions (line 18731) | function fixPositions(token, start) {
function agregateErrors (line 18736) | function agregateErrors(errors, token) {
function parseRuleName (line 18741) | function parseRuleName(name) {
function findRuleByName (line 18763) | function findRuleByName(name, parser) {
function stripRules (line 18769) | function stripRules(token, re) {
class Parser (line 18782) | class Parser {
method constructor (line 18783) | constructor(grammarRules, options) {
method getAST (line 18844) | getAST(txt, target) {
method emitSource (line 18865) | emitSource() {
method parse (line 18868) | parse(txt, target, recursion = 0) {
method parseRecovery (line 19101) | parseRecovery(recoverableToken, tmpTxt, recursion) {
method constructor (line 19395) | constructor(source, options) {
method emitSource (line 19400) | emitSource() {
method constructor (line 19711) | constructor(source, options) {
method emitSource (line 19715) | emitSource() {
method constructor (line 20124) | constructor(source, options) {
method emitSource (line 20128) | emitSource() {
function findChildrenByType (line 19153) | function findChildrenByType(token, type) {
function getAllTerms (line 19352) | function getAllTerms(expr) {
function getRules (line 19361) | function getRules(source, parser = BNF.defaultParser) {
function Transform (line 19390) | function Transform(source, subParser = BNF.defaultParser) {
class Parser (line 19394) | class Parser extends Parser_1.Parser {
method constructor (line 18783) | constructor(grammarRules, options) {
method getAST (line 18844) | getAST(txt, target) {
method emitSource (line 18865) | emitSource() {
method parse (line 18868) | parse(txt, target, recursion = 0) {
method parseRecovery (line 19101) | parseRecovery(recoverableToken, tmpTxt, recursion) {
method constructor (line 19395) | constructor(source, options) {
method emitSource (line 19400) | emitSource() {
method constructor (line 19711) | constructor(source, options) {
method emitSource (line 19715) | emitSource() {
method constructor (line 20124) | constructor(source, options) {
method emitSource (line 20128) | emitSource() {
function getBNFRule (line 19570) | function getBNFRule(name, parser) {
function isLonelyRule (line 19592) | function isLonelyRule(name, parser) {
function getBNFChoice (line 19599) | function getBNFChoice(rules, parser) {
function getBNFBody (line 19602) | function getBNFBody(name, parser) {
function emit (line 19608) | function emit(parser) {
function restar (line 19620) | function restar(total, resta) {
function convertRegex (line 19624) | function convertRegex(txt) {
function getSubItems (line 19631) | function getSubItems(tmpRules, seq, parentName) {
function createRule (line 19674) | function createRule(tmpRules, token, name) {
function getRules (line 19691) | function getRules(source, parser = BNF.defaultParser) {
function Transform (line 19706) | function Transform(source, subParser = BNF.defaultParser) {
class Parser (line 19710) | class Parser extends Parser_1.Parser {
method constructor (line 18783) | constructor(grammarRules, options) {
method getAST (line 18844) | getAST(txt, target) {
method emitSource (line 18865) | emitSource() {
method parse (line 18868) | parse(txt, target, recursion = 0) {
method parseRecovery (line 19101) | parseRecovery(recoverableToken, tmpTxt, recursion) {
method constructor (line 19395) | constructor(source, options) {
method emitSource (line 19400) | emitSource() {
method constructor (line 19711) | constructor(source, options) {
method emitSource (line 19715) | emitSource() {
method constructor (line 20124) | constructor(source, options) {
method emitSource (line 20128) | emitSource() {
function getBNFRule (line 19914) | function getBNFRule(name, parser) {
function isLonelyRule (line 19936) | function isLonelyRule(name, parser) {
function getBNFChoice (line 19943) | function getBNFChoice(rules, parser) {
function getBNFBody (line 19946) | function getBNFBody(name, parser) {
function emit (line 19952) | function emit(parser) {
function restar (line 19964) | function restar(total, resta) {
function convertRegex (line 19968) | function convertRegex(txt) {
function getSubItems (line 19975) | function getSubItems(tmpRules, seq, parentName, parentAttributes) {
function createRule (line 20041) | function createRule(tmpRules, token, name, parentAttributes = undefined) {
function getRules (line 20085) | function getRules(source, parser = BNF.defaultParser) {
function Transform (line 20119) | function Transform(source, subParser = BNF.defaultParser) {
class Parser (line 20123) | class Parser extends Parser_1.Parser {
method constructor (line 18783) | constructor(grammarRules, options) {
method getAST (line 18844) | getAST(txt, target) {
method emitSource (line 18865) | emitSource() {
method parse (line 18868) | parse(txt, target, recursion = 0) {
method parseRecovery (line 19101) | parseRecovery(recoverableToken, tmpTxt, recursion) {
method constructor (line 19395) | constructor(source, options) {
method emitSource (line 19400) | emitSource() {
method constructor (line 19711) | constructor(source, options) {
method emitSource (line 19715) | emitSource() {
method constructor (line 20124) | constructor(source, options) {
method emitSource (line 20128) | emitSource() {
class Formula (line 20221) | class Formula {
method constructor (line 20222) | constructor(ast, table) {
class Source (line 20237) | class Source {
method constructor (line 20238) | constructor(ast, table) {
class Table (line 20364) | class Table {
method constructor (line 20371) | constructor(rows) {
method getHeight (line 20379) | getHeight() {
method getWidth (line 20387) | getWidth() {
method getHeaderWidth (line 20398) | getHeaderWidth() {
method getRows (line 20406) | getRows() {
method getDelimiterRow (line 20414) | getDelimiterRow() {
method getCellAt (line 20431) | getCellAt(rowIndex, columnIndex) {
method getFocusedCell (line 20444) | getFocusedCell(focus) {
method toLines (line 20452) | toLines() {
method setCellAt (line 20461) | setCellAt(rowIndex, columnIndex, value) {
method focusOfPosition (line 20474) | focusOfPosition(pos, rowOffset) {
method positionOfFocus (line 20503) | positionOfFocus(focus, rowOffset) {
method selectionRangeOfFocus (line 20528) | selectionRangeOfFocus(focus, rowOffset) {
method applyFormulas (line 20553) | applyFormulas(formulaLines) {
function getEAWOfCodePoint (line 21334) | function getEAWOfCodePoint(codePoint) {
function getEAW (line 21381) | function getEAW(str, pos) {
function computeWidth (line 21412) | function computeWidth(str, widths) {
class Insert (line 21923) | class Insert {
method constructor (line 21930) | constructor(row, line) {
class Delete (line 21941) | class Delete {
method constructor (line 21947) | constructor(row) {
class IList (line 21992) | class IList {
method car (line 21993) | get car() {
method cdr (line 21996) | get cdr() {
method isEmpty (line 21999) | isEmpty() {
method unshift (line 22002) | unshift(value) {
method toArray (line 22005) | toArray() {
class Nil (line 22018) | class Nil extends IList {
method constructor (line 22019) | constructor() {
method car (line 22022) | get car() {
method cdr (line 22025) | get cdr() {
method isEmpty (line 22028) | isEmpty() {
class Cons (line 22035) | class Cons extends IList {
method constructor (line 22036) | constructor(car, cdr) {
method car (line 22041) | get car() {
method cdr (line 22044) | get cdr() {
method isEmpty (line 22047) | isEmpty() {
class ITextEditor (line 22120) | class ITextEditor {
method getCursorPosition (line 22126) | getCursorPosition() {
method setCursorPosition (line 22132) | setCursorPosition(pos) {
method setSelectionRange (line 22139) | setSelectionRange(range) {
method getLastRow (line 22145) | getLastRow() {
method acceptsTableEdit (line 22155) | acceptsTableEdit(row) {
method getLine (line 22165) | getLine(row) {
method insertLine (line 22175) | insertLine(row, line) {
method deleteLine (line 22183) | deleteLine(row) {
method replaceLines (line 22195) | replaceLines(startRow, endRow, lines) {
method transact (line 22203) | transact(func) {
class TableEditor (line 22322) | class TableEditor {
method constructor (line 22328) | constructor(textEditor) {
method resetSmartCursor (line 22337) | resetSmartCursor() {
method cursorIsInTable (line 22347) | cursorIsInTable(options) {
method cursorIsInTableFormula (line 22359) | cursorIsInTableFormula(options) {
method _findTable (line 22370) | _findTable(options) {
method _withTable (line 22438) | _withTable(options, func) {
method _updateLines (line 22455) | _updateLines(startRow, endRow, newLines, oldLines = undefined) {
method _moveToFocus (line 22475) | _moveToFocus(startRow, table, focus) {
method _selectFocus (line 22490) | _selectFocus(startRow, table, focus) {
method format (line 22502) | format(options) {
method escape (line 22515) | escape(options) {
method alignColumn (line 22545) | alignColumn(alignment, options) {
method selectCell (line 22567) | selectCell(options) {
method moveFocus (line 22583) | moveFocus(rowOffset, columnOffset, options) {
method nextCell (line 22627) | nextCell(options) {
method previousCell (line 22707) | previousCell(options) {
method nextRow (line 22750) | nextRow(options) {
method insertRow (line 22820) | insertRow(options) {
method deleteRow (line 22837) | deleteRow(options) {
method moveRow (line 22858) | moveRow(offset, options) {
method evaluateFormulas (line 22871) | evaluateFormulas(options) {
method sortRows (line 22885) | sortRows(sortOrder, options) {
method insertColumn (line 22933) | insertColumn(options) {
method deleteColumn (line 22952) | deleteColumn(options) {
method moveColumn (line 22978) | moveColumn(offset, options) {
method formatAll (line 22995) | formatAll(options) {
method exportTable (line 23088) | exportTable(withtHeaders, options) {
method exportCSV (line 23101) | exportCSV(withtHeaders, options) {
method withCompletedTable (line 23111) | withCompletedTable(options, func) {
method formatAndApply (line 23132) | formatAndApply(options, range, originalLines, formulaLines, newTable, ...
function TableEditorPluginSettings (line 23213) | function TableEditorPluginSettings(loadedData) {
function ObsidianTextEditor (line 23232) | function ObsidianTextEditor(obj) {
function TableEditor (line 23295) | function TableEditor(app, editor, settings) {
method constructor (line 22328) | constructor(textEditor) {
method resetSmartCursor (line 22337) | resetSmartCursor() {
method cursorIsInTable (line 22347) | cursorIsInTable(options) {
method cursorIsInTableFormula (line 22359) | cursorIsInTableFormula(options) {
method _findTable (line 22370) | _findTable(options) {
method _withTable (line 22438) | _withTable(options, func) {
method _updateLines (line 22455) | _updateLines(startRow, endRow, newLines, oldLines = undefined) {
method _moveToFocus (line 22475) | _moveToFocus(startRow, table, focus) {
method _selectFocus (line 22490) | _selectFocus(startRow, table, focus) {
method format (line 22502) | format(options) {
method escape (line 22515) | escape(options) {
method alignColumn (line 22545) | alignColumn(alignment, options) {
method selectCell (line 22567) | selectCell(options) {
method moveFocus (line 22583) | moveFocus(rowOffset, columnOffset, options) {
method nextCell (line 22627) | nextCell(options) {
method previousCell (line 22707) | previousCell(options) {
method nextRow (line 22750) | nextRow(options) {
method insertRow (line 22820) | insertRow(options) {
method deleteRow (line 22837) | deleteRow(options) {
method moveRow (line 22858) | moveRow(offset, options) {
method evaluateFormulas (line 22871) | evaluateFormulas(options) {
method sortRows (line 22885) | sortRows(sortOrder, options) {
method insertColumn (line 22933) | insertColumn(options) {
method deleteColumn (line 22952) | deleteColumn(options) {
method moveColumn (line 22978) | moveColumn(offset, options) {
method formatAll (line 22995) | formatAll(options) {
method exportTable (line 23088) | exportTable(withtHeaders, options) {
method exportCSV (line 23101) | exportCSV(withtHeaders, options) {
method withCompletedTable (line 23111) | withCompletedTable(options, func) {
method formatAndApply (line 23132) | formatAndApply(options, range, originalLines, formulaLines, newTable, ...
function CSVModal (line 23378) | function CSVModal(app, mte, settings) {
function TableControlsView (line 23419) | function TableControlsView(leaf, settings) {
function TableEditorPlugin (line 23542) | function TableEditorPlugin() {
function TableEditorSettingsTab (line 23904) | function TableEditorSettingsTab(app, plugin) {
FILE: 1. cs/《Problem solving with algorithms and Data Structures Using Python》/线性数据结构/my_stack.py
class MyStack (line 1) | class MyStack:
method __init__ (line 2) | def __init__(self):
method is_empty (line 5) | def is_empty(self) -> bool:
method push (line 11) | def push(self, item):
method pop (line 17) | def pop(self):
method peek (line 21) | def peek(self):
method size (line 24) | def size(self):
FILE: 2. coding/1-beginner/dp/temp.js
function isSquare (line 35) | function isSquare(xDp, yDp, xIdx, yIdx, edgeLen) {
FILE: 2. coding/3-contest/273/2.js
function dfs (line 13) | function dfs(x, y, idx) {
function comp (line 29) | function comp(char) {
FILE: 2. coding/3-contest/273/3 copy.js
function findSum (line 19) | function findSum(num,idx) {
FILE: 2. coding/3-contest/274/2.js
function getCount (line 23) | function getCount(str) {
FILE: 2. coding/3-contest/第二题模拟练习/3.js
function lookAround (line 31) | function lookAround(idx, l, r) {
FILE: 2. coding/4-books/《挑战程序设计竞赛》/1. 抽签.js
function main (line 1) | function main() {
FILE: 2. coding/4-books/《挑战程序设计竞赛》/2. 三角形.js
function main (line 7) | function main(nums) {
FILE: 2. coding/4-books/《挑战程序设计竞赛》/tempCodeRunnerFile.js
function main (line 1) | function main() {
FILE: todo/fe/koa_/my_koa/src/Application.js
method constructor (line 10) | constructor() {
method use (line 18) | use(middleware) {
method createContext (line 22) | createContext(req, res) {
method compose (line 36) | compose(ctx) {
method handleRequest (line 57) | handleRequest(req, res) {
method listen (line 76) | listen(...args) {
FILE: todo/fe/koa_/my_koa/src/context.js
function defineGetter (line 11) | function defineGetter(target,property) {
function defineSetter (line 17) | function defineSetter(target,property) {
FILE: todo/fe/koa_/my_koa/src/request.js
method url (line 3) | get url () {
method path (line 6) | get path () {
method query (line 9) | get query () {
FILE: todo/fe/koa_/my_koa/src/response.js
method body (line 4) | get body() {
method body (line 7) | set body(val) {
FILE: todo/fe/notes-JavaScript/ES6/Promise/promiseA+.js
constant RESOLVED (line 1) | const RESOLVED = "RESOLVED"
constant REJECTED (line 3) | const REJECTED = "REJECTED"
constant PENDING (line 5) | const PENDING = "PENDING"
class Promise (line 53) | class Promise {
method constructor (line 54) | constructor(executor) {
method then (line 81) | then(onfulfilled,onrejected) {
FILE: todo/fe/notes-设计模式/创建模式/Singleton.ts
class Singleton (line 9) | class Singleton {
method constructor (line 12) | private constructor() {
method getInstance (line 15) | public static getInstance() {
FILE: todo/fe/vue 手写/src/compiler/index.js
function compileToFunction (line 32) | function compileToFunction (template) {
function generate (line 46) | function generate(el) { // [{name:'id',value:'app'},{}] {id:app,a:1,b:2}
function genProps (line 61) | function genProps(attrs) { // 处理属性 拼接成属性的字符串
function genChildren (line 78) | function genChildren(el) {
function gen (line 91) | function gen(node) {
FILE: todo/fe/vue 手写/src/compiler/parser-html.js
constant ELEMENT_TYPE (line 11) | const ELEMENT_TYPE = 1;
constant TEXT_TYPE (line 12) | const TEXT_TYPE = 3;
function parseHTML (line 19) | function parseHTML(html) {
function createASTElement (line 99) | function createASTElement(tagName, attrs) {
function start (line 114) | function start(tagName, attrs) {
function chars (line 123) | function chars(text) {
function end (line 134) | function end(tagName) {
FILE: todo/fe/vue 手写/src/index.js
function Vue (line 2) | function Vue(options){
FILE: todo/fe/vue 手写/src/init.js
function initMixin (line 5) | function initMixin(Vue){
FILE: todo/fe/vue 手写/src/lifecycle.js
function lifecycleMixin (line 3) | function lifecycleMixin(Vue) {
function mountComponent (line 16) | function mountComponent(vm,el){
FILE: todo/fe/vue 手写/src/observer/dep.js
class Dep (line 2) | class Dep{
method constructor (line 3) | constructor(){
method addSub (line 7) | addSub(watcher){
method depend (line 10) | depend(){
method notify (line 14) | notify(){
function pushTarget (line 22) | function pushTarget(watcher){
function popTarget (line 26) | function popTarget(){
FILE: todo/fe/vue 手写/src/observer/index.js
function observe (line 15) | function observe(data) {
class Observer (line 26) | class Observer{
method constructor (line 27) | constructor(originData){ // 仅仅是初始化的操作
method observerArray (line 45) | observerArray(originData){
method walk (line 54) | walk(data){
function defineReactive (line 69) | function defineReactive(data,key,originData){
FILE: todo/fe/vue 手写/src/observer/watcher.js
class Watcher (line 9) | class Watcher {
method constructor (line 10) | constructor(vm, exprOrFn, callback, options) {
method addDep (line 20) | addDep(dep) { // watcher里不能放重复的dep dep里不能放重复的watcher
method get (line 29) | get() {
method update (line 35) | update() {
method run (line 39) | run(){
FILE: todo/fe/vue 手写/src/render.js
function renderMixin (line 5) | function renderMixin(Vue) {
FILE: todo/fe/vue 手写/src/state.js
function initState (line 8) | function initState(vm) {
function initProps (line 28) | function initProps() {}
function initMethod (line 29) | function initMethod() {}
function initData (line 38) | function initData(vm) {
function initComputed (line 46) | function initComputed() {}
function initWatch (line 47) | function initWatch() {}
FILE: todo/fe/vue 手写/src/util/index.js
function isObject (line 5) | function isObject(data) {
function def (line 8) | function def(data,key,value){
function proxy (line 22) | function proxy (target,source,key) {
FILE: todo/fe/vue 手写/src/vdom/create-element.js
function createElement (line 1) | function createElement(tag, data = {}, ...children) {
function createTextNode (line 8) | function createTextNode(text) {
function vnode (line 12) | function vnode(tag, data, key, children, text) {
FILE: todo/fe/vue 手写/src/vdom/patch.js
function patch (line 8) | function patch(oldVnode,vnode){
function createElm (line 26) | function createElm(vnode){ // 根据虚拟节点创建真实的节点
function updateProperties (line 44) | function updateProperties(vnode){
FILE: todo/fe/webpack 手写/实现打包器/lib/Compilar.js
class Compilar (line 12) | class Compilar {
method constructor (line 13) | constructor(options) {
method run (line 23) | run() {
method buildDependenceModules (line 29) | buildDependenceModules(ModulePath, isEntry) {
method resolveCode (line 50) | resolveCode(path) {
method resolveName (line 54) | resolveName(sourcePath) {
method parseCode (line 60) | parseCode(source,dirPath){
method emitFile (line 82) | emitFile() {
FILE: todo/fe/待迁移-强化代码/Observer.js
function defineReactive (line 7) | function defineReactive(obj, key, val) {
function Observer (line 26) | function Observer(target) {
function ArrayObserver (line 69) | function ArrayObserver(target) {
FILE: todo/fe/待迁移-强化代码/bind函数.js
function test (line 12) | function test (sex,age) {
FILE: todo/fe/待迁移-强化代码/deepClone.js
function deepClone (line 20) | function deepClone (target = {}) {
FILE: todo/fe/待迁移-强化代码/eventEmitter.js
class EventEmitter (line 6) | class EventEmitter {
method constructor (line 7) | constructor() {
method $on (line 12) | $on(type, handle) {
method $emit (line 24) | $emit(type, ...msg) {
method $once (line 28) | $once(type, handle) {
method removeAllListeners (line 35) | removeAllListeners(type) {
method removeListener (line 38) | removeListener(type, handle) {
FILE: todo/fe/待迁移-强化代码/flatten.js
function flatten (line 55) | function flatten(array) {
FILE: todo/fe/待迁移-强化代码/lastEvent.js
class eventModule (line 2) | class eventModule {
method constructor (line 3) | constructor () {
method $on (line 6) | $on (type, handle) {
method $emit (line 13) | $emit(type,callback) {
method $once (line 21) | $once(type,handle) {
method $removeListener (line 29) | $removeListener(type,handle) {
method $getListener (line 37) | $getListener(type) {
method $removeAll (line 43) | $removeAll() {
function note (line 47) | function note () {
FILE: todo/fe/待迁移-强化代码/发布订阅.js
function EventEmitter (line 1) | function EventEmitter() {
FILE: todo/fe/练习-JavaScript部分/AJAX.js
function XHR (line 39) | function XHR() {
function format (line 72) | function format(data) {
function handler (line 118) | function handler() {
function getWebData (line 148) | function getWebData(url) {
FILE: todo/fe/练习-JavaScript部分/ES6 class编译/extends.js
class Parent (line 1) | class Parent {
method constructor (line 2) | constructor(name) {
class Child (line 7) | class Child extends Parent {
method constructor (line 8) | constructor(name, age) {
FILE: todo/fe/练习-JavaScript部分/tools.js
function stopBubble (line 2) | function stopBubble(evnet) {
function cancelHandler (line 11) | function cancelHandler(event) {
function retElementChild (line 19) | function retElementChild(node) {
function retParent (line 35) | function retParent(e, n) {
function retSibling (line 43) | function retSibling(e, n) {
function F (line 107) | function F() {}
function addEvent (line 127) | function addEvent(elem, type, handle) {
function removeEvent (line 139) | function removeEvent(elem, type, handle) {
function loadScript (line 157) | function loadScript(url, callback) {
function type (line 183) | function type(target) {
FILE: todo/fe/练习-JavaScript部分/功能函数汇总/函数深度比较.js
function isObject (line 4) | function isObject(object) {
function isEqual (line 7) | function isEqual(obj1,obj2) {
FILE: todo/fe/练习-JavaScript部分/功能函数汇总/函数节流.js
function throttle (line 6) | function throttle(fn, wait) {
function throttle (line 23) | function throttle(fn, wait) {
function throttle (line 37) | function throttle(fn, wait, options) {
FILE: todo/fe/练习-JavaScript部分/功能函数汇总/函数防抖.js
function debounce (line 6) | function debounce(fn,wait) {
function debounce (line 19) | function debounce (fn,wait,options) {
function _debounce (line 41) | function _debounce (fn,wait,options) {
FILE: todo/fe/练习-JavaScript部分/功能函数汇总/数组平拍.js
function flat (line 8) | function flat(arr) {
function d_flat (line 16) | function d_flat(arr,deep = 1){
FILE: todo/fe/练习-JavaScript部分/图片懒加载.js
function lazyLoad (line 8) | function lazyLoad() {
FILE: todo/fe/练习-JavaScript部分/手写create.js
function F (line 6) | function F () {}
FILE: todo/fe/练习-JavaScript部分/手写instanceof.js
function _instanceof (line 1) | function _instanceof(l, r) {
function _instanceof (line 13) | function _instanceof(l, r) {
FILE: todo/fe/练习-JavaScript部分/手写new.js
function myNew (line 8) | function myNew(constructor, ...args) {
FILE: todo/fe/练习-JavaScript部分/手写深拷贝.js
function hackClone (line 1) | function hackClone(target) {
function recursionClone (line 4) | function recursionClone(target = {}, origin) {
FILE: todo/fe/练习-JavaScript部分/继承/1. 原型链继承.js
function Parent (line 1) | function Parent(name) {
function Child (line 7) | function Child() {
FILE: todo/fe/练习-JavaScript部分/继承/2. 借用构造函数继承.js
function Parent (line 1) | function Parent() {
function Child (line 8) | function Child(...args) {
FILE: todo/fe/练习-JavaScript部分/继承/3. 组合继承.js
function Parent (line 1) | function Parent(name) {
function Child (line 7) | function Child(...args) {
FILE: todo/fe/练习-JavaScript部分/继承/4. 原型式继承.js
function Parent (line 1) | function Parent(name) {
function myCreate (line 7) | function myCreate (o) {
FILE: todo/fe/练习-JavaScript部分/继承/5. 寄生组合式继承.js
function Parent (line 2) | function Parent(name) {
function Child (line 8) | function Child() {
function prototype (line 11) | function prototype(child, parent) {
FILE: todo/fe/练习-JavaScript部分/请你实现一个LRU缓存算法.js
function LinkList (line 17) | function LinkList(node) {
class LRU (line 22) | class LRU {
method constructor (line 23) | constructor(size) {
method set (line 26) | set() {
method get (line 29) | get() {
function LRUcache (line 39) | function LRUcache(capacity) {
FILE: todo/fe/练习-Nodejs/eventEmitter.js
class EventEmitter (line 8) | class EventEmitter {
method constructor (line 9) | constructor() {
method $on (line 20) | $on(type, cb) {
method $emit (line 38) | $emit(type, ...msg) {
method $once (line 50) | $once(type, cb) {
method $off (line 62) | $off(type, cb) {
FILE: todo/fe/练习-数据结构算法刷题/链表/4.插入有序链表.js
function insertTarget (line 1) | function insertTarget (node,target){
FILE: todo/fe/练习-数据结构算法刷题/链表/9. 两两交换链表中的节点.js
function swapPairs (line 1) | function swapPairs (head) {
FILE: todo/fe/练习-数据结构算法刷题/链表/翻转链表/25. K 个一组翻转链表.js
function reverse (line 30) | function reverse(head, tail) {
FILE: todo/fe/练习-数据结构算法刷题/链表/翻转链表/92. 反转链表 II.js
function reverse (line 21) | function reverse(head, n) {
FILE: todo/fe/练习-数据结构算法刷题/链表/重排链表/143. 重排链表.js
function findMiddleNode (line 19) | function findMiddleNode(node) {
function reverseList (line 31) | function reverseList(node) {
function merge (line 49) | function merge(l1, l2) {
FILE: todo/fe/练习-数据结构算法刷题/链表/面试题22. 链表中倒数第k个节点.js
function helper (line 21) | function helper(head, index) {
FILE: todo/fe/组件/vue-懒加载/v-lazy.js
function Lazy (line 5) | function Lazy(Vue) {
method install (line 124) | install(Vue, options) {
function getScrollParent (line 138) | function getScrollParent(el) {
function loadImageAsync (line 148) | function loadImageAsync(src, resolve, reject) {
Condensed preview — 334 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,091K chars).
[
{
"path": ".gitignore",
"chars": 14,
"preview": ".vscode\n.idea\n"
},
{
"path": ".obsidian/app.json",
"chars": 341,
"preview": "{\n \"vimMode\": true,\n \"attachmentFolderPath\": \"静态\",\n \"alwaysUpdateLinks\": true,\n \"promptDelete\": false,\n \"autoPairBr"
},
{
"path": ".obsidian/appearance.json",
"chars": 124,
"preview": "{\n \"baseFontSize\": 19,\n \"theme\": \"obsidian\",\n \"translucency\": false,\n \"baseFontSizeAction\": true,\n \"cssTheme\": \"Ato"
},
{
"path": ".obsidian/community-plugins.json",
"chars": 109,
"preview": "[\n \"file-explorer-note-count\",\n \"obsidian-outliner\",\n \"recent-files-obsidian\",\n \"table-editor-obsidian\"\n]"
},
{
"path": ".obsidian/core-plugins.json",
"chars": 279,
"preview": "[\n \"file-explorer\",\n \"global-search\",\n \"switcher\",\n \"graph\",\n \"backlink\",\n \"page-preview\",\n \"templates\",\n \"note-"
},
{
"path": ".obsidian/daily-notes.json",
"chars": 63,
"preview": "{\n \"autorun\": true,\n \"folder\": \"log/2021\",\n \"template\": \"\"\n}"
},
{
"path": ".obsidian/graph.json",
"chars": 780,
"preview": "{\n \"collapse-filter\": false,\n \"search\": \"path:/new\",\n \"showTags\": false,\n \"showAttachments\": false,\n \"hideUnresolve"
},
{
"path": ".obsidian/hotkeys.json",
"chars": 280,
"preview": "{\n \"table-editor-obsidian:format-all-tables\": [\n {\n \"modifiers\": [\n \"Alt\",\n \"Ctrl\",\n \"Shif"
},
{
"path": ".obsidian/page-preview.json",
"chars": 21,
"preview": "{\n \"preview\": true\n}"
},
{
"path": ".obsidian/plugins/file-explorer-note-count/data.json",
"chars": 110,
"preview": "{\n \"showAllNumbers\": true,\n \"filterList\": [\n \"md\"\n ],\n \"blacklist\": false,\n \"filterFolderNote\": true\n}"
},
{
"path": ".obsidian/plugins/file-explorer-note-count/main.js",
"chars": 78313,
"preview": "/*\nTHIS IS A GENERATED/BUNDLED FILE BY ROLLUP\nif you want to view the source visit the plugins github repository\n*/\n\n'us"
},
{
"path": ".obsidian/plugins/file-explorer-note-count/manifest.json",
"chars": 351,
"preview": "{\n \"id\": \"file-explorer-note-count\",\n \"name\": \"File Explorer Note Count\",\n \"version\": \"1.2.0\",\n \"minAppVersi"
},
{
"path": ".obsidian/plugins/file-explorer-note-count/styles.css",
"chars": 687,
"preview": ".nav-folder-title[data-count]::after {\n content: attr(data-count);\n display: inline-block;\n position: relative;"
},
{
"path": ".obsidian/plugins/obsidian-outliner/data.json",
"chars": 169,
"preview": "{\n \"styleLists\": true,\n \"debug\": false,\n \"stickCursor\": true,\n \"betterEnter\": true,\n \"selectAll\": true,\n \"disableZ"
},
{
"path": ".obsidian/plugins/obsidian-outliner/main.js",
"chars": 290726,
"preview": "'use strict';\n\nvar obsidian = require('obsidian');\n\n/*! ****************************************************************"
},
{
"path": ".obsidian/plugins/obsidian-outliner/manifest.json",
"chars": 295,
"preview": "{\r\n \"id\": \"obsidian-outliner\",\r\n \"name\": \"Outliner\",\r\n \"version\": \"1.4.1\",\r\n \"minAppVersion\": \"0.12.19\",\r\n \"descrip"
},
{
"path": ".obsidian/plugins/obsidian-outliner/styles.css",
"chars": 1093,
"preview": "/* lists */\n.outliner-plugin-bls .cm-s-obsidian .HyperMD-list-line {\n padding-top: 0.4em;\n}\n\n/* bullets */\n.outliner-pl"
},
{
"path": ".obsidian/plugins/recent-files-obsidian/data.json",
"chars": 2905,
"preview": "{\n \"recentFiles\": [\n {\n \"basename\": \"README\",\n \"path\": \"README.md\"\n },\n {\n \"basename\": \"index\","
},
{
"path": ".obsidian/plugins/recent-files-obsidian/main.js",
"chars": 178906,
"preview": "'use strict';\n\nvar obsidian = require('obsidian');\n\n/*! ****************************************************************"
},
{
"path": ".obsidian/plugins/recent-files-obsidian/manifest.json",
"chars": 264,
"preview": "{\n \"id\": \"recent-files-obsidian\",\n \"name\": \"Recent Files\",\n \"version\": \"1.3.1\",\n \"minAppVersion\": \"0.11.6\",\n \"descr"
},
{
"path": ".obsidian/plugins/recent-files-obsidian/styles.css",
"chars": 130,
"preview": ".recent-files-donation {\n width: 70%;\n margin: 0 auto;\n text-align: center;\n}\n\n.recent-files-donate-button {\n margin"
},
{
"path": ".obsidian/plugins/table-editor-obsidian/data.json",
"chars": 94,
"preview": "{\n \"formatType\": \"normal\",\n \"showRibbonIcon\": true,\n \"bindEnter\": true,\n \"bindTab\": true\n}"
},
{
"path": ".obsidian/plugins/table-editor-obsidian/main.js",
"chars": 2765044,
"preview": "'use strict';\n\nvar obsidian = require('obsidian');\nvar state = require('@codemirror/state');\nvar view = require('@codemi"
},
{
"path": ".obsidian/plugins/table-editor-obsidian/manifest.json",
"chars": 318,
"preview": "{\n \"id\": \"table-editor-obsidian\",\n \"name\": \"Advanced Tables\",\n \"author\": \"Tony Grosinger\",\n \"authorUrl\": \"https://gr"
},
{
"path": ".obsidian/plugins/table-editor-obsidian/styles.css",
"chars": 401,
"preview": ".HyperMD-table-row span.cm-inline-code {\n font-size: 100%;\n}\n\n.widget-icon {\n width: 20px;\n height: 20px;\n fill: var"
},
{
"path": ".obsidian/starred.json",
"chars": 111,
"preview": "{\n \"items\": [\n {\n \"type\": \"file\",\n \"title\": \"2022年计划\",\n \"path\": \"log/2022年计划.md\"\n }\n ]\n}"
},
{
"path": ".obsidian/templates.json",
"chars": 22,
"preview": "{\n \"folder\": \"temp\"\n}"
},
{
"path": ".obsidian/themes/Atom.css",
"chars": 12579,
"preview": ".theme-dark {\n --background-primary: #272b34;\n --background-primary-alt: #20242b;\n --background-secondary: #20242b;\n "
},
{
"path": ".obsidian/themes/Obsidian Nord.css",
"chars": 10930,
"preview": "\n:root\n{\n --dark0: #2e3440;\n --dark1: #3b4252;\n --dark2: #434c5e;\n --dark3: #4c566a;\n\n --light0: #d8d"
},
{
"path": ".obsidian/workspace",
"chars": 3261,
"preview": "{\n \"main\": {\n \"id\": \"2f3ee696a4aeba5e\",\n \"type\": \"split\",\n \"children\": [\n {\n \"id\": \"2cf85588b3df5d"
},
{
"path": ".obsidian/workspaces.json",
"chars": 6905,
"preview": "{\n \"workspaces\": {\n \"laioffer\": {\n \"main\": {\n \"id\": \"4a561b26e65b0de3\",\n \"type\": \"split\",\n "
},
{
"path": "1. cs/《CSAPP》/chapter 6 - the memory hierarchy.md",
"chars": 87,
"preview": "# chapter 6 - the memory hierarchy 读书笔记\n\n## 1. 核心主题\n\n## 2. 细节解说\n\n## 3. 领域联想\n\n## 4. 专业词汇"
},
{
"path": "1. cs/《Problem solving with algorithms and Data Structures Using Python》/index.md",
"chars": 195,
"preview": "# Table of Contents\n\n> ❗️ 只记录书中讲述的重点内容,以及补充以下链接关系:\n> - 数据结构的工业应用\n> - 经典/有趣/ leetcode题\n\n[[何为数据结构与算法?]]\n\n\n[[1. cs/《Problem"
},
{
"path": "1. cs/《Problem solving with algorithms and Data Structures Using Python》/何为数据结构与算法?.md",
"chars": 0,
"preview": ""
},
{
"path": "1. cs/《Problem solving with algorithms and Data Structures Using Python》/线性数据结构/index.md",
"chars": 131,
"preview": "# 线性数据结构\n\n- 理解何为线性\n- 基本ADT:栈、队列、双端队列和列表\n\n\n## 线性(属性)定义\n\n1. 有序的数据集合,其元素的顺序由添加和删除时机决定\n2. 删除/新增元素到集合中时,不会影响其他元素的相对位置\n\n## 重要结"
},
{
"path": "1. cs/《Problem solving with algorithms and Data Structures Using Python》/线性数据结构/my_stack.py",
"chars": 567,
"preview": "class MyStack:\n def __init__(self):\n self.items = []\n\n def is_empty(self) -> bool:\n return len(self."
},
{
"path": "1. cs/《Problem solving with algorithms and Data Structures Using Python》/线性数据结构/栈.md",
"chars": 1921,
"preview": "# 栈\n\n## 性质\n\n### 性质1: LIFO\n\n提供一种基于数据停留在集合中的时间来排序的方式,时长短的在顶部,反之在底部。\n\n### 性质2: 反转(盗梦空间)\n\n## ADT 与实现\n\n### ADT\n\n- Stack()创建一个"
},
{
"path": "1. cs/存储体系.md",
"chars": 117,
"preview": "# 存储体系\n\n一句话解释概念:利用分层层次的存储技术和局部性思想,使得程序在I/O时能够享有速度和成本的(最优状态)。\n\n**存储技术**\n\n**局部性原理**\n\n**层缓存**\n\n**cpu cache**\n\n**存储器山**\n\n"
},
{
"path": "2. coding/1-beginner/0. 贪心/455. assign-cookies.md",
"chars": 709,
"preview": "# [455. assign-cookies](https://leetcode-cn.com/problems/assign-cookies/)\n\n- 最优子结构\n- 无后效性\n- 贪心选择性质\n\n> 体会不出来 “贪心选择性质 ” ,难"
},
{
"path": "2. coding/1-beginner/1. sorting/26. 删除有序数组中的重复项.md",
"chars": 526,
"preview": "# [26. 删除有序数组中的重复项](https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/)\n\n## solutions\n\n```js\n/**\n\n1. "
},
{
"path": "2. coding/1-beginner/1. sorting/283. 移动零.md",
"chars": 80,
"preview": "# [283. 移动零](https://leetcode-cn.com/problems/move-zeroes/)\n\n## solutions\n\n同向双指针"
},
{
"path": "2. coding/1-beginner/1. sorting/475. 供暖器.md",
"chars": 539,
"preview": "# [475. 供暖器](https://leetcode-cn.com/problems/heaters/)\n\n```js\n/**\n * @param {number[]} houses\n * @param {number[]} heat"
},
{
"path": "2. coding/1-beginner/1. sorting/56. 合并区间.md",
"chars": 1235,
"preview": "# [56. 合并区间](https://leetcode-cn.com/problems/merge-intervals/)\n\n## solutions\n\n不要preCheck能行吗?测试一下高赞答案。\n\n```js\n/**\n * @pa"
},
{
"path": "2. coding/1-beginner/1. sorting/80. 删除有序数组中的重复项 II.md",
"chars": 712,
"preview": "# [80. 删除有序数组中的重复项 II](https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/)\n\n## solutions\n\n```js\n/*"
},
{
"path": "2. coding/1-beginner/1. sorting/881. 救生艇.md",
"chars": 70,
"preview": "# [881. 救生艇](https://leetcode-cn.com/problems/boats-to-save-people/)\n\n"
},
{
"path": "2. coding/1-beginner/1. sorting/912. 排序数组.md",
"chars": 92,
"preview": "# [912. 排序数组](https://leetcode-cn.com/problems/sort-an-array/)\n\n## quick_sort\n\n## merge_sort"
},
{
"path": "2. coding/1-beginner/1. sorting/Array Deduplication III.md",
"chars": 443,
"preview": "## Description\n\nGiven a sorted integer array, remove duplicate elements. For each group of elements with the same value "
},
{
"path": "2. coding/1-beginner/1. sorting/pointer.md",
"chars": 184,
"preview": "#index \n\nTODO:\n - 孙老师 双指针基础题整理\n\n## 双指针\n\n### 同向行\n- [[26. 删除有序数组中的重复项]]\n- [[80. 删除有序数组中的重复项 II]]\n- [[Array Deduplication I"
},
{
"path": "2. coding/1-beginner/3. linked-list/206. 反转链表.md",
"chars": 120,
"preview": "# [206. 反转链表](https://leetcode-cn.com/problems/reverse-linked-list/)\n\n## 迭代\n\n## 递归\n\n![[Pasted image 20211223100307.png]]"
},
{
"path": "2. coding/1-beginner/4. queue & stack/1047. 删除字符串中的所有相邻重复项.md",
"chars": 552,
"preview": "# [1047. 删除字符串中的所有相邻重复项](https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/)\n\n## solutions\n\n```j"
},
{
"path": "2. coding/1-beginner/binary-search/704. Binary Search.md",
"chars": 69,
"preview": "[704. Binary Search](https://leetcode-cn.com/problems/binary-search/)"
},
{
"path": "2. coding/1-beginner/dp/1139. 最大的以 1 为边界的正方形.md",
"chars": 263,
"preview": "# [1139. 最大的以 1 为边界的正方形](https://leetcode-cn.com/problems/largest-1-bordered-square/)\n\n\n## solutions\n\n\n[\n\t[1 , 1 , 1],\n\t"
},
{
"path": "2. coding/1-beginner/dp/139. 单词拆分.md",
"chars": 0,
"preview": ""
},
{
"path": "2. coding/1-beginner/dp/221. 最大正方形.md",
"chars": 883,
"preview": "# [221. 最大正方形](https://leetcode-cn.com/problems/maximal-square/)\n\n## 基本问题\n一共有多少个正方形?*n ^ 3?*\n\n暴力check 为什么是 *n ^ 5 ?*\n## "
},
{
"path": "2. coding/1-beginner/dp/45.跳跃游戏 II.md",
"chars": 1999,
"preview": "# [45. 跳跃游戏 II](https://leetcode-cn.com/problems/jump-game-ii/)\n## solution \n\n### 1. goal & basic case\n\n- ***goal?*** \n使"
},
{
"path": "2. coding/1-beginner/dp/485. 最大连续 1 的个数.md",
"chars": 416,
"preview": "# [485. 最大连续 1 的个数](https://leetcode-cn.com/problems/max-consecutive-ones/)\n\n## solution\n\n```js\nvar findMaxConsecutiveOn"
},
{
"path": "2. coding/1-beginner/dp/53.最大子数组和.md",
"chars": 2708,
"preview": "# [53. 最大子数组和](https://leetcode-cn.com/problems/maximum-subarray/)\n\n## solution \n\n### 1. goal & basic case\n\n- ***goal?**"
},
{
"path": "2. coding/1-beginner/dp/55.跳跃游戏.md",
"chars": 2240,
"preview": "# [55. 跳跃游戏](https://leetcode-cn.com/problems/jump-game/)\n\n## solution \n\n### 1. goal & basic case\n\n- ***goal?*** \n是否能够到达"
},
{
"path": "2. coding/1-beginner/dp/72. 编辑距离.md",
"chars": 4027,
"preview": "# [72. 编辑距离](https://leetcode-cn.com/problems/edit-distance/)\n## solution\n\n### 解释三种操作\n\ns1 = \"asdf\" = char **a** | rest "
},
{
"path": "2. coding/1-beginner/dp/764. 最大加号标志.md",
"chars": 3330,
"preview": "# [764. 最大加号标志](https://leetcode-cn.com/problems/largest-plus-sign/)\n\n\n\n### 暴力\n\n```js\n\n/**\n * @param {number} n\n * @para"
},
{
"path": "2. coding/1-beginner/dp/Longest Ascending SubArray.md",
"chars": 2516,
"preview": "[https://app.laicode.io/app/problem/86](https://app.laicode.io/app/problem/86)\n\n## Description\n\nGiven an unsorted array,"
},
{
"path": "2. coding/1-beginner/dp/temp.js",
"chars": 1172,
"preview": "/**\n * @param {number[][]} grid\n * @return {number}\n */\nvar largest1BorderedSquare = function (grid) {\n const y = grid."
},
{
"path": "2. coding/1-beginner/dp/剑指 Offer 14- I. 剪绳子.md",
"chars": 2365,
"preview": "# [剑指 Offer 14- I. 剪绳子](https://leetcode-cn.com/problems/jian-sheng-zi-lcof/)\n## solution \n\n### 1. goal & basic case\n\n- "
},
{
"path": "2. coding/1-beginner/dp/面试题 17.24. 最大子矩阵.md",
"chars": 74,
"preview": "# [面试题 17.24. 最大子矩阵](https://leetcode-cn.com/problems/max-submatrix-lcci/)"
},
{
"path": "2. coding/1-beginner/recursion/25. K 个一组翻转链表.md",
"chars": 0,
"preview": ""
},
{
"path": "2. coding/1-beginner/recursion/344. 反转字符串.md",
"chars": 64,
"preview": "# [344. 反转字符串](https://leetcode-cn.com/problems/reverse-string/)"
},
{
"path": "2. coding/1-beginner/recursion/408. 有效单词缩写.md",
"chars": 112,
"preview": "# [408. 有效单词缩写](https://leetcode-cn.com/problems/valid-word-abbreviation/)\n\n![[Pasted image 20211223101810.png]]"
},
{
"path": "2. coding/1-beginner/recursion/50. Pow(x, n).md",
"chars": 199,
"preview": "# [50. Pow(x, n)](https://leetcode-cn.com/problems/powx-n/)\n\n\n1. navie \n2. improved\n3. optimized\n\nhttps://github.com/pub"
},
{
"path": "2. coding/1-beginner/recursion/509. 斐波那契数.md",
"chars": 344,
"preview": "# [509. 斐波那契数](https://leetcode-cn.com/problems/fibonacci-number/)\n## 表层问题\n1. 目标的小一号(小两号问题)问题是什么?最小号问题是什么?\n2. 子问题之间的联系是什"
},
{
"path": "2. coding/1-beginner/recursion/51. N 皇后.md",
"chars": 1425,
"preview": "# [51. N 皇后](https://leetcode-cn.com/problems/n-queens/)\n\n\n![[Pasted image 20211223095758.png]]\n\n## 一维数组\n\n```js\n/**\n * @"
},
{
"path": "2. coding/1-beginner/recursion/59. 螺旋矩阵 II.md",
"chars": 1113,
"preview": "# [59. 螺旋矩阵 II](https://leetcode-cn.com/problems/spiral-matrix-ii/)\n\n```js\n/**\n * @param {number} n\n * @return {number[]"
},
{
"path": "2. coding/1-beginner/recursion/92. 反转链表 II.md",
"chars": 111,
"preview": "# [92. 反转链表 II](https://leetcode-cn.com/problems/reverse-linked-list-ii/)\n\n![[Pasted image 20211223100454.png]]"
},
{
"path": "2. coding/2-training/1014.最佳观光组合.md",
"chars": 365,
"preview": "# [1014. 最佳观光组合](https://leetcode-cn.com/problems/best-sightseeing-pair/)\n\n## solutions\n\n往一维dp上不太好套...\n\n\n```js\n\n/**\n\n\n\n "
},
{
"path": "2. coding/2-training/103. 二叉树的锯齿形层序遍历.md",
"chars": 135,
"preview": "# [103. 二叉树的锯齿形层序遍历](https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/)\n\n\n\n\n"
},
{
"path": "2. coding/2-training/121. 买卖股票的最佳时机#P0#3.md",
"chars": 485,
"preview": "> 二维数组只是逻辑上的二维状态保存,去想表格会很轻松。\n\n\n## code\n\n```js\n/**\n * @param {number[]} prices\n * @return {number}\n */\nvar maxProfit = fu"
},
{
"path": "2. coding/2-training/1609. 奇偶树.md",
"chars": 1283,
"preview": "/**\n * Definition for a binary tree node.\n * function TreeNode(val, left, right) {\n * this.val = (val===undefined ? "
},
{
"path": "2. coding/2-training/1644. 二叉树的最近公共祖先 II.md",
"chars": 541,
"preview": "# [1644. 二叉树的最近公共祖先 II](https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree-ii/)\n\nhttps://en.wikipe"
},
{
"path": "2. coding/2-training/1705. 吃苹果的最大数目.md",
"chars": 1983,
"preview": "// https://leetcode-cn.com/problems/maximum-number-of-eaten-apples/\n\n// 贪心 & 优先级队列\n\n/**\n * @param {number[]} apples\n * @"
},
{
"path": "2. coding/2-training/198.打家劫舍.md",
"chars": 347,
"preview": "## code \n\n```js\nvar rob = function(nums) {\n let len = nums.length;\n let dp = new Array(len + 1);\n\n dp[0] = 0;\n "
},
{
"path": "2. coding/2-training/2100. 适合打劫银行的日子.md",
"chars": 1009,
"preview": "// 暴力求解\n\n/**\n * @param {number[]} security\n * @param {number} time\n * @return {number[]}\n */\nvar goodDaysToRobBank = fun"
},
{
"path": "2. coding/2-training/2109. 向字符串添加空格.md",
"chars": 0,
"preview": ""
},
{
"path": "2. coding/2-training/236. 二叉树的最近公共祖先.md",
"chars": 94,
"preview": "# [236. 二叉树的最近公共祖先](https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/)"
},
{
"path": "2. coding/2-training/300.最长递增子序列.md",
"chars": 561,
"preview": "## code\n\n```js\n\nconst max = (list) =>\n list.reduce((memo, cur) => (cur > memo ? cur : memo), list[0]);\n\n/**\n * @param {"
},
{
"path": "2. coding/2-training/846. 一手顺子.js",
"chars": 687,
"preview": "/**\n * @param {number[]} hand\n * @param {number} groupSize\n * @return {boolean}\n */\n var isNStraightHand = function(hand"
},
{
"path": "2. coding/2-training/index.md",
"chars": 303,
"preview": "# index\n\n> 对beginner进行一个延续,不会涉及太多算法竞赛内容(模板、技巧等)\n\n- 短期都会将题目收敛至这里,月中和月末进行归类,拆分到子标题下的目录中\n- 按照topic整理典型 & 有趣的leetcode题目\n\n## "
},
{
"path": "2. coding/2-training/面试题 02.06. 回文链表.md",
"chars": 514,
"preview": "// 递归\n/**\n * @param {ListNode} head\n * @return {boolean}\n */\nvar isPalindrome = function (head) {\n if (!head || head.ne"
},
{
"path": "2. coding/3-contest/273/1.js",
"chars": 238,
"preview": "/**\n * @param {number} num\n * @return {boolean}\n */\n var isSameAfterReversals = function(num) {\n if(num < 10) {\n ret"
},
{
"path": "2. coding/3-contest/273/2 copy.js",
"chars": 539,
"preview": "/**\n * @param {number} n\n * @param {number[]} startPos\n * @param {string} s\n * @return {number[]}\n */\nvar executeInstruc"
},
{
"path": "2. coding/3-contest/273/2.js",
"chars": 765,
"preview": "/**\n * @param {number} n\n * @param {number[]} startPos\n * @param {string} s\n * @return {number[]}\n */\nvar executeInstruc"
},
{
"path": "2. coding/3-contest/273/3 copy.js",
"chars": 565,
"preview": "/**\n * @param {number[]} arr\n * @return {number[]}\n */\n var getDistances = function(arr) {\n const map = new Map();\n fo"
},
{
"path": "2. coding/3-contest/273/3.js",
"chars": 322,
"preview": "/**\n * @param {number[]} arr\n * @return {number[]}\n */\nvar getDistances = function (arr) {\n const res = [];\n \n for (l"
},
{
"path": "2. coding/3-contest/274/1.js",
"chars": 338,
"preview": "/**\n * @param {number} mass\n * @param {number[]} asteroids\n * @return {boolean}\n */\nvar asteroidsDestroyed = function(ma"
},
{
"path": "2. coding/3-contest/274/2.js",
"chars": 677,
"preview": "/**\n * @param {string[]} bank\n * @return {number}\n */\n var numberOfBeams = function(bank) {\n let cnt = 0;\n for(le"
},
{
"path": "2. coding/3-contest/274/3.js",
"chars": 361,
"preview": "/**\n * @param {string} s\n * @return {boolean}\n */\n var checkString = function(s) {\n\n for(let i = 0;i < s.length;i++) "
},
{
"path": "2. coding/3-contest/274/4.js",
"chars": 108,
"preview": "/**\n * @param {number[]} favorite\n * @return {number}\n */\n var maximumInvitations = function(favorite) {\n\n};"
},
{
"path": "2. coding/3-contest/test.js",
"chars": 0,
"preview": ""
},
{
"path": "2. coding/3-contest/第 273 场周赛.md",
"chars": 4993,
"preview": "# [第 273 场周赛](https://leetcode-cn.com/contest/weekly-contest-273/)\n\n## 成绩 & 想法\n\n成绩:2636 / 4367 - 7分\n\n## Access - [5963. "
},
{
"path": "2. coding/3-contest/第二题模拟练习/1.js",
"chars": 819,
"preview": "/**\n * @param {number} n\n * @param {number[]} leftChild\n * @param {number[]} rightChild\n * @return {boolean}\n */\nvar val"
},
{
"path": "2. coding/3-contest/第二题模拟练习/2.js",
"chars": 654,
"preview": "/**\n * @param {string} date1\n * @param {string} date2\n * @return {number}\n */\nlet m2days = [-1,31,28,31,30,31,30,31,31,3"
},
{
"path": "2. coding/3-contest/第二题模拟练习/3.js",
"chars": 968,
"preview": "/**\n * @param {number} n\n * @param {number[]} leftChild\n * @param {number[]} rightChild\n * @return {boolean}\n */\nvar val"
},
{
"path": "2. coding/4-books/《挑战程序设计竞赛》/1. 抽签.js",
"chars": 416,
"preview": "function main() {\n let target = 3;\n\n let k = [1, 3, 5];\n\n let n = 3;\n\n for(let i = 0;i < n;i++) {\n fo"
},
{
"path": "2. coding/4-books/《挑战程序设计竞赛》/2. 三角形.js",
"chars": 549,
"preview": "let n = 5;\nlet a = [2, 3, 4, 5, 10]\n\n// let n = 4;\n// let a = [4, 5, 10, 20]\n\nfunction main(nums) {\n let ans = 0;\n\n "
},
{
"path": "2. coding/4-books/《挑战程序设计竞赛》/tempCodeRunnerFile.js",
"chars": 423,
"preview": "function main() {\n let target = 3;\n\n let k = [1, 3, 5];\n\n let n = 3;\n\n for(let i = 0;i < n;i++) {\n fo"
},
{
"path": "2. coding/51. N 皇后.md",
"chars": 1376,
"preview": "# [51. N 皇后](https://leetcode-cn.com/problems/n-queens/)\n\n```js\n/**\n * @param {number} n\n * @return {string[][]}\n */\nvar"
},
{
"path": "2. coding/59. 螺旋矩阵 II.md",
"chars": 0,
"preview": ""
},
{
"path": "2. coding/index.md",
"chars": 8748,
"preview": "# table content\n## 1. data-structures\n### 1.1 array\n### 1.2 link-list\n\n- [ ] [[206. 反转链表|基本功:单节点反转链表]]\n\n| 题目 | 类型 | call"
},
{
"path": "3. sd/FE/index.md",
"chars": 57,
"preview": "*** base environment browsers & node***\n***交互***\n***工程***"
},
{
"path": "DOM检查 ?react 解析器?开源工具?.md",
"chars": 0,
"preview": ""
},
{
"path": "README.md",
"chars": 633,
"preview": "# 1. 知识索引\n## 1.1 专业\n### CS\n\n> 积累阶段,全部以读书笔记为准!\n\n***体系***\n- 《CSAPP》\n- 《操作系统导论》\n- 《自顶向下》\n\n***programming***\n- the little sc"
},
{
"path": "temp/1维 - 动态规划.md",
"chars": 473,
"preview": "## solution \n\n### 1. goal & basic case\n\n- ***goal?*** \n\n\n- ***basic case?*** \n\n### 2. growing & relation \n\n- ***growing*"
},
{
"path": "temp/leetcode 拷贝题目模板.md",
"chars": 24,
"preview": "## solution \n\n```js\n\n```"
},
{
"path": "temp/内推模板.md",
"chars": 1720,
"preview": "## 内推广告\n\n- 面试进度跟进快\n- 部门直推效率高\n\n### 1. 字节 - 懂车帝\n\n我们致力于成为汽车领域最专业、最开放的前端技术团队,打造懂车帝这辆卓越战车上最极致,最酷炫的引擎。我们深耕汽车互联网行业,为汽车C端用户、汽车内容"
},
{
"path": "temp/大部头读书笔记.md",
"chars": 46,
"preview": "## 1. 核心主题\n\n## 2. 细节解说\n\n## 3. 领域联想\n\n## 4. 专业词汇"
},
{
"path": "todo/fe/TODO/10月第一周.md",
"chars": 281,
"preview": "\n## 季度计划 (春节前)\n\n- [ ] 完成毕业设计\n- [ ] 春悦工作项目(老丈人项目)\n- [ ] 高程4,面向对象是如何工作的,设计模式(PDF版本),看人的艺术,高情商,精读 + 书评\n- [ ] 算法题按照期望(所有整理的内"
},
{
"path": "todo/fe/fe-README.md",
"chars": 2418,
"preview": "# 前端部分\n\n记录前端知识体系的点点滴滴,能力有限,持续更新。\n\n> 本仓库做为一个我自己的全局索引,可能会链接到不同的仓库中。\n\n## 算法和数据结构\n\n[算法手册](https://github.com/sup-fiveyear/FE"
},
{
"path": "todo/fe/koa_/app.js",
"chars": 408,
"preview": "// const Koa = require('koa')\n// const app = new Koa()\n// app.use((ctx,next)=> {\n// ctx.body = 'hello world'\n// })\n// "
},
{
"path": "todo/fe/koa_/my_koa/package.json",
"chars": 36,
"preview": "{\n \"main\": \"./src/Application.js\"\n}"
},
{
"path": "todo/fe/koa_/my_koa/src/Application.js",
"chars": 2154,
"preview": "import {resolveAsset} from \"../../../源码解读-vue/vue-dev/src/core/util\";\n\nlet EventEmitter = require('events')\nlet context "
},
{
"path": "todo/fe/koa_/my_koa/src/context.js",
"chars": 578,
"preview": "//实现ctx能够访问到属性,实际上是一个代理\nlet proto = {\n}\n\n/**\n * 实现代理对象获取时,拿到值\n * ctx.res => this.request.res\n * @param target request or"
},
{
"path": "todo/fe/koa_/my_koa/src/request.js",
"chars": 240,
"preview": "const url = require('url')\nlet request = {\n get url () {\n return this.req.url\n },\n get path () {\n return url.pa"
},
{
"path": "todo/fe/koa_/my_koa/src/response.js",
"chars": 276,
"preview": "let response = {\n _body: undefined,\n\n get body() {\n return this._body\n },\n set body(val) {\n if(val === undefin"
},
{
"path": "todo/fe/koa_/package.json",
"chars": 294,
"preview": "{\n \"name\": \"koa_learn\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"index.js\",\n \"scripts\": {\n \"test\": \"ec"
},
{
"path": "todo/fe/notes-JavaScript/DOM/DOM汇总.md",
"chars": 3417,
"preview": "# DOM\n\n- 桥梁\n - 用于将脚本语言与HTML/XML连接\n- 逻辑树\n - 每个节点都是一个对象\n - DOM方法,操作树 \n- 事件处理器\n \n解释:\n\n- 文档对象模型 (DOM) 将 web 页面与到脚本或编程语言"
},
{
"path": "todo/fe/notes-JavaScript/ES5/ES5 - new & instanceof 实现.md",
"chars": 1312,
"preview": "\n## new\n\nnew操作符的三个过程:\n\n1. 创建一个继承自该构造函数关联的原型的实例对象\n2. 将构造函数的作用域赋给新对象并执行构造函数(修改this)\n3. 如果构造函数返回值位对象,返回这个对象,否则返回新对象。\n\n```ja"
},
{
"path": "todo/fe/notes-JavaScript/ES5/ES5 - 你说一下你对原型的认识.md",
"chars": 3051,
"preview": "## ES5 - 你说一下你对原型的认识\n\n在解释什么是原型时,我目前的思路是首先讲清楚 构造函数 - 原型对象 - 实例对象 三者之间的关系,也就是大体画出如下关系图:\n\n在创建时都会关"
},
{
"path": "todo/fe/notes-JavaScript/ES5/ES5-变量提升.md",
"chars": 1243,
"preview": "## JS执行机制 & 预编译\n\n### 变量提升特点\n\n所谓的变量提升,是指在 JavaScript 代码执行过程中,JavaScript 引擎把变量的声明部分和函数的声明部分提升到代码开头的“行为”。\n\n**表象**\n\n```javas"
},
{
"path": "todo/fe/notes-JavaScript/ES5/ES5-数据类型.md",
"chars": 8657,
"preview": "## 数据类型\n\n### 原始值和引用值\n\n#### 区别\n\n在**表现上**有如下几点区别:\n\n1. **复制**\n\n- 原始值复制后处在**不同栈帧**中,**变量互不影响**。\n- 引用值复制的是**栈中存储的地址**,会指向堆内存中"
},
{
"path": "todo/fe/notes-JavaScript/ES5/ES5-继承.md",
"chars": 2158,
"preview": "## 继承\n\n### 什么是面向对象?JavaScript是面向对象语言吗\n\n面向对象语言都有一个标志就是类的概念,通过类可以**创建多个对象具有相同方法和属性**。JavaScript 只是在两个对象之间创建一个关联,这样,一个对象就可以"
},
{
"path": "todo/fe/notes-JavaScript/ES5/ES5-闭包.md",
"chars": 1620,
"preview": "## 闭包\n\n### 定义\n\n当函数能够记住并访问当前的词法作用域,就形成了闭包。即使该函数执行时的作用域不在“记住的那个词法作用域中”\n\n### 解释产生原因 & 执行流程\n\n> 代码执行顺序(预编译 -> 变量对象/可执行的代码 -> "
},
{
"path": "todo/fe/notes-JavaScript/ES6/ES6 - class 总结.md",
"chars": 4126,
"preview": "### 语法糖\n\n#### class\n\nES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。\n\n#### constructor\n\n"
},
{
"path": "todo/fe/notes-JavaScript/ES6/ES6 - extends 总结.md",
"chars": 0,
"preview": ""
},
{
"path": "todo/fe/notes-JavaScript/ES6/Promise/Promise - 实现 Promise.race() && Promise.all() && Promise.allsettled().md",
"chars": 1856,
"preview": "## 手写\n\n### Promise.all()\n\n```js\nPromise.myall = (iterators) => {\n let promises = Array.from(iterators);\n let nums = pr"
},
{
"path": "todo/fe/notes-JavaScript/ES6/Promise/promiseA+.js",
"chars": 2595,
"preview": "const RESOLVED = \"RESOLVED\"\n\nconst REJECTED = \"REJECTED\"\n\nconst PENDING = \"PENDING\"\n\n/**\n1. 判断 promise === x ? reject(一"
},
{
"path": "todo/fe/notes-JavaScript/ES6/Promise/promise练习.md",
"chars": 1060,
"preview": "### 使用Promise实现每隔1秒输出1,2,3\n\n同步累加then函数\n\n```js\n\nconst arr = [1,2,3]\n\narr.reduce((memo,cur) => {\n return memo.then(() => "
},
{
"path": "todo/fe/notes-JavaScript/ES6/Promise/promisify.md",
"chars": 976,
"preview": "## promisify\n\n例如现在我们有一个异步IO函数,它是基于回调函数的异步编写风格:\n\n```js\nlet fs = require('fs');\n\nlet read = fs.readFile;\n\nread('name.txt',"
},
{
"path": "todo/fe/notes-JavaScript/ES6/Promise/实现PromiseA+.md",
"chars": 9563,
"preview": "## 实现PromiseA+ 规范\n\n### promise\n\n它是是一个拥有 then 方法的对象或函数,其行为符合本规范;\n\n> 因此我选择实现一个Promise类\n\n### Promise 的状态\n\n一个 Promise 的当前状态必"
},
{
"path": "todo/fe/notes-JavaScript/ES6/Promise/来一沓Promise.md",
"chars": 6511,
"preview": "# Promise\n\n## 产生背景\n\n它是用来解决形如“回调地狱” 的**异步串行**编程风格问题,主要策略:**将一个处理函数传入到 Promise 的 then 方法中,当 Promise 构造函数中获得最终结果后,会将结果传递给此时"
},
{
"path": "todo/fe/notes-JavaScript/ES6/README.MD",
"chars": 36,
"preview": "## ES6\n\n[ES6 - 数组汇总](数组常见API及实现.md)\n"
},
{
"path": "todo/fe/notes-JavaScript/ES6/新增数据结构/map/map.md",
"chars": 1503,
"preview": "## map\n\n### 特点\n\n- 解决对象的键值对存储,只能用字符串当做键的限制,并且会有隐式类型转换\n- Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构\n- 除了数组,字符串,其他具有 Iterator 接口的双元素"
},
{
"path": "todo/fe/notes-JavaScript/ES6/新增数据结构/set/set.md",
"chars": 1547,
"preview": "## set/map\n\n### 特点\n\n- ES6 提供了新的数据结构 Set。它类似于数组,但是**成员唯一,没有重复的值**。\n- 可以接受一个数组(或者具有 iterable 接口的其他数据结构)来初始化。\n- 向 Set 加入值的时"
},
{
"path": "todo/fe/notes-JavaScript/README.md",
"chars": 1178,
"preview": "## ECMAscript\n\n### ES5\n\n- [x] [ES5 - 数据类型](ES5-数据类型.md)\n- [x] [ES5 - 变量提升](ES5-变量提升.md)\n- [x] [ES5 - 如何理解闭包 & 执行上下文?](ES"
},
{
"path": "todo/fe/notes-JavaScript/函数式编程/README.md",
"chars": 123,
"preview": "- [x] [高阶函数之-函数柯里化](高阶函数之函数柯里化.md)\n[高阶函数之-初见 AOP](高阶函数之初见AOP.md)\n[高阶函数之-after 函数](高阶函数之after函数.md)\n\n- [ ] 高阶函数之-compose "
},
{
"path": "todo/fe/notes-JavaScript/实现极简发布订阅.md",
"chars": 620,
"preview": "## 实现极简发布订阅\n\n发布订阅能够解决异步问题,在异步逻辑成功后,会发射一个消息,告诉我已完成。\n\n这样在此之前订阅的内容就会被逐一执行,这是极其简单的模型,是后续 Nodejs 以及各种框架源码中的基础,如下:\n\n需要注意的是,发布订"
},
{
"path": "todo/fe/notes-JavaScript/数组常见API及实现.md",
"chars": 7033,
"preview": "## [数组](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array)\n\n### 创建数组\n\n#### Array() "
},
{
"path": "todo/fe/notes-JavaScript/说说async的原理.md",
"chars": 4171,
"preview": "## async\n\n### 本质\n\nasync 函数是 Generator 函数的语法糖(内置了执行器)。体现在写法的差异:async函数就是将 Generator 函数的星号(*)替换成async,将yield替换成await。\n\n###"
},
{
"path": "todo/fe/notes-JavaScript/高阶函数之after函数.md",
"chars": 844,
"preview": "## 高阶函数之 after 函数\n\n### 异步并发控制\n\n如何在多个异步函数中进行并发控制?例如现在有这样一个需求,希望在两个异步函数都完成后,才进行一些操作。\n\n```js\nlet temp = {};\nfs.readFile(\"./"
},
{
"path": "todo/fe/notes-JavaScript/高阶函数之函数柯里化.md",
"chars": 1130,
"preview": "## 高阶函数之函数柯里化\n\n### 简单的例子\n\n假设现在有一个需求,封装一个通用的判断类型的函数,用例如下:\n\n```js\nisType(\"Array\", []); // true\nisType(\"Array\", {}); // fal"
},
{
"path": "todo/fe/notes-JavaScript/高阶函数之初见AOP.md",
"chars": 512,
"preview": "## 高阶函数之初见 AOP\n\n### 高阶函数的定义\n\n满足如下条件即可称之为高阶函数:\n\n1. 函数的参数是一个函数 (回调函数就是一种高阶函数)\n2. 函数返回一个函数 当前这个函数也是一个高阶函数\n\n### 初见 AOP\n\n假设现在"
},
{
"path": "todo/fe/notes-nodeJs/1. NodeJs有哪些特点?应用场景又有哪些?.md",
"chars": 1143,
"preview": "## NodeJs 的特点有哪些\n\nnodejs的初心是创建高性能webserver,因此开发nodejs的大哥总结了两点:\n\n- 事件驱动\n- 非阻塞I/O\n\n所以就敲定了nodejs的主要特点:\n\n- 事件驱动 + 事件回调\n- 非阻塞"
},
{
"path": "todo/fe/notes-nodeJs/2. V8 libuv 和 Nodejs之间的关系?.md",
"chars": 1118,
"preview": "## V8 libuv 和 Nodejs 之间的关系\n\nNodejs 更像是 “站在了巨人的肩膀” 进行了一系列的拼凑... 因此他的高效离不开很多厉害的第三方类库和程序。\n\n\n\n### V8 和 Node"
},
{
"path": "todo/fe/notes-nodeJs/3. 说说你对global 以及global.process的理解?.md",
"chars": 1782,
"preview": "## 3. 说说你对 global 以及 global.process 的理解?\n\n### global 和 this\n\n在 nodejs 官方网站对 global 有这样一段描述:\n\n> 这些对象在所有的模块中都可用。 以下的变量虽然看似"
},
{
"path": "todo/fe/notes-nodeJs/4. 说一下Liubv的事件循环机制.md",
"chars": 3246,
"preview": "## 说一下 Liubv 的事件循环机制\n\n> 事件循环是 libuv 的核心,所有的 I/O 操作都建立在它之上。\n\n\n\n- [x] [NodeJs 都借助哪些第三方工具?](2.%20V8%20"
},
{
"path": "todo/fe/notes-nodeJs/notes-htmlcss/flex 布局.md",
"chars": 2695,
"preview": "## 基本术语\ndisplay: flex 属性 形成 flex container,直接子元素就此成为 flex items,如下图:\n\n易于理解,也要使人易于理解。在团队协作开发中,对人的易于理解显得尤为重要了,一个莫名其妙的 div 会让后续的开发或者维"
},
{
"path": "todo/fe/notes-nodeJs/notes-htmlcss/常见居中.md",
"chars": 1088,
"preview": "## 常见居中方案\n\n### 水平居中\n\n#### text-align\n\n若是行内元素, 给其父元素设置 text-align:center,即可实现行内元素水平居中.\n\n#### margin: 0 auto\n\n若是块级元素, 该元素设"
},
{
"path": "todo/fe/notes-nodeJs/npm有了解吗?.md",
"chars": 0,
"preview": ""
},
{
"path": "todo/fe/notes-nodeJs/说一下Nodejs的异步编程吧.md",
"chars": 31,
"preview": "## 异步I/O\n\n### 为什么Nodejs需要异步I/O\n"
},
{
"path": "todo/fe/notes-nodeJs/请你实现一下Event模块.md",
"chars": 1,
"preview": "\n"
},
{
"path": "todo/fe/notes-vue/$mount和模板编译原理.md",
"chars": 0,
"preview": ""
},
{
"path": "todo/fe/notes-vue/$watch和computed.md",
"chars": 2577,
"preview": "### \\$watch\n\n\\$watch 是 watcher 的一个实例,不过需要定制化实现三个功能:\n\n- unwatch\n- immediate\n- deep\n\n### 计算属性\n\n计算属性简单的来说就是定义在 vm 身上的一个特殊 g"
},
{
"path": "todo/fe/notes-vue/vue-router.md",
"chars": 2535,
"preview": "## 基础\n\n### 单页面应用和 vue-router\n\nrouter 的存在,使得 SPA 成为一种可行的方案;\n\n根据不同的路由匹配渲染不同的组件,实现页面之间的切换。\n\n和传统多页面的区别? 传统多页面:1html 对应一个 页面;"
},
{
"path": "todo/fe/notes-vue/vuex.md",
"chars": 10135,
"preview": "\n## Vuex\n\n### 1.简述一下什么是vuex?\n\n- vue 的状态管理模式\n- 集中式存储组件间共享的状态\n- 保证状态以可预测的方式进行更新 \n- 核心理念:单向数据流 {\n //"
},
{
"path": "todo/fe/notes-vue/常见面试题汇总.md",
"chars": 4514,
"preview": "\n### 1.v-html会导致哪些问题? (顺带模板语法)\n\nv-html(通常用于将后端返回的数据进行格式化操作):\n- 会有XSS风险\n- 会覆盖子组件,严格使用规范。\n\n插值语法:可以使用js表达式,但是不能使用js语句(if-el"
},
{
"path": "todo/fe/notes-vue/来,唠一下生命周期.md",
"chars": 2021,
"preview": "## 简述生命周期\n\n生命周期的本质是在组件初始化过程中(数据,事件,模板编译,挂载实例,销毁实例)会运行指定的生命周期钩子函数,从而给我们在不同时机自定义代码的能力\n\n总体分为四个阶段:\n\n### 初始化阶段 (new Vue)\n 初始"
},
{
"path": "todo/fe/notes-vue/渲染详细流程.md",
"chars": 0,
"preview": ""
},
{
"path": "todo/fe/notes-vue/虚拟DOM.md",
"chars": 20,
"preview": "## 虚拟DOM\n\n### 钩子函数\n\n"
},
{
"path": "todo/fe/notes-vue/说一下nextTick?.md",
"chars": 3191,
"preview": "## 说一下\\$nextTick?\n\n### 特点\n\n将 API 中注册的回调函数延迟到 DOM 更新后执行。\n\n> 需要注意的是,Vue 原型上的\\$nextTick 只是对全局方法 Vue.nextTick 的一个代理。\n\n特点:\n\n-"
},
{
"path": "todo/fe/notes-vue/说一下你对$nextTick的理解.md",
"chars": 3191,
"preview": "## 说一下\\$nextTick?\n\n### 特点\n\n将 API 中注册的回调函数延迟到 DOM 更新后执行。\n\n> 需要注意的是,Vue 原型上的\\$nextTick 只是对全局方法 Vue.nextTick 的一个代理。\n\n特点:\n\n-"
},
{
"path": "todo/fe/notes-vue/说说指令的原理.md",
"chars": 70,
"preview": "## 指令的原理\n\n### 指令生效流程\n\n### v-if / v - for \n\n### v-on v-once\n\n### 自定义指令\n"
},
{
"path": "todo/fe/notes-vue/面试题.md",
"chars": 13377,
"preview": "## 提纲\n\n- [提纲](#提纲)\n- [感性认知](#感性认知)\n - [什么是命令式和声明式?](#什么是命令式和声明式)\n - [谈谈你对 MVC 和 MVVM 的理解?](#谈谈你对-mvc-和-mvvm-的理解)\n- [数据"
},
{
"path": "todo/fe/notes-性能优化/浏览器/README.md",
"chars": 109,
"preview": "## 性能优化 - 浏览器\n\n- [x] [函数防抖](函数防抖.md)\n- [x] [函数节流](函数节流.md)\n\n[如何高性能渲染十万条数据?](../Notes/练习-实际开发/虚拟列表/README.md)\n"
},
{
"path": "todo/fe/notes-性能优化/浏览器/函数节流.md",
"chars": 709,
"preview": "## 函数节流\n\n### 适用场景\n\n和函数防抖是一样的适用场景\n\n### 节流思路\n\n- 时间戳\n- 定时器\n\n### 代码\n\n```js\n/**\n * 时间戳思路\n * @param {Function} fn 需要节流的函数\n * @"
},
{
"path": "todo/fe/notes-性能优化/浏览器/函数防抖.md",
"chars": 657,
"preview": "## 函数防抖\n\n### 适用场景\n\n在前端开发中会遇到一些频繁的事件触发,比如:\n\n- window 的 resize、scroll\n- mousedown、mousemove\n- keyup、keydown\n\n通常事件回调不会很复杂,浏"
},
{
"path": "todo/fe/notes-浏览器/DOM.md",
"chars": 3010,
"preview": "## DOM汇总\n\n\nDOM的本质:树形结构,用于描述xml/html的节点关系,同时提供API进行操作。\n\n### nodeType常见字段\n\n文档节点(9) \t元素节点(1)\ttext节点(3) \t注释节点(8) \tattr节点(2)\t"
},
{
"path": "todo/fe/notes-浏览器/README.md",
"chars": 811,
"preview": "## 浏览器基础\n\n**渲染&构建**\n\n- [x] [浏览器从输入URL到页面渲染的整个流程](输入URL后发生了什么.md)\n- [ ] 重绘重排 & DOM解析细节\n- [ ] JavaScript 影响页面构建\n\n**事件调度**\n"
},
{
"path": "todo/fe/notes-浏览器/浏览器基础/说一下AJAX.md",
"chars": 1246,
"preview": "## 说一下AJAX\n\n异步JavaScript + XML的缩写,通过这种技术方案可以实现向服务器请求数据时不需要卸载(刷新)页面。\n\n并且不会阻塞JavaScript代码的执行,解决“单击 - 等待”的交互模式,将前端推向了新的时代(w"
},
{
"path": "todo/fe/notes-浏览器/浏览器基础/说一下垃圾回收策略?.md",
"chars": 2922,
"preview": "## 说一下垃圾回收策略?\n\n- 回收策略\n- 栈空间:ESP\n- 堆空间:Scavenge、标记清除、标记整理\n- 全停顿和增量标记\n- NodeJs 垃圾回收\n\n### 策略:手动/自动\n\n垃圾数据回收分为**手动回收**和**自动回收"
},
{
"path": "todo/fe/notes-浏览器/浏览器基础/说一下浏览器事件循环.md",
"chars": 3903,
"preview": "## 单线程与消息队列\n\n由于 JavaScript 是一门单线程脚本语言,本身不存在多线程能力。如下图所示,不难看出单线程的语言,存在着阻塞行为。\n\n> 如果任务二比较耗时(网络请求),会导致后续的任务无法进行只能阻塞\n\n因此为了能够胜任"
},
{
"path": "todo/fe/notes-浏览器/浏览器基础/跨域通信.md",
"chars": 5071,
"preview": "\n## 说一下跨域\n\n产生跨域是由浏览器的**安全策略**所导致的,它是web页面中最基础、最核心的安全策略。\n\n### 同源策略\n\n同源策略主要表现在DOM、数据层面和网络这三个层面:\n\n1. DOM层面:同源策略限制了来自不同源的 Ja"
},
{
"path": "todo/fe/notes-浏览器/浏览器基础/输入URL后发生了什么.md",
"chars": 5118,
"preview": "# 输入URL后发生了什么\n\n> 侧重浏览器视角\n\n这是什么数据才行,否则上层应用就会“不知所措”。\n\n### MIME type 和 Encoding t"
},
{
"path": "todo/fe/notes-网络/HTTP/11.HTTP 重定向有了解吗?.md",
"chars": 1277,
"preview": "## HTTP 重定向有了解吗?\n\n由服务器来发起的,浏览器使用者无法控制,相对地就可以称为“被动跳转”,这在 HTTP 协议里有个专门的名词叫做“重定向”(Redirection),这个过程是用户无感知的。\n\n> 主动跳转说的是前端点击一"
},
{
"path": "todo/fe/notes-网络/HTTP/12.了解HTTP长连接吧?那队头阻塞呢?.md",
"chars": 1829,
"preview": "## 了解 HTTP 长连接吧?那队头阻塞呢?\n\n### 连接管理\n\n\n\n如果压缩率能有 50%,也就是说 100K 的数据能够压缩成 50K 的大小,那么就相当于在带宽不变的情况下网速提升了一倍,加速的效果是非常明显"
},
{
"path": "todo/fe/notes-网络/HTTP/2. 你知道HTTP都有哪些版本吗?.md",
"chars": 1488,
"preview": "## 你知道 HTTP 都有哪些版本吗?\n\n### 蒂姆·伯纳斯-李 万维网\n\n1989 年,任职于欧洲核子研究中心(CERN)的蒂姆·伯纳斯 - 李 创造了万维网,伟大的三个发明:\n\n- URI:即统一资源标识符,作为互联网上资源的唯一身"
},
{
"path": "todo/fe/notes-网络/HTTP/3.说一下你对域名的理解?.md",
"chars": 1738,
"preview": "## 说一下你对域名的理解\n\n### 域名的层次结构\n\n域名是一个有层次的结构,是一串用“.”分隔的多个单词,最右边的被称为“顶级域名”,然后是“二级域名”,最后是“主机名” 层级关系向左依次降低。\n\n**最左边的是主机名**,通常用来表明"
},
{
"path": "todo/fe/notes-网络/HTTP/4.说说你对URL 和 URI 的理解.md",
"chars": 1243,
"preview": "## URL\\URN\\URI\n\n- URL: RFC1738 (1994.12),Uniform Resource Locator,表示资源的位置, 期望提供查找资源的方法\n\n- URN:RFC2141 (1997.5),Uniform R"
},
{
"path": "todo/fe/notes-网络/HTTP/5. 描述一下HTTP报文结构.md",
"chars": 745,
"preview": "## 来描述一下 HTTP 报文结构,以及常用的头部字段?\n\n### HTTP报文基本结构\n\n上下文?.md",
"chars": 0,
"preview": ""
},
{
"path": "todo/fe/notes-网络/HTTP/7. 请求方法和状态码有哪些?.md",
"chars": 3574,
"preview": "## 请求方法 和 常见状态码\n\n### 请求方法\n\nHttp/1.1 规定了八种方法,单词必须都是大写的形式。\n\n1. GET:获取资源,可以理解为读取或者下载数据\n2. HEAD:获取资源的元信息;\n3. POST:向资源提交数据,相当"
},
{
"path": "todo/fe/notes-网络/HTTP/8.说说你对cookie的理解.md",
"chars": 1210,
"preview": "## 描述一下 cookie?\n\n### 背景\n\nHTTP 是“无状态”的,这既是优点也是缺点。优点是服务器没有状态差异,可以很容易地组成集群,而缺点就是无法支持需要记录状态的事务操作。\n\n随着 HTTP 应用领域的不断扩大,对“记忆能力”"
},
{
"path": "todo/fe/notes-网络/HTTP/9.说下你了解的缓存策略.md",
"chars": 3112,
"preview": "\n## HTTP cache\n\n缓存策略是基于**HTTP 协议**进行的,是浏览器端和服务端的通用缓存策略。\n\n### 缓存的意义\n\n> 缓存(Cache)是计算机领域里的一个重要概念,是优化系统性能的利器。\n\n由于链路漫长,网络时延不可"
}
]
// ... and 134 more files (download for full content)
About this extraction
This page contains the full source code of the sup-fiveyear/Notes GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 334 files (3.6 MB), approximately 963.5k tokens, and a symbol index with 1199 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.