├── .github └── workflows │ └── publish.yml ├── .gitignore ├── .vscode └── extensions.json ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── book.json ├── docs ├── .vitepress │ └── config.js ├── chapters │ ├── ch01_environment.md │ ├── ch02_computation.md │ ├── ch03_procedure.md │ ├── ch04_encoding.md │ ├── ch05_sequence.md │ ├── ch06_data.md │ ├── ch07_state.md │ ├── ch08_reference.md │ ├── ch09_closure.md │ ├── ch10_object.md │ ├── ch11_concurrency.md │ └── intro.md ├── draft │ └── draft.md ├── index.md ├── public │ ├── .nojekyll │ ├── CNAME │ └── favicon.ico ├── reference │ ├── debug.md │ ├── glossary.md │ ├── safety-and-security.md │ └── testing.md ├── res │ ├── code.html │ └── images │ │ └── cons-cells.png └── stream.md ├── package.json ├── practices └── index.md └── yarn.lock /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | permissions: 9 | contents: read 10 | pages: write 11 | id-token: write 12 | 13 | jobs: 14 | deploy: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: actions/checkout@v4 18 | - uses: actions/setup-node@v2.1.2 19 | - run: yarn 20 | 21 | - name: Build 22 | run: yarn build 23 | 24 | - name: Setup Pages 25 | uses: actions/configure-pages@v5 26 | - name: Upload artifact 27 | uses: actions/upload-pages-artifact@v3 28 | with: 29 | path: './docs/.vitepress/dist' 30 | - name: Deploy to GitHub Pages 31 | id: deployment 32 | uses: actions/deploy-pages@v4 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _book/ 2 | 3 | node_modules/ 4 | 5 | dist/ 6 | 7 | .vuepress/dist/ 8 | docs/.vitepress/dist/ 9 | 10 | *.log 11 | 12 | docs/.vitepress/cache -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "davidanson.vscode-markdownlint", 4 | "yzhang.markdown-all-in-one" 5 | ] 6 | } -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # 贡献指南 2 | 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Attribution 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More_considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution 4.0 International Public License 58 | 59 | By exercising the Licensed Rights (defined below), You accept and agree 60 | to be bound by the terms and conditions of this Creative Commons 61 | Attribution 4.0 International Public License ("Public License"). To the 62 | extent this Public License may be interpreted as a contract, You are 63 | granted the Licensed Rights in consideration of Your acceptance of 64 | these terms and conditions, and the Licensor grants You such rights in 65 | consideration of benefits the Licensor receives from making the 66 | Licensed Material available under these terms and conditions. 67 | 68 | 69 | Section 1 -- Definitions. 70 | 71 | a. Adapted Material means material subject to Copyright and Similar 72 | Rights that is derived from or based upon the Licensed Material 73 | and in which the Licensed Material is translated, altered, 74 | arranged, transformed, or otherwise modified in a manner requiring 75 | permission under the Copyright and Similar Rights held by the 76 | Licensor. For purposes of this Public License, where the Licensed 77 | Material is a musical work, performance, or sound recording, 78 | Adapted Material is always produced where the Licensed Material is 79 | synched in timed relation with a moving image. 80 | 81 | b. Adapter's License means the license You apply to Your Copyright 82 | and Similar Rights in Your contributions to Adapted Material in 83 | accordance with the terms and conditions of this Public License. 84 | 85 | c. Copyright and Similar Rights means copyright and/or similar rights 86 | closely related to copyright including, without limitation, 87 | performance, broadcast, sound recording, and Sui Generis Database 88 | Rights, without regard to how the rights are labeled or 89 | categorized. For purposes of this Public License, the rights 90 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 91 | Rights. 92 | 93 | d. Effective Technological Measures means those measures that, in the 94 | absence of proper authority, may not be circumvented under laws 95 | fulfilling obligations under Article 11 of the WIPO Copyright 96 | Treaty adopted on December 20, 1996, and/or similar international 97 | agreements. 98 | 99 | e. Exceptions and Limitations means fair use, fair dealing, and/or 100 | any other exception or limitation to Copyright and Similar Rights 101 | that applies to Your use of the Licensed Material. 102 | 103 | f. Licensed Material means the artistic or literary work, database, 104 | or other material to which the Licensor applied this Public 105 | License. 106 | 107 | g. Licensed Rights means the rights granted to You subject to the 108 | terms and conditions of this Public License, which are limited to 109 | all Copyright and Similar Rights that apply to Your use of the 110 | Licensed Material and that the Licensor has authority to license. 111 | 112 | h. Licensor means the individual(s) or entity(ies) granting rights 113 | under this Public License. 114 | 115 | i. Share means to provide material to the public by any means or 116 | process that requires permission under the Licensed Rights, such 117 | as reproduction, public display, public performance, distribution, 118 | dissemination, communication, or importation, and to make material 119 | available to the public including in ways that members of the 120 | public may access the material from a place and at a time 121 | individually chosen by them. 122 | 123 | j. Sui Generis Database Rights means rights other than copyright 124 | resulting from Directive 96/9/EC of the European Parliament and of 125 | the Council of 11 March 1996 on the legal protection of databases, 126 | as amended and/or succeeded, as well as other essentially 127 | equivalent rights anywhere in the world. 128 | 129 | k. You means the individual or entity exercising the Licensed Rights 130 | under this Public License. Your has a corresponding meaning. 131 | 132 | 133 | Section 2 -- Scope. 134 | 135 | a. License grant. 136 | 137 | 1. Subject to the terms and conditions of this Public License, 138 | the Licensor hereby grants You a worldwide, royalty-free, 139 | non-sublicensable, non-exclusive, irrevocable license to 140 | exercise the Licensed Rights in the Licensed Material to: 141 | 142 | a. reproduce and Share the Licensed Material, in whole or 143 | in part; and 144 | 145 | b. produce, reproduce, and Share Adapted Material. 146 | 147 | 2. Exceptions and Limitations. For the avoidance of doubt, where 148 | Exceptions and Limitations apply to Your use, this Public 149 | License does not apply, and You do not need to comply with 150 | its terms and conditions. 151 | 152 | 3. Term. The term of this Public License is specified in Section 153 | 6(a). 154 | 155 | 4. Media and formats; technical modifications allowed. The 156 | Licensor authorizes You to exercise the Licensed Rights in 157 | all media and formats whether now known or hereafter created, 158 | and to make technical modifications necessary to do so. The 159 | Licensor waives and/or agrees not to assert any right or 160 | authority to forbid You from making technical modifications 161 | necessary to exercise the Licensed Rights, including 162 | technical modifications necessary to circumvent Effective 163 | Technological Measures. For purposes of this Public License, 164 | simply making modifications authorized by this Section 2(a) 165 | (4) never produces Adapted Material. 166 | 167 | 5. Downstream recipients. 168 | 169 | a. Offer from the Licensor -- Licensed Material. Every 170 | recipient of the Licensed Material automatically 171 | receives an offer from the Licensor to exercise the 172 | Licensed Rights under the terms and conditions of this 173 | Public License. 174 | 175 | b. No downstream restrictions. You may not offer or impose 176 | any additional or different terms or conditions on, or 177 | apply any Effective Technological Measures to, the 178 | Licensed Material if doing so restricts exercise of the 179 | Licensed Rights by any recipient of the Licensed 180 | Material. 181 | 182 | 6. No endorsement. Nothing in this Public License constitutes or 183 | may be construed as permission to assert or imply that You 184 | are, or that Your use of the Licensed Material is, connected 185 | with, or sponsored, endorsed, or granted official status by, 186 | the Licensor or others designated to receive attribution as 187 | provided in Section 3(a)(1)(A)(i). 188 | 189 | b. Other rights. 190 | 191 | 1. Moral rights, such as the right of integrity, are not 192 | licensed under this Public License, nor are publicity, 193 | privacy, and/or other similar personality rights; however, to 194 | the extent possible, the Licensor waives and/or agrees not to 195 | assert any such rights held by the Licensor to the limited 196 | extent necessary to allow You to exercise the Licensed 197 | Rights, but not otherwise. 198 | 199 | 2. Patent and trademark rights are not licensed under this 200 | Public License. 201 | 202 | 3. To the extent possible, the Licensor waives any right to 203 | collect royalties from You for the exercise of the Licensed 204 | Rights, whether directly or through a collecting society 205 | under any voluntary or waivable statutory or compulsory 206 | licensing scheme. In all other cases the Licensor expressly 207 | reserves any right to collect such royalties. 208 | 209 | 210 | Section 3 -- License Conditions. 211 | 212 | Your exercise of the Licensed Rights is expressly made subject to the 213 | following conditions. 214 | 215 | a. Attribution. 216 | 217 | 1. If You Share the Licensed Material (including in modified 218 | form), You must: 219 | 220 | a. retain the following if it is supplied by the Licensor 221 | with the Licensed Material: 222 | 223 | i. identification of the creator(s) of the Licensed 224 | Material and any others designated to receive 225 | attribution, in any reasonable manner requested by 226 | the Licensor (including by pseudonym if 227 | designated); 228 | 229 | ii. a copyright notice; 230 | 231 | iii. a notice that refers to this Public License; 232 | 233 | iv. a notice that refers to the disclaimer of 234 | warranties; 235 | 236 | v. a URI or hyperlink to the Licensed Material to the 237 | extent reasonably practicable; 238 | 239 | b. indicate if You modified the Licensed Material and 240 | retain an indication of any previous modifications; and 241 | 242 | c. indicate the Licensed Material is licensed under this 243 | Public License, and include the text of, or the URI or 244 | hyperlink to, this Public License. 245 | 246 | 2. You may satisfy the conditions in Section 3(a)(1) in any 247 | reasonable manner based on the medium, means, and context in 248 | which You Share the Licensed Material. For example, it may be 249 | reasonable to satisfy the conditions by providing a URI or 250 | hyperlink to a resource that includes the required 251 | information. 252 | 253 | 3. If requested by the Licensor, You must remove any of the 254 | information required by Section 3(a)(1)(A) to the extent 255 | reasonably practicable. 256 | 257 | 4. If You Share Adapted Material You produce, the Adapter's 258 | License You apply must not prevent recipients of the Adapted 259 | Material from complying with this Public License. 260 | 261 | 262 | Section 4 -- Sui Generis Database Rights. 263 | 264 | Where the Licensed Rights include Sui Generis Database Rights that 265 | apply to Your use of the Licensed Material: 266 | 267 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 268 | to extract, reuse, reproduce, and Share all or a substantial 269 | portion of the contents of the database; 270 | 271 | b. if You include all or a substantial portion of the database 272 | contents in a database in which You have Sui Generis Database 273 | Rights, then the database in which You have Sui Generis Database 274 | Rights (but not its individual contents) is Adapted Material; and 275 | 276 | c. You must comply with the conditions in Section 3(a) if You Share 277 | all or a substantial portion of the contents of the database. 278 | 279 | For the avoidance of doubt, this Section 4 supplements and does not 280 | replace Your obligations under this Public License where the Licensed 281 | Rights include other Copyright and Similar Rights. 282 | 283 | 284 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 285 | 286 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 287 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 288 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 289 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 290 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 291 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 292 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 293 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 294 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 295 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 296 | 297 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 298 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 299 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 300 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 301 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 302 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 303 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 304 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 305 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 306 | 307 | c. The disclaimer of warranties and limitation of liability provided 308 | above shall be interpreted in a manner that, to the extent 309 | possible, most closely approximates an absolute disclaimer and 310 | waiver of all liability. 311 | 312 | 313 | Section 6 -- Term and Termination. 314 | 315 | a. This Public License applies for the term of the Copyright and 316 | Similar Rights licensed here. However, if You fail to comply with 317 | this Public License, then Your rights under this Public License 318 | terminate automatically. 319 | 320 | b. Where Your right to use the Licensed Material has terminated under 321 | Section 6(a), it reinstates: 322 | 323 | 1. automatically as of the date the violation is cured, provided 324 | it is cured within 30 days of Your discovery of the 325 | violation; or 326 | 327 | 2. upon express reinstatement by the Licensor. 328 | 329 | For the avoidance of doubt, this Section 6(b) does not affect any 330 | right the Licensor may have to seek remedies for Your violations 331 | of this Public License. 332 | 333 | c. For the avoidance of doubt, the Licensor may also offer the 334 | Licensed Material under separate terms or conditions or stop 335 | distributing the Licensed Material at any time; however, doing so 336 | will not terminate this Public License. 337 | 338 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 339 | License. 340 | 341 | 342 | Section 7 -- Other Terms and Conditions. 343 | 344 | a. The Licensor shall not be bound by any additional or different 345 | terms or conditions communicated by You unless expressly agreed. 346 | 347 | b. Any arrangements, understandings, or agreements regarding the 348 | Licensed Material not stated herein are separate from and 349 | independent of the terms and conditions of this Public License. 350 | 351 | 352 | Section 8 -- Interpretation. 353 | 354 | a. For the avoidance of doubt, this Public License does not, and 355 | shall not be interpreted to, reduce, limit, restrict, or impose 356 | conditions on any use of the Licensed Material that could lawfully 357 | be made without permission under this Public License. 358 | 359 | b. To the extent possible, if any provision of this Public License is 360 | deemed unenforceable, it shall be automatically reformed to the 361 | minimum extent necessary to make it enforceable. If the provision 362 | cannot be reformed, it shall be severed from this Public License 363 | without affecting the enforceability of the remaining terms and 364 | conditions. 365 | 366 | c. No term or condition of this Public License will be waived and no 367 | failure to comply consented to unless expressly agreed to by the 368 | Licensor. 369 | 370 | d. Nothing in this Public License constitutes or may be interpreted 371 | as a limitation upon, or waiver of, any privileges and immunities 372 | that apply to the Licensor or You, including from the legal 373 | processes of any jurisdiction or authority. 374 | 375 | 376 | ======================================================================= 377 | 378 | Creative Commons is not a party to its public 379 | licenses. Notwithstanding, Creative Commons may elect to apply one of 380 | its public licenses to material it publishes and in those instances 381 | will be considered the “Licensor.” The text of the Creative Commons 382 | public licenses is dedicated to the public domain under the CC0 Public 383 | Domain Dedication. Except for the limited purpose of indicating that 384 | material is shared under a Creative Commons public license or as 385 | otherwise permitted by the Creative Commons policies published at 386 | creativecommons.org/policies, Creative Commons does not authorize the 387 | use of the trademark "Creative Commons" or any other trademark or logo 388 | of Creative Commons without its prior written consent including, 389 | without limitation, in connection with any unauthorized modifications 390 | to any of its public licenses or any other arrangements, 391 | understandings, or agreements concerning use of licensed material. For 392 | the avoidance of doubt, this paragraph does not form part of the 393 | public licenses. 394 | 395 | Creative Commons may be contacted at creativecommons.org. 396 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | docs/chapters/intro.md -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "gitbook": ">=2.0.0", 3 | "plugins": [ 4 | "mathjax-pro", 5 | "todo", 6 | "betterchinese", 7 | "ga" 8 | ], 9 | "pluginsConfig": { 10 | "ga": { 11 | "token": "UA-51073473-3" 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /docs/.vitepress/config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | title: '编程导引', 3 | themeConfig: { 4 | nav: [ 5 | {text: "编程导引", link: '/chapters/intro'}, 6 | {text: "参考", link: '/reference/glossary'}, 7 | ], 8 | 9 | sidebar: { 10 | "/chapters/": [ 11 | { text: "引言", link: "/chapters/intro" }, 12 | { text: "环境", link: '/chapters/ch01_environment' }, 13 | { text: "计算", link: '/chapters/ch02_computation' }, 14 | { text: "过程", link: '/chapters/ch03_procedure' }, 15 | { text: "编码", link: '/chapters/ch04_encoding' }, 16 | { text: "序列", link: '/chapters/ch05_sequence' }, 17 | { text: "数据", link: '/chapters/ch06_data' }, 18 | { text: "状态", link: '/chapters/ch07_state' }, 19 | { text: "引用", link: '/chapters/ch08_reference' }, 20 | { text: "闭包", link: '/chapters/ch09_closure' }, 21 | { text: "对象", link: '/chapters/ch10_object' }, 22 | { text: "并发", link: '/chapters/ch11_concurrency' } 23 | ], 24 | "/reference/": [ 25 | { text: "概念解释", link: "/reference/glossary"} 26 | ] 27 | }, 28 | footer: { 29 | copyright: "CC-BY 4.0 Licensed | Copyright © 2015-present Kimmy Leo" 30 | }, 31 | }, 32 | 33 | markdown: { 34 | math: true 35 | }, 36 | 37 | 38 | head: [ 39 | [ 40 | "script", 41 | {}, 42 | 43 | ` 44 | var _hmt = _hmt || []; 45 | (function() { 46 | var hm = document.createElement("script"); 47 | hm.src = "https://hm.baidu.com/hm.js?bc2f9f80827718f41c02c33dc45976cb"; 48 | var s = document.getElementsByTagName("script")[0]; 49 | s.parentNode.insertBefore(hm, s); 50 | })(); 51 | ` 52 | ] 53 | ] 54 | } -------------------------------------------------------------------------------- /docs/chapters/ch01_environment.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: 简单介绍下JavaScript编程语言,以及对应的环境准备工作。 3 | --- 4 | 5 | # 环境 6 | 7 | ## JavaScript 8 | 9 | JavaScript是目前使用最广泛的编程语言之一。作为互联网和移动计算时代的基础支撑语言,从基本的生产力工具,到日常的泛娱乐平台,它活跃在每一次你浏览网站、使用App的过程中,提供基本的运算和流程保障。 10 | 11 | JavaScript的诞生和发展也颇具传奇色彩,Brendan Eich在几天的时间内设计并实现了这门编程语言,影响了后面几十年的软件和技术的发展。如今几乎每一个设备都接入了JavaScript,深入到了我们生活的方方面面。作为一门工业级的编程语言,JavaScript由欧洲计算机制造商协会(ECMA)制定标准化的行为和定义,来规范这个语言的使用和发展方向。TC39技术委员会也一直在更新JavaScript的功能,让这个有二十多年历史的旧技术不断焕发新的活力。 12 | 13 | JavaScript的环境触手可及。在电脑端你可以随时打开一个现代的浏览器,页面上右键菜单中选择“Inspect”或者“查看/检查元素”,选择“控制台(Console)”标签。如果你是在移动端或者浏览器不支持,也可以通过一些工具比如[移动端Console](http://code.hnldesign.nl/demo/hnl.MobileConsole.html)来体验JavaScript控制台。 14 | 15 | ## 编写代码 16 | 17 | 当需要写大量代码组合使用的时候,你可以通过本地编辑Web页面的方式来编写JavaScript代码。JavaScript是Web端的基本编程语言,可以稳定地运行在大多数现代浏览器中。 18 | 19 | 通过文件编辑器创建下面的代码,命名为`index.html` 20 | 21 | ```html 22 | 23 | 24 | 25 | 26 | Introduction to Programming 27 | 28 | 29 | 32 | 33 | 34 | ``` 35 | 36 | 在``之间,就是你编写JavaScript代码的地方。编写完成后,用浏览器打开(或者刷新)这个文件,就能看到对应的效果和执行内容。 37 | 38 | 比如上面的代码,就是在控制台打印“hello world”。 39 | 40 | 本书推荐使用[Visual Studio Code](https://code.visualstudio.com/)作为基本的代码编辑工具。你可以在官网进行下载和安装。官网也有详细的使用教程。 41 | 42 | MDN 中对[浏览器开发者工具](https://developer.mozilla.org/zh-CN/docs/Learn/Discover_browser_developer_tools)和[基本的工具软件](https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web/Installing_basic_software)有更为完整的介绍,可以参考。如果你想了解更多关于Web设计和开发的知识,MDN也有完备的文档供参考。 43 | 44 | 一切准备就绪的话,我们就开始吧。 45 | -------------------------------------------------------------------------------- /docs/chapters/ch02_computation.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: 计算机可以完成哪些基本运算?如何把运算进行组合?如何进行函数封装?如何实现递归? 3 | --- 4 | 5 | # 计算 6 | 7 | 编程语言是人与计算机打交道的一个重要工具。 8 | 9 | 计算机(Computer)是干嘛的?当然是计算(Computing)啦。 10 | 11 | 在浏览器的控制台输入以下代码: 12 | 13 | ```javascript 14 | 1 + 1 15 | ``` 16 | 17 | 是不是有看到浏览器在回应你:`2`。这里基本上是能够当成一个计算器用的。 18 | 19 | 没错,这就是计算嘛。 20 | 21 | 然而,有什么用呢? 22 | 23 | ## 计算 24 | 25 | 简(pian)单(mian)地讲,一切问题都能抽出来一套数学模型,同样能够抽出来的数学模型都可以转化成计算问题,然后让计算机来解决。 26 | 27 | 所以**计算**可以看成是整个程序设计的基础。同样像我们之前提到的,计算机,本身也就是拿来做计算的。 28 | 29 | 那么我们都可以做哪些计算呢? 30 | 31 | 当然普通的$+ - \times(*) \div(/)$不用说,你还可以把一些复杂的计算规则定义成函数: 32 | 33 | ```javascript 34 | function pow5(num) { 35 | return num * num * num * num * num; 36 | } 37 | ``` 38 | 39 | 比如`pow5`的意思就是求一个数的5次方。我们定义了一个函数,怎么用呢? 40 | 41 | 然后尝试下面的代码: 42 | ```javascript 43 | pow5(1) 44 | ``` 45 | 46 | 嗯,没错,输出了我们期望的结果(`1`)。 47 | 48 | ## 组合 49 | 50 | 什么是组合呢? 51 | 52 | 想想我们学习函数和多项式的时候, 53 | 54 | $$ 55 | f(x) = x^2 + 2x + 1 56 | $$ 57 | 58 | $$ 59 | g(x) = (x+3)(x-5) 60 | $$ 61 | 62 | 然后我们要定义一个$h(x) = f(g(x))$,那么定义出来的$h(x)$长什么样呢? 63 | 64 | 我们首先要把$g(x)$代入$f(x)$, 65 | 66 | $$ 67 | f(g(x)) = g(x)^2 + 2g(x) + 1 68 | $$ 69 | 70 | 即 71 | 72 | $$ 73 | f(g(x)) = [(x+3)(x-5)]^2 + 2 * (x+3)(x-5) + 1 74 | $$ 75 | 76 | 好吧我编不下去了。总之展开来以后很丑的。 77 | 78 | 而且如果以后遇到$\sigma(x,y,z)$跟$\theta(a,b,c)$组合的,或者是更多参数的函数组合,结果更是可想而知。 79 | 80 | 但是在JavaScript里面我们并不用担心这个问题。 81 | 82 | 比如我们有两个函数 83 | 84 | ```javascript 85 | function f(x) { 86 | return x*x + 2*x + 1; 87 | } 88 | 89 | function g(x) { 90 | return (x+3) * (x-5); 91 | } 92 | ``` 93 | 94 | 那么我们的$h(x)$可以很简单的写成这个样子: 95 | 96 | ```javascript 97 | function h(x) { 98 | return f(g(x)); 99 | } 100 | ``` 101 | 102 | 或者你也可以不用专门去定义,在用到的时候直接用就可以: 103 | 104 | ```javascript 105 | f(g(5)) 106 | // or 107 | h(5) 108 | ``` 109 | 110 | ### 组合的意义 111 | 112 | 比如我们可以考虑一个更复杂的函数, 113 | 114 | $$ 115 | \sigma(x,y) = x^2 + x*y + (x+y)\times5 116 | $$ 117 | 118 | 当 $x, y$ 分别为 $4x+1,5x-3$的时候。你可以试着自己去展开一下这个算式: 119 | 120 | $$ 121 | \sigma(4x+1, 5x-3) = 122 | (4x+1)^2 + (4x+1)(5x-3)+(4x+1+5x-3)\times 5 123 | $$ 124 | 125 | 总之,无论他有多长,都会在算式里面充斥着$4x+1$和$5x-3$,而且,计算机并没有那么聪明,所以只好按照特定的顺序一次次的计算。 126 | 127 | 于是$4x+1$被重复计算了三次,$5x-3$被重复计算了两次。对于`pow5`那种情况,更是会被求值5次。 128 | 129 | 令人欣慰的是,组合帮我们保证了这个问题不会有这些重复。 130 | 131 | 当你计算`pow5(3+1)`的时候,JavaScript并不会去展开成`(3+1)*(3+1)...*(3+1)`这种形式,而是直接变成了`pow5(4)`,最后的结果是1024。 132 | 133 | 也就是说,函数的每个自变量(编程语言里面我们会把他们叫做参数(argument))会先被求值,得到他们的值以后才会带入计算。 134 | 135 | \*请记住我们现在讨论的这个问题,后面会展开并且深入地探讨。 136 | 137 | ## 练习 138 | 139 | * 请思考,如果函数的参数在代入函数之前并不进行强制求值,`pow5(pow5(pow5(pow5(5))))`展开后共计算多少次乘法。 140 | * 强制求值可能会造成的问题有哪些。 141 | 142 | -------------------------------------------------------------------------------- /docs/chapters/ch03_procedure.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: 程序的基本控制结构有哪几种?递归和循环的区别是什么?短路求值的作用是什么? 3 | --- 4 | 5 | # 过程 6 | 7 | 什么是过程呢? 8 | 9 | 凭经验我们就能知道,实际的问题并不是像理想中那么简单,不是一个表达式就能描述的清楚的,而且也并不一定能通过组合来直接解决。 10 | 11 | 甚至是简单的数学问题,也不能用他们来解决。比如: 12 | 13 | $$ 14 | |x| 15 | = abs(x) = \begin{cases} 16 | x, &x\ge0 \\ 17 | -x, &x\lt0 18 | \end{cases} 19 | $$ 20 | 21 | 求绝对值,或者 22 | 23 | $$ 24 | pow(x,y) = \prod_{1}^{y}{x} 25 | $$ 26 | 27 | 求积。 28 | 29 | 其中一个需要我们根据参数的值,来选择不同的计算方式,返回不同的结果;另外一个则是通过对特定的表达式做一个累乘(没错其实行为跟乘方是一样的,所以我把它叫 pow)。 30 | 31 | 我们先看累乘。 32 | 33 | ## 累乘 34 | 35 | 如果我们已知指数的话,要写起来是很简单的: 36 | 37 | ```javascript 38 | function pow1(x) { return x; } 39 | function pow2(x) { return pow1(x) * x; } 40 | function pow3(x) { return pow2(x) * x; } 41 | function pow4(x) { return pow3(x) * x; } 42 | function pow5(x) { return pow4(x) * x; } 43 | ``` 44 | 45 | 这样写其实是符合pow的定义的。 46 | 47 | 然后其实我们可以把它变换一下: 48 | 49 | ```javascript 50 | // 伪代码,无法正确运行 51 | function pow(x, 1) { return x; } 52 | function pow(x, 2) { return pow(x, 1) * x; } 53 | function pow(x, 3) { return pow(x, 2) * x; } 54 | function pow(x, 4) { return pow(x, 3) * x; } 55 | function pow(x, 5) { return pow(x, 4) * x; } 56 | ``` 57 | 58 | 所以我们得到了pow函数的另一个形式: 59 | 60 | $$ 61 | pow(x, y) = \begin{cases} 62 | x, &y=1 \\ 63 | pow(x, y -1)\times x, &y>1 64 | \end{cases} 65 | $$ 66 | 67 | 没错我们又归结到了选择结构上。后面我们会拿这个来讨论。现在只是简单提一提。 68 | 69 | 哦对了,现在pow的这个形式叫做递归定义,数学上叫递推关系式(好像又叫归纳定义?)。 70 | 71 | 好的,我们回到$\prod$运算符上来。 72 | 73 | 根据前面的分析,我们可以知道,如果能够拿到前面一个乘积,然后和第y个相乘,,就可以得到我们要的结果。 74 | 75 | 于是我们假设那第`y-1`个乘积是`prod`,最终的结果就是`prod*x`。再往前推`prod`,这个关系是基本上不变的。 76 | 77 | 那么,我们只要有一个东西来保存前面的结果,再跟后面的相乘之后更新保存的结果就可以了。 78 | 79 | 这个能保存数据的东西我们把它叫做变量(Variable)。 80 | 81 | 比如最开始`prod = 1`,然后`prod = prod * x`,会把`prod`与`x`相乘的结果计算出来,再保存进`prod`里面。 82 | 83 | 所以我们可以简单地把这个计算看成 84 | 85 | ```javascript 86 | let prod=1 87 | prod=prod*x; 88 | prod=prod*x; 89 | prod=prod*x; 90 | ... 91 | prod=prod*x; // 执行y次 92 | ``` 93 | 94 | 那么怎么让他能够只执行`y`次呢? 95 | 96 | ## 循环 97 | 98 | JavaScript提供了一种东西叫做循环语句。 99 | 100 | 大概是长这个样子的 101 | 102 | ```javascript 103 | let prod=1; 104 | for(let i = 1; i <= y; i = i+1) { 105 | prod = prod*x; 106 | } 107 | ``` 108 | 109 | 这个叫循环语句,意思就是,在满足指定条件的情况下,会一直去执行语句体(花括号之间)的内容。 110 | 111 | 上面那段代码的意思是,让`prod`初值为1,让`i`从1开始,每次增加1,如果`i`小于等于`y`的话,执行`prod = prod*x`,否则跳出循环。 112 | 113 | 确实很复杂,特别是比起上面那个递归定义来。 114 | 115 | 我们对它进行一个简单的改写。 116 | 117 | 一般来说,程序员是从 $0$ 开始计数的。于是从 $1$ 到 $y$,就变成了从 $0$ 到 $y-1$,进一步地`i <= y-1`又可以进一步地写成`i < y`(反正都是整数,证明我就不给了),这样条件就简化掉了一个符号。 118 | 119 | 另外,但凡类似`x=x+y`这种的,都可以写成`x+=y`,特别地,当运算符为`+`和`-`,同时`y`为1的时候,可以直接写成`x++`或者`x--`; 120 | 121 | 于是一个典型的循环就出来了: 122 | 123 | ```javascript 124 | let prod=1; 125 | for(let i = 0; i < y; i++) { 126 | prod *= x; 127 | } 128 | ``` 129 | 130 | 那么我们的pow函数也有了: 131 | 132 | ```javascript 133 | function pow(x, y) { 134 | let prod=1; 135 | for(let i = 0; i < y; i++) { 136 | prod *= x; 137 | } 138 | return prod; 139 | } 140 | ``` 141 | 142 | ## 选择 143 | 144 | 好的,回头来看我们的abs函数。 145 | 146 | 我们要根据x的符号来决定时返回x还是他的相反数。 147 | 148 | JavaScript让我们能通过选择语句`if...else...`做这件事。 149 | 150 | ```javascript 151 | function abs(x) { 152 | if(x >= 0) { 153 | return x; 154 | } else { 155 | return -x; 156 | } 157 | } 158 | ``` 159 | 160 | 当然`if/else`还有一种简单的形式,可以让我们写起来更省力。 161 | 162 | ```javascript 163 | function abs(x) { 164 | return (x >= 0) ? x : -x; 165 | } 166 | ``` 167 | 168 | `?:`运算符共有三部分,问好前面是判断条件,问号后面由冒号分成两部分,如果判断条件为真,那么返回冒号与问号之间的,否则返回冒号之后的。 169 | 170 | ## 递归 171 | 172 | 好的,这样子我们就能完善我们前面写的递归定义的pow了。 173 | 174 | ```javascript 175 | function pow(x, y) { 176 | return (y == 1) ? x : pow(x, y-1) * x; 177 | } 178 | ``` 179 | 180 | 不能比循环的明白更多。 181 | 182 | ### 尾递归 183 | 184 | 尾递归这个概念可以简单做个了解。主要是因为如果有了尾递归,编译器就可以更好的优化程序的执行过程。而且更重要的一点是,尾递归跟循环几乎是一一对应的关系。 185 | 186 | 我们先简单的把这个实现写出来吧。 187 | 188 | ```javascript 189 | function pow(x, y, prod = 1) { 190 | return (y == 0) ? prod : pow(x, y-1, prod*x); 191 | } 192 | ``` 193 | 194 | 怎么转换到循环的呢? 195 | 196 | 首先我们提取出变量来。 197 | 198 | ```javascript 199 | function pow(x, y, prod = 1) { 200 | if (y == 0) { 201 | return prod; 202 | } 203 | y = y - 1; 204 | prod*=x; 205 | return prow(x, y, prod); 206 | } 207 | ``` 208 | 209 | 正式写成循环 210 | 211 | ```javascript 212 | function pow(x, y, prod = 1) { 213 | for(;y != 0;) { // or while(y != 0) 214 | y = y - 1; 215 | prod*=x; 216 | } 217 | return prod; 218 | } 219 | ``` 220 | 221 | 改写成递增的变量 222 | 223 | ```javascript 224 | function pow(x, y) { 225 | let prod = 1; 226 | for(let i = 0; i < y; i++) { 227 | prod *= x; 228 | } 229 | return prod; 230 | } 231 | ``` 232 | 233 | ## 短路求值 234 | 235 | 试想一下我们的递归版pow代码 236 | 237 | ```javascript 238 | function pow(x, y) { 239 | return (y == 1) ? x : pow(x, y-1) * x; 240 | } 241 | ``` 242 | 243 | 如果这里你把函数自身的调用写成了`pow(x, y) * x`,结果会是怎么样的呢? 244 | 245 | 如果这样写,y作为一个计数器并没有递减,那么每回调用都会跟当前调用一样传递相同的参数进去。 246 | 247 | 于是会一在重复递归地调用`pow(x, y)`,直到不能再调用导致栈溢出。 248 | 249 | 然而一定是这样吗?你可以调用一下`pow(4, 1)`试试,会正常输出`4`。 250 | 251 | 为什么会有这种不同呢? 252 | 253 | 上一讲,我们提到了组合的概念,说,通过组合会强制求值每一个传递给函数的参数,但是当我们把这个东西忘`?:`操作符上套的时候,并没有效果。 254 | 255 | 这种特性叫做短路求值(short-circuit evaluation),对于`?:`来说,只有当条件为真的时候才去求值真分支,为假的时候才去求值假分支。 256 | 257 | 所以如果写错的那个pow,当`y == 1`的时候,还是能够正常执行的。 258 | 259 | ## 过程 260 | 261 | 一个再复杂的流程,最终都会由这样的三部分组成: 262 | 263 | * 顺序 264 | * 分支(选择) 265 | * 循环 266 | 267 | 根据我们前面提到的组合的思想,再复杂的过程都能通过这些来组合解决。 268 | 269 | ## 练习 270 | 271 | * 试写出求阶乘、求斐波那契数等函数的循环、递归和尾递归版本的实现。 272 | * 用以上代码解释短路求值 273 | * 请使用顺序、分支、循环来描述现实中的一些过程。 274 | 275 | -------------------------------------------------------------------------------- /docs/chapters/ch04_encoding.md: -------------------------------------------------------------------------------- 1 | # 编码 2 | 3 | 这里的编码(Encoding)当然不是指简单的编写代码。 4 | 5 | 为什么会有这个概念呢。 6 | 7 | 想想古老的印度人是怎么表示数字的吧:用十个不同的符号和位序组合来表示一个确切的数字,演化成今天我们的用阿拉伯数字(Arabic Numerials)表示的十进制系统。 8 | 9 | 没错就是你身边到处都存在的**数字**。这套系统只需要简单的十个符号和并不怎么复杂的规则就能从0表示到任意大的确切数字。 10 | 11 | 我们在第二讲中提到,代码中的表示的“整数”,跟数学意义上的整数,是有所差距的。这个差距其宗之一就在于表示数字的能力上。 12 | 13 | 比如,我们来计算$2^{70}$: 14 | 15 | ```javascript 16 | pow(2, 70); 17 | ``` 18 | 19 | 嗯,结果是什么鬼(`1.1805916207174113e+21`,特别是后面这段)! 20 | 21 | 也就是说,我们能直观表示的整数也就21位(十万亿亿级),再之后就只能用科学计数法表示了。 22 | 23 | 实际你会发现,其实还没到这个数量级的时候,数字就已经无法精确表示了。 24 | 25 | 为什么会这样呢? 26 | 27 | ## 二进制 28 | 29 | 跟阿拉伯数字系统一样,计算机内部也是利用位序来表示数值,但犹豫数字电路只有通和断两种状态,所以,相当于每位上只能有两种状态,作为传统,我们将用0和1来表示这两种状态。 30 | 31 | 然后我们就会看到计算机努力的表示数字: $0,1,10,11,100,101,110,111,1000,1001,1010$ 等你都觉得脑袋大了,计算机才数到10,不过其实关于这个问题并不需要你操心太多,反正跟阿拉伯数字一样,只要足够长,任意大的数都可以表示。 32 | 33 | 可是我们之前使用的过程告诉我们,其实并不是这样的。为什么呢? 34 | 35 | ### 定长 36 | 37 | 既然计算机表示数字就是靠0和1,那么如果我要表示多个数字,怎么来区分呢? 38 | 39 | 比如,你知道下面究竟是1,2,3,4还是13, 14? 40 | 41 | ```javascript 42 | 11011100 43 | ``` 44 | 45 | 于是其实我们可以思考一下,出了数值,还有什么可以利用的。 46 | 47 | 长度。(以及其实你也可以用霍夫曼编码。) 48 | 49 | 当我规定用于表示数据的长度必须是一定(比如4位)的时候,表示数据就特别地清晰了: 50 | 51 | ```javascript 52 | 0001 0010 0011 0100 53 | ``` 54 | 55 | 就可以表示1,2,3,4这四个数。而上面那个我们理解不了的序列,也可以解释成13,14这两个数。 56 | 57 | 当你去规定一种解释二进制序列的方法的时候,其实你就是在定义一种**编码**。 58 | 59 | 二进制序列中,每个0或者1,叫一个bit(位),特定长度(一般是8)的基本解释单位,叫做byte(字节),这个特定长度,据说是依据当前系统中表示基本的字符编码的长度来确定。 60 | 61 | 换句话说,编码不仅仅是能用来表示数字的。 62 | 63 | ## ASCII 64 | 65 | 现在提到字节大家都会反应是8位,就是因为这个东西。 66 | 67 | 全名叫American Standard Code for Information Interchange(美国标准信息交换码)。 68 | 69 | 这套代码从上世纪60年代一致用到现在,足以说明有多么经典。然而我们先不说他是什么,简单的从我们自己的角度出发先设计一套东西。 70 | 71 | ### 字符集 72 | 73 | 要知道美国人民的生活很是单调的,每天就面临大小写加起来四十多个字母,十个阿拉伯数字,以及十多个常用的标点符号。对比起来,深深地为自己的母语感到自豪。 74 | 75 | 当然,美国人民日常使用的字符量少,在信息化的时代,其实是有优势的,比如,把他们常用的字符加起来也就100个左右,而$2^{6} \lt 100 \lt 2^7$,所以我们只要有长度为7位的二进制串长度就能把美国人民用的那些字符给完全表示出来。 76 | 77 | 比如我们可以定义,0000000 ~ 0001001 表示数字字符0-9, 0100001 ~ 0111010 表示大写字母字符的A-Z,1000001 ~ 1011010表示小写字母字符的a-z,于是我们就能对把对应的字母变成相应的编码了。 78 | 79 | 但是老是这样看着满屏的0和1,总是会感觉眼花。既然都是表示数据,并不是说相同的东西,计算机看到长什么样子,我们就要看一样的。只要是能够表示相同的数据,完全可以换一种我们更习惯的方式来表示。 80 | 81 | ### 十六进制 82 | 83 | 比如我们可以使用十六进制(Hexadecimal)代替二进制(Binary),也就是说,同一个位上面共有16个状态,习惯上分别用0-9加上a-f来表示,同时,为了与十进制表示进行区分,一般会加上0x前缀或者h后缀。对于刚刚的字符编码来说,就可以用0x00 ~ 0x09 表示 数字字符,0x21 ~ 0x3A 表示大写字母A-Z,0x40 ~ 0x5A表示小写字母a-z。 84 | 85 | #### 为什么是十六进制而不是其他的十二进制或者十八、二十四进制呢? 86 | 87 | 我们可以简单的做一个对比: 88 | 89 | ``` 90 | Bin 0001 0010 0011 .... 1010 1011 1100 1101 1110 1111 91 | Hex 1 2 3 A B C D E F 92 | Dec 1 2 3 10 11 12 13 14 15 93 | ``` 94 | 95 | 十六进制的一位刚好一一对应二进制的每四个位。 96 | 97 | 于是本来用二进制表示起来很冗长的东西,用十六进制可以比较轻松的表述出来。而且相互之间的转换也很容易。 98 | 99 | 相反生活中常用的十进制跟二进制对应的就不那么协调,所以一般也比较少用,只要知道对应的位上的值就好。 100 | 101 | 也就是说,只要能够数 102 | 103 | $$ 104 | 1,2,4,8,16,...,1024,2048,...,32768,65536, 105 | 131072,...,2147483648 106 | $$ 107 | 108 | 嗯,我觉得如果你玩过2048的话一定不会对前面的那些数字感到陌生。 109 | 110 | ### ASCII 111 | 112 | 嗯,ASCII跟我们想的一样,选择了8位作为实际的长度,同时加入了一些必须要用到的特殊字符(比如制表符tab 0x09,回车记号carriage return 0x0D,换行符line feed 0x0A..),以及一些控制字符(比如空字符NUL 0x00,文件结束符EOF等)。于是整体的设计相对于我们的想法有一些偏移: 113 | 114 | * `\x30` ~ `\x39` 表示0-9 115 | * `\x41` ~ `\x5a` 表示A-Z 116 | * `\x61` ~ `\x7a` 表示a-z 117 | 118 | 好的我们来试试吧: 119 | 120 | ```javascript 121 | '\x41' 122 | ``` 123 | 124 | 125 | 我们可以直接用引号`'`括起来单个字符,在程序中直接拿来使用。同时也可以反过来看: 126 | 127 | ```javascript 128 | let a_char = 'a'; 129 | a_char.charCodeAt(0).toString(16) 130 | ``` 131 | 132 | 133 | ### CJK字符集 134 | 135 | CJK(有时候也会带上V),是China,Japan,Korea(和Vietnam)的统称,在这些地区,因为同遗传自古汉语,字符的数量可是非常之多,8位的ASCII根本就没办法保存这么多东西。 136 | 137 | 于是随着各种语言诞生了各种编码,比如`GB2312` 简体中文,`Big-5` 繁体中文,`Shift-JIS` 日文等。这些编码并不是相互兼容的,于是一般对于特定的内容,需要专门指出其编码。同样地,当你尝试去一种编码来解释另外一种编码的文本时,就会出现**乱码**的情况。注意这个时候并不是你电脑中毒了。 138 | 139 | ### Unicode 140 | 141 | 所以就有人想,不如把所有的编码都统一了吧,于是就出现了Unicode。 142 | 143 | 现行版本的Unicode加入了世界上能够找到的绝大多数语言的符号(嗯,包括emoji),然后将这些符号分类整理,统一编码。于是,在理想情况下,大家都使用Unicode字符集的话,就不会出现乱码的错误了。 144 | 145 | Unicode包含的字符量足够的多,于是就要设计比ASCII更充分大的表示方式才能够容纳所有的符号。最初选择的是每个字符使用16位的二进制串来表示,这样的话一个中文字符虽然会超出8位范围之外,还是能够表示得出来,这种方法被称为UTF-16。 146 | 147 | 然而不久就发现,符号的数量(就算仅仅是中文字符)远远多于65536个,于是又进一步地扩充到了32位,可以表示到上亿个字符了,目前为止还要很久才会资源枯竭,这种方法类似地,被称为UTF-32。 148 | 149 | 然而UTF-32有个很致命的缺点。 150 | 151 | 对于西方人来说,并没有CJKV地区的人的需求,1个字节就能足够表示他们的符号,而UTF-32硬生生地为了统一,要求字母字符也要用4个字节来表示,这样就让空间整整大了4倍,而且另外3倍的空间完全是浪费掉的,没有任何作用。 152 | 153 | 但是,为了兼容,没办法。 154 | 155 | ### UTF-8 156 | 157 | 于是为了解决这个浪费空间的问题,UTF-8出现了。这是来自Ken Thompson的设计,他给整个IT界贡献了不少东西,Unix、C语言、UTF-8。 158 | 159 | 简单来说就是,在保持与ASCII兼容的情况下,通过添加一些标记来支持更长的编码。 160 | 161 | 具体的做法当然维基百科介绍的比我更清楚,这里提起来只是要说这么一个思路:变长编码(Variable-Width Encoding)。因为比较重要的就是在设计的过程中考虑变量和不变量,以及设置各种标志和不同的数据区块解释方式,这样就可以把简单的二进制序列变成我们想要的任意数据。 162 | 163 | 当然,这里的思想我们会在第6章详细地展开。 164 | 165 | ## 数系的扩充 166 | 167 | 你有没有尝试计算JavaScript里面`1/3`的结果? 168 | 169 | 当我们需要小数的时候又该如何表示呢? 170 | 171 | 这个问题留作练习。 172 | 173 | 作为参考答案,你可以搜索IEEE754。 174 | 175 | -------------------------------------------------------------------------------- /docs/chapters/ch05_sequence.md: -------------------------------------------------------------------------------- 1 | # 序列 2 | 3 | 你应该记得,我们在编码那一张提过如何表示多个数字的,没错,定长编码可以帮我们解决这个问题,帮我们界定数字之间的边界。但是,当我们要表示的数据不只是一组的时候,又该怎么来界定边界? 4 | 5 | 比如,我们有两组数,分别是$1,3,5,7,9,11$和$0,2,4,6,8,10$,假设以一个字节(十六进制)表示的话,就是下面这个样子的: 6 | 7 | ```cpp 8 | 0x01030507 0x090B0002 0x0406080A 9 | ``` 10 | 11 | 好的,接下来请完成以下任务: 12 | 13 | * 找到第二个序列中的第三个数。 14 | 15 | 嗯,是不是感觉自己懵了,如果不知道第一组有几个的话你是不可能准确找到这个数字的。 16 | 17 | 于是我们得到了一个简单的界定序列边界的方法,就是要知道各序列对应的长度。 18 | 19 | 比如我们知道这两个序列是连续放在一起的,第一个序列长度是$6$,同时也知道要找的是第二个序列的第三个数,那么这个数就应该是第$6+3$个数字。 20 | 21 | 当然,这个数字要从$1$数过去才行,否则从任意其他的位置数,都不能得到我们想要的结果。 22 | 23 | ## 长度 24 | 25 | 我们可以看到,界定一个序列,必须要知道的是两点,第一个是他的起始元素,第二个就是这个序列的长度。 26 | 27 | 一般来说,当这个序列的长度固定不变,并且每个元素是挨在一起的时候,我们常把它叫做array。 28 | 29 | > 关于array,我非常不喜欢“数组”这个翻译,因为这里面并不一定是数,也有可能是符,所以我会尽可能地使用array来表示它。 30 | 31 | 在JavaScript中,定义一个array如下: 32 | 33 | ```javascript 34 | let nums = [1, 2, 3, 4, 5] 35 | ``` 36 | 37 | 对于array来讲,初始元素是方括号中的取值为0的时候的值。在方括号中的值我们称之为index(**索引**,奇葩翻译一般叫做**下标**)。这些索引以数字的形式出现,作为序号来表示数据在序列中的位置。 38 | 39 | 有个重点是,这里的索引是从$0$开始,最大是$序列长度-1$,这其实也就是为什么我们在第三章讲过程的时候提到循环的写法的一个原因。 40 | 41 | 不过对于遍历序列来说还支持另外一种写法。 42 | 43 | ```javascript 44 | 45 | for(let item of nums) { 46 | console.log(item); 47 | } 48 | ``` 49 | 50 | 不需要你去管什么索引了,这样子写就像是在说 51 | 52 | ```javascript 53 | 对于 nums 里面的 item 54 | 输出 item 的值 55 | ``` 56 | 57 | 当然,在Python中看起来更自然: 58 | 59 | ```python 60 | for item in nums: 61 | print(item) 62 | ``` 63 | 64 | ## 串 65 | 66 | JavaScript中的字符串与array类似,自己维护了长度。但在早期的一些编程语言(如C语言)中,是没有做这种记录的,取而代之的是使用一个特定的标志来表示,这里是最后一个值为空。这种字符串也有另外一个名字,叫空结尾串(Null-terminated String)。 67 | 68 | 这种特殊标记就可以让我们界定一个序列的边界的另外一种方式。 69 | 70 | 我们可以来简单模拟一下这个行为: 71 | ```javascript 72 | let content = ['h', 'e', 'l', 'l', 'o', null]; 73 | 74 | // 求长度: 75 | 76 | function length(nts) { 77 | let length = 0; 78 | for (let item of nts) { 79 | if (item != null) { 80 | length ++; 81 | } else { 82 | break; 83 | } 84 | } 85 | return length; 86 | } 87 | 88 | length(content) // 5 89 | ``` 90 | 91 | 而实际存放这个串的空间大小: 92 | ```javascript 93 | content.length // 6 94 | ``` 95 | 96 | ## 可变长序列 97 | 98 | 试想你在一个笔记本上记录内容,每一行算是一个条目,当一页记录满以后,并不能连续地往下面记了,就需要翻到下一页纸。 99 | 100 | 连续不连续并不重要,重要的是我们能从这一页翻到下一页。 101 | 102 | 对应到我们的序列表示上,只要当前元素能够记录下一个元素的位置,是不是就表示我们的序列就能从第一个元素全部找出来了呢? 103 | 104 | 就像这张图片描述的: 105 | 106 | ![list](../res/images/cons-cells.png) 107 | 108 | 这种结构被称为链接列表(也叫链表,Linked List)在上世纪五十年代就已经设计用于实际的程序。链表这种结构非常的灵活,可以很轻松的在任意位置添加或者删除数据。因为并不需要内存结构上的连续,所有的位序关系都是靠前一个元素和后一个元素之间的链接关系来确定,而添加或者删除数据只要改变一下这种链接关系就可以了。 109 | 110 | 但是对于链表来说一个很大的问题就是访问数据。比如我们要访问链表的第n个元素的时候,对于array和串这种结构来说,因为内存空间上是连续的,直接做一次加法就能找到,但是对于链表来说每次都要从第一个元素开始找起。而且,这种形式的链表又称作单链表(Singly Linked List),是没有办法从尾部往头部走的。 111 | 112 | 所以,在单链表的基础上,又构造了双链表(Double Linked List),每一个元素除了纪录自己对应的下一个元素之外,还要保存自己对应的上一个元素。这种时候如果做一些相邻元素的访问,就比单链表高效了一些。 113 | 114 | 比如,当我访问列表中第7个元素,然后再去访问第6个的时候,只要从第7个元素向前查找一次就可以了。 115 | 116 | 也许以后你可能还会听说到循环链表(Circular Linked List),或者是其他的形式,这些都离不开最初链表的思想:把数据和位置做关联。 117 | 118 | ## 线性结构 119 | 120 | 我们简单的做一个总结。 121 | 122 | 对于array,string和list我们都称为序列,原因其实是显而易见的。 123 | 124 | 首先,他们满足这样一点:所有的都是从头到尾连续地组织在一起,从任何地方出发都能找到下一个元素或者是到序列尾部。就像是在头和尾之间有一条线把他们串起来一样,而且在逻辑表示上,我们也是把他们放成一串。 125 | 126 | 另外,对于每一个元素,他们在序列中的位置是固定的,换句话说,序列中的元素是有前后顺序的。当我任意交换两个元素的位置,得到的新序列就跟原来的序列是不同的。 127 | 128 | 第三点就是,当我们从第一个元素开始找下去的时候,总是能找到最后一个元素(对于没有最后一个元素的情况,我们会在以后进行探讨)。 129 | 130 | 总结下来就是,序列是线性的(Linear)、有序的(Ordered,类比“排序过的(Sorted)”)和有穷的(Finite)。 131 | 132 | ## 生成器 133 | 134 | 很多时候我们的序列是通过某种规则产生的,而这种规则 135 | 136 | ### 练习:最长公共子序列(Longest Common Subsequence) 137 | 138 | 通常我们会对两个序列的内容进行对比,比较这两个序列有什么地方不同。这就是典型的LCS问题。LCS的应用很多,大部分版本控制系统的核心逻辑中就有它的存在。 139 | 140 | 请参阅Wikipedia对LCS问题的分析和讨论,尝试实现求LCS的算法,并试分析该算法要求迭代器至少要属于哪个category。 141 | 142 | -------------------------------------------------------------------------------- /docs/chapters/ch06_data.md: -------------------------------------------------------------------------------- 1 | # 数据 2 | 3 | 很多时候我们要处理的东西并不只是一个简单的数据,或者是一个由多个数据组成的简单序列。比如,当我们要考虑一间房子,关注的是户型、面积和位置等,考虑一辆汽车,关注的是性价比、能耗和易用性等,考虑一个学生,关注的是他的学号、姓名、各科成绩等。 4 | 5 | 很多时候我们也需要考虑一系列的符号,比如房屋的户型、汽车的品牌,这些在一定程度上固定的内容,并不需要专门去用字符串处理。 6 | 7 | 这种时候,序列、引用和各种标量(Scalar)类型都不能很好的满足我们的需要。 8 | 9 | 我们来做一个简单的示范吧。 10 | 11 | ## 结构 12 | 13 | 比如,我们要表示一辆车,其中包括他的品牌、价格和最高时速。在当前的情况下,最合适的方式就是采用长度为3的array,约定好第0位表示品牌,第1位表示价格,第2位表示最高时速。于是我们可以得到以下的设计: 14 | 15 | ```javascript 16 | let car = [1, 500000, 180] 17 | ``` 18 | 19 | 于是我们就能够很轻松地(并丑陋地)表示汽车了。 20 | 21 | 这种写法虽然算是比较方便,但是还是有很多问题的。 22 | 23 | 比如,每次我们都需要多写很多个函数,比如所有的元素都必须是同一个类型的。 24 | 25 | 所以大多数编程语言都提供结构(Structure)或者记录(Record)类型,来简化我们实现这个的过程。 26 | 27 | 比如,在JavaScript中我们可以很简单的把Car表示如下: 28 | 29 | ```javascript 30 | let car = { 31 | brand: 'Nissan', 32 | price: 500000, // USD 33 | speed: 180 // MPH 34 | } 35 | ``` 36 | 37 | 这是一个结构(struct),其中包含了三个域(field,也叫字段)。比起还要反复地写各种函数来,要简单和方便很多。 而且,各个字段的类型可以不同。 38 | 39 | 这样子我们就能通过Car来表示一辆汽车了: 40 | 41 | ```javascript 42 | car.brand 43 | ``` 44 | 45 | 很简单吧。 46 | 47 | 那么,结构的本质到底是什么呢? 48 | 49 | 回到本章开始我们的讨论。房子、汽车、学生,这些概念性的实体(Entity)都有一些自己本身的属性(Property),以及与其他实体之间的关系(Relation)。 我们可以给这些实体的属性和关系贴上一个个标签,把他们与所属的实体之间关联起来。这样就组成了我们现在看到的结构。 50 | 51 | 当然,他还是数据,但是这些数据通过我们贴上不同的标签以及把他们关联组合,就变成了更加具有实际意义的内容。换句话说,我们给一块二进制内存区赋予了语义(Semantics)。 52 | 53 | 来让我们看一下其他的许多结构吧。 54 | 55 | 复数, 56 | 57 | ```cpp 58 | let complex = { 59 | real: 1, 60 | image: 1 61 | }; 62 | ``` 63 | 64 | 分数, 65 | 66 | ```cpp 67 | let frac = { 68 | numerator: 1, 69 | denominator: 2 70 | }; 71 | ``` 72 | 73 | 甚至是,用数据代替表达式, 74 | 75 | ```cpp 76 | let arith = { 77 | optr: '+' 78 | leftOperand: 1, 79 | rightOperand: 2 80 | }; 81 | ``` 82 | 83 | 以及,更多复杂的结构。 84 | 85 | ## 递归数据类型 86 | 87 | 看到这里也许你开始担忧了。什么是递归数据结构(Recursive Data Type)? 88 | 89 | 这里我们要拿前面提到的一个例子来说事儿了。 90 | 91 | ![list](../res/images/cons-cells.png) 92 | 93 | 看这张图,去掉这个list的第一个节点,结果得到的还是一个list。同样地,在这个节点上面再加一个节点,得到的也依然还是一个list。 94 | 95 | 也就是说,这个list的每一个节点大概对应到下面的结构: 96 | 97 | ```cpp 98 | struct ListNode{ 99 | int value; 100 | ListNode* next; 101 | }; 102 | ``` 103 | 104 | 我们试着用这个结构建立一个列表。 105 | 106 | ```cpp 107 | ListNode a{1, nullptr}; 108 | ListNode b{2, &a}; 109 | ListNode c{3, &b}; 110 | ``` 111 | 112 | 从`c`出发,我们就能够依次遍历完`b`、`a`,而且对于每一个节点,处理的方式基本一致。 113 | 114 | ```cpp 115 | void printList(ListNode* list) { 116 | if(list == nullptr) return; 117 | std::cout << list->value; 118 | printList(list->next); 119 | } 120 | ``` 121 | 122 | 没错,list就是递归的。每一个list节点都包含一个list的引用。这样我们就能够利用递归来对其进行操作了。 123 | 124 | 比如我们想要构造一个新的list,也可以把他做成递归的。 125 | 126 | ```cpp 127 | struct List{ 128 | int value; 129 | shared_ptr next; 130 | } 131 | 132 | shared_ptr make_cell(int value, shared_ptr next) { 133 | auto cell = make_shared(); 134 | cell->value = value; 135 | cell->next = next; 136 | return cell; 137 | } 138 | 139 | template 140 | shared_ptr make_list(int value, Args... args) { 141 | return make_cell(value, make_list(args...)); 142 | } 143 | 144 | template<> 145 | shared_ptr make_list(int value) { 146 | return make_cell(value, nullptr); 147 | } 148 | ``` 149 | 150 | ## 构造器(Constructor) 151 | 152 | 看我们的`make_cell`函数,其实就是创建了一个`shared_ptr`,然后再利用传入的参数来对cell中的数据进行初始化。当然这意思其实已经很明确了,`make_cell`作为创建一个新的cell结构的函数而存在。 153 | 154 | 但是这样未免太罗嗦,每次我创建一个struct的时候都要再去考虑怎么设计一个用来专门创建实例的函数。JavaScript提供了一种叫做构造器的函数,可以简化这个过程。加入了构造器的List定义如下: 155 | 156 | ```cpp 157 | struct { 158 | int value; 159 | shared_ptr next; 160 | 161 | List(int _value, shared_ptr _next): 162 | value(_value), next(_next) {} 163 | } 164 | ``` 165 | 166 | 这里的构造器是说,我接受两个参数(`_next`, `_value`),然后用这两个参数去初始化JavaScript结构(struct)中的字段。 167 | 168 | 然后我们可以把整个make\_cell函数改成 169 | 170 | ```cpp 171 | make_shared(value, next); 172 | ``` 173 | 174 | 构造器能够让我们以一种很直观的方式来创建和使用数据。 比如: 175 | 176 | ```cpp 177 | struct User { 178 | std::string name; 179 | int age; 180 | double height; 181 | 182 | User(std::string _name, int _age, double _height): 183 | name(_name), age(_age), height(_height) {} 184 | }; 185 | 186 | auto user = User{"Kimmy", 18, 178.0}; 187 | ``` 188 | 189 | 没错,这样看上去跟前面定义的Car类型没有什么区别。但是当结合上默认值参数以及需要在数据初始化的时候做一些其他操作的时候,构造器给提供了很直接的方案。后面我们会进一步地看到这种方案的优点。(当然你也可以去看一看什么是RAII。) 190 | 191 | ## 递归结构上的操作 192 | 193 | 好的我们回到刚刚的List上来。 194 | 195 | 我们已经可以通过make\_list来创建一个整数的列表了,那么,作为一个递归的结构,我们当然也可以通过递归来对齐定义一些操作。 196 | 197 | 比如把List里面的每一个元素做一个转换。 198 | 199 | ```cpp 200 | shared_ptr 201 | transform(shared_ptr list, std::function transformer) { 202 | if(list == nullptr) return nullptr; 203 | return make_shared(transformer(list->value), transform(list->next, tranformer)) 204 | } 205 | 206 | 207 | // => {-1, -2, -3, -4, -5} 208 | transform(make_list(1,2,3,4,5), [](int i) -> int { return -i; }); 209 | ``` 210 | 211 | ### 作为数据的过程(Procedure as data) 212 | 213 | 当然,看到上面那段代码你会是满头雾水。`std::function`是什么,`[](){}`放在一起又是什么。 214 | 215 | 回过头去想想,我们是不是可以定义一些过程,然后对这个过程进行调用,去做一些复杂的计算?同时,当我们需要进一步利用这些过程的时候,可以把它们直接当成数据拿来用的。于是我们可以约束他们的类型,然后根据这些约束再进一步地做抽象。 216 | 217 | 比如第三章中的pow,类型就是`std::function`,接收两个整数,返回他们的乘方,结果也是整数。 218 | 219 | 而有些时候我们可能并不只是需要拿已经就有的过程来简单地做抽象,所以更有必要提供一种方式让我们随时都能够创建一个过程。于是JavaScript给我们提供了Lambda表达式(Lambda Expression,在其他语言里面也可能叫做匿名函数/过程,Anonymous Function/Procedure),比如 220 | 221 | ```cpp 222 | auto negate=[](int i) -> int{ return -i; }; 223 | ``` 224 | 225 | 我们就地创建了一个lambda表达式,然后把它赋值给了negate。这个lambda表达式所表示的就是一个匿名过程,它会接收一个整数,然后返回这个数的相反数。 226 | 227 | 于是当我们再去回过头看transform的时候,就不会觉得太突兀了。 228 | 229 | ```cpp 230 | shared_ptr 231 | transform(shared_ptr list, std::function transformer) { 232 | if(list == nullptr) return nullptr; 233 | return make_shared(transformer(list->value), transform(list->next, tranformer)) 234 | } 235 | ``` 236 | 237 | transform接收一个List和一个`int(int)`类型的transformer,然后在这个List上递归地对每一个元素执行transformer,得到一个新的结果,然后组成一个新的List。 238 | 239 | ## 树 240 | 241 | 好的我们来看另外一种递归数据类型,树。更确切地说,是二叉树(Binary Tree)。 242 | 243 | ```C++ 244 | struct Tree { 245 | int value; 246 | shared_ptr left; 247 | shared_ptr right; 248 | 249 | Tree(int _v, shared_ptr _l, shared_ptr _r): 250 | value(_v), left(_l), right(_r) {} 251 | }; 252 | ``` 253 | 254 | 也就是说,Tree是这种结构,他的左侧是Tree,右侧也是Tree。而且Tree的每个节点都会带有一个value。 255 | 256 | 当然你还是会怀疑说这种无聊的结构拿来有什么用。那我们看下面的内容: 257 | 258 | ``` 259 | * 260 | / \ 261 | + 4 262 | / \ 263 | 1 - 264 | / \ 265 | 2 3 266 | ``` 267 | 268 | 这个就是把 $(1+(2-3))\times4$作为一种树行结构来表示。 269 | 270 | ### 遍历(Traverse) 271 | 272 | 对于前面那个树形结构,我们可以试着从最顶端的节点写出他的value,然后再分别访问他的左右子树,按照这样的方式把所有的内容写出来,就能得到下面的结果: 273 | 274 | ``` 275 | * + 1 - 2 3 4 276 | ``` 277 | 278 | 这种表示方式又叫做该二叉树的先序遍历,又叫前序遍历。 279 | 280 | 然后我们可以把属于同一个树的部分用括号包起来,就得到了: 281 | 282 | ```scheme 283 | (* (+ 1 (- 2 3)) 4) 284 | ``` 285 | 286 | 没错这就是Lisp。 287 | 288 | 同样地,我们可以选择先一次访问一棵树的左右子树,然后再写出器对应的value,这样一层层递进下去。我们能够得到如下的结果: 289 | 290 | ``` 291 | 1 2 3 - + 4 * 292 | ``` 293 | 294 | 如果你有了解过的话,就能看得出来这跟forth或者PostScript很像,当然他也叫上面那个二叉树的后序遍历。 295 | 296 | 当然还有一种叫做中序遍历的过程,得到的结果是: 297 | 298 | ``` 299 | 1 + 2 - 3 * 4 300 | ``` 301 | 302 | 跟最初的算术表达式的区别就在于没有了括号。当然,本来表示的意思也丧失了。 303 | 304 | 对于前序遍历和后序遍历的结果,并不会改变整个表达式的语义,只是重新定义了这个表达式的解析方式。 305 | 306 | > #### 练习 307 | > 308 | > 请尝试用代码实现先序、中序和后序遍历。 309 | 310 | ### 深度优先(Depth-First)和广度优先(Breath-First) 311 | 312 | 前面我们提到的遍历,是对整个树进行访问的过程。如果我们只需要从根节点出发,然后去寻找某个指定元素的话,可以有这样两种选择。 313 | 314 | 第一种是遇到有分支,我们就选择一个方向继续往前走,直到走到不能再继续,然后再一步步返回,同时在返回的过程中尝试其他的分支。 315 | 316 | 这种首先走到最底端然后再慢慢回来的过程叫做深度优先查找(Depth-First Search)。 317 | 318 | 比如前文中的那个表达式树,整个过程就是 319 | 320 | ```cpp 321 | * + 1 <后退> - 2 <后退> 3 <后退> <后退> <后退> 4 322 | ``` 323 | 324 | 也就是说,我们需要访问整个树才能查找到4。 325 | 326 | 另外一种方式是,遇到分支,我们先把对应的分支的每一个第一层先访问一遍,再一步步走到下一层。 327 | 328 | 这样的过程叫做广度优先查找(Breath-First Search)。比如 329 | 330 | ```cpp 331 | * <下一层> + 4 <下一层> 1 - <下一层> 2 3 332 | ``` 333 | 334 | 这个时候我们如果要查找4的话,只要在第一层就可以了。 335 | 336 | ### 栈(stack)与队列(queue) 337 | 338 | 我们仔细思考一下怎么实现DFS和BFS。 339 | 340 | 对于DFS,我们需要考虑如果找不到如何返回,所以我们可以先试着模拟一下DFS查找4的流程。 341 | 342 | ```cpp 343 | path description 344 | ========== ========== 345 | * //step 1 346 | * + //step 2 347 | * + 1 //step 3 and 1 has no childs 348 | * + //get back to + 349 | * + - //step 4 350 | * + - 2 //step 5 and no childs 351 | * + - //get back to - 352 | * + - 3 //step 6 and no childs 353 | * + - //get back to - and no more childs to visit 354 | * + //get back to + and no more childs to visit 355 | * //get back to * 356 | * 4 //step 7 found! 357 | ``` 358 | 359 | 可以看到,每次当遇到无法继续的节点,都会有一步回退操作,其实就是把path中加入进去内容的再取出来,这种一般最后进入但是最先退出(Last In First Out,LIFO)的结构我们常常称作是栈(stack)。栈通常会用来辅助实现一些拥有LIFO特性的过程,比如过程调用,也有一个对应的调用栈(call stack)。 360 | 361 | 比如当我们调用递归函数pow\(2, 5\),对应的调用栈展开如下: 362 | 363 | ```cpp 364 | pow(2, 5) => 2 * 2 * 2 * 2 * 2 365 | pow(2, 4) => 2 * 2 * 2 * 2 366 | pow(2, 3) => 2 * 2 * 2 367 | pow(2, 2) => 2 * 2 368 | pow(2, 1) => 2 369 | ``` 370 | 371 | 这也就是在第三章我提到“栈溢出”中的“栈”的含义。当一个调用栈太大而超出了当前系统规定的范围以后,就会造成这种问题。 372 | 373 | 我们接下来看BFS,模拟一下它查找3的流程: 374 | 375 | ```cpp 376 | path description 377 | ========== ========== 378 | * //step 1 379 | * + 4 //push childs and move to next 380 | + 4 //step 2 381 | + 4 1 - //push childs and move to next 382 | 4 1 - //step 3 no childs move to next 383 | 1 - //step 4 no childs move to next 384 | - //step 5 385 | - 2 3 //push childs and move to next 386 | 2 3 //step 6 no childs move to next 387 | 3 //step 7 found! 388 | ``` 389 | 390 | 与DFS的后进先出不同的是,BFS会把先放入的东西给拿出去,也就是先进先出(First In First Out,FIFO)。用于实现FIFO的结构我们一般叫做队列(queue)。当然队列的应用也很广泛,特别是需要考虑进入的先后顺序,通常都是作为一种特殊的队列来处理。 391 | 392 | ### 树 393 | 394 | 树反应了具有某种特定结构的层级关系。当然这种结构并不一定是只有两个分支的,也并不一定非得是考虑顺序的。当我们在建模的时候,遇到层级结构,就可以考虑设计成一棵树。另外,递归。 395 | 396 | > #### 练习 397 | > 398 | > 尝试用代码实现DFS和BFS。 399 | 400 | -------------------------------------------------------------------------------- /docs/chapters/ch07_state.md: -------------------------------------------------------------------------------- 1 | # 状态 2 | 3 | 程序中的很多数据往往是在不停地变化的,比如时间,比如与用户的交互,又比如,一些程序运行中产生和保存的数据。当一些可变的数据或者对象是发生改变的时候,我们就可以说它们从一个状态转换到了另一个状态。 4 | 5 | 一个简单的例子就是迭代器(iterator)。这个JavaScript里面非常重要的概念,就是一个典型的可变对象。每一次需要向前或者向后访问一个序列的元素的时候,都需要改变一下迭代器的状态。 6 | 7 | -------------------------------------------------------------------------------- /docs/chapters/ch08_reference.md: -------------------------------------------------------------------------------- 1 | # 引用 2 | 3 | > 注:本文中提及到的引用,是广义的“引用”概念,而不仅仅是JavaScript的引用。 4 | 5 | TODO: 重写 -------------------------------------------------------------------------------- /docs/chapters/ch09_closure.md: -------------------------------------------------------------------------------- 1 | # 闭包 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /docs/chapters/ch10_object.md: -------------------------------------------------------------------------------- 1 | # 对象 2 | 3 | 广义地讲,任何一个在程序中出现的元素都被称作对象。于是对象也拥有自己的类型,比如整数对象、类型对象(对象的类型也算是类型,first-class type)以及函数对象等。 4 | 5 | 但是对象在另外一个编程流派也有着特殊的含义。 6 | 7 | ## 面向对象编程(Object-Oriented Programming) 8 | 9 | 面向对象编程是当前比较热门的一个编程范式(Programming Paradigm)。主要涉及通过抽象(abstraction)和多态(polymorphism)来进行程序建模和设计,以达到组件(Component)复用的目的。 10 | 11 | 简单地讲,就是面向对象会通过一种方式来定义一些共有的接口和符合接口的操作,然后通过对这些接口的实现来完成一些具有公共特性但细节上略有不一致的行为。 12 | 13 | 先看一个简单的例子。 14 | 15 | 不同的车(Vehicle)都可以走(Run),包括汽车(Car)、卡车(Truck)、推车(Wagon)等等。 16 | 17 | 我们可以简单地描述这种关系: 18 | 19 | ```cpp 20 | // Pseudo code 21 | interface Vehicle { 22 | void Run(); 23 | } 24 | 25 | class Car is Vehicle { 26 | void Run() override { ... } 27 | } 28 | 29 | class Truck is Vehicle { 30 | void Run() override { ... } 31 | } 32 | 33 | class Wagon is Vehicle { 34 | void Run() override { ... } 35 | } 36 | 37 | 38 | Vehicle v = new Car{} // or new Wagon/Truck 39 | 40 | v->Run(); // run specific Run prodeure 41 | ``` 42 | 43 | ## 基于继承(Inheritance)的多态 44 | 45 | ## 基于泛型(Generics)的多态 46 | 47 | -------------------------------------------------------------------------------- /docs/chapters/ch11_concurrency.md: -------------------------------------------------------------------------------- 1 | # 并发 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /docs/chapters/intro.md: -------------------------------------------------------------------------------- 1 | # 引言 2 | 15 | ## 编程 16 | 17 | 编程(Programming)是一项创造性的活动,如同创作(Composing)、绘画(Painting)等一样。我们常常会通过一系列的步骤把所需要的部件进行组合,得到另一个期望的结构,或者是解决一个实际性的问题。表达和构建这些步骤的过程,就是编程(当然,在脱离程序语言以后,也可以把它叫做**规划**(Programme))。 18 | 19 | 我们会简单地把一件件小事按**顺序**做,这样一件件小事的组合以后就可以完成一件更大的事情。比如我们会切菜,生火,炒菜,煮饭,这样我们就能够做出一顿午餐。 20 | 21 | 当然在这个过程中可能会设计一些**计算**。我们会考虑,需要放几勺盐和几把米,以适合最后吃午餐的人的营养均衡。在特殊的时候,甚至需要精确到毫克级别的营养规划,以及不同人的营养结构的差异等。我们会在第二节探讨关于计算,以及计算的**组合**等相关问题。 22 | 23 | 在规划和解决问题的时候可能并不是一帆风顺的,有时候我们会面临各种抉择。比如,考虑明天下午吃素还是吃荤,吃鸡肉和还是鱼肉,吃宫保鸡丁还是鱼香肉丝等等。有比如,在我们准备吃鱼香肉丝的时候发现没有鱼了,又该怎么办。 24 | 25 | 在任何需要做选择的时候,作为一个程序员(**规划师**),你不应该出现选择困难症。因为任何一个涵待解决的问题都必须得到解决之后才能让这个程序正常地执行。所以,我们在第三章中会探讨关于过程设计,以及如何利用循环和选择等手法来设计一个完善的程序的相关问题。 26 | 27 | 但是做饭的时候你是怎么区分盐和砂糖、醋和酱油的呢?当然你会说每个都尝一遍,但是这样既有可能浪费,又不卫生。所以习惯性地我们会关注这些材料瓶上面的标签,从上面知道我们用的是什么东西。当然对于读不懂标签的计算机来说,这些材料作为商品的时候都会有固定的条形码,这个条形码也能够让计算机知道一个被它看到的东西代表着什么。因为它知道这些条码是如何**编码**(Encoding)的。 28 | 29 | 当你遇到大量具有相同组件的时候,可以考虑用**序列**(Sequence)或者列表(List)来安排这些组件。比如做一道菜的每一个步骤对应在菜谱上的每一项。或者是在处理具有层级结构以及更复杂的关联的结构的时候采用**树**(Tree)和**图**(Graph)来组织。比如六度关系理论,实际上就是一张非常大的**图**(Graph)。 30 | 31 | 有时候会考虑到一部分组件是可变的。比如时间总是流逝的,人总会长大的。当我们尝试描述一个组件改变的时候,就引入了**状态**(State)。这种时候我们更希望能够把改变的数据和相应的操作做一个绑定,这样子绑定了组件的操作就可以看成一个闭包(Closure)。简单地比如一个计数器。当在组件上面绑定更多操作的时候,就可以把它看作一个**对象**(Object)。 32 | 33 | 可变的状态可能会带来的一个问题就是,如果有多个人尝试同时去修改这个状态的时候,会造成结果的不一致性。比如,一个没有加入事务处理的银行账户,两个人同时在进行操作,账户中原有1000元,甲存入了200块,但在甲存入200块还未完成的同时乙取出了200块。这种时候会有几种可能的结果,第一种就是甲先于乙完成操作,结果就是账户余额变成了800块,凭空损失了200块;另外一种就是乙先于甲完成了操作,结果账户余额就变成了甲操作的结果,1200块,凭空多出来400块。这种问题就属于**并发**(Concurrency)。 34 | 35 | ## JavaScript 36 | 37 | 本书选择使用JavaScript来讲述编程中的各种思想和概念。 38 | 39 | 我们并不是在讲述JavaScript这门编程语言,只是通过JavaScript和其提供的丰富的方便特性,来讲述关于“程序设计”的内容。任何与JavaScript细节相关的东西,可以参考[Mozilla Developer Network](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript),对于特定的主题,我也会专门列出可以参阅的链接。[StackOverflow](http://stackoverflow.com/questions/tagged/javascript)上也有丰富的资源来解答你的疑惑。 40 | 41 | 作为入门书籍,为了直观地表述各种概念或者原理,本书可能会使用一些非专业词汇,或者与准确定义有偏差的理解。JavaScript作为一种生产力工具,其准确定义和行为以[ECMA 262](https://tc39.es/ecma262/)国际标准为准。对专业人员如有任何困惑或者争议的点,请参考标准文档的描述。同样,如果你通过本书对编程和相关的东西产生了兴趣,希望深入了解和学习,也请使用专业的书籍和资料。本书只是作为入门的引导,不对专业内容做解释和定义。 42 | 43 | ## 更新状态 44 | 45 | 这本书从2015年8月开始编写,中间经过了多次的重写过程,包括把编程语言从偏硬核且专业的C++转向为JavaScript、引入更多资料和练习、增补和调整章节顺序等,目前内容仍处于不稳定的状态,请参考下面的状态来确定这一章是否值得学习: 46 | 47 | * 第一章 环境 \(rewriting\) 48 | * 第二章 计算 Computation \(outdated\) 49 | * 第三章 过程 Procedural \(outdated\) 50 | * 第四章 编码 Encoding \(outdated\) 51 | * 第五章 序列 Sequence \(outdated\) 52 | * 第六章 数据 Data \(outdated\) 53 | * 第七章 状态 State \(prepared\) 54 | * 第八章 引用 Reference 55 | * 第九章 闭包 Closure 56 | * 第十章 对象 Object \(prepared\) 57 | * 第十一章 58 | * 第十二章 59 | * more... 60 | 61 | ## 目录 62 | 63 | * [引言](intro.md) 64 | * [环境](ch01_environment.md) 65 | * [计算](ch02_computation.md) 66 | * [过程](ch03_procedure.md) 67 | * [编码](ch04_encoding.md) 68 | * [序列](ch05_sequence.md) 69 | * [数据](ch06_data.md) 70 | * [状态](ch07_state.md) 71 | * [引用](ch08_reference.md) 72 | * [闭包](ch09_closure.md) 73 | * [对象](ch10_object.md) 74 | * [并发](ch11_concurrency.md) 75 | 76 | ## 参与贡献 77 | 78 | 本书的源码托管在 GitHub [IntroToProgramming/IntroductionToProgramming](https://github.com/IntroToProgramming/IntroductionToProgramming)仓库,你可以提交issue或者pull request贡献和改进本书。 79 | 80 | ## 支持我 81 | 82 | 欢迎关注我的微信公众号轻技术(lightych)或者[Telegram Lightych 频道](https://t.me/lightychannel)及时获取更新。 83 | 84 | ### 特别感谢以下朋友的资助 85 | 86 | * [esrever10](https://github.com/esrever10) 87 | * [karakapi](https://github.com/karakapi) 88 | * [负一的平方根](http://sqrt-1.me) 89 | * [linkgod](http://www.linkgod.net) 90 | * [shellvon](https://github.com/shellvon) & [tingoo](https://github.com/tingoo) 91 | -------------------------------------------------------------------------------- /docs/draft/draft.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IntroToProgramming/IntroductionToProgramming/d3bd2f1e4123efe6608dc103bbb1f0e99bc9d488/docs/draft/draft.md -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: home 3 | hero: 4 | name: 编程导引 5 | text: Introduction to Programming 6 | tagline: "从零开始你的计算机编程之旅" 7 | actions: 8 | - text: 开始阅读 → 9 | link: /chapters/intro 10 | theme: brand 11 | # features: 12 | # - icon: 🛠️ 13 | # title: Simple and minimal, always 14 | # details: Lorem ipsum... 15 | # - icon: 16 | # src: /cool-feature-icon.svg 17 | # title: Another cool feature 18 | # details: Lorem ipsum... 19 | # - icon: 20 | # dark: /dark-feature-icon.svg 21 | # light: /light-feature-icon.svg 22 | # title: Another cool feature 23 | # details: Lorem ipsum... 24 | --- 25 | -------------------------------------------------------------------------------- /docs/public/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IntroToProgramming/IntroductionToProgramming/d3bd2f1e4123efe6608dc103bbb1f0e99bc9d488/docs/public/.nojekyll -------------------------------------------------------------------------------- /docs/public/CNAME: -------------------------------------------------------------------------------- 1 | intro.kimleo.net 2 | -------------------------------------------------------------------------------- /docs/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IntroToProgramming/IntroductionToProgramming/d3bd2f1e4123efe6608dc103bbb1f0e99bc9d488/docs/public/favicon.ico -------------------------------------------------------------------------------- /docs/reference/debug.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IntroToProgramming/IntroductionToProgramming/d3bd2f1e4123efe6608dc103bbb1f0e99bc9d488/docs/reference/debug.md -------------------------------------------------------------------------------- /docs/reference/glossary.md: -------------------------------------------------------------------------------- 1 | # 概念解释 Glossary 2 | 3 | ## A 4 | 5 | - [安全](./safety-and-security.md) 6 | 7 | ## C 8 | - [测试](./testing.md) 9 | 10 | ## D 11 | - [Debug](./debug.md) 12 | 13 | ## S 14 | - [Safety, Security](./safety-and-security.md) 15 | 16 | ## T 17 | 18 | - [Testing](./testing.md) 19 | - [调试](./debug.md) -------------------------------------------------------------------------------- /docs/reference/safety-and-security.md: -------------------------------------------------------------------------------- 1 | # 安全 2 | 3 | 在计算机科学中,安全代表着两个不同但相关的概念:safety(安全性)和security(安全保障)。虽然它们经常被混淆使用,但它们在含义和应用上存在一些区别。 4 | 5 | 可以说,safety(安全性)更注重系统的内部能力,而security(安全保障)则更关注系统对外的能力。 6 | 7 | ## 安全性(Safety) 8 | 9 | 安全性关注的是系统或软件本身的性质,确保其在正常操作下不会对用户、数据或环境造成伤害或危险。安全性侧重于预防和减轻事故或意外事件的潜在危害,并确保系统在异常情况下能够进入安全状态。 10 | 11 | 例如,对于一辆自动驾驶汽车而言,安全性意味着它能够遵循交通规则、正确感知周围环境、有效地应对紧急情况,并保证乘客和其他道路使用者的安全。在软件开发中,安全性可以涉及对输入数据的验证、错误处理、边界检查和异常处理等方面,以防止潜在的崩溃、数据损坏或系统故障。 12 | 13 | ## 安全保障(Security) 14 | 15 | 安全保障则更加关注系统或软件的保护和防御,以确保其免受恶意攻击、未经授权的访问、数据泄露或损坏等威胁。安全保障旨在确保系统的机密性、完整性和可用性,以及保护用户的隐私和敏感信息。 16 | 17 | 在计算机系统中,安全保障可以包括诸如身份验证和访问控制、加密和解密、防火墙和入侵检测系统(IDS)等措施。这些措施旨在防止恶意用户的未经授权访问、数据泄露、网络攻击或病毒感染等安全威胁。 18 | 19 | 总结起来,安全性(safety)强调系统的健壮性和对意外情况的适应能力,而安全保障则强调系统的保护性和对恶意威胁的防御能力。它们是计算机科学中维护系统完整性、可靠性和保护用户利益的重要方面,常常需要综合考虑来确保计算机系统的全面安全。 20 | -------------------------------------------------------------------------------- /docs/reference/testing.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IntroToProgramming/IntroductionToProgramming/d3bd2f1e4123efe6608dc103bbb1f0e99bc9d488/docs/reference/testing.md -------------------------------------------------------------------------------- /docs/res/code.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Introduction to Programming 6 | 7 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /docs/res/images/cons-cells.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IntroToProgramming/IntroductionToProgramming/d3bd2f1e4123efe6608dc103bbb1f0e99bc9d488/docs/res/images/cons-cells.png -------------------------------------------------------------------------------- /docs/stream.md: -------------------------------------------------------------------------------- 1 | # 流 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "build": "vitepress build docs", 4 | "dev": "vitepress dev docs" 5 | }, 6 | "devDependencies": { 7 | "markdown-it-mathjax3": "^4.3.2", 8 | "vitepress": "^1.4.1" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /practices/index.md: -------------------------------------------------------------------------------- 1 | # 软件工程实践 2 | 3 | - 免责声明 4 | - 概览 5 | - 开始你的第一个项目 6 | - 编程语言和平台的选择 7 | - 编程团队的构建 8 | - 需求与设计 9 | - 用户故事 10 | - 验收条件 11 | - 实例化需求 12 | - 领域专家 13 | - 项目制 14 | - 研发交付 15 | - 脚手架 16 | - 12 factors 17 | - 代码规范 18 | - 19 | - 质量保证与验收 20 | - 持续运维与改进 21 | - 节奏、工作空间、业余活动 22 | - 复杂项目实践 23 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@algolia/autocomplete-core@1.9.3": 6 | version "1.9.3" 7 | resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" 8 | integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== 9 | dependencies: 10 | "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" 11 | "@algolia/autocomplete-shared" "1.9.3" 12 | 13 | "@algolia/autocomplete-plugin-algolia-insights@1.9.3": 14 | version "1.9.3" 15 | resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz#9b7f8641052c8ead6d66c1623d444cbe19dde587" 16 | integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg== 17 | dependencies: 18 | "@algolia/autocomplete-shared" "1.9.3" 19 | 20 | "@algolia/autocomplete-preset-algolia@1.9.3": 21 | version "1.9.3" 22 | resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz#64cca4a4304cfcad2cf730e83067e0c1b2f485da" 23 | integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA== 24 | dependencies: 25 | "@algolia/autocomplete-shared" "1.9.3" 26 | 27 | "@algolia/autocomplete-shared@1.9.3": 28 | version "1.9.3" 29 | resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa" 30 | integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== 31 | 32 | "@algolia/cache-browser-local-storage@4.24.0": 33 | version "4.24.0" 34 | resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz#97bc6d067a9fd932b9c922faa6b7fd6e546e1348" 35 | integrity sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww== 36 | dependencies: 37 | "@algolia/cache-common" "4.24.0" 38 | 39 | "@algolia/cache-common@4.24.0": 40 | version "4.24.0" 41 | resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.24.0.tgz#81a8d3a82ceb75302abb9b150a52eba9960c9744" 42 | integrity sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g== 43 | 44 | "@algolia/cache-in-memory@4.24.0": 45 | version "4.24.0" 46 | resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz#ffcf8872f3a10cb85c4f4641bdffd307933a6e44" 47 | integrity sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w== 48 | dependencies: 49 | "@algolia/cache-common" "4.24.0" 50 | 51 | "@algolia/client-account@4.24.0": 52 | version "4.24.0" 53 | resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.24.0.tgz#eba7a921d828e7c8c40a32d4add21206c7fe12f1" 54 | integrity sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA== 55 | dependencies: 56 | "@algolia/client-common" "4.24.0" 57 | "@algolia/client-search" "4.24.0" 58 | "@algolia/transporter" "4.24.0" 59 | 60 | "@algolia/client-analytics@4.24.0": 61 | version "4.24.0" 62 | resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.24.0.tgz#9d2576c46a9093a14e668833c505ea697a1a3e30" 63 | integrity sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg== 64 | dependencies: 65 | "@algolia/client-common" "4.24.0" 66 | "@algolia/client-search" "4.24.0" 67 | "@algolia/requester-common" "4.24.0" 68 | "@algolia/transporter" "4.24.0" 69 | 70 | "@algolia/client-common@4.24.0": 71 | version "4.24.0" 72 | resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.24.0.tgz#77c46eee42b9444a1d1c1583a83f7df4398a649d" 73 | integrity sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA== 74 | dependencies: 75 | "@algolia/requester-common" "4.24.0" 76 | "@algolia/transporter" "4.24.0" 77 | 78 | "@algolia/client-personalization@4.24.0": 79 | version "4.24.0" 80 | resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.24.0.tgz#8b47789fb1cb0f8efbea0f79295b7c5a3850f6ae" 81 | integrity sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w== 82 | dependencies: 83 | "@algolia/client-common" "4.24.0" 84 | "@algolia/requester-common" "4.24.0" 85 | "@algolia/transporter" "4.24.0" 86 | 87 | "@algolia/client-search@4.24.0": 88 | version "4.24.0" 89 | resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.24.0.tgz#75e6c02d33ef3e0f34afd9962c085b856fc4a55f" 90 | integrity sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA== 91 | dependencies: 92 | "@algolia/client-common" "4.24.0" 93 | "@algolia/requester-common" "4.24.0" 94 | "@algolia/transporter" "4.24.0" 95 | 96 | "@algolia/logger-common@4.24.0": 97 | version "4.24.0" 98 | resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.24.0.tgz#28d439976019ec0a46ba7a1a739ef493d4ef8123" 99 | integrity sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA== 100 | 101 | "@algolia/logger-console@4.24.0": 102 | version "4.24.0" 103 | resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.24.0.tgz#c6ff486036cd90b81d07a95aaba04461da7e1c65" 104 | integrity sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg== 105 | dependencies: 106 | "@algolia/logger-common" "4.24.0" 107 | 108 | "@algolia/recommend@4.24.0": 109 | version "4.24.0" 110 | resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-4.24.0.tgz#8a3f78aea471ee0a4836b78fd2aad4e9abcaaf34" 111 | integrity sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw== 112 | dependencies: 113 | "@algolia/cache-browser-local-storage" "4.24.0" 114 | "@algolia/cache-common" "4.24.0" 115 | "@algolia/cache-in-memory" "4.24.0" 116 | "@algolia/client-common" "4.24.0" 117 | "@algolia/client-search" "4.24.0" 118 | "@algolia/logger-common" "4.24.0" 119 | "@algolia/logger-console" "4.24.0" 120 | "@algolia/requester-browser-xhr" "4.24.0" 121 | "@algolia/requester-common" "4.24.0" 122 | "@algolia/requester-node-http" "4.24.0" 123 | "@algolia/transporter" "4.24.0" 124 | 125 | "@algolia/requester-browser-xhr@4.24.0": 126 | version "4.24.0" 127 | resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz#313c5edab4ed73a052e75803855833b62dd19c16" 128 | integrity sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA== 129 | dependencies: 130 | "@algolia/requester-common" "4.24.0" 131 | 132 | "@algolia/requester-common@4.24.0": 133 | version "4.24.0" 134 | resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.24.0.tgz#1c60c198031f48fcdb9e34c4057a3ea987b9a436" 135 | integrity sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA== 136 | 137 | "@algolia/requester-node-http@4.24.0": 138 | version "4.24.0" 139 | resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz#4461593714031d02aa7da221c49df675212f482f" 140 | integrity sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw== 141 | dependencies: 142 | "@algolia/requester-common" "4.24.0" 143 | 144 | "@algolia/transporter@4.24.0": 145 | version "4.24.0" 146 | resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.24.0.tgz#226bb1f8af62430374c1972b2e5c8580ab275102" 147 | integrity sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA== 148 | dependencies: 149 | "@algolia/cache-common" "4.24.0" 150 | "@algolia/logger-common" "4.24.0" 151 | "@algolia/requester-common" "4.24.0" 152 | 153 | "@babel/helper-string-parser@^7.25.9": 154 | version "7.25.9" 155 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" 156 | integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== 157 | 158 | "@babel/helper-validator-identifier@^7.25.9": 159 | version "7.25.9" 160 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" 161 | integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== 162 | 163 | "@babel/parser@^7.25.3": 164 | version "7.25.9" 165 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.9.tgz#8fcaa079ac7458facfddc5cd705cc8005e4d3817" 166 | integrity sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg== 167 | dependencies: 168 | "@babel/types" "^7.25.9" 169 | 170 | "@babel/types@^7.25.9": 171 | version "7.25.9" 172 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.9.tgz#620f35ea1f4233df529ec9a2668d2db26574deee" 173 | integrity sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ== 174 | dependencies: 175 | "@babel/helper-string-parser" "^7.25.9" 176 | "@babel/helper-validator-identifier" "^7.25.9" 177 | 178 | "@docsearch/css@3.6.2", "@docsearch/css@^3.6.2": 179 | version "3.6.2" 180 | resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.6.2.tgz#ccd9c83dbfeaf34efe4e3547ee596714ae7e5891" 181 | integrity sha512-vKNZepO2j7MrYBTZIGXvlUOIR+v9KRf70FApRgovWrj3GTs1EITz/Xb0AOlm1xsQBp16clVZj1SY/qaOJbQtZw== 182 | 183 | "@docsearch/js@^3.6.2": 184 | version "3.6.2" 185 | resolved "https://registry.yarnpkg.com/@docsearch/js/-/js-3.6.2.tgz#000d7d255e8387e7c5b82c7b87d3060398e1605d" 186 | integrity sha512-pS4YZF+VzUogYrkblCucQ0Oy2m8Wggk8Kk7lECmZM60hTbaydSIhJTTiCrmoxtBqV8wxORnOqcqqOfbmkkQEcA== 187 | dependencies: 188 | "@docsearch/react" "3.6.2" 189 | preact "^10.0.0" 190 | 191 | "@docsearch/react@3.6.2": 192 | version "3.6.2" 193 | resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.6.2.tgz#32b16dd7d5614f0d39e6bc018549816b68d171b8" 194 | integrity sha512-rtZce46OOkVflCQH71IdbXSFK+S8iJZlUF56XBW5rIgx/eG5qoomC7Ag3anZson1bBac/JFQn7XOBfved/IMRA== 195 | dependencies: 196 | "@algolia/autocomplete-core" "1.9.3" 197 | "@algolia/autocomplete-preset-algolia" "1.9.3" 198 | "@docsearch/css" "3.6.2" 199 | algoliasearch "^4.19.1" 200 | 201 | "@esbuild/aix-ppc64@0.21.5": 202 | version "0.21.5" 203 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" 204 | integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== 205 | 206 | "@esbuild/android-arm64@0.21.5": 207 | version "0.21.5" 208 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" 209 | integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== 210 | 211 | "@esbuild/android-arm@0.21.5": 212 | version "0.21.5" 213 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" 214 | integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== 215 | 216 | "@esbuild/android-x64@0.21.5": 217 | version "0.21.5" 218 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" 219 | integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== 220 | 221 | "@esbuild/darwin-arm64@0.21.5": 222 | version "0.21.5" 223 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" 224 | integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== 225 | 226 | "@esbuild/darwin-x64@0.21.5": 227 | version "0.21.5" 228 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" 229 | integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== 230 | 231 | "@esbuild/freebsd-arm64@0.21.5": 232 | version "0.21.5" 233 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" 234 | integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== 235 | 236 | "@esbuild/freebsd-x64@0.21.5": 237 | version "0.21.5" 238 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" 239 | integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== 240 | 241 | "@esbuild/linux-arm64@0.21.5": 242 | version "0.21.5" 243 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" 244 | integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== 245 | 246 | "@esbuild/linux-arm@0.21.5": 247 | version "0.21.5" 248 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" 249 | integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== 250 | 251 | "@esbuild/linux-ia32@0.21.5": 252 | version "0.21.5" 253 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" 254 | integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== 255 | 256 | "@esbuild/linux-loong64@0.21.5": 257 | version "0.21.5" 258 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" 259 | integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== 260 | 261 | "@esbuild/linux-mips64el@0.21.5": 262 | version "0.21.5" 263 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" 264 | integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== 265 | 266 | "@esbuild/linux-ppc64@0.21.5": 267 | version "0.21.5" 268 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" 269 | integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== 270 | 271 | "@esbuild/linux-riscv64@0.21.5": 272 | version "0.21.5" 273 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" 274 | integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== 275 | 276 | "@esbuild/linux-s390x@0.21.5": 277 | version "0.21.5" 278 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" 279 | integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== 280 | 281 | "@esbuild/linux-x64@0.21.5": 282 | version "0.21.5" 283 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" 284 | integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== 285 | 286 | "@esbuild/netbsd-x64@0.21.5": 287 | version "0.21.5" 288 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" 289 | integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== 290 | 291 | "@esbuild/openbsd-x64@0.21.5": 292 | version "0.21.5" 293 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" 294 | integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== 295 | 296 | "@esbuild/sunos-x64@0.21.5": 297 | version "0.21.5" 298 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" 299 | integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== 300 | 301 | "@esbuild/win32-arm64@0.21.5": 302 | version "0.21.5" 303 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" 304 | integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== 305 | 306 | "@esbuild/win32-ia32@0.21.5": 307 | version "0.21.5" 308 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" 309 | integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== 310 | 311 | "@esbuild/win32-x64@0.21.5": 312 | version "0.21.5" 313 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" 314 | integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== 315 | 316 | "@jridgewell/sourcemap-codec@^1.5.0": 317 | version "1.5.0" 318 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" 319 | integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== 320 | 321 | "@rollup/rollup-android-arm-eabi@4.24.0": 322 | version "4.24.0" 323 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz#1661ff5ea9beb362795304cb916049aba7ac9c54" 324 | integrity sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA== 325 | 326 | "@rollup/rollup-android-arm64@4.24.0": 327 | version "4.24.0" 328 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz#2ffaa91f1b55a0082b8a722525741aadcbd3971e" 329 | integrity sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA== 330 | 331 | "@rollup/rollup-darwin-arm64@4.24.0": 332 | version "4.24.0" 333 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz#627007221b24b8cc3063703eee0b9177edf49c1f" 334 | integrity sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA== 335 | 336 | "@rollup/rollup-darwin-x64@4.24.0": 337 | version "4.24.0" 338 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz#0605506142b9e796c370d59c5984ae95b9758724" 339 | integrity sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ== 340 | 341 | "@rollup/rollup-linux-arm-gnueabihf@4.24.0": 342 | version "4.24.0" 343 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz#62dfd196d4b10c0c2db833897164d2d319ee0cbb" 344 | integrity sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA== 345 | 346 | "@rollup/rollup-linux-arm-musleabihf@4.24.0": 347 | version "4.24.0" 348 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz#53ce72aeb982f1f34b58b380baafaf6a240fddb3" 349 | integrity sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw== 350 | 351 | "@rollup/rollup-linux-arm64-gnu@4.24.0": 352 | version "4.24.0" 353 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz#1632990f62a75c74f43e4b14ab3597d7ed416496" 354 | integrity sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA== 355 | 356 | "@rollup/rollup-linux-arm64-musl@4.24.0": 357 | version "4.24.0" 358 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz#8c03a996efb41e257b414b2e0560b7a21f2d9065" 359 | integrity sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw== 360 | 361 | "@rollup/rollup-linux-powerpc64le-gnu@4.24.0": 362 | version "4.24.0" 363 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz#5b98729628d5bcc8f7f37b58b04d6845f85c7b5d" 364 | integrity sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw== 365 | 366 | "@rollup/rollup-linux-riscv64-gnu@4.24.0": 367 | version "4.24.0" 368 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz#48e42e41f4cabf3573cfefcb448599c512e22983" 369 | integrity sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg== 370 | 371 | "@rollup/rollup-linux-s390x-gnu@4.24.0": 372 | version "4.24.0" 373 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz#e0b4f9a966872cb7d3e21b9e412a4b7efd7f0b58" 374 | integrity sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g== 375 | 376 | "@rollup/rollup-linux-x64-gnu@4.24.0": 377 | version "4.24.0" 378 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz#78144741993100f47bd3da72fce215e077ae036b" 379 | integrity sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A== 380 | 381 | "@rollup/rollup-linux-x64-musl@4.24.0": 382 | version "4.24.0" 383 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz#d9fe32971883cd1bd858336bd33a1c3ca6146127" 384 | integrity sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ== 385 | 386 | "@rollup/rollup-win32-arm64-msvc@4.24.0": 387 | version "4.24.0" 388 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz#71fa3ea369316db703a909c790743972e98afae5" 389 | integrity sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ== 390 | 391 | "@rollup/rollup-win32-ia32-msvc@4.24.0": 392 | version "4.24.0" 393 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz#653f5989a60658e17d7576a3996deb3902e342e2" 394 | integrity sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ== 395 | 396 | "@rollup/rollup-win32-x64-msvc@4.24.0": 397 | version "4.24.0" 398 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz#0574d7e87b44ee8511d08cc7f914bcb802b70818" 399 | integrity sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw== 400 | 401 | "@shikijs/core@1.22.0", "@shikijs/core@^1.22.0": 402 | version "1.22.0" 403 | resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.22.0.tgz#74e5d4485e5f7afa85109e322b42e400686f92bb" 404 | integrity sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q== 405 | dependencies: 406 | "@shikijs/engine-javascript" "1.22.0" 407 | "@shikijs/engine-oniguruma" "1.22.0" 408 | "@shikijs/types" "1.22.0" 409 | "@shikijs/vscode-textmate" "^9.3.0" 410 | "@types/hast" "^3.0.4" 411 | hast-util-to-html "^9.0.3" 412 | 413 | "@shikijs/engine-javascript@1.22.0": 414 | version "1.22.0" 415 | resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-1.22.0.tgz#2e5db29f0421755492f5279f8224ef7a7f907a29" 416 | integrity sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw== 417 | dependencies: 418 | "@shikijs/types" "1.22.0" 419 | "@shikijs/vscode-textmate" "^9.3.0" 420 | oniguruma-to-js "0.4.3" 421 | 422 | "@shikijs/engine-oniguruma@1.22.0": 423 | version "1.22.0" 424 | resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.0.tgz#74c661fac4cd1f08f2c09b5d6e2fd2a6720d0401" 425 | integrity sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw== 426 | dependencies: 427 | "@shikijs/types" "1.22.0" 428 | "@shikijs/vscode-textmate" "^9.3.0" 429 | 430 | "@shikijs/transformers@^1.22.0": 431 | version "1.22.0" 432 | resolved "https://registry.yarnpkg.com/@shikijs/transformers/-/transformers-1.22.0.tgz#f36fa4d769e36db9a91e09877cf48b3a04d26aba" 433 | integrity sha512-k7iMOYuGQA62KwAuJOQBgH2IQb5vP8uiB3lMvAMGUgAMMurePOx3Z7oNqJdcpxqZP6I9cc7nc4DNqSKduCxmdg== 434 | dependencies: 435 | shiki "1.22.0" 436 | 437 | "@shikijs/types@1.22.0", "@shikijs/types@^1.22.0": 438 | version "1.22.0" 439 | resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.22.0.tgz#d2a572381395c9308b472c8199b8e0289753b9ad" 440 | integrity sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww== 441 | dependencies: 442 | "@shikijs/vscode-textmate" "^9.3.0" 443 | "@types/hast" "^3.0.4" 444 | 445 | "@shikijs/vscode-textmate@^9.3.0": 446 | version "9.3.0" 447 | resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz#b2f1776e488c1d6c2b6cd129bab62f71bbc9c7ab" 448 | integrity sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA== 449 | 450 | "@types/estree@1.0.6": 451 | version "1.0.6" 452 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" 453 | integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== 454 | 455 | "@types/hast@^3.0.0", "@types/hast@^3.0.4": 456 | version "3.0.4" 457 | resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" 458 | integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== 459 | dependencies: 460 | "@types/unist" "*" 461 | 462 | "@types/linkify-it@^5": 463 | version "5.0.0" 464 | resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-5.0.0.tgz#21413001973106cda1c3a9b91eedd4ccd5469d76" 465 | integrity sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q== 466 | 467 | "@types/markdown-it@^14.1.2": 468 | version "14.1.2" 469 | resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-14.1.2.tgz#57f2532a0800067d9b934f3521429a2e8bfb4c61" 470 | integrity sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog== 471 | dependencies: 472 | "@types/linkify-it" "^5" 473 | "@types/mdurl" "^2" 474 | 475 | "@types/mdast@^4.0.0": 476 | version "4.0.4" 477 | resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" 478 | integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== 479 | dependencies: 480 | "@types/unist" "*" 481 | 482 | "@types/mdurl@^2": 483 | version "2.0.0" 484 | resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-2.0.0.tgz#d43878b5b20222682163ae6f897b20447233bdfd" 485 | integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== 486 | 487 | "@types/unist@*", "@types/unist@^3.0.0": 488 | version "3.0.3" 489 | resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" 490 | integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== 491 | 492 | "@types/web-bluetooth@^0.0.20": 493 | version "0.0.20" 494 | resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz#f066abfcd1cbe66267cdbbf0de010d8a41b41597" 495 | integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow== 496 | 497 | "@ungap/structured-clone@^1.0.0": 498 | version "1.2.0" 499 | resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" 500 | integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== 501 | 502 | "@vitejs/plugin-vue@^5.1.4": 503 | version "5.1.4" 504 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz#72b8b705cfce36b00b59af196195146e356500c4" 505 | integrity sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A== 506 | 507 | "@vue/compiler-core@3.5.12": 508 | version "3.5.12" 509 | resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.12.tgz#bd70b7dabd12b0b6f31bc53418ba3da77994c437" 510 | integrity sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw== 511 | dependencies: 512 | "@babel/parser" "^7.25.3" 513 | "@vue/shared" "3.5.12" 514 | entities "^4.5.0" 515 | estree-walker "^2.0.2" 516 | source-map-js "^1.2.0" 517 | 518 | "@vue/compiler-dom@3.5.12": 519 | version "3.5.12" 520 | resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz#456d631d11102535b7ee6fd954cf2c93158d0354" 521 | integrity sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg== 522 | dependencies: 523 | "@vue/compiler-core" "3.5.12" 524 | "@vue/shared" "3.5.12" 525 | 526 | "@vue/compiler-sfc@3.5.12": 527 | version "3.5.12" 528 | resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz#6688120d905fcf22f7e44d3cb90f8dabc4dd3cc8" 529 | integrity sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw== 530 | dependencies: 531 | "@babel/parser" "^7.25.3" 532 | "@vue/compiler-core" "3.5.12" 533 | "@vue/compiler-dom" "3.5.12" 534 | "@vue/compiler-ssr" "3.5.12" 535 | "@vue/shared" "3.5.12" 536 | estree-walker "^2.0.2" 537 | magic-string "^0.30.11" 538 | postcss "^8.4.47" 539 | source-map-js "^1.2.0" 540 | 541 | "@vue/compiler-ssr@3.5.12": 542 | version "3.5.12" 543 | resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz#5f1a3fbd5c44b79a6dbe88729f7801d9c9218bde" 544 | integrity sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA== 545 | dependencies: 546 | "@vue/compiler-dom" "3.5.12" 547 | "@vue/shared" "3.5.12" 548 | 549 | "@vue/devtools-api@^7.4.6": 550 | version "7.5.3" 551 | resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-7.5.3.tgz#577f191f419ceef6c5c8e5366169cc8b6755a645" 552 | integrity sha512-nwz45qBxHOUdZzaYP9V3E1aFOgPpoMmNlBcGn0dsUxizlws4wJ4V6P6849yt28p5NSQ/2E3V87JXFAuk3N9Inw== 553 | dependencies: 554 | "@vue/devtools-kit" "^7.5.3" 555 | 556 | "@vue/devtools-kit@^7.5.3": 557 | version "7.5.3" 558 | resolved "https://registry.yarnpkg.com/@vue/devtools-kit/-/devtools-kit-7.5.3.tgz#c103e2b9026edb3289c90c887dddd2e837e8727b" 559 | integrity sha512-XSTXCAHshYniK3gLQfhMRDuDLLj6vHFWKVl1tvtSgZ0iJy5AXoI4U/GKGlyS2uS1hwZCSoNSGdkKtbW/pn/Iuw== 560 | dependencies: 561 | "@vue/devtools-shared" "^7.5.3" 562 | birpc "^0.2.19" 563 | hookable "^5.5.3" 564 | mitt "^3.0.1" 565 | perfect-debounce "^1.0.0" 566 | speakingurl "^14.0.1" 567 | superjson "^2.2.1" 568 | 569 | "@vue/devtools-shared@^7.5.3": 570 | version "7.5.3" 571 | resolved "https://registry.yarnpkg.com/@vue/devtools-shared/-/devtools-shared-7.5.3.tgz#c7561b925e49b36d3f2058c23068a0f5509d9f4d" 572 | integrity sha512-i2tCUtAEQ0S8AmTuy6FSOmVKCB5ajmMaVrrw0ypX75koLSo1mssQ8zezds5IoUZHRiXBsgoGHbJGuGwyrSGhqQ== 573 | dependencies: 574 | rfdc "^1.4.1" 575 | 576 | "@vue/reactivity@3.5.12": 577 | version "3.5.12" 578 | resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.12.tgz#a2815d91842ed7b9e7e7936c851923caf6b6e603" 579 | integrity sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg== 580 | dependencies: 581 | "@vue/shared" "3.5.12" 582 | 583 | "@vue/runtime-core@3.5.12": 584 | version "3.5.12" 585 | resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.12.tgz#849207f203d0fd82971f19574d30dbe7134c78c7" 586 | integrity sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw== 587 | dependencies: 588 | "@vue/reactivity" "3.5.12" 589 | "@vue/shared" "3.5.12" 590 | 591 | "@vue/runtime-dom@3.5.12": 592 | version "3.5.12" 593 | resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz#6d4de3df49a90a460b311b1100baa5e2d0d1c8c9" 594 | integrity sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA== 595 | dependencies: 596 | "@vue/reactivity" "3.5.12" 597 | "@vue/runtime-core" "3.5.12" 598 | "@vue/shared" "3.5.12" 599 | csstype "^3.1.3" 600 | 601 | "@vue/server-renderer@3.5.12": 602 | version "3.5.12" 603 | resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.12.tgz#79c6bc3860e4e4ef80d85653c5d03fd94b26574e" 604 | integrity sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg== 605 | dependencies: 606 | "@vue/compiler-ssr" "3.5.12" 607 | "@vue/shared" "3.5.12" 608 | 609 | "@vue/shared@3.5.12", "@vue/shared@^3.5.12": 610 | version "3.5.12" 611 | resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.12.tgz#f9e45b7f63f2c3f40d84237b1194b7f67de192e3" 612 | integrity sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg== 613 | 614 | "@vueuse/core@11.1.0", "@vueuse/core@^11.1.0": 615 | version "11.1.0" 616 | resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-11.1.0.tgz#a104f33c899a15f3b28d3eb7b20738501a3a5035" 617 | integrity sha512-P6dk79QYA6sKQnghrUz/1tHi0n9mrb/iO1WTMk/ElLmTyNqgDeSZ3wcDf6fRBGzRJbeG1dxzEOvLENMjr+E3fg== 618 | dependencies: 619 | "@types/web-bluetooth" "^0.0.20" 620 | "@vueuse/metadata" "11.1.0" 621 | "@vueuse/shared" "11.1.0" 622 | vue-demi ">=0.14.10" 623 | 624 | "@vueuse/integrations@^11.1.0": 625 | version "11.1.0" 626 | resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-11.1.0.tgz#1e2c1d43b2d389fc4b4d0a7ee08091665698b9ad" 627 | integrity sha512-O2ZgrAGPy0qAjpoI2YR3egNgyEqwG85fxfwmA9BshRIGjV4G6yu6CfOPpMHAOoCD+UfsIl7Vb1bXJ6ifrHYDDA== 628 | dependencies: 629 | "@vueuse/core" "11.1.0" 630 | "@vueuse/shared" "11.1.0" 631 | vue-demi ">=0.14.10" 632 | 633 | "@vueuse/metadata@11.1.0": 634 | version "11.1.0" 635 | resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-11.1.0.tgz#ad367d2a51d985129724425923b3cf95f0faf27b" 636 | integrity sha512-l9Q502TBTaPYGanl1G+hPgd3QX5s4CGnpXriVBR5fEZ/goI6fvDaVmIl3Td8oKFurOxTmbXvBPSsgrd6eu6HYg== 637 | 638 | "@vueuse/shared@11.1.0": 639 | version "11.1.0" 640 | resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-11.1.0.tgz#3bfc3aa555c2a456c21945ec7f127d71938d12e8" 641 | integrity sha512-YUtIpY122q7osj+zsNMFAfMTubGz0sn5QzE5gPzAIiCmtt2ha3uQUY1+JPyL4gRCTsLPX82Y9brNbo/aqlA91w== 642 | dependencies: 643 | vue-demi ">=0.14.10" 644 | 645 | algoliasearch@^4.19.1: 646 | version "4.24.0" 647 | resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.24.0.tgz#b953b3e2309ef8f25da9de311b95b994ac918275" 648 | integrity sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g== 649 | dependencies: 650 | "@algolia/cache-browser-local-storage" "4.24.0" 651 | "@algolia/cache-common" "4.24.0" 652 | "@algolia/cache-in-memory" "4.24.0" 653 | "@algolia/client-account" "4.24.0" 654 | "@algolia/client-analytics" "4.24.0" 655 | "@algolia/client-common" "4.24.0" 656 | "@algolia/client-personalization" "4.24.0" 657 | "@algolia/client-search" "4.24.0" 658 | "@algolia/logger-common" "4.24.0" 659 | "@algolia/logger-console" "4.24.0" 660 | "@algolia/recommend" "4.24.0" 661 | "@algolia/requester-browser-xhr" "4.24.0" 662 | "@algolia/requester-common" "4.24.0" 663 | "@algolia/requester-node-http" "4.24.0" 664 | "@algolia/transporter" "4.24.0" 665 | 666 | ansi-colors@^4.1.1: 667 | version "4.1.3" 668 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" 669 | integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== 670 | 671 | birpc@^0.2.19: 672 | version "0.2.19" 673 | resolved "https://registry.yarnpkg.com/birpc/-/birpc-0.2.19.tgz#cdd183a4a70ba103127d49765b4a71349da5a0ca" 674 | integrity sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ== 675 | 676 | boolbase@^1.0.0: 677 | version "1.0.0" 678 | resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 679 | integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== 680 | 681 | ccount@^2.0.0: 682 | version "2.0.1" 683 | resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" 684 | integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== 685 | 686 | character-entities-html4@^2.0.0: 687 | version "2.1.0" 688 | resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" 689 | integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== 690 | 691 | character-entities-legacy@^3.0.0: 692 | version "3.0.0" 693 | resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" 694 | integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== 695 | 696 | cheerio-select@^1.5.0: 697 | version "1.6.0" 698 | resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.6.0.tgz#489f36604112c722afa147dedd0d4609c09e1696" 699 | integrity sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g== 700 | dependencies: 701 | css-select "^4.3.0" 702 | css-what "^6.0.1" 703 | domelementtype "^2.2.0" 704 | domhandler "^4.3.1" 705 | domutils "^2.8.0" 706 | 707 | cheerio@1.0.0-rc.10: 708 | version "1.0.0-rc.10" 709 | resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" 710 | integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== 711 | dependencies: 712 | cheerio-select "^1.5.0" 713 | dom-serializer "^1.3.2" 714 | domhandler "^4.2.0" 715 | htmlparser2 "^6.1.0" 716 | parse5 "^6.0.1" 717 | parse5-htmlparser2-tree-adapter "^6.0.1" 718 | tslib "^2.2.0" 719 | 720 | comma-separated-tokens@^2.0.0: 721 | version "2.0.3" 722 | resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" 723 | integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== 724 | 725 | commander@9.2.0: 726 | version "9.2.0" 727 | resolved "https://registry.yarnpkg.com/commander/-/commander-9.2.0.tgz#6e21014b2ed90d8b7c9647230d8b7a94a4a419a9" 728 | integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== 729 | 730 | commander@^6.1.0: 731 | version "6.2.1" 732 | resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" 733 | integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== 734 | 735 | copy-anything@^3.0.2: 736 | version "3.0.5" 737 | resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-3.0.5.tgz#2d92dce8c498f790fa7ad16b01a1ae5a45b020a0" 738 | integrity sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w== 739 | dependencies: 740 | is-what "^4.1.8" 741 | 742 | css-select@^4.3.0: 743 | version "4.3.0" 744 | resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" 745 | integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== 746 | dependencies: 747 | boolbase "^1.0.0" 748 | css-what "^6.0.1" 749 | domhandler "^4.3.1" 750 | domutils "^2.8.0" 751 | nth-check "^2.0.1" 752 | 753 | css-what@^6.0.1: 754 | version "6.1.0" 755 | resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" 756 | integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== 757 | 758 | csstype@^3.1.3: 759 | version "3.1.3" 760 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" 761 | integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== 762 | 763 | dequal@^2.0.0: 764 | version "2.0.3" 765 | resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" 766 | integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== 767 | 768 | devlop@^1.0.0: 769 | version "1.1.0" 770 | resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" 771 | integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== 772 | dependencies: 773 | dequal "^2.0.0" 774 | 775 | dom-serializer@^1.0.1, dom-serializer@^1.3.2: 776 | version "1.4.1" 777 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" 778 | integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== 779 | dependencies: 780 | domelementtype "^2.0.1" 781 | domhandler "^4.2.0" 782 | entities "^2.0.0" 783 | 784 | domelementtype@^2.0.1, domelementtype@^2.2.0: 785 | version "2.3.0" 786 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" 787 | integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== 788 | 789 | domhandler@^3.3.0: 790 | version "3.3.0" 791 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" 792 | integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== 793 | dependencies: 794 | domelementtype "^2.0.1" 795 | 796 | domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: 797 | version "4.3.1" 798 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" 799 | integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== 800 | dependencies: 801 | domelementtype "^2.2.0" 802 | 803 | domutils@^2.4.2, domutils@^2.5.2, domutils@^2.8.0: 804 | version "2.8.0" 805 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" 806 | integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== 807 | dependencies: 808 | dom-serializer "^1.0.1" 809 | domelementtype "^2.2.0" 810 | domhandler "^4.2.0" 811 | 812 | entities@^2.0.0: 813 | version "2.2.0" 814 | resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" 815 | integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== 816 | 817 | entities@^4.5.0: 818 | version "4.5.0" 819 | resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" 820 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== 821 | 822 | esbuild@^0.21.3: 823 | version "0.21.5" 824 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" 825 | integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== 826 | optionalDependencies: 827 | "@esbuild/aix-ppc64" "0.21.5" 828 | "@esbuild/android-arm" "0.21.5" 829 | "@esbuild/android-arm64" "0.21.5" 830 | "@esbuild/android-x64" "0.21.5" 831 | "@esbuild/darwin-arm64" "0.21.5" 832 | "@esbuild/darwin-x64" "0.21.5" 833 | "@esbuild/freebsd-arm64" "0.21.5" 834 | "@esbuild/freebsd-x64" "0.21.5" 835 | "@esbuild/linux-arm" "0.21.5" 836 | "@esbuild/linux-arm64" "0.21.5" 837 | "@esbuild/linux-ia32" "0.21.5" 838 | "@esbuild/linux-loong64" "0.21.5" 839 | "@esbuild/linux-mips64el" "0.21.5" 840 | "@esbuild/linux-ppc64" "0.21.5" 841 | "@esbuild/linux-riscv64" "0.21.5" 842 | "@esbuild/linux-s390x" "0.21.5" 843 | "@esbuild/linux-x64" "0.21.5" 844 | "@esbuild/netbsd-x64" "0.21.5" 845 | "@esbuild/openbsd-x64" "0.21.5" 846 | "@esbuild/sunos-x64" "0.21.5" 847 | "@esbuild/win32-arm64" "0.21.5" 848 | "@esbuild/win32-ia32" "0.21.5" 849 | "@esbuild/win32-x64" "0.21.5" 850 | 851 | escape-goat@^3.0.0: 852 | version "3.0.0" 853 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-3.0.0.tgz#e8b5fb658553fe8a3c4959c316c6ebb8c842b19c" 854 | integrity sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw== 855 | 856 | esm@^3.2.25: 857 | version "3.2.25" 858 | resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" 859 | integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== 860 | 861 | estree-walker@^2.0.2: 862 | version "2.0.2" 863 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 864 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 865 | 866 | focus-trap@^7.6.0: 867 | version "7.6.0" 868 | resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.6.0.tgz#7f3edab8135eaca92ab59b6e963eb5cc42ded715" 869 | integrity sha512-1td0l3pMkWJLFipobUcGaf+5DTY4PLDDrcqoSaKP8ediO/CoWCCYk/fT/Y2A4e6TNB+Sh6clRJCjOPPnKoNHnQ== 870 | dependencies: 871 | tabbable "^6.2.0" 872 | 873 | fsevents@~2.3.2: 874 | version "2.3.2" 875 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 876 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 877 | 878 | fsevents@~2.3.3: 879 | version "2.3.3" 880 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 881 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 882 | 883 | hast-util-to-html@^9.0.3: 884 | version "9.0.3" 885 | resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz#a9999a0ba6b4919576a9105129fead85d37f302b" 886 | integrity sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg== 887 | dependencies: 888 | "@types/hast" "^3.0.0" 889 | "@types/unist" "^3.0.0" 890 | ccount "^2.0.0" 891 | comma-separated-tokens "^2.0.0" 892 | hast-util-whitespace "^3.0.0" 893 | html-void-elements "^3.0.0" 894 | mdast-util-to-hast "^13.0.0" 895 | property-information "^6.0.0" 896 | space-separated-tokens "^2.0.0" 897 | stringify-entities "^4.0.0" 898 | zwitch "^2.0.4" 899 | 900 | hast-util-whitespace@^3.0.0: 901 | version "3.0.0" 902 | resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" 903 | integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== 904 | dependencies: 905 | "@types/hast" "^3.0.0" 906 | 907 | hookable@^5.5.3: 908 | version "5.5.3" 909 | resolved "https://registry.yarnpkg.com/hookable/-/hookable-5.5.3.tgz#6cfc358984a1ef991e2518cb9ed4a778bbd3215d" 910 | integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ== 911 | 912 | html-void-elements@^3.0.0: 913 | version "3.0.0" 914 | resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" 915 | integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== 916 | 917 | htmlparser2@^5.0.0: 918 | version "5.0.1" 919 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-5.0.1.tgz#7daa6fc3e35d6107ac95a4fc08781f091664f6e7" 920 | integrity sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ== 921 | dependencies: 922 | domelementtype "^2.0.1" 923 | domhandler "^3.3.0" 924 | domutils "^2.4.2" 925 | entities "^2.0.0" 926 | 927 | htmlparser2@^6.1.0: 928 | version "6.1.0" 929 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" 930 | integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== 931 | dependencies: 932 | domelementtype "^2.0.1" 933 | domhandler "^4.0.0" 934 | domutils "^2.5.2" 935 | entities "^2.0.0" 936 | 937 | is-what@^4.1.8: 938 | version "4.1.16" 939 | resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.16.tgz#1ad860a19da8b4895ad5495da3182ce2acdd7a6f" 940 | integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A== 941 | 942 | juice@^8.0.0: 943 | version "8.1.0" 944 | resolved "https://registry.yarnpkg.com/juice/-/juice-8.1.0.tgz#4ea23362522fe06418229943237ee3751a4fca70" 945 | integrity sha512-FLzurJrx5Iv1e7CfBSZH68dC04EEvXvvVvPYB7Vx1WAuhCp1ZPIMtqxc+WTWxVkpTIC2Ach/GAv0rQbtGf6YMA== 946 | dependencies: 947 | cheerio "1.0.0-rc.10" 948 | commander "^6.1.0" 949 | mensch "^0.3.4" 950 | slick "^1.12.2" 951 | web-resource-inliner "^6.0.1" 952 | 953 | katex@^0.6.0: 954 | version "0.6.0" 955 | resolved "https://registry.yarnpkg.com/katex/-/katex-0.6.0.tgz#12418e09121c05c92041b6b3b9fb6bab213cb6f3" 956 | integrity sha512-rS4mY3SvHYg5LtQV6RBcK0if7ur6plyEukAOV+jGGPqFImuzu8fHL6M752iBmRGoUyF0bhZbAPoezehn7xYksA== 957 | dependencies: 958 | match-at "^0.1.0" 959 | 960 | magic-string@^0.30.11: 961 | version "0.30.12" 962 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.12.tgz#9eb11c9d072b9bcb4940a5b2c2e1a217e4ee1a60" 963 | integrity sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw== 964 | dependencies: 965 | "@jridgewell/sourcemap-codec" "^1.5.0" 966 | 967 | mark.js@8.11.1: 968 | version "8.11.1" 969 | resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" 970 | integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== 971 | 972 | markdown-it-katex@^2.0.3: 973 | version "2.0.3" 974 | resolved "https://registry.yarnpkg.com/markdown-it-katex/-/markdown-it-katex-2.0.3.tgz#d7b86a1aea0b9d6496fab4e7919a18fdef589c39" 975 | integrity sha512-nUkkMtRWeg7OpdflamflE/Ho/pWl64Lk9wNBKOmaj33XkQdumhXAIYhI0WO03GeiycPCsxbmX536V5NEXpC3Ng== 976 | dependencies: 977 | katex "^0.6.0" 978 | 979 | markdown-it-mathjax3@^4.3.2: 980 | version "4.3.2" 981 | resolved "https://registry.yarnpkg.com/markdown-it-mathjax3/-/markdown-it-mathjax3-4.3.2.tgz#1e34aa86f8560b283fd283008334adc2d6b05a37" 982 | integrity sha512-TX3GW5NjmupgFtMJGRauioMbbkGsOXAAt1DZ/rzzYmTHqzkO1rNAdiMD4NiruurToPApn2kYy76x02QN26qr2w== 983 | dependencies: 984 | juice "^8.0.0" 985 | mathjax-full "^3.2.0" 986 | 987 | match-at@^0.1.0: 988 | version "0.1.1" 989 | resolved "https://registry.yarnpkg.com/match-at/-/match-at-0.1.1.tgz#25d040d291777704d5e6556bbb79230ec2de0540" 990 | integrity sha512-h4Yd392z9mST+dzc+yjuybOGFNOZjmXIPKWjxBd1Bb23r4SmDOsk2NYCU2BMUBGbSpZqwVsZYNq26QS3xfaT3Q== 991 | 992 | mathjax-full@^3.2.0: 993 | version "3.2.2" 994 | resolved "https://registry.yarnpkg.com/mathjax-full/-/mathjax-full-3.2.2.tgz#43f02e55219db393030985d2b6537ceae82f1fa7" 995 | integrity sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w== 996 | dependencies: 997 | esm "^3.2.25" 998 | mhchemparser "^4.1.0" 999 | mj-context-menu "^0.6.1" 1000 | speech-rule-engine "^4.0.6" 1001 | 1002 | mdast-util-to-hast@^13.0.0: 1003 | version "13.2.0" 1004 | resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" 1005 | integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== 1006 | dependencies: 1007 | "@types/hast" "^3.0.0" 1008 | "@types/mdast" "^4.0.0" 1009 | "@ungap/structured-clone" "^1.0.0" 1010 | devlop "^1.0.0" 1011 | micromark-util-sanitize-uri "^2.0.0" 1012 | trim-lines "^3.0.0" 1013 | unist-util-position "^5.0.0" 1014 | unist-util-visit "^5.0.0" 1015 | vfile "^6.0.0" 1016 | 1017 | mensch@^0.3.4: 1018 | version "0.3.4" 1019 | resolved "https://registry.yarnpkg.com/mensch/-/mensch-0.3.4.tgz#770f91b46cb16ea5b204ee735768c3f0c491fecd" 1020 | integrity sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g== 1021 | 1022 | mhchemparser@^4.1.0: 1023 | version "4.2.1" 1024 | resolved "https://registry.yarnpkg.com/mhchemparser/-/mhchemparser-4.2.1.tgz#d73982e66bc06170a85b1985600ee9dabe157cb0" 1025 | integrity sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ== 1026 | 1027 | micromark-util-character@^2.0.0: 1028 | version "2.1.0" 1029 | resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.0.tgz#31320ace16b4644316f6bf057531689c71e2aee1" 1030 | integrity sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ== 1031 | dependencies: 1032 | micromark-util-symbol "^2.0.0" 1033 | micromark-util-types "^2.0.0" 1034 | 1035 | micromark-util-encode@^2.0.0: 1036 | version "2.0.0" 1037 | resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" 1038 | integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== 1039 | 1040 | micromark-util-sanitize-uri@^2.0.0: 1041 | version "2.0.0" 1042 | resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" 1043 | integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== 1044 | dependencies: 1045 | micromark-util-character "^2.0.0" 1046 | micromark-util-encode "^2.0.0" 1047 | micromark-util-symbol "^2.0.0" 1048 | 1049 | micromark-util-symbol@^2.0.0: 1050 | version "2.0.0" 1051 | resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" 1052 | integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== 1053 | 1054 | micromark-util-types@^2.0.0: 1055 | version "2.0.0" 1056 | resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" 1057 | integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== 1058 | 1059 | mime@^2.4.6: 1060 | version "2.6.0" 1061 | resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" 1062 | integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== 1063 | 1064 | minisearch@^7.1.0: 1065 | version "7.1.0" 1066 | resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-7.1.0.tgz#f5830e9109b5919ee7b291c29a304f381aa68770" 1067 | integrity sha512-tv7c/uefWdEhcu6hvrfTihflgeEi2tN6VV7HJnCjK6VxM75QQJh4t9FwJCsA2EsRS8LCnu3W87CuGPWMocOLCA== 1068 | 1069 | mitt@^3.0.1: 1070 | version "3.0.1" 1071 | resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" 1072 | integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== 1073 | 1074 | mj-context-menu@^0.6.1: 1075 | version "0.6.1" 1076 | resolved "https://registry.yarnpkg.com/mj-context-menu/-/mj-context-menu-0.6.1.tgz#a043c5282bf7e1cf3821de07b13525ca6f85aa69" 1077 | integrity sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA== 1078 | 1079 | nanoid@^3.3.7: 1080 | version "3.3.7" 1081 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" 1082 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 1083 | 1084 | node-fetch@^2.6.0: 1085 | version "2.7.0" 1086 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" 1087 | integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== 1088 | dependencies: 1089 | whatwg-url "^5.0.0" 1090 | 1091 | nth-check@^2.0.1: 1092 | version "2.1.1" 1093 | resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" 1094 | integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== 1095 | dependencies: 1096 | boolbase "^1.0.0" 1097 | 1098 | oniguruma-to-js@0.4.3: 1099 | version "0.4.3" 1100 | resolved "https://registry.yarnpkg.com/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz#8d899714c21f5c7d59a3c0008ca50e848086d740" 1101 | integrity sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ== 1102 | dependencies: 1103 | regex "^4.3.2" 1104 | 1105 | parse5-htmlparser2-tree-adapter@^6.0.1: 1106 | version "6.0.1" 1107 | resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" 1108 | integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== 1109 | dependencies: 1110 | parse5 "^6.0.1" 1111 | 1112 | parse5@^6.0.1: 1113 | version "6.0.1" 1114 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" 1115 | integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== 1116 | 1117 | perfect-debounce@^1.0.0: 1118 | version "1.0.0" 1119 | resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a" 1120 | integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA== 1121 | 1122 | picocolors@^1.1.0: 1123 | version "1.1.1" 1124 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" 1125 | integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== 1126 | 1127 | postcss@^8.4.43, postcss@^8.4.47: 1128 | version "8.4.47" 1129 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" 1130 | integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== 1131 | dependencies: 1132 | nanoid "^3.3.7" 1133 | picocolors "^1.1.0" 1134 | source-map-js "^1.2.1" 1135 | 1136 | preact@^10.0.0: 1137 | version "10.13.2" 1138 | resolved "https://registry.yarnpkg.com/preact/-/preact-10.13.2.tgz#2c40c73d57248b57234c4ae6cd9ab9d8186ebc0a" 1139 | integrity sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw== 1140 | 1141 | property-information@^6.0.0: 1142 | version "6.5.0" 1143 | resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" 1144 | integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== 1145 | 1146 | regex@^4.3.2: 1147 | version "4.3.3" 1148 | resolved "https://registry.yarnpkg.com/regex/-/regex-4.3.3.tgz#8cda73ccbdfa7c5691881d02f9bb142dba9daa6a" 1149 | integrity sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg== 1150 | 1151 | rfdc@^1.4.1: 1152 | version "1.4.1" 1153 | resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" 1154 | integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== 1155 | 1156 | rollup@^4.20.0: 1157 | version "4.24.0" 1158 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.24.0.tgz#c14a3576f20622ea6a5c9cad7caca5e6e9555d05" 1159 | integrity sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg== 1160 | dependencies: 1161 | "@types/estree" "1.0.6" 1162 | optionalDependencies: 1163 | "@rollup/rollup-android-arm-eabi" "4.24.0" 1164 | "@rollup/rollup-android-arm64" "4.24.0" 1165 | "@rollup/rollup-darwin-arm64" "4.24.0" 1166 | "@rollup/rollup-darwin-x64" "4.24.0" 1167 | "@rollup/rollup-linux-arm-gnueabihf" "4.24.0" 1168 | "@rollup/rollup-linux-arm-musleabihf" "4.24.0" 1169 | "@rollup/rollup-linux-arm64-gnu" "4.24.0" 1170 | "@rollup/rollup-linux-arm64-musl" "4.24.0" 1171 | "@rollup/rollup-linux-powerpc64le-gnu" "4.24.0" 1172 | "@rollup/rollup-linux-riscv64-gnu" "4.24.0" 1173 | "@rollup/rollup-linux-s390x-gnu" "4.24.0" 1174 | "@rollup/rollup-linux-x64-gnu" "4.24.0" 1175 | "@rollup/rollup-linux-x64-musl" "4.24.0" 1176 | "@rollup/rollup-win32-arm64-msvc" "4.24.0" 1177 | "@rollup/rollup-win32-ia32-msvc" "4.24.0" 1178 | "@rollup/rollup-win32-x64-msvc" "4.24.0" 1179 | fsevents "~2.3.2" 1180 | 1181 | shiki@1.22.0, shiki@^1.22.0: 1182 | version "1.22.0" 1183 | resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.22.0.tgz#45d1dfff0e03a598af70e2ec8592f14ef07827b4" 1184 | integrity sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw== 1185 | dependencies: 1186 | "@shikijs/core" "1.22.0" 1187 | "@shikijs/engine-javascript" "1.22.0" 1188 | "@shikijs/engine-oniguruma" "1.22.0" 1189 | "@shikijs/types" "1.22.0" 1190 | "@shikijs/vscode-textmate" "^9.3.0" 1191 | "@types/hast" "^3.0.4" 1192 | 1193 | slick@^1.12.2: 1194 | version "1.12.2" 1195 | resolved "https://registry.yarnpkg.com/slick/-/slick-1.12.2.tgz#bd048ddb74de7d1ca6915faa4a57570b3550c2d7" 1196 | integrity sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A== 1197 | 1198 | source-map-js@^1.2.0, source-map-js@^1.2.1: 1199 | version "1.2.1" 1200 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" 1201 | integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== 1202 | 1203 | space-separated-tokens@^2.0.0: 1204 | version "2.0.2" 1205 | resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" 1206 | integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== 1207 | 1208 | speakingurl@^14.0.1: 1209 | version "14.0.1" 1210 | resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53" 1211 | integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ== 1212 | 1213 | speech-rule-engine@^4.0.6: 1214 | version "4.0.7" 1215 | resolved "https://registry.yarnpkg.com/speech-rule-engine/-/speech-rule-engine-4.0.7.tgz#b655dacbad3dae04acc0f7665e26ef258397dd09" 1216 | integrity sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g== 1217 | dependencies: 1218 | commander "9.2.0" 1219 | wicked-good-xpath "1.3.0" 1220 | xmldom-sre "0.1.31" 1221 | 1222 | stringify-entities@^4.0.0: 1223 | version "4.0.4" 1224 | resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" 1225 | integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== 1226 | dependencies: 1227 | character-entities-html4 "^2.0.0" 1228 | character-entities-legacy "^3.0.0" 1229 | 1230 | superjson@^2.2.1: 1231 | version "2.2.1" 1232 | resolved "https://registry.yarnpkg.com/superjson/-/superjson-2.2.1.tgz#9377a7fa80fedb10c851c9dbffd942d4bcf79733" 1233 | integrity sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA== 1234 | dependencies: 1235 | copy-anything "^3.0.2" 1236 | 1237 | tabbable@^6.2.0: 1238 | version "6.2.0" 1239 | resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" 1240 | integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== 1241 | 1242 | tr46@~0.0.3: 1243 | version "0.0.3" 1244 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 1245 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 1246 | 1247 | trim-lines@^3.0.0: 1248 | version "3.0.1" 1249 | resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" 1250 | integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== 1251 | 1252 | tslib@^2.2.0: 1253 | version "2.8.0" 1254 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b" 1255 | integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA== 1256 | 1257 | unist-util-is@^6.0.0: 1258 | version "6.0.0" 1259 | resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" 1260 | integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== 1261 | dependencies: 1262 | "@types/unist" "^3.0.0" 1263 | 1264 | unist-util-position@^5.0.0: 1265 | version "5.0.0" 1266 | resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" 1267 | integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== 1268 | dependencies: 1269 | "@types/unist" "^3.0.0" 1270 | 1271 | unist-util-stringify-position@^4.0.0: 1272 | version "4.0.0" 1273 | resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" 1274 | integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== 1275 | dependencies: 1276 | "@types/unist" "^3.0.0" 1277 | 1278 | unist-util-visit-parents@^6.0.0: 1279 | version "6.0.1" 1280 | resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" 1281 | integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== 1282 | dependencies: 1283 | "@types/unist" "^3.0.0" 1284 | unist-util-is "^6.0.0" 1285 | 1286 | unist-util-visit@^5.0.0: 1287 | version "5.0.0" 1288 | resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" 1289 | integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== 1290 | dependencies: 1291 | "@types/unist" "^3.0.0" 1292 | unist-util-is "^6.0.0" 1293 | unist-util-visit-parents "^6.0.0" 1294 | 1295 | valid-data-url@^3.0.0: 1296 | version "3.0.1" 1297 | resolved "https://registry.yarnpkg.com/valid-data-url/-/valid-data-url-3.0.1.tgz#826c1744e71b5632e847dd15dbd45b9fb38aa34f" 1298 | integrity sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA== 1299 | 1300 | vfile-message@^4.0.0: 1301 | version "4.0.2" 1302 | resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" 1303 | integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== 1304 | dependencies: 1305 | "@types/unist" "^3.0.0" 1306 | unist-util-stringify-position "^4.0.0" 1307 | 1308 | vfile@^6.0.0: 1309 | version "6.0.3" 1310 | resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" 1311 | integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== 1312 | dependencies: 1313 | "@types/unist" "^3.0.0" 1314 | vfile-message "^4.0.0" 1315 | 1316 | vite@^5.4.8: 1317 | version "5.4.10" 1318 | resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.10.tgz#d358a7bd8beda6cf0f3b7a450a8c7693a4f80c18" 1319 | integrity sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ== 1320 | dependencies: 1321 | esbuild "^0.21.3" 1322 | postcss "^8.4.43" 1323 | rollup "^4.20.0" 1324 | optionalDependencies: 1325 | fsevents "~2.3.3" 1326 | 1327 | vitepress@^1.4.1: 1328 | version "1.4.1" 1329 | resolved "https://registry.yarnpkg.com/vitepress/-/vitepress-1.4.1.tgz#59c2f242e6a9efd27388093994a5b8df42e9dcb4" 1330 | integrity sha512-C2rQ7PMlDVqgsaHOa0uJtgGGWaGv74QMaGL62lxKbtFkYtosJB5HAfZ8+pEbfzzvLemYaYwaiQdFLBlexK2sFw== 1331 | dependencies: 1332 | "@docsearch/css" "^3.6.2" 1333 | "@docsearch/js" "^3.6.2" 1334 | "@shikijs/core" "^1.22.0" 1335 | "@shikijs/transformers" "^1.22.0" 1336 | "@shikijs/types" "^1.22.0" 1337 | "@types/markdown-it" "^14.1.2" 1338 | "@vitejs/plugin-vue" "^5.1.4" 1339 | "@vue/devtools-api" "^7.4.6" 1340 | "@vue/shared" "^3.5.12" 1341 | "@vueuse/core" "^11.1.0" 1342 | "@vueuse/integrations" "^11.1.0" 1343 | focus-trap "^7.6.0" 1344 | mark.js "8.11.1" 1345 | minisearch "^7.1.0" 1346 | shiki "^1.22.0" 1347 | vite "^5.4.8" 1348 | vue "^3.5.12" 1349 | 1350 | vue-demi@>=0.14.10: 1351 | version "0.14.10" 1352 | resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.10.tgz#afc78de3d6f9e11bf78c55e8510ee12814522f04" 1353 | integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg== 1354 | 1355 | vue@^3.5.12: 1356 | version "3.5.12" 1357 | resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.12.tgz#e08421c601b3617ea2c9ef0413afcc747130b36c" 1358 | integrity sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg== 1359 | dependencies: 1360 | "@vue/compiler-dom" "3.5.12" 1361 | "@vue/compiler-sfc" "3.5.12" 1362 | "@vue/runtime-dom" "3.5.12" 1363 | "@vue/server-renderer" "3.5.12" 1364 | "@vue/shared" "3.5.12" 1365 | 1366 | web-resource-inliner@^6.0.1: 1367 | version "6.0.1" 1368 | resolved "https://registry.yarnpkg.com/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz#df0822f0a12028805fe80719ed52ab6526886e02" 1369 | integrity sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A== 1370 | dependencies: 1371 | ansi-colors "^4.1.1" 1372 | escape-goat "^3.0.0" 1373 | htmlparser2 "^5.0.0" 1374 | mime "^2.4.6" 1375 | node-fetch "^2.6.0" 1376 | valid-data-url "^3.0.0" 1377 | 1378 | webidl-conversions@^3.0.0: 1379 | version "3.0.1" 1380 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 1381 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 1382 | 1383 | whatwg-url@^5.0.0: 1384 | version "5.0.0" 1385 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 1386 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 1387 | dependencies: 1388 | tr46 "~0.0.3" 1389 | webidl-conversions "^3.0.0" 1390 | 1391 | wicked-good-xpath@1.3.0: 1392 | version "1.3.0" 1393 | resolved "https://registry.yarnpkg.com/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz#81b0e95e8650e49c94b22298fff8686b5553cf6c" 1394 | integrity sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw== 1395 | 1396 | xmldom-sre@0.1.31: 1397 | version "0.1.31" 1398 | resolved "https://registry.yarnpkg.com/xmldom-sre/-/xmldom-sre-0.1.31.tgz#10860d5bab2c603144597d04bf2c4980e98067f4" 1399 | integrity sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw== 1400 | 1401 | zwitch@^2.0.4: 1402 | version "2.0.4" 1403 | resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" 1404 | integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== 1405 | --------------------------------------------------------------------------------