diff --git a/content/posts/modular-web-app.md b/content/posts/modular-app-1.md similarity index 67% rename from content/posts/modular-web-app.md rename to content/posts/modular-app-1.md index 4ef6962..7726ba2 100644 --- a/content/posts/modular-web-app.md +++ b/content/posts/modular-app-1.md @@ -1,5 +1,5 @@ +++ -title = "Plugin-Based Web Application in Dotnet" +title = "#1 Plugin-Based Web App in Dotnet - The Idea" date = "2024-01-20T00:00:00+00:00" author = "the1mason" authorTwitter = "the0mason" #do not include @ @@ -13,22 +13,39 @@ hideComments = false draft = false +++ -### Table of Contents + +
-- [Introduction](#introduction) +# Chapters + +Writing those takes time. Expect to see one published per one-two weeks. + +1. Idea, Stack + +2. ~~Loading plugins~~ + +3. ~~PluginBase, IPlugin~~ + +4. ~~Creating plugin, DependencyInjection~~ + +5. ~~Controllers, Views~~ + +6. ~~Hooks and Triggers - better event system~~ + +7. ~~Advanced: Unit tests, unloading plugins~~ # Introduction Have you ever heard of plugins? These are loadable libraries, extending your application. -This article is an overview of my plugin-based web application prototype and mechanisms behind it's features as well as my thought process and decision making during development. This article is, essentially, a step by step guide to making your own plugin-based web app prototype. +This series of articles is an overview of my plugin-based web application prototype and mechanisms behind it's features, as well as my thought process and decision making during development. These articles are a step by step guide to making your own plugin-based web app prototype. -*This article assumes some knowledge of programming and design patterns.* +*I assume some that readers have some knowledge of C# and design patterns* # Problem -Self-hosted web applications can solve different problems and be of use to a variety of different people with slightly different needs. For this to work, I think that such an application should provide an option to extend its functionality. This would allow other people to build an ecosystem of different extensions around it. +Self-hosted web applications can solve different problems and be of use to a variety of different people with slightly different needs. For this to work, I think that such an application should provide an option to extend its functionality. This would allow other people to build an ecosystem of different extensions around it. For example, a shopping website might have plugins for different payment systems, or a comment section under the product page. For me this also means, that instead of making one feature-rich website, that would be so specific to my needs, that it wouldn't of any use to anyone but me, I can write a bunch of smaller modules, that could be used by someone, without having to configure other modules. -# Choose your stack! +# Choosing my stack ![C#, MVC, HTMX](/posts/modular-app/stack.svg) @@ -40,9 +57,9 @@ I'm a dotnet developer and I write C# code for living. This project is as much o I haven't seen such plugin-based sites written in C#. There are some projects, using plugin based architecture... Well, there's even a [Microsoft Learn Article](https://learn.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support) about building such an app! -**Q:** Why would I even bother to write all these posts and making prototypes? Even more: Why would someone be interested in such post? +> **Q:** Why would I even bother to write all these posts and making prototypes? Even more: Why would someone be interested in such post? -**A:** You see... there's a problem: Neither `learn.microsoft.com` nor any other webside covers dynamically updating web interface with plugins! If you want to learn about it, it's the right place. Also just loading libraries isn't enough because app also has to provide some ways for plugins to interact with it, which is also covered here! +> **A:** You see... there's a problem: Neither `learn.microsoft.com` nor any other webside covers dynamically updating web interface with plugins! If you want to learn about it, it's the right place. Also just loading libraries isn't enough because app also has to provide some ways for plugins to interact with it, which is also covered here! --- @@ -58,6 +75,17 @@ ASP.NET MVC is a web framework, that incorporates the MVC design pattern and use HTMX uses [Hypermedia as the Engine of Application State (HATEOAS)](https://htmx.org/essays/hateoas/) - it's a principle that leaves all state handling to the server, providing the client only with a set of actions that it can take. Your regular SPA will get raw data from the server (like bank balance) and based on it, it will show or hide certain actions (like we won't show the withdrawal option if balance is 0 or less). With HATEOAS, the server just won't give the link to withdraw money, making this action impossible in the first place. +HTMX would allow this app to be extended more easily as well. Most of the modern JS frameworks require transpiling, bundling and other sorts of stuff. This means that when a plugin is installed the client is most likely will have to be rebuilt. This is slow and needs additional dependencies. + +> Have you heard about Blazor WASM? You can just write client code in C#! + +Blazor WASM does not support dynamic loading for plugins. Because of that, plugins won't be able to extend the client. Also it's initial load time is stupidly slow. + +--- + +The next article will cover the following topocs: Loading plugins in runtime, creating plugin's instances, app-plugin communication. I'll have the link here when I'm done writing it! + + \ No newline at end of file diff --git a/content/posts/modular-web-app-advanced.md b/content/posts/modular-web-app-advanced.md new file mode 100644 index 0000000..de6b364 --- /dev/null +++ b/content/posts/modular-web-app-advanced.md @@ -0,0 +1,71 @@ ++++ +title = "Plugin-Based Web Application in Dotnet" +date = "2024-01-20T00:00:00+00:00" +author = "the1mason" +authorTwitter = "the0mason" #do not include @ +cover = "posts/modular-app/title.svg" +tags = ["dotnet", "web", "prototype"] +keywords = ["prototype", "dotnet", "guide", "plugins", "plugin-based", "web application", "ASP.NET", "C#", ".NET 8", "Programming", "Software Architecture"] +description = "Have you ever thought about making a web application, that could be easily extended by third-party developers? I've been thinking about making this app for a while, so here's my experience..." +showFullContent = false +readingTime = true +hideComments = false +draft = true ++++ + +### Table of Contents + +- [Introduction](#introduction) +- [Why](#why) +- [How](#how) +- [The Prototype](#the-prototype) +- - [IPlugin](#iplugin) +- - [Loading Plugins](#loading-plugins) +- - [Hooks and Triggers](#hooks-and-triggers) +- [Sources](#sources) + + +# Introduction + +This post is about my experience of making a prototype of a web app with plugin support as well as my reasoning. As a result, this app could be extended by adding compiled `.dll` class libraries into a plugins folder. I've made it possible to load not only classes but also views and API controllers. You can check out the final version of this prototype in this [GitHub Repo](//github.com/the1mason/prototype.modularmvc). +Also right now I'm building a web application, using similar concepts. As of now, it's not on github, but you can find it [here](//git.the1mason.com/the1mason/octocore). + + +
+ +# Why + +Self-hosted web applications can solve different problems and be of use to a variety of different people with slightly different needs. For this to work, I think that such an application should provide an option to extend its functionality. This would allow other people to build an ecosystem of different extensions. + +# Stack + +![C#, MVC, HTMX](/posts/modular-app/stack.svg) + +Making a C# web application was my goal from the begginning. That's my backend language for this project, but why MVC and what is HTMX? +Let's have a quick look at worthy alternatives, and then I'll explain my choices. + +`Blazor WASM` does not support runtime assembly loading, which makes client extension impossible. It has [Lazy loading](https://learn.microsoft.com/en-us/aspnet/core/blazor/webassembly-lazy-load-assemblies?view=aspnetcore-8.0), but it still requires these assemblies to be defined in the project file, which is not viable for our case. + +`WebApi + ` is also not an option. It would require plugins to be written in two languages. Also, the client would have to be rebuilt after each plugin installation. + +So, what are MVC and HTMX? + +`ASP.NET MVC` is an older framework that uses `Razor Pages` to render HTML on a server and return it to the client. But it has a significant problem: Lack of reactivity. Each user's action would have to be processed on the server like in the good old days... +So in order for the app to be usable, I have decided to go with `HTMX`: + +> htmx gives you access to AJAX, CSS Transitions, WebSockets and Server Sent Events directly in HTML, using attributes, so you can build modern user interfaces with the simplicity and power of hypertext. +> *— from [htmx.org](htmx.org)* + +
+ +
+
+ +This means, that I will use razor pages to generate an HTML body with HTMX tags, and return it to the client. The client would then read HTML, executing HTMX tags. Ain't that awesome? + +# How + +[This](https://learn.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support) article gives the base for plugin loading. It doesn't cover the ASP.NET part but otherwise is very helpful. +Still, I will explain basic concepts here. Just to have everything in one place. + + diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..6869e4e --- /dev/null +++ b/public/404.html @@ -0,0 +1,175 @@ + + + + + 404 Page not found :: the1mason + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + +
+ + + + +
+ + +
+ +
+

404 — Page not found...

+ +
+ Back to home page → +
+ +
+ +
+ + + + + + + + + + + + + + + + +
+ + + diff --git a/public/bigcrab.png b/public/bigcrab.png new file mode 100644 index 0000000..c946f1c Binary files /dev/null and b/public/bigcrab.png differ diff --git a/public/bundle.min.js b/public/bundle.min.js new file mode 100644 index 0000000..bc7678f --- /dev/null +++ b/public/bundle.min.js @@ -0,0 +1,45 @@ +(()=>{var t=document.querySelector(".container"),e=document.querySelectorAll(".menu");document.body.addEventListener("click",()=>{e.forEach(e=>{e.classList.contains("open")&&e.classList.remove("open")})}),window.addEventListener("resize",()=>{e.forEach(e=>{e.classList.remove("open")})}),e.forEach(n=>{const o=n.querySelector(".menu__trigger"),s=n.querySelector(".menu__dropdown");o.addEventListener("click",o=>{o.stopPropagation(),n.classList.contains("open")?n.classList.remove("open"):(e.forEach(e=>e.classList.remove("open")),n.classList.add("open")),s.getBoundingClientRect().right>t.getBoundingClientRect().right&&(s.style.left="auto",s.style.right=0)}),s.addEventListener("click",e=>e.stopPropagation())})})(),(()=>{var e=Object.getOwnPropertyNames,t=(t,n)=>function(){return n||(0,t[e(t)[0]])((n={exports:{}}).exports,n),n.exports},n=t({""(e,t){var s="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},n=function(e){var s,c,o=/\blang(?:uage)?-([\w-]+)\b/i,d=0,i={},t={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof n?new n(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);f+=u.value.length,u=u.next){if(b=u.value,o.length>s.length)return;if(!(b instanceof n)){if(O=1,z){if(!(g=l(N,f,s,S)))break;var E=g.index,L=g.index+g[0].length,p=f;for(p+=u.value.length;p<=E;)u=u.next,p+=u.value.length;if(p-=u.value.length,f=p,u.value instanceof n)continue;for(j=u;j!==o.tail&&(pd.reach&&(d.reach=k),w=u.prev,A&&(w=a(o,w,A),f+=A.length),h(o,w,O),D=new n(_,M?t.tokenize(C,M):C,R,C),(u=a(o,w,D),T&&a(o,u,T),1d.reach&&(d.reach=x.reach))}}}}(e,o,s,o.head,0),function(e){for(var n=[],t=e.head.next;t!==e.tail;)n.push(t.value),t=t.next;return n}(o)},hooks:{all:{},add:function(e,n){var s=t.hooks.all;s[e]=s[e]||[],s[e].push(n)},run:function(e,n){var o,i,s=t.hooks.all[e];if(s&&s.length)for(i=0;o=s[i++];)o(n)}},Token:n};function n(e,t,n,s){this.type=e,this.content=t,this.alias=n,this.length=0|(s||"").length}function l(e,t,n,s){e.lastIndex=t;var i,o=e.exec(n);return o&&s&&o[1]&&(i=o[1].length,o.index+=i,o[0]=o[0].slice(i)),o}function u(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function a(e,t,n){var o=t.next,s={value:n,prev:t,next:o};return t.next=s,o.prev=s,e.length++,s}function h(e,t,n){for(var s=t.next,o=0;o"+o.content+""},!e.document)return e.addEventListener&&(t.disableWorkerMessageHandler||e.addEventListener("message",function(n){var s=JSON.parse(n.data),o=s.language,i=s.code,a=s.immediateClose;e.postMessage(t.highlight(i,t.languages[o],o)),a&&e.close()},!1)),t;s=t.util.currentScript();function r(){t.manual||t.highlightAll()}return(s&&(t.filename=s.src,s.hasAttribute("data-manual")&&(t.manual=!0)),!t.manual)&&(c=document.readyState,"loading"===c||"interactive"===c&&s&&s.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)),t}(s);"undefined"!=typeof t&&t.exports&&(t.exports=n),"undefined"!=typeof global&&(global.Prism=n),n.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>/=$<%]+(?:\s(?:\s*[^\s>/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>/]+/,inside:{namespace:/^[^\s>/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},n.languages.markup.tag.inside["attr-value"].inside.entity=n.languages.markup.entity,n.languages.markup.doctype.inside["internal-subset"].inside=n.languages.markup,n.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(n.languages.markup.tag,"addInlined",{value:function(e,t){var o,i,s={};s["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:n.languages[t]},s.cdata=/^$/i,o={"included-cdata":{pattern://i,inside:s}},o["language-"+t]={pattern:/[\s\S]+/,inside:n.languages[t]},i={},i[e]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:o},n.languages.insertBefore("markup","cdata",i)}}),Object.defineProperty(n.languages.markup.tag,"addAttribute",{value:function(e,t){n.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(`(^|["'\\s])(?:`+e+`)\\s*=\\s*(?:"[^"]*"|'[^']*'|[^\\s'">=]+(?=[\\s>]))`,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:n.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),n.languages.html=n.languages.markup,n.languages.mathml=n.languages.markup,n.languages.svg=n.languages.markup,n.languages.xml=n.languages.extend("markup",{}),n.languages.ssml=n.languages.xml,n.languages.atom=n.languages.xml,n.languages.rss=n.languages.xml,!function(e){var n,t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+`|(?:[^\\\\ +()"']|\\\\[^])*)\\)`,"i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css,n=e.languages.markup,n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(n),n.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},n.languages.javascript=n.languages.extend("clike",{"class-name":[n.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),n.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,n.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:n.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:n.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:n.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:n.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:n.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),n.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:n.languages.javascript}},string:/[\s\S]+/}}}),n.languages.markup&&(n.languages.markup.tag.addInlined("script","javascript"),n.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),n.languages.js=n.languages.javascript,n.languages.actionscript=n.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|else|extends|finally|for|function|if|implements|import|in|instanceof|interface|internal|is|native|new|null|package|private|protected|public|return|super|switch|this|throw|try|typeof|use|var|void|while|with|dynamic|each|final|get|include|namespace|override|set|static)\b/,operator:/\+\+|--|(?:[+\-*/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),n.languages.actionscript["class-name"].alias="function",n.languages.markup&&n.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:n.languages.markup}}),n.languages.apacheconf={comment:/#.*/,"directive-inline":{pattern:/(^[\t ]*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|Type|UserFile|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferSize|BufferedLogs|CGIDScriptTimeout|CGIMapExtension|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DTracePrivileges|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtFilterDefine|ExtFilterOptions|ExtendedStatus|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|KeepAlive|KeepAliveTimeout|KeptBodySize|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|LanguagePriority|Limit(?:InternalRecursion|Request(?:Body|FieldSize|Fields|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|MMapFile|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|ModMimeUsePathInfo|ModemStandard|MultiviewsMatch|Mutex|NWSSLTrustedCerts|NWSSLUpgradeable|NameVirtualHost|NoProxy|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|RLimitCPU|RLimitMEM|RLimitNPROC|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|SSIETag|SSIEndTag|SSIErrorMsg|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|SRPUnknownUserSeed|SRPVerifierFile|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UseStapling|UserName|VerifyClient|VerifyDepth)|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadStackSize|ThreadsPerChild|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,lookbehind:!0,alias:"property"},"directive-block":{pattern:/<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,inside:{"directive-block":{pattern:/^<\/?\w+/,inside:{punctuation:/^<\/?/},alias:"tag"},"directive-block-parameter":{pattern:/.*[^>]/,inside:{punctuation:/:/,string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}}},alias:"attr-value"},punctuation:/>/},alias:"tag"},"directive-flags":{pattern:/\[(?:[\w=],?)+\]/,alias:"keyword"},string:{pattern:/("|').*\1/,inside:{variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/}},variable:/[$%]\{?(?:\w\.?[-+:]?)+\}?/,regex:/\^?.*\$|\^.*\$?/},n.languages.applescript={comment:[/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,/--.+/,/#.+/],string:/"(?:\\.|[^"\\\r\n])*"/,number:/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?\b/i,operator:[/[&=≠≤≥*+\-/÷^]|[<>]=?/,/\b(?:(?:start|begin|end)s? with|(?:(?:does not|doesn't) contain|contains?)|(?:is|isn't|is not) (?:in|contained by)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:(?:does not|doesn't) come|comes) (?:before|after)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equals|equal to|isn't|is not)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|or|div|mod|as|not))\b/],keyword:/\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,class:{pattern:/\b(?:alias|application|boolean|class|constant|date|file|integer|list|number|POSIX file|real|record|reference|RGB color|script|text|centimetres|centimeters|feet|inches|kilometres|kilometers|metres|meters|miles|yards|square feet|square kilometres|square kilometers|square metres|square meters|square miles|square yards|cubic centimetres|cubic centimeters|cubic feet|cubic inches|cubic metres|cubic meters|cubic yards|gallons|litres|liters|quarts|grams|kilograms|ounces|pounds|degrees Celsius|degrees Fahrenheit|degrees Kelvin)\b/,alias:"builtin"},punctuation:/[{}():,¬«»《》]/},!function(e){var n="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",o={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},t={bash:o,environment:{pattern:RegExp("\\$"+n),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!/]|##?|%%?|\^\^?|,,?/,punctuation:/[[\]]/,environment:{pattern:RegExp("(\\{)"+n),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+n),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:t},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:o}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:t.entity}}],environment:{pattern:RegExp("\\$?"+n),alias:"constant"},variable:t.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},o.inside=e.languages.bash;for(var i=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=t.variable[1].inside,s=0;s>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),n.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},n.languages.c.string],comment:n.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:n.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete n.languages.c.boolean,!function(e){function n(e,t){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+t[+n]+")"})}function t(e,t,s){return RegExp(n(e,t),s||"")}function r(e,t){for(var n=0;n>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var S="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",c="class enum interface record struct",_="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",f="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var v=l(c),d=RegExp(l(S+" "+c+" "+_+" "+f)),z=l(c+" "+_+" "+f),T=l(S+" "+c+" "+f),u=r("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),h=r("\\((?:[^()]|<>)*\\)",2),o="@?\\b[A-Za-z_]\\w*\\b",m=n("<<0>>(?:\\s*<<1>>)?",[o,u]),i=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[z,m]),p="\\[\\s*(?:,\\s*)*\\]",D=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[i,p]),a=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[n("\\(<<0>>+(?:,<<0>>+)+\\)",[n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[u,h,p])]),i,p]),s={keyword:d,punctuation:/[<>()?,.:[\]]/},w=`'(?:[^ +'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'`,O=`"(?:\\\\.|[^\\\\" +])*"`;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:t("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:t("(^|[^@$\\\\])<<0>>",[O]),lookbehind:!0,greedy:!0},{pattern:RegExp(w),greedy:!0,alias:"character"}],"class-name":[{pattern:t("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[i]),lookbehind:!0,inside:s},{pattern:t("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[o,a]),lookbehind:!0,inside:s},{pattern:t("(\\busing\\s+)<<0>>(?=\\s*=)",[o]),lookbehind:!0},{pattern:t("(\\b<<0>>\\s+)<<1>>",[v,m]),lookbehind:!0,inside:s},{pattern:t("(\\bcatch\\s*\\(\\s*)<<0>>",[i]),lookbehind:!0,inside:s},{pattern:t("(\\bwhere\\s+)<<0>>",[o]),lookbehind:!0},{pattern:t("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[D]),lookbehind:!0,inside:s},{pattern:t("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[a,T,o]),inside:s}],keyword:d,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:t("([(,]\\s*)<<0>>(?=\\s*:)",[o]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:t("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[o]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:t("(\\b(?:default|typeof|sizeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[h]),lookbehind:!0,alias:"class-name",inside:s},"return-type":{pattern:t("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[a,i]),inside:s,alias:"class-name"},"constructor-invocation":{pattern:t("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[a]),lookbehind:!0,inside:s,alias:"class-name"},"generic-method":{pattern:t("<<0>>\\s*<<1>>(?=\\s*\\()",[o,u]),inside:{function:t("^<<0>>",[o]),generic:{pattern:RegExp(u),alias:"class-name",inside:s}}},"type-list":{pattern:t("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[v,m,o,a,d.source,h,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:t("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[m,h]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:d,"class-name":{pattern:RegExp(a),greedy:!0,inside:s},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var x=O+"|"+w,C=n(`/(?![*/])|//[^ +]*[ +]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>`,[x]),b=r(n(`[^"'/()]|<<0>>|\\(<>*\\)`,[C]),2),k="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",F=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[i,b]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:t("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[k,F]),lookbehind:!0,greedy:!0,inside:{target:{pattern:t("^<<0>>(?=\\s*:)",[k]),alias:"keyword"},"attribute-arguments":{pattern:t("\\(<<0>>*\\)",[b]),inside:e.languages.csharp},"class-name":{pattern:RegExp(i),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var g=`:[^} +]+`,M=r(n(`[^"'/()]|<<0>>|\\(<>*\\)`,[C]),2),A=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[M,g]),E=r(n(`[^"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)`,[x]),2),y=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[E,g]);function j(n,s){return{interpolation:{pattern:t("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:t("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[s,g]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:t('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[A]),lookbehind:!0,greedy:!0,inside:j(A,M)},{pattern:t('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[y]),lookbehind:!0,greedy:!0,inside:j(y,E)}]})}(n),n.languages.dotnet=n.languages.cs=n.languages.csharp,!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,function(){return t.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(`(\\b(?:module|import)\\s+)(?:"(?:\\\\(?: +|[^])|[^"\\\\ +])*"|<[^<> +]*>|`+"(?:\\s*:\\s*)?|:\\s*".replace(//g,function(){return n})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b[a-z_]\w*\s*<(?:[^<>]|<(?:[^<>])*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(n),n.languages.cmake={comment:/#.*/,string:{pattern:/"(?:[^\\"]|\\.)*"/,greedy:!0,inside:{interpolation:{pattern:/\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,inside:{punctuation:/\$\{|\}/,variable:/\w+/}}}},variable:/\b(?:CMAKE_\w+|\w+_(?:VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?|(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_(?:BINARY_DIR|DESCRIPTION|HOMEPAGE_URL|NAME|SOURCE_DIR|VERSION|VERSION_(?:MAJOR|MINOR|PATCH|TWEAK))|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE|XCODE_VERSION))\b/,property:/\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|GLOBAL_KEYWORD|GLOBAL_PROJECT_TYPES|GLOBAL_ROOTNAMESPACE|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,keyword:/\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,boolean:/\b(?:ON|OFF|TRUE|FALSE)\b/,namespace:/\b(?:PROPERTIES|SHARED|PRIVATE|STATIC|PUBLIC|INTERFACE|TARGET_OBJECTS)\b/,operator:/\b(?:NOT|AND|OR|MATCHES|LESS|GREATER|EQUAL|STRLESS|STRGREATER|STREQUAL|VERSION_LESS|VERSION_EQUAL|VERSION_GREATER|DEFINED)\b/,inserted:{pattern:/\b\w+::\w+\b/,alias:"class-name"},number:/\b\d+(?:\.\d+)*\b/,function:/\b[a-z_]\w*(?=\s*\()\b/i,punctuation:/[()>}]|\$[<{]/},!function(e){var n=/#(?!\{).+/,t={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:n,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:t}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:n,interpolation:t}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:t}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(n),n.languages.csp={directive:{pattern:/(^|[^-\da-z])(?:base-uri|block-all-mixed-content|(?:child|connect|default|font|frame|img|manifest|media|object|prefetch|script|style|worker)-src|disown-opener|form-action|frame-(?:ancestors|options)|input-protection(?:-(?:clip|selectors))?|navigate-to|plugin-types|policy-uri|referrer|reflected-xss|report-(?:to|uri)|require-sri-for|sandbox|(?:script|style)-src-(?:attr|elem)|upgrade-insecure-requests)(?=[^-\da-z]|$)/i,lookbehind:!0,alias:"keyword"},safe:{pattern:/'(?:deny|none|report-sample|self|strict-dynamic|top-only|(?:nonce|sha(?:256|384|512))-[-+/\w=]+)'/i,alias:"selector"},unsafe:{pattern:/(?:'unsafe-(?:allow-redirects|dynamic|eval|hash-attributes|hashed-attributes|hashes|inline)'|\*)/i,alias:"function"}},!function(e){t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:n={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp(`\\[(?:[^[\\]"']|`+t.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[t,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=n,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var t,n,s={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},o={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:rgb|hsl)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:rgb|hsl)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:s,number:o,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:s,number:o})}(n),!function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach(function(n){var o=t[n],s=[];/^\w+$/.test(n)||s.push(/\w+/.exec(n)[0]),"diff"===n&&s.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+o+`].*(?: +?| +|(?![\\s\\S])))+`,"m"),alias:s,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}}),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(n),!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,s,o,i){if(n.language===s){var a=n.tokenStack=[];n.code=n.code.replace(o,function(e){if("function"==typeof i&&!i(e))return e;for(var r,o=a.length;-1!==n.code.indexOf(r=t(s,o));)++o;return a[o]=e,r}),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,s){if(n.language===s&&n.tokenStack){n.grammar=e.languages[s];var o=0,i=Object.keys(n.tokenStack);!function a(r){for(d=0;d=i.length);d++)if(c=r[d],"string"==typeof c||c.content&&"string"==typeof c.content){{var c,d,m=i[o],f=n.tokenStack[m],u="string"==typeof c?c:c.content,p=t(s,m),h=u.indexOf(p);if(-1]?|>[=>]?|[&|^~]/,number:/\b\d+(?:\.\d+)?\b/,boolean:/[Tt]rue|[Ff]alse|[Nn]one/,variable:/\b\w+?\b/,punctuation:/[{}[\](),.:;]/};var n=/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g,t=e.languages["markup-templating"];e.hooks.add("before-tokenize",function(e){t.buildPlaceholders(e,"django",n)}),e.hooks.add("after-tokenize",function(e){t.tokenizePlaceholders(e,"django")}),e.languages.jinja2=e.languages.django,e.hooks.add("before-tokenize",function(e){t.buildPlaceholders(e,"jinja2",n)}),e.hooks.add("after-tokenize",function(e){t.tokenizePlaceholders(e,"jinja2")})}(n),!function(e){var i="(?:[ ]+(?![ ])(?:)?|)".replace(//g,function(){return`\\\\[ +](?:\\s|\\\\[ +]|#.*(?!.))*(?![\\s#]|\\\\[ +])`}),n=`"(?:[^"\\\\ +]|\\\\(?: +|[^]))*"|'(?:[^'\\\\ +]|\\\\(?: +|[^]))*'`,a=`--[\\w-]+=(?:|(?!["'])(?:[^\\s\\\\]|\\\\.)+)`.replace(//g,function(){return n}),s={pattern:RegExp(n),greedy:!0},o={pattern:/(^[ \t]*)#.*/m,lookbehind:!0,greedy:!0};function t(e,t){return e=e.replace(//g,function(){return a}).replace(//g,function(){return i}),RegExp(e,t)}e.languages.docker={instruction:{pattern:/(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,lookbehind:!0,greedy:!0,inside:{options:{pattern:t("(^(?:ONBUILD)?\\w+)(?:)*","i"),lookbehind:!0,greedy:!0,inside:{property:{pattern:/(^|\s)--[\w-]+/,lookbehind:!0},string:[s,{pattern:/(=)(?!["'])(?:[^\s\\]|\\.)+/,lookbehind:!0}],operator:/\\$/m,punctuation:/=/}},keyword:[{pattern:t("(^(?:ONBUILD)?HEALTHCHECK(?:)*)(?:CMD|NONE)\\b","i"),lookbehind:!0,greedy:!0},{pattern:t("(^(?:ONBUILD)?FROM(?:)*(?!--)[^ \\\\]+)AS","i"),lookbehind:!0,greedy:!0},{pattern:t("(^ONBUILD)\\w+","i"),lookbehind:!0,greedy:!0},{pattern:/^\w+/,greedy:!0}],comment:o,string:s,variable:/\$(?:\w+|\{[^{}"'\\]*\})/,operator:/\\$/m}},comment:o},e.languages.dockerfile=e.languages.docker}(n),n.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/m,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:true|false|nil)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%[\]{}()]/},n.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:n.languages.elixir}}}}),n.languages.elm={comment:/--.*|\{-[\s\S]*?-\}/,char:{pattern:/'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+))'/,greedy:!0},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:[^\\"\r\n]|\\.)*"/,greedy:!0}],"import-statement":{pattern:/(^[\t ]*)import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,lookbehind:!0,inside:{keyword:/\b(?:import|as|exposing)\b/}},keyword:/\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,builtin:/\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,operator:/\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,hvariable:/\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,constant:/\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,punctuation:/[{}[\]|(),.:]/},n.languages.erlang={comment:/%.+/,string:{pattern:/"(?:\\.|[^\\"\r\n])*"/,greedy:!0},"quoted-function":{pattern:/'(?:\\.|[^\\'\r\n])+'(?=\()/,alias:"function"},"quoted-atom":{pattern:/'(?:\\.|[^\\'\r\n])+'/,alias:"atom"},boolean:/\b(?:true|false)\b/,keyword:/\b(?:fun|when|case|of|end|if|receive|after|try|catch)\b/,number:[/\$\\?./,/\b\d+#[a-z0-9]+/i,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i],function:/\b[a-z][\w@]*(?=\()/,variable:{pattern:/(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,lookbehind:!0},operator:[/[=/<>:]=|=[:/]=|\+\+?|--?|[=*/!]|\b(?:bnot|div|rem|band|bor|bxor|bsl|bsr|not|and|or|xor|orelse|andalso)\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\b[a-z][\w@]*/,punctuation:/[()[\]{}:;,.#|]|<<|>>/},n.languages.fsharp=n.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\(\*(?!\))[\s\S]*?\*\)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:{pattern:/(?:"""[\s\S]*?"""|@"(?:""|[^"])*"|"(?:\\[\s\S]|[^\\"])*")B?|'(?:[^\\']|\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8}))'B?/,greedy:!0},"class-name":{pattern:/(\b(?:exception|inherit|interface|new|of|type)\s+|\w\s*:\s*|\s:\??>\s*)[.\w]+\b(?:\s*(?:->|\*)\s*[.\w]+\b)*(?!\s*[:.])/,lookbehind:!0,inside:{operator:/->|\*/,punctuation:/\./}},keyword:/\b(?:let|return|use|yield)(?:!\B|\b)|\b(?:abstract|and|as|assert|base|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|global|if|in|inherit|inline|interface|internal|lazy|match|member|module|mutable|namespace|new|not|null|of|open|or|override|private|public|rec|select|static|struct|then|to|true|try|type|upcast|val|void|when|while|with|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|include|method|mixin|object|parallel|process|protected|pure|sealed|tailcall|trait|virtual|volatile)\b/,number:[/\b0x[\da-fA-F]+(?:un|lf|LF)?\b/,/\b0b[01]+(?:y|uy)?\b/,/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[fm]|e[+-]?\d+)?\b/i,/\b\d+(?:[IlLsy]|u[lsy]?|UL)?\b/],operator:/([<>~&^])\1\1|([*.:<>&])\2|<-|->|[!=:]=|?|\??(?:<=|>=|<>|[-+*/%=<>])\??|[!?^&]|~[+~-]|:>|:\?>?/}),n.languages.insertBefore("fsharp","keyword",{preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(^#)\b(?:else|endif|if|light|line|nowarn)\b/,lookbehind:!0,alias:"keyword"}}}}),n.languages.insertBefore("fsharp","punctuation",{"computation-expression":{pattern:/\b[_a-z]\w*(?=\s*\{)/i,alias:"keyword"}}),n.languages.insertBefore("fsharp","string",{annotation:{pattern:/\[<.+?>\]/,inside:{punctuation:/^\[<|>\]$/,"class-name":{pattern:/^\w+$|(^|;\s*)[A-Z]\w*(?=\()/,lookbehind:!0},"annotation-content":{pattern:/[\s\S]+/,inside:n.languages.fsharp}}}}),!function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Nn]umber|[Ss]tring|[Bb]oolean|Function|any|mixed|null|void)\b/,alias:"tag"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:type|opaque|declare|Class)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:await|Diff|Exact|Keys|ObjMap|PropertyType|Shape|Record|Supertype|Subtype|Enum)\b(?!\$)/,lookbehind:!0})}(n),n.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/m,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/m}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},n.languages.go=n.languages.extend("clike",{string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|iota|nil|true|false)\b/,number:/(?:\b0x[a-f\d]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[-+]?\d+)?)i?/i,operator:/[*/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/}),delete n.languages.go["class-name"],n.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:n.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:true|false)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/[A-Z]\w*Input(?=!?.*$)/m,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}[\]:=,]/,property:/\w+/},n.hooks.add("after-tokenize",function(e){if("graphql"===e.language)for(var o,i,a,r,c,l,d,n=e.tokens.filter(function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type}),t=0;t\\\\]|\\\\[^])*>"].join("|")+")[egimnosux]{0,6}"),greedy:!0,inside:{interpolation:t}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{function:/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:RegExp("%[qQiIwWxs]?(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^])*\\)","\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[^])*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\]","<(?:[^<>\\\\]|\\\\[^])*>"].join("|")+")"),greedy:!0,inside:{interpolation:t}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?/}},interpolation:t}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?'|'$/}}}}],e.languages.rb=e.languages.ruby}(n),!function(e){e.languages.haml={"multiline-comment":{pattern:/((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,lookbehind:!0,alias:"comment"},"multiline-code":[{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,lookbehind:!0,inside:e.languages.ruby},{pattern:/((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,lookbehind:!0,inside:e.languages.ruby}],filter:{pattern:/((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"}}},markup:{pattern:/((?:^|\r?\n|\r)[\t ]*)<.+/,lookbehind:!0,inside:e.languages.markup},doctype:{pattern:/((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,lookbehind:!0},tag:{pattern:/((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[/<>]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,lookbehind:!0,inside:e.languages.ruby},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,lookbehind:!0},"attr-name":/[\w:-]+(?=\s*!?=|\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\[[^\]]+\]/,inside:e.languages.ruby}],punctuation:/[<>]/}},code:{pattern:/((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:e.languages.ruby},interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:e.languages.ruby}},punctuation:{pattern:/((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,lookbehind:!0}};for(var t,s=["css",{filter:"coffee",language:"coffeescript"},"erb","javascript","less","markdown","ruby","scss","textile"],o={},n=0,i=s.length;n@[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,/;<=>@[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)}),e.hooks.add("after-tokenize",function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")}),e.languages.hbs=e.languages.handlebars}(n),n.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\/].*|$)|\{-[\s\S]*?-\})/m,lookbehind:!0},char:{pattern:/'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,alias:"string"},string:{pattern:/"(?:[^\\"]|\\(?:\S|\s+\\))*"/,greedy:!0},keyword:/\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,"import-statement":{pattern:/(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:import|qualified|as|hiding)\b/,punctuation:/\./}},builtin:/\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:[{pattern:/`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,greedy:!0},{pattern:/(\s)\.(?=\s)/,lookbehind:!0},/[-!#$%*+=?&@|~:<>^\\/][-!#$%*+=?&@|~.:<>^\\/]*|\.[-!#$%*+=?&@|~.:<>^\\/]+/],hvariable:{pattern:/\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,inside:{punctuation:/\./}},constant:{pattern:/\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:]/},n.languages.hs=n.languages.haskell,!function(e){e.languages.http={"request-line":{pattern:/^(?:GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH|PRI|SEARCH)\s(?:https?:\/\/|\/)\S*\sHTTP\/[0-9.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:e.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[0-9.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[0-9.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[0-9.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},"header-name":{pattern:/^[\w-]+:(?=.)/m,alias:"keyword"}};var n,s,i,a,r,t=e.languages,o={"application/javascript":t.javascript,"application/json":t.json||t.javascript,"application/xml":t.xml,"text/xml":t.xml,"text/html":t.html,"text/css":t.css},c={"application/json":!0,"application/xml":!0};for(n in o)o[n]&&(s=s||{},r=c[n]?(void 0,a=(i=n).replace(/^[a-z]+\//,""),"(?:"+i+"|\\w+/(?:[\\w.-]+\\+)+"+a+"(?![+\\w.-]))"):n,s[n.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+r+`(?:(?:\\r\\n?|\\n).+)*)(?:\\r?\\n|\\r){2}[\\s\\S]*`,"i"),lookbehind:!0,inside:o[n]});s&&e.languages.insertBefore("http","header-name",s)}(n),!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,s="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",n={pattern:RegExp(s+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{"class-name":[n,{pattern:RegExp(s+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:n.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":n,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(n),n.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},n.languages.webmanifest=n.languages.json,!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"],e.languages.insertBefore("kotlin","string",{"raw-string":{pattern:/("""|''')[\s\S]*?\1/,alias:"string"}}),e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}});var t=[{pattern:/\$\{[^}]+\}/,inside:{delimiter:{pattern:/^\$\{|\}$/,alias:"variable"},rest:e.languages.kotlin}},{pattern:/\$\w+/,alias:"variable"}];e.languages.kotlin.string.inside=e.languages.kotlin["raw-string"].inside={interpolation:t},e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(n),!function(e){var t=/\\(?:[^a-z()[\]]|[a-z*]+)/i,n={"equation-command":{pattern:t,alias:"regex"}};e.languages.latex={comment:/%.*/m,cdata:{pattern:/(\\begin\{((?:verbatim|lstlisting)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:equation|math|eqnarray|align|multline|gather)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|end|ref|cite|label|usepackage|documentclass)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:part|chapter|section|subsection|frametitle|subsubsection|paragraph|subparagraph|subsubparagraph|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0,alias:"class-name"},function:{pattern:t,alias:"selector"},punctuation:/[[\]{}&]/},e.languages.tex=e.languages.latex,e.languages.context=e.languages.latex}(n),n.languages.less=n.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/i,operator:/[+\-*/]/}),n.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),n.languages.llvm={comment:/;.*/,string:{pattern:/"[^"]*"/,greedy:!0},boolean:/\b(?:true|false)\b/,variable:/[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,label:/(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,type:{pattern:/\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,alias:"class-name"},keyword:/\b[a-z_][a-z_0-9]*\b/,number:/[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,punctuation:/[{}[\];(),.!*=<>]/},n.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},builtin:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,symbol:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:[/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,{pattern:/(\()(?:addsuffix|abspath|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:s|list)?)(?=[ \t])/,lookbehind:!0}],operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},!function(e){function n(e){return e=e.replace(//g,function(){return`(?:\\\\.|[^\\\\ + ]|(?: +| +?)(?![ +]))`}),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+e+")")}var s="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",t=`\\|?__(?:\\|__)+\\|?(?:(?: +| +?)|(?![^]))`.replace(/__/g,function(){return s}),o=`\\|?[ ]*:?-{3,}:?[ ]*(?:\\|[ ]*:?-{3,}:?[ ]*)+\\|?(?: +| +?)`;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"font-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+t+o+"(?:"+t+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+t+o+")(?:"+t+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(s),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+t+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+t+"$"),inside:{"table-header":{pattern:RegExp(s),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[[\]!:]|[<>]/},alias:"url"},bold:{pattern:n("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n("(~~?)(?:(?!~))+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[ ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ ]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(t){["url","bold","italic","strike","code-snippet"].forEach(function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])})}),e.hooks.add("after-tokenize",function(e){"markdown"!==e.language&&"md"!==e.language||!function e(t){if(t&&"string"!=typeof t)for(var n,s,o,i,r,a=0,c=t.length;a",quot:'"'},r=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(n),n.languages.nasm={comment:/;.*$/m,string:/(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,label:{pattern:/(^\s*)[A-Za-z._?$][\w.?$@~#]*:/m,lookbehind:!0,alias:"function"},keyword:[/\[?BITS (?:16|32|64)\]?/,{pattern:/(^\s*)section\s*[a-z.]+:?/im,lookbehind:!0},/(?:extern|global)[^;\r\n]*/i,/(?:CPU|FLOAT|DEFAULT).*$/m],register:{pattern:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|sp|si|di)|[cdefgs]s)\b/i,alias:"variable"},number:/(?:\b|(?=\$))(?:0[hx](?:\.[\da-f]+|[\da-f]+(?:\.[\da-f]+)?)(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[[\]*+\-/%<>=&|$!]/},n.languages.objectivec=n.languages.extend("c",{string:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|@"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,keyword:/\b(?:asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while|in|self|super)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*/@]/}),delete n.languages.objectivec["class-name"],n.languages.objc=n.languages.objectivec,n.languages.ocaml={comment:/\(\*[\s\S]*?\*\)/,string:[{pattern:/"(?:\\.|[^\\\r\n"])*"/,greedy:!0},{pattern:/(['`])(?:\\(?:\d+|x[\da-f]+|.)|(?!\1)[^\\\r\n])\1/i,greedy:!0}],number:/\b(?:0x[\da-f][\da-f_]+|(?:0[bo])?\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?[\d_]+)?)/i,directive:{pattern:/\B#\w+/,alias:"important"},label:{pattern:/\B~\w+/,alias:"function"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"variable"},module:{pattern:/\b[A-Z]\w+/,alias:"variable"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,operator:/:=|[=<>@^|&+\-*/$%!?~][!$%&*+\-./:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/[(){}[\]|.,:;]|\b_\b/},n.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0}],string:[{pattern:/\b(?:q|qq|qx|qw)\s*([^a-zA-Z0-9\s{([<])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s+([a-zA-Z0-9])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s*\((?:[^()\\]|\\[\s\S])*\)/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s*\{(?:[^{}\\]|\\[\s\S])*\}/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s*\[(?:[^[\]\\]|\\[\s\S])*\]/,greedy:!0},{pattern:/\b(?:q|qq|qx|qw)\s*<(?:[^<>\\]|\\[\s\S])*>/,greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:/\b(?:m|qr)\s*([^a-zA-Z0-9\s{([<])(?:(?!\1)[^\\]|\\[\s\S])*\1[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s+([a-zA-Z0-9])(?:(?!\1)[^\\]|\\[\s\S])*\1[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*\((?:[^()\\]|\\[\s\S])*\)[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*\{(?:[^{}\\]|\\[\s\S])*\}[msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*\[(?:[^[\]\\]|\\[\s\S])*\][msixpodualngc]*/,greedy:!0},{pattern:/\b(?:m|qr)\s*<(?:[^<>\\]|\\[\s\S])*>[msixpodualngc]*/,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*([^a-zA-Z0-9\s{([<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s+([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\((?:[^()\\]|\\[\s\S])*\)\s*\((?:[^()\\]|\\[\s\S])*\)[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\{(?:[^{}\\]|\\[\s\S])*\}\s*\{(?:[^{}\\]|\\[\s\S])*\}[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\[(?:[^[\]\\]|\\[\s\S])*\]\s*\[(?:[^[\]\\]|\\[\s\S])*\][msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*<(?:[^<>\\]|\\[\s\S])*>\s*<(?:[^<>\\]|\\[\s\S])*>[msixpodualngcer]*/,lookbehind:!0,greedy:!0},{pattern:/\/(?:[^/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:lt|gt|le|ge|eq|ne|cmp|not|and|or|xor|x)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/i,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*>|\b_\b/,alias:"symbol"},vstring:{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/sub \w+/i,inside:{keyword:/sub/}},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:lt|gt|le|ge|eq|ne|cmp|not|and|or|xor)\b/,punctuation:/[{}[\];(),:]/},!function(e){var t,n,s=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,o=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,a=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,r=/[{}[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:s,variable:/\$+(?:\w+\b|(?=\{))/i,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:bool|boolean|int|integer|float|string|object|array)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:bool|int|float|string|object|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*[\w|]\|\s*)(?:null|false)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?[\w|]\|\s*)(?:null|false)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:null|false)\b/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|match|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:o,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:a,punctuation:r},t={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},n=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:t}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:t}}],e.languages.insertBefore("php","variable",{string:n,attribute:{pattern:/#\[(?:[^"'/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:s,string:n,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:o,number:i,operator:a,punctuation:r}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",function(t){/<\?/.test(t.code)&&e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/gi)}),e.hooks.add("after-tokenize",function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")})}(n),n.languages.insertBefore("php","variable",{this:/\$this\b/,global:/\$(?:_(?:SERVER|GET|POST|FILES|REQUEST|SESSION|ENV|COOKIE)|GLOBALS|HTTP_RAW_POST_DATA|argc|argv|php_errormsg|http_response_header)\b/,scope:{pattern:/\b[\w\\]+::/,inside:{keyword:/static|self|parent/,punctuation:/::|\\/}}}),!function(){var t=n.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:{function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:{}}}},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^[\]])*\]|[^[\]])*\]/i,boolean:/\$(?:true|false)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(\W?)(?:!|-(?:eq|ne|gt|ge|lt|le|sh[lr]|not|b?(?:and|x?or)|(?:Not)?(?:Like|Match|Contains|In)|Replace|Join|is(?:Not)?|as)\b|-[-=]?|\+[+=]?|[*/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/},s=t.string[0].inside;s.boolean=t.boolean,s.variable=t.variable,s.function.inside=t}(),n.languages.processing=n.languages.extend("clike",{keyword:/\b(?:break|catch|case|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\b/,operator:/<[<=]?|>[>=]?|&&?|\|\|?|[%?]|[!=+\-*/]=?/}),n.languages.insertBefore("processing","number",{constant:/\b(?!XML\b)[A-Z][A-Z\d_]+\b/,type:{pattern:/\b(?:boolean|byte|char|color|double|float|int|[A-Z]\w*)\b/,alias:"variable"}}),n.languages.processing.function=/\b\w+(?=\s*\()/,n.languages.processing["class-name"].alias="variable",!function(e){e.languages.pug={comment:{pattern:/(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,lookbehind:!0},"multiline-script":{pattern:/(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:e.languages.javascript},filter:{pattern:/(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"}}},"multiline-plain-text":{pattern:/(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\t ]*)<.+/m,lookbehind:!0,inside:e.languages.markup},doctype:{pattern:/((?:^|\n)[\t ]*)doctype(?: .+)?/,lookbehind:!0},"flow-control":{pattern:/(^[\t ]*)(?:if|unless|else|case|when|default|each|while)\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\b/,inside:{keyword:/\b(?:each|in)\b/,punctuation:/,/}},branch:{pattern:/^(?:if|unless|else|case|when|default|while)\b/,alias:"keyword"},rest:e.languages.javascript}},keyword:{pattern:/(^[\t ]*)(?:block|extends|include|append|prepend)\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,function:/\w+(?=\s*\(|\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\t ]*)\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\+\w+/,alias:"function"},rest:e.languages.javascript}}],script:{pattern:/(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,lookbehind:!0,inside:e.languages.javascript},"plain-text":{pattern:/(^[\t ]*(?!-)[\w\-#.]*[\w-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,lookbehind:!0},tag:{pattern:/(^[\t ]*)(?!-)[\w\-#.]*[\w-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\([^)]+\)/,inside:e.languages.javascript},{pattern:/\([^)]+\)/,inside:{"attr-value":{pattern:/(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,lookbehind:!0,inside:e.languages.javascript},"attr-name":/[\w-]+(?=\s*!?=|\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/,"attr-id":/#[\w-]+/,"attr-class":/\.[\w-]+/}},code:[{pattern:/(^[\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:e.languages.javascript}],punctuation:/[.\-!=|]+/};for(var t,s=[{filter:"atpl",language:"twig"},{filter:"coffee",language:"coffeescript"},"ejs","handlebars","less","livescript","markdown",{filter:"sass",language:"scss"},"stylus"],o={},n=0,i=s.length;n(?:(?:\r?\n|\r(?!\n))(?:\\2[ ].+|\\s*?(?=\r?\n|\r)))+".replace("",function(){return t.filter}),"m"),lookbehind:!0,inside:{"filter-name":{pattern:/^:[\w-]+/,alias:"variable"},rest:e.languages[t.language]}});e.languages.insertBefore("pug","filter",o)}(n),n.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},n.languages.python["string-interpolation"].inside.interpolation.inside.rest=n.languages.python,n.languages.py=n.languages.python,n.languages.r={comment:/#.*/,string:{pattern:/(['"])(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"percent-operator":{pattern:/%[^%\s]*%/,alias:"operator"},boolean:/\b(?:TRUE|FALSE)\b/,ellipsis:/\.\.(?:\.|\d+)/,number:[/\b(?:NaN|Inf)\b/,/(?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?/],keyword:/\b(?:if|else|repeat|while|function|for|in|next|break|NULL|NA|NA_integer_|NA_real_|NA_complex_|NA_character_)\b/,operator:/->?>?|<(?:=|=!]=?|::?|&&?|\|\|?|[+*/^$@~]/,punctuation:/[(){}[\],;]/},!function(e){var t,o,i=e.util.clone(e.languages.javascript),s="(?:\\{*\\.{3}(?:[^{}]|)*\\})";function n(e,t){return e=e.replace(//g,function(){return"(?:\\s|//.*(?!.)|/\\*(?:[^*]|\\*(?!/))\\*/)"}).replace(//g,function(){return"(?:\\{(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])*\\})"}).replace(//g,function(){return s}),RegExp(e,t)}s=n(s).source,e.languages.jsx=e.languages.extend("markup",i),e.languages.jsx.tag.pattern=n(`+(?:[\\w.:$-]+(?:=(?:"(?:\\\\[^]|[^\\\\"])*"|'(?:\\\\[^]|[^\\\\'])*'|[^\\s{'"/>=]+|))?|))**/?)?>`),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>/]*/i,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/i,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=i.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:n(""),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:n("="),inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx},alias:"language-javascript"}},e.languages.jsx.tag),t=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(t).join(""):""},o=function(n){for(var s,r,c,i=[],a=0;a"===s.content[s.content.length-1].content||i.push({tagName:t(s.content[0].content[1]),openedBraces:0}):0]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:string|Function|any|number|boolean|Array|symbol|console|Promise|unknown|never)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|as|declare|implements|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[{*]|$))/),delete e.languages.typescript.parameter;var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(n),!function(e){var t,n=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",n),t=e.languages.tsx.tag,t.pattern=RegExp("(^|[^\\w$]|(?=|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*/]\.?|\b(?:mod|land|lor|lxor|lsl|lsr|asr)\b/}),n.languages.insertBefore("reason","class-name",{character:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,alias:"string"},constructor:{pattern:/\b[A-Z]\w*\b(?!\s*\.)/,alias:"variable"},label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete n.languages.reason.function,!function(e){for(var t="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|)*\\*/",n=0;n<2;n++)t=t.replace(//g,function(){return t});t=t.replace(//g,function(){return"[^\\s\\S]"}),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0,alias:"string"},attribute:{pattern:/#!?\[(?:[^[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|Self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:[ui](?:8|16|32|64|128|size)|f(?:32|64)|bool|char|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:[iu](?:8|16|32|64|size)?|f32|f64))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(n),!function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/m}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*/%]|[=!]=|<=?|>=?|\b(?:and|or|not)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(n),n.languages.scss=n.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/m,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),n.languages.insertBefore("scss","atrule",{keyword:[/@(?:if|else(?: if)?|forward|for|each|while|import|use|extend|debug|warn|mixin|include|function|return|content)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),n.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),n.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|with|show|hide)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*/%]|[=!]=|<=?|>=?|and|or|not)(?=\s)/,lookbehind:!0}}),n.languages.scss.atrule.inside.rest=n.languages.scss,n.languages.scala=n.languages.extend("java",{"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/<-|=>|\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\b/,number:/\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,builtin:/\b(?:String|Int|Long|Short|Byte|Boolean|Double|Float|Char|Any|AnyRef|AnyVal|Unit|Nothing)\b/,symbol:/'[^\d\s\\]\w*/}),delete n.languages.scala["class-name"],delete n.languages.scala.function,n.languages.scheme={comment:/;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^[\]]|\[[^[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,string:{pattern:/"(?:[^"\\]|\\.)*"/,greedy:!0},symbol:{pattern:/'[^()[\]#'\s]+/,greedy:!0},character:{pattern:/#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,greedy:!0,alias:"string"},"lambda-parameter":[{pattern:/((?:^|[^'`#])[([]lambda\s+)(?:[^|()[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,lookbehind:!0},{pattern:/((?:^|[^'`#])[([]lambda\s+[([])[^()[\]']+/,lookbehind:!0}],keyword:{pattern:/((?:^|[^'`#])[([])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|export|except|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()[\]\s]|$)/,lookbehind:!0},builtin:{pattern:/((?:^|[^'`#])[([])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()[\]\s]|$)/,lookbehind:!0},operator:{pattern:/((?:^|[^'`#])[([])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,lookbehind:!0},number:{pattern:RegExp(function(e){for(var t in e)e[t]=e[t].replace(/<[\w\s]+>/g,function(t){return"(?:"+e[t].trim()+")"});return e[t]}({"":"\\d+(?:/\\d+)|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"(?:#d(?:#[ei])?|#[ei](?:#d)?)?","":"[0-9a-f]+(?:/[0-9a-f]+)?","":"[+-]?|[+-](?:inf|nan)\\.0","":"[+-](?:|(?:inf|nan)\\.0)?i","":"(?:@|)?|","":"#[box](?:#[ei])?|(?:#[ei])?#[box]","":"(^|[()\\[\\]\\s])(?:|)(?=[()\\[\\]\\s]|$)"}),"i"),lookbehind:!0},boolean:{pattern:/(^|[()[\]\s])#(?:[ft]|false|true)(?=[()[\]\s]|$)/,lookbehind:!0},function:{pattern:/((?:^|[^'`#])[([])(?:[^|()[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()[\]\s]|$)/,lookbehind:!0},identifier:{pattern:/(^|[()[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()[\]\s]|$)/,lookbehind:!0,greedy:!0},punctuation:/[()[\]']/},n.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:S|ING)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:TRUE|FALSE|NULL)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|IN|ILIKE|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},!function(e){var n={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},s={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},t={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:if|else|for|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:rgb|hsl)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:rgb|hsl)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:n,number:s,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:n,boolean:/\b(?:true|false)\b/,operator:[/~|[+!/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:s,punctuation:/[{}()[\];:,]/};t.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:t}},t.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:t}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:t}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:t}},statement:{pattern:/(^[ \t]*)(?:if|else|for|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:t}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:t.interpolation}},rest:t}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:t.interpolation,comment:t.comment,punctuation:/[{},]/}},func:t.func,string:t.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:t.interpolation,punctuation:/[{}()[\];:.]/}}(n),n.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(`(^|[^"#])(?:"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)| +|[^(])|[^\\\\ +"])*"|"""(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|[^(])|[^\\\\"]|"(?!""))*""")(?!["#])`),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp('(^|[^"#])(#+)(?:"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^#])|[^\\\\\r\n])*?"|"""(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|[^#])|[^\\\\])*?""")\\2'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp("#(?:(?:elseif|if)\\b(?:[ ]*(?:![ ]*)?(?:\\b\\w+\\b(?:[ ]*\\((?:[^()]|\\([^()]*\\))*\\))?|\\((?:[^()]|\\([^()]*\\))*\\))(?:[ ]*(?:&&|\\|\\|))?)+|(?:else|endif)\\b)"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:true|false)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:true|false)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},n.languages.swift["string-literal"].forEach(function(e){e.inside.interpolation.inside=n.languages.swift}),!function(e){function t(e,t){return RegExp(e.replace(//g,function(){return`(?:\\([^|() +]+\\)|\\[[^\\] +]+\\]|\\{[^} +]+\\})`}).replace(//g,function(){return`(?:\\)|\\((?![^|() +]+\\)))`}),t||"")}var o,a,i={css:{pattern:/\{[^{}]+\}/,inside:{rest:e.languages.css}},"class-id":{pattern:/(\()[^()]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^[\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\/]\d+|\S/},r=e.languages.textile=e.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,lookbehind:!0,inside:{"block-tag":{pattern:t("^[a-z]\\w*(?:||[<>=])*\\."),inside:{modifier:{pattern:t("(^[a-z]\\w*)(?:||[<>=])+(?=\\.)"),lookbehind:!0,inside:i},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:t("^[*#]+*\\s+\\S.*","m"),inside:{modifier:{pattern:t("(^[*#]+)+"),lookbehind:!0,inside:i},punctuation:/^[*#]+/}},table:{pattern:t("^(?:(?:||[<>=^~])+\\.\\s*)?(?:\\|(?:(?:||[<>=^~_]|[\\\\/]\\d+)+\\.|(?!(?:||[<>=^~_]|[\\\\/]\\d+)+\\.))[^|]*)+\\|","m"),inside:{modifier:{pattern:t(`(^|\\|(?: ? +| )?)(?:||[<>=^~_]|[\\\\/]\\d+)+(?=\\.)`),lookbehind:!0,inside:i},punctuation:/\||^\./}},inline:{pattern:t("(^|[^a-zA-Z\\d])(\\*\\*|__|\\?\\?|[*_%@+\\-^~])*.+?\\2(?![a-zA-Z\\d])"),lookbehind:!0,inside:{bold:{pattern:t("(^(\\*\\*?)*).+?(?=\\2)"),lookbehind:!0},italic:{pattern:t("(^(__?)*).+?(?=\\2)"),lookbehind:!0},cite:{pattern:t("(^\\?\\?*).+?(?=\\?\\?)"),lookbehind:!0,alias:"string"},code:{pattern:t("(^@*).+?(?=@)"),lookbehind:!0,alias:"keyword"},inserted:{pattern:t("(^\\+*).+?(?=\\+)"),lookbehind:!0},deleted:{pattern:t("(^-*).+?(?=-)"),lookbehind:!0},span:{pattern:t("(^%*).+?(?=%)"),lookbehind:!0},modifier:{pattern:t("(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])+"),lookbehind:!0,inside:i},punctuation:/[*_%?@+\-^~]+/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(^\])\S+$/,lookbehind:!0},punctuation:/[[\]]/}},link:{pattern:t('"*[^"]+":.+?(?=[^\\w/]?(?:\\s|$))'),inside:{text:{pattern:t('(^"*)[^"]+(?=")'),lookbehind:!0},modifier:{pattern:t('(^")+'),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:t("!(?:||[<>=])*(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?"),inside:{source:{pattern:t("(^!(?:||[<>=])*)(?![<>=])[^!\\s()]+(?:\\([^)]+\\))?(?=!)"),lookbehind:!0,alias:"url"},modifier:{pattern:t("(^!)(?:||[<>=])+"),lookbehind:!0,inside:i},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^()]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((?:TM|R|C)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}}),s=r.phrase.inside,n={inline:s.inline,link:s.link,image:s.image,footnote:s.footnote,acronym:s.acronym,mark:s.mark};r.tag.pattern=/<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,a=s.inline.inside,a.bold.inside=n,a.italic.inside=n,a.inserted.inside=n,a.deleted.inside=n,a.span.inside=n,o=s.table.inside,o.inline=n.inline,o.link=n.link,o.image=n.image,o.footnote=n.footnote,o.acronym=n.acronym,o.mark=n.mark}(n),!function(e){function t(e){return e.replace(/__/g,function(){return`(?:[\\w-]+|'[^' + ]*'|"(?:\\\\.|[^\\\\" +])*")`})}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(t("(^[ ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(t("(^[ ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:true|false)\b/,punctuation:/[.,=[\]{}]/}}(n),n.languages.twig={comment:/\{#[\s\S]*?#\}/,tag:{pattern:/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}/,inside:{ld:{pattern:/^(?:\{\{-?|\{%-?\s*\w+)/,inside:{punctuation:/^(?:\{\{|\{%)-?/,keyword:/\w+/}},rd:{pattern:/-?(?:%\}|\}\})$/,inside:{punctuation:/.+/}},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,inside:{punctuation:/^['"]|['"]$/}},keyword:/\b(?:even|if|odd)\b/,boolean:/\b(?:true|false|null)\b/,number:/\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,operator:[{pattern:/(\s)(?:and|b-and|b-xor|b-or|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,lookbehind:!0},/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/],property:/\b[a-zA-Z_]\w*\b/,punctuation:/[()[\]{}:.,]/}},other:{pattern:/\S(?:[\s\S]*\S)?/,inside:n.languages.markup}},n.languages.vim={string:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,comment:/".*/,function:/\b\w+(?=\()/,keyword:/\b(?:ab|abbreviate|abc|abclear|abo|aboveleft|al|all|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|ar|args|argu|argument|as|ascii|bad|badd|ba|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bN|bNext|bo|botright|bp|bprevious|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|br|brewind|bro|browse|bufdo|b|buffer|buffers|bun|bunload|bw|bwipeout|ca|cabbrev|cabc|cabclear|caddb|caddbuffer|cad|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cgetb|cgetbuffer|cgete|cgetexpr|cg|cgetfile|c|change|changes|chd|chdir|che|checkpath|checkt|checktime|cla|clast|cl|clist|clo|close|cmapc|cmapclear|cnew|cnewer|cn|cnext|cN|cNext|cnf|cnfile|cNfcNfile|cnorea|cnoreabbrev|col|colder|colo|colorscheme|comc|comclear|comp|compiler|conf|confirm|con|continue|cope|copen|co|copy|cpf|cpfile|cp|cprevious|cq|cquit|cr|crewind|cuna|cunabbrev|cu|cunmap|cw|cwindow|debugg|debuggreedy|delc|delcommand|d|delete|delf|delfunction|delm|delmarks|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|di|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|earlier|echoe|echoerr|echom|echomsg|echon|e|edit|el|else|elsei|elseif|em|emenu|endfo|endfor|endf|endfunction|endfun|en|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fina|finally|fin|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|folddoc|folddoclosed|foldd|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|ha|hardcopy|h|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iuna|iunabbrev|iu|iunmap|j|join|ju|jumps|k|keepalt|keepj|keepjumps|kee|keepmarks|laddb|laddbuffer|lad|laddexpr|laddf|laddfile|lan|language|la|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|let|left|lefta|leftabove|lex|lexpr|lf|lfile|lfir|lfirst|lgetb|lgetbuffer|lgete|lgetexpr|lg|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|l|list|ll|lla|llast|lli|llist|lmak|lmake|lm|lmap|lmapc|lmapclear|lnew|lnewer|lne|lnext|lN|lNext|lnf|lnfile|lNf|lNfile|ln|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lpf|lpfile|lp|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|mak|make|ma|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkvie|mkview|mkv|mkvimrc|mod|mode|m|move|mzf|mzfile|mz|mzscheme|nbkey|new|n|next|N|Next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|omapc|omapclear|on|only|o|open|opt|options|ou|ounmap|pc|pclose|ped|pedit|pe|perl|perld|perldo|po|pop|popu|popup|pp|ppop|pre|preserve|prev|previous|p|print|P|Print|profd|profdel|prof|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptN|ptNext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|pyf|pyfile|py|python|qa|qall|q|quit|quita|quitall|r|read|rec|recover|redi|redir|red|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|rub|ruby|rubyd|rubydo|rubyf|rubyfile|ru|runtime|rv|rviminfo|sal|sall|san|sandbox|sa|sargument|sav|saveas|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbN|sbNext|sbp|sbprevious|sbr|sbrewind|sb|sbuffer|scripte|scriptencoding|scrip|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sla|slast|sl|sleep|sm|smagic|smap|smapc|smapclear|sme|smenu|sn|snext|sN|sNext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|sor|sort|so|source|spelld|spelldump|spe|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|sp|split|spr|sprevious|sre|srewind|sta|stag|startg|startgreplace|star|startinsert|startr|startreplace|stj|stjump|st|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tab|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabnew|tabn|tabnext|tabN|tabNext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|ta|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tmenu|tn|tnext|tN|tNext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tunmenu|una|unabbreviate|u|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|verb|verbose|ve|version|vert|vertical|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|vi|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|wa|wall|wh|while|winc|wincmd|windo|winp|winpos|win|winsize|wn|wnext|wN|wNext|wp|wprevious|wq|wqa|wqall|w|write|ws|wsverb|wv|wviminfo|X|xa|xall|x|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|XMLent|XMLns|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,builtin:/\b(?:autocmd|acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|t_AB|t_AF|t_al|t_AL|t_bc|t_cd|t_ce|t_Ce|t_cl|t_cm|t_Co|t_cs|t_Cs|t_CS|t_CV|t_da|t_db|t_dl|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_fs|t_IE|t_IS|t_k1|t_K1|t_k2|t_k3|t_K3|t_k4|t_K4|t_k5|t_K5|t_k6|t_K6|t_k7|t_K7|t_k8|t_K8|t_k9|t_K9|t_KA|t_kb|t_kB|t_KB|t_KC|t_kd|t_kD|t_KD|t_ke|t_KE|t_KF|t_KG|t_kh|t_KH|t_kI|t_KI|t_KJ|t_KK|t_kl|t_KL|t_kN|t_kP|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_RI|t_RV|t_Sb|t_se|t_Sf|t_SI|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_WP|t_WS|t_xs|t_ZH|t_ZR)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,operator:/\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*/%?]|\b(?:is(?:not)?)\b/,punctuation:/[{}[\](),;:]/},n.languages["visual-basic"]={comment:{pattern:/(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,inside:{keyword:/^REM/i}},directive:{pattern:/#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:[^\S\r\n]_[^\S\r\n]*(?:\r\n?|\n)|.)+/i,alias:"comment",greedy:!0},string:{pattern:/\$?["“”](?:["“”]{2}|[^"“”])*["“”]C?/i,greedy:!0},date:{pattern:/#[^\S\r\n]*(?:\d+([/-])\d+\1\d+(?:[^\S\r\n]+(?:\d+[^\S\r\n]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[^\S\r\n]*(?:AM|PM))?))?|\d+[^\S\r\n]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[^\S\r\n]*(?:AM|PM))?)[^\S\r\n]*#/i,alias:"builtin"},number:/(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:U?[ILS]|[FRD])?/i,boolean:/\b(?:True|False|Nothing)\b/i,keyword:/\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Until|Xor)\b/i,operator:[/[+\-*/\\^<=>&#@$%!]/,{pattern:/([^\S\r\n])_(?=[^\S\r\n]*[\r\n])/,lookbehind:!0}],punctuation:/[{}().,:?]/},n.languages.vb=n.languages["visual-basic"],n.languages.vba=n.languages["visual-basic"],n.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/i,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/},!function(e){var n=/[*&][^\s[\]{},]+/,s=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,o="(?:"+s.source+"(?:[ ]+"+n.source+")?|"+n.source+"(?:[ ]+"+s.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ ]*(?:(?![#:])|:))*".replace(//g,function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"}),i=`"(?:[^"\\\\ +]|\\\\.)*"|'(?:[^'\\\\ +]|\\\\.)*'`;function t(e,t){t=(t||"").replace(/m/g,"")+"m";var n=`([:\\-,[{]\\s*(?:\\s<>[ ]+)?)(?:<>)(?=[ ]*(?:$|,|\\]|\\}|(?:[ +]\\s*)?#))`.replace(/<>/g,function(){return o}).replace(/<>/g,function(){return e});return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ ]+)?[|>])[ ]*(?:((?:\r?\n|\r)[ ]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,function(){return o})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(`((?:^|[:\\-,[{ +?])[ ]*(?:<>[ ]+)?)<>(?=\\s*:\\s)`.replace(/<>/g,function(){return o}).replace(/<>/g,function(){return"(?:"+a+"|"+i+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:t("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ ]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ ]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:t("true|false","i"),lookbehind:!0,alias:"important"},null:{pattern:t("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:t(i),lookbehind:!0,greedy:!0},number:{pattern:t("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:s,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(n),!function(){if("undefined"!=typeof n&&"undefined"!=typeof document&&document.querySelector){var s,r="line-numbers",e="linkable-line-numbers",h=function(){if(void 0===s){var e=document.createElement("div");e.style.fontSize="13px",e.style.lineHeight="1.5",e.style.padding="0",e.style.border="0",e.innerHTML=" 
 ",document.body.appendChild(e),s=38===e.offsetHeight,document.body.removeChild(e)}return s},o=!0,c=0;n.hooks.add("before-sanity-check",function(e){var n,s=e.element.parentElement;i(s)&&(n=0,t(".line-highlight",s).forEach(function(e){n+=e.textContent.length,e.parentNode.removeChild(e)}),n&&/^(?: \n)+$/.test(e.code.slice(-n))&&(e.code=e.code.slice(0,-n)))}),n.hooks.add("complete",function e(t){if(s=t.element.parentElement,i(s)){clearTimeout(c);var s,o=n.plugins.lineNumbers,d=t.plugins&&t.plugins.lineNumbers;l(s,r)&&o&&!d?n.hooks.add("line-numbers",e):(a(s)(),c=setTimeout(u,1))}}),window.addEventListener("hashchange",u),window.addEventListener("resize",function(){t("pre").filter(i).map(function(e){return a(e)}).forEach(d)})}function t(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function l(e,t){return e.classList.contains(t)}function d(e){e()}function i(t){return!!t&&!!/pre/i.test(t.nodeName)&&(!!t.hasAttribute("data-line")||!!t.id&&!!n.util.isActive(t,e))}function a(s,i,a){var f,v,b=(i="string"==typeof i?i:s.getAttribute("data-line")||"").replace(/\s+/g,"").split(",").filter(Boolean),j=+s.getAttribute("data-line-offset")||0,y=(h()?parseInt:parseFloat)(getComputedStyle(s).lineHeight),m=n.util.isActive(s,r),u=s.querySelector("code"),p=m?s:u||s,c=[],g=u&&p!=u?function(e,t){var o=getComputedStyle(e),s=getComputedStyle(t);function n(e){return+e.substr(0,e.length-2)}return t.offsetTop+n(s.borderTopWidth)+n(s.paddingTop)-n(o.paddingTop)}(s,u):0;return b.forEach(function(e){var r,l,u,h,d=e.split("-"),o=+d[0],i=+d[1]||o,t=s.querySelector('.line-highlight[data-range="'+e+'"]')||document.createElement("div");c.push(function(){t.setAttribute("aria-hidden","true"),t.setAttribute("data-range",e),t.className=(a||"")+" line-highlight"}),m&&n.plugins.lineNumbers?(r=n.plugins.lineNumbers.getLine(s,o),l=n.plugins.lineNumbers.getLine(s,i),r&&(u=r.offsetTop+g+"px",c.push(function(){t.style.top=u})),l&&(h=l.offsetTop-r.offsetTop+l.offsetHeight+"px",c.push(function(){t.style.height=h}))):c.push(function(){t.setAttribute("data-start",String(o)),o span",s).forEach(function(e,t){var n=t+v;e.onclick=function(){var e=f+"."+n;o=!1,location.hash=e,setTimeout(function(){o=!0},1)}})),function(){c.forEach(d)}}function u(){if(e=location.hash.slice(1),t(".temporary.line-highlight").forEach(function(e){e.parentNode.removeChild(e)}),s=(e.match(/\.([\d,-]+)$/)||[,""])[1],s&&!document.getElementById(e)){var e,s,i=e.slice(0,e.lastIndexOf(".")),n=document.getElementById(i);n&&(n.hasAttribute("data-line")||n.setAttribute("data-line",""),a(n,s,"temporary ")(),o&&document.querySelector(".temporary.line-highlight").scrollIntoView())}}}(),!function(){if("undefined"!=typeof n&&"undefined"!=typeof document){var e="line-numbers",s=/\n(?!$)/g,i=n.plugins.lineNumbers={getLine:function(t,n){if("PRE"===t.tagName&&t.classList.contains(e)&&(s=t.querySelector(".line-numbers-rows"),s)){var s,a,o=parseInt(t.getAttribute("data-start"),10)||1,i=o+(s.children.length-1);return n");(r=document.createElement("span")).setAttribute("aria-hidden","true"),r.className="line-numbers-rows",r.innerHTML=d,i.hasAttribute("data-start")&&(i.style.counterReset="linenumber "+(parseInt(i.getAttribute("data-start"),10)-1)),o.element.appendChild(r),t([i]),n.hooks.run("line-numbers",o)}}}),n.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0})}function t(e){if(0!=(e=e.filter(function(e){var t=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null}(e)["white-space"];return"pre-wrap"===t||"pre-line"===t})).length){var t=e.map(function(e){var t,o,i,n=e.querySelector("code"),a=e.querySelector(".line-numbers-rows");if(n&&a)return t=e.querySelector(".line-numbers-sizer"),o=n.textContent.split(s),t||((t=document.createElement("span")).className="line-numbers-sizer",n.appendChild(t)),t.innerHTML="0",t.style.display="block",i=t.getBoundingClientRect().height,t.innerHTML="",{element:e,lines:o,lineHeights:[],oneLinerHeight:i,sizer:t}}).filter(Boolean);t.forEach(function(e){var s=e.sizer,t=e.lines,n=e.lineHeights,o=e.oneLinerHeight;n[t.length-1]=void 0,t.forEach(function(e,t){if(e&&1o.length&&(s=o.length),s--;for(t=--n;t<=s;t++)u[t]=o[t],o[t]=""}});else if(d)for(a=0;a',h):d=o('',h),a=document.createElement("span"),a.className=s,a.innerHTML=d;for(var f=i.outputLines||[],c=0,p=f.length;c + + + + Categories :: the1mason + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + +
+ + + + +
+ + +
+ +
+

Categories

+
    + + +
+
+ +
+ + + + + + + + + + + + + + + + +
+ + + diff --git a/public/categories/index.xml b/public/categories/index.xml new file mode 100644 index 0000000..c6693be --- /dev/null +++ b/public/categories/index.xml @@ -0,0 +1,10 @@ + + + + Categories on the1mason + the1mason.com/categories/ + Recent content in Categories on the1mason + Hugo -- gohugo.io + en + + diff --git a/public/crab.png b/public/crab.png new file mode 100644 index 0000000..7dfe065 Binary files /dev/null and b/public/crab.png differ diff --git a/public/crabHdFixed512signal.png b/public/crabHdFixed512signal.png new file mode 100644 index 0000000..f32bbd1 Binary files /dev/null and b/public/crabHdFixed512signal.png differ diff --git a/public/crabr.png b/public/crabr.png new file mode 100644 index 0000000..b1dff46 Binary files /dev/null and b/public/crabr.png differ diff --git a/public/css/red-local.css b/public/css/red-local.css new file mode 100644 index 0000000..02d3ba1 --- /dev/null +++ b/public/css/red-local.css @@ -0,0 +1,1191 @@ +@charset "UTF-8"; +/* COLOR VARIABLES */ +/* MEDIA QUERIES */ +/* variables for js, must be the same as these in @custom-media queries */ +:root { + --phoneWidth: (max-width: 684px); + --tabletWidth: (max-width: 900px); } + +@font-face { + font-display: swap; + font-family: 'Fira Code'; + font-style: normal; + font-weight: 400; + src: url("../fonts/FiraCode-Regular.woff") format("woff"); } + +@font-face { + font-display: swap; + font-family: 'Fira Code'; + font-style: normal; + font-weight: 800; + src: url("../fonts/FiraCode-Bold.woff") format("woff"); } + +.button-container { + display: table; + margin-left: auto; + margin-right: auto; } + +button, +.button, +a.button { + position: relative; + display: flex; + align-items: center; + justify-content: center; + padding: 8px 18px; + margin-bottom: 5px; + text-decoration: none; + text-align: center; + border-radius: 8; + border: 1px solid #FF6266; + background: #FF6266; + color: #221f29; + font: inherit; + font-weight: bold; + appearance: none; + cursor: pointer; + outline: none; + /* variants */ + /* sizes */ } + button:hover, + .button:hover, + a.button:hover { + background: rgba(255, 98, 102, 0.9); } + button.outline, + .button.outline, + a.button.outline { + background: transparent; + box-shadow: none; + padding: 8px 18px; } + button.outline :hover, + .button.outline :hover, + a.button.outline :hover { + transform: none; + box-shadow: none; } + button.link, + .button.link, + a.button.link { + background: none; + font-size: 1rem; } + button.small, + .button.small, + a.button.small { + font-size: .8rem; } + button.wide, + .button.wide, + a.button.wide { + min-width: 200px; + padding: 14px 24px; } + +a.read-more, +a.read-more:hover, +a.read-more:active { + display: inline-flex; + border: none; + color: #FF6266; + background: none; + box-shadow: none; + padding: 0; + margin: 20px 0; + max-width: 100%; } + +.code-toolbar { + margin-bottom: 20px; } + .code-toolbar .toolbar-item a { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 3px 8px; + margin-bottom: 5px; + text-decoration: none; + text-align: center; + font-size: 13px; + font-weight: 500; + border-radius: 8px; + border: 1px solid transparent; + appearance: none; + cursor: pointer; + outline: none; } + +input, textarea, select { + background: transparent; + color: #FF6266; + border: 1px solid #FF6266; + border-radius: 0; + padding: 10px; + font: inherit; + appearance: none; } + input:focus, input :active, textarea:focus, textarea :active, select:focus, select :active { + border-color: white; + outline: 1px solid white; } + input:active, textarea:active, select:active { + box-shadow: none; } + +select { + background: #221f29; } + select option { + background: #221f29; } + +::placeholder { + color: rgba(255, 98, 102, 0.5); } + +.header { + display: flex; + flex-direction: column; + position: relative; } + @media print { + .header { + display: none; } } + .header__inner { + display: flex; + align-items: center; + justify-content: space-between; } + .header__logo { + display: flex; + flex: 1; } + .header__logo:after { + content: ''; + background: repeating-linear-gradient(90deg, #FF6266, #FF6266 2px, transparent 0, transparent 10px); + display: block; + width: 100%; + right: 10px; } + .header__logo a { + flex: 0 0 auto; + max-width: 100%; + text-decoration: none; } + +.navigation-menu { + display: flex; + align-items: flex-start; + justify-content: space-between; + margin: 20px 1px; } + @media (max-width: 684px) { + .navigation-menu { + margin: 0; } } + .navigation-menu__inner { + display: flex; + flex: 1; + flex-wrap: wrap; + list-style: none; + margin: 0; + padding: 0; } + .navigation-menu__inner > li { + flex: 0 0 auto; + margin-bottom: 10px; + white-space: nowrap; } + .navigation-menu__inner > li:not(:last-of-type) { + margin-right: 20px; } + @media (max-width: 684px) { + .navigation-menu__inner { + flex-direction: column; + align-items: flex-start; + padding: 0; } + .navigation-menu__inner li { + margin: 0; + padding: 5px; } } + .navigation-menu .spacer { + flex-grow: 1 !important; } + +.menu { + display: flex; + flex-direction: column; + position: relative; + list-style: none; + padding: 0; + margin: 0; } + .menu__trigger { + margin-right: 0 !important; + color: #FF6266; + user-select: none; + cursor: pointer; } + .menu__dropdown { + display: none; + flex-direction: column; + position: absolute; + background: #221f29; + box-shadow: 0 10px rgba(34, 31, 41, 0.8), -10px 10px rgba(34, 31, 41, 0.8), 10px 10px rgba(34, 31, 41, 0.8); + color: white; + border: 2px solid; + margin: 0; + padding: 10px; + top: 10px; + left: 0; + list-style: none; + z-index: 99; } + .open .menu__dropdown { + display: flex; } + .menu__dropdown > li { + flex: 0 0 auto; } + .menu__dropdown > li:not(:last-of-type) { + margin-bottom: 10px; } + .menu__dropdown > li a { + display: flex; + padding: 5px; } + @media (max-width: 684px) { + .menu--desktop { + display: none; } } + .menu--mobile .menu__trigger { + color: #FF6266; + border: 2px solid; + margin-left: 10px; + height: 100%; + padding: 3px 8px; + margin-bottom: 0 !important; + position: relative; + cursor: pointer; + display: none; } + @media (max-width: 684px) { + .menu--mobile .menu__trigger { + display: block; } } + @media (max-width: 684px) { + .menu--mobile .menu__dropdown { + left: auto; + right: 0; } } + .menu--mobile li { + flex: 0 0 auto; } + .menu--mobile li:not(:last-of-type) { + margin-bottom: 10px; } + .menu--language-selector .menu__trigger { + color: #FF6266; + border: 2px solid; + margin-left: 10px; + height: 100%; + padding: 3px 8px; + margin-bottom: 0 !important; + position: relative; + cursor: pointer; } + @media (max-width: 684px) { + .menu--language-selector .menu__trigger { + display: none; } } + .menu--language-selector .menu__dropdown { + left: auto; + right: 0; } + +.logo { + display: flex; + align-items: center; + text-decoration: none; + background: #FF6266; + color: black; + padding: 5px 10px; } + +html { + box-sizing: border-box; } + +*, +*:before, +*:after { + box-sizing: inherit; } + +body { + margin: 0; + padding: 0; + font-family: 'Fira Code', Monaco, Consolas, Ubuntu Mono, monospace; + font-size: 1rem; + line-height: 1.54; + letter-spacing: -0.02em; + background-color: #221f29; + color: white; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + font-feature-settings: "liga", "tnum", "zero", "ss01", "locl"; + font-variant-ligatures: contextual; + -webkit-overflow-scrolling: touch; + -webkit-text-size-adjust: 100%; } + @media (max-width: 684px) { + body { + font-size: 1rem; } } +.headings--one-size h1, +.headings--one-size h2, +.headings--one-size h3, +.headings--one-size h4, +.headings--one-size h5, +.headings--one-size h6 { + line-height: 1.3; } + .headings--one-size h1:not(first-child), + .headings--one-size h2:not(first-child), + .headings--one-size h3:not(first-child), + .headings--one-size h4:not(first-child), + .headings--one-size h5:not(first-child), + .headings--one-size h6:not(first-child) { + margin-top: 40px; } + +.headings--one-size h1, +.headings--one-size h2, +.headings--one-size h3 { + font-size: 1.4rem; } + +.headings--one-size h4, +.headings--one-size h5, +.headings--one-size h6 { + font-size: 1.2rem; } + +a { + color: inherit; + /* Waiting for a better times... */ + /* &:has(code) { + text-decoration-color: $accent; + } */ } + +img { + display: block; + max-width: 100%; } + img.left { + margin-right: auto; } + img.center { + margin-left: auto; + margin-right: auto; } + img.right { + margin-left: auto; } + +p { + margin-bottom: 20px; } + +figure { + display: table; + max-width: 100%; + margin: 25px 0; } + figure.left { + margin-right: auto; } + figure.center { + margin-left: auto; + margin-right: auto; } + figure.right { + margin-left: auto; } + figure figcaption { + font-size: 14px; + padding: 5px 10px; + margin-top: 5px; + background: #FF6266; + color: #221f29; + /* opacity: .8; */ } + figure figcaption.left { + text-align: left; } + figure figcaption.center { + text-align: center; } + figure figcaption.right { + text-align: right; } + +code, kbd { + font-family: 'Fira Code', Monaco, Consolas, Ubuntu Mono, monospace !important; + font-feature-settings: normal; + background: rgba(255, 98, 102, 0.2); + color: #FF6266; + padding: 1px 6px; + margin: 0 2px; + font-size: .95rem; } + code code, code kbd, kbd code, kbd kbd { + background: transparent; + padding: 0; + margin: 0; } + +pre { + background: transparent !important; + padding: 20px 10px; + margin: 40px 0; + font-size: .95rem !important; + overflow: auto; + border-top: 1px solid rgba(255, 255, 255, 0.1); + border-bottom: 1px solid rgba(255, 255, 255, 0.1); } + pre + pre { + border-top: 0; + margin-top: -40px; } + @media (max-width: 684px) { + pre { + white-space: pre-wrap; + word-wrap: break-word; } } + pre code { + background: none !important; + margin: 0; + padding: 0; + font-size: inherit; + border: none; } + +blockquote { + border-top: 1px solid #FF6266; + border-bottom: 1px solid #FF6266; + margin: 40px 0; + padding: 25px; } + @media (max-width: 684px) { + blockquote { + padding-right: 0; } } + blockquote p:first-of-type { + margin-top: 0; } + blockquote p:last-of-type { + margin-bottom: 0; } + blockquote p { + position: relative; } + blockquote p:first-of-type:before { + content: '>'; + display: block; + position: absolute; + left: -25px; + color: #FF6266; } + blockquote.twitter-tweet { + position: relative; + background: rgba(255, 98, 102, 0.1); + font: inherit; + color: inherit; + border: 1px solid #FF6266; + padding-top: 60px; } + blockquote.twitter-tweet p:before { + content: ''; } + blockquote.twitter-tweet:before { + content: '> From Twitter:'; + position: absolute; + top: 20px; + color: #FF6266; + font-weight: bold; } + blockquote.twitter-tweet a { + color: #FF6266; } + +table { + table-layout: auto; + border-collapse: collapse; + width: 100%; + margin: 40px 0; } + +table, +th, +td { + border: 1px dashed #FF6266; + padding: 10px; } + +th { + color: #FF6266; } + +ul, +ol { + margin-left: 22px; + padding: 0; } + ul li, + ol li { + position: relative; } + @media (max-width: 684px) { + ul, + ol { + margin-left: 20px; } } +ol { + list-style: none; + counter-reset: li; } + ol li { + counter-increment: li; } + ol li:before { + content: counter(li); + position: absolute; + right: calc(100% + 10px); + color: #FF6266; + display: inline-block; + text-align: right; } + ol ol { + margin-left: 38px; } + ol ol li { + counter-increment: li; } + ol ol li:before { + content: counters(li, ".") " "; } + +mark { + background: #FF6266; + color: #221f29; } + +.container { + display: flex; + flex-direction: column; + padding: 40px; + max-width: 864px; + min-height: 100vh; + border-right: 1px solid rgba(255, 255, 255, 0.1); } + .container.full, .container.center { + border: none; + margin: 0 auto; } + .container.full { + max-width: 100%; } + @media (max-width: 684px) { + .container { + padding: 20px; } } + @media print { + .container { + display: initial; } } +.content { + display: flex; + flex-direction: column; } + @media print { + .content { + display: initial; } } +hr { + width: 100%; + border: none; + background: rgba(255, 255, 255, 0.1); + height: 1px; } + +.hidden { + display: none; } + +sup { + line-height: 0; } + +.index-content { + margin-top: 20px; } + +.framed { + border: 1px solid #FF6266; + padding: 20px; } + .framed *:first-child { + margin-top: 0; } + .framed *:last-child { + margin-bottom: 0; } + +.posts { + width: 100%; } + +.post { + width: 100%; + text-align: left; + margin: 20px auto; + padding: 20px 0; } + .post:not(:last-of-type) { + border-bottom: 1px solid rgba(255, 255, 255, 0.1); } + .post-meta { + font-size: 1rem; + margin-bottom: 10px; + color: rgba(255, 98, 102, 0.7); } + .post-title { + position: relative; + color: #FF6266; + margin: 0 0 15px; + padding-bottom: 15px; + border-bottom: 3px dotted #FF6266; } + .post-title:after { + content: ''; + position: absolute; + bottom: 2px; + display: block; + width: 100%; + border-bottom: 3px dotted #FF6266; } + .post-title a { + text-decoration: none; } + .post-tags { + display: block; + margin-bottom: 20px; + font-size: 1rem; + opacity: .5; } + .post-tags a { + text-decoration: none; } + .post-content { + margin-top: 30px; } + .post-cover { + border: 20px solid #FF6266; + background: transparent; + margin: 40px 0; + padding: 20px; } + @media (max-width: 684px) { + .post-cover { + padding: 10px; + border-width: 10px; } } + .post ul { + list-style: none; } + .post ul li:not(:empty):before { + content: '-'; + position: absolute; + left: -20px; + color: #FF6266; } + +.post--regulation h1 { + justify-content: center; } + +.post--regulation h2 { + justify-content: center; + margin-bottom: 10px; } + .post--regulation h2 + h2 { + margin-top: -10px; + margin-bottom: 20px; } + +.hanchor { + color: rgba(255, 98, 102, 0.9); + text-decoration: none; + margin-left: 10px; + visibility: hidden; } + +h1:hover a, h2:hover a, h3:hover a, h4:hover a { + visibility: visible; } + +.footnotes { + color: rgba(255, 255, 255, 0.5); } + +.pagination { + margin-top: 50px; } + @media print { + .pagination { + display: none; } } + .pagination__title { + display: flex; + text-align: center; + position: relative; + margin: 100px 0 20px; } + .pagination__title-h { + text-align: center; + margin: 0 auto; + padding: 5px 10px; + background: #221f29; + color: rgba(255, 255, 255, 0.3); + font-size: .8rem; + text-transform: uppercase; + text-decoration: none; + letter-spacing: .1em; + z-index: 1; } + .pagination__title hr { + position: absolute; + left: 0; + right: 0; + width: 100%; + margin-top: 15px; + z-index: 0; } + .pagination__buttons { + display: flex; + align-items: center; + justify-content: center; + flex-flow: row wrap; + gap: 10px; } + .pagination__buttons a { + text-decoration: none; } + +.button { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 1rem; + padding: 0; + appearance: none; } + @media (max-width: 684px) { + .button { + flex: 1; } } + .button a { + display: flex; + justify-content: center; + flex: 1; + padding: 8px 16px; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + .button__text { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + .button.next .button__icon { + margin-left: 8px; } + .button.previous .button__icon { + margin-right: 8px; } + +.footer { + padding: 40px 0; + flex-grow: 0; + opacity: .5; } + .footer__inner { + display: flex; + align-items: center; + justify-content: space-between; + margin: 0; + width: 760px; + max-width: 100%; } + @media (max-width: 900px) { + .footer__inner { + flex-direction: column; } } + .footer a { + color: inherit; } + .footer .copyright { + display: flex; + flex-flow: row wrap; + flex: 1; + align-items: center; + font-size: 1rem; + justify-content: center; } + .footer .copyright--user { + margin: auto; + text-align: center; } + .footer .copyright > *:first-child:not(:only-child) { + margin-right: 10px; } + .footer .copyright span { + white-space: nowrap; } + +/* PrismJS 1.24.1 +https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+actionscript+apacheconf+applescript+bash+c+csharp+cpp+cmake+coffeescript+csp+css-extras+diff+django+docker+elixir+elm+erlang+fsharp+flow+git+go+graphql+haml+handlebars+haskell+http+java+json+kotlin+latex+less+llvm+makefile+markdown+markup-templating+nasm+objectivec+ocaml+perl+php+php-extras+powershell+processing+pug+python+r+jsx+tsx+reason+ruby+rust+sass+scss+scala+scheme+sql+stylus+swift+textile+toml+twig+typescript+vim+visual-basic+wasm+yaml&plugins=line-highlight+line-numbers+jsonp-highlight+highlight-keywords+command-line+toolbar+copy-to-clipboard */ +/** + * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML + * Based on https://github.com/chriskempson/tomorrow-theme + * @author Rose Pritchard + */ +code[class*="language-"], +pre[class*="language-"] { + color: #ccc; + background: none; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; } + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; } + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #2d2d2d; } + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; } + +.token.comment, +.token.block-comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #999; } + +.token.punctuation { + color: #ccc; } + +.token.tag, +.token.attr-name, +.token.namespace, +.token.deleted { + color: #e2777a; } + +.token.function-name { + color: #6196cc; } + +.token.boolean, +.token.number, +.token.function { + color: #f08d49; } + +.token.property, +.token.class-name, +.token.constant, +.token.symbol { + color: #f8c555; } + +.token.selector, +.token.important, +.token.atrule, +.token.keyword, +.token.builtin { + color: #cc99cd; } + +.token.string, +.token.char, +.token.attr-value, +.token.regex, +.token.variable { + color: #7ec699; } + +.token.operator, +.token.entity, +.token.url { + color: #67cdcc; } + +.token.important, +.token.bold { + font-weight: bold; } + +.token.italic { + font-style: italic; } + +.token.entity { + cursor: help; } + +.token.inserted { + color: green; } + +pre[data-line] { + position: relative; + padding: 1em 0 1em 3em; } + +.line-highlight { + position: absolute; + left: 0; + right: 0; + padding: inherit 0; + margin-top: 1em; + /* Same as .prism’s padding-top */ + background: rgba(153, 122, 102, 0.08); + background: linear-gradient(to right, rgba(153, 122, 102, 0.1) 70%, rgba(153, 122, 102, 0)); + pointer-events: none; + line-height: inherit; + white-space: pre; } + +@media print { + .line-highlight { + /* + * This will prevent browsers from replacing the background color with white. + * It's necessary because the element is layered on top of the displayed code. + */ + -webkit-print-color-adjust: exact; + color-adjust: exact; } } + +.line-highlight:before, +.line-highlight[data-end]:after { + content: attr(data-start); + position: absolute; + top: .4em; + left: .6em; + min-width: 1em; + padding: 0 .5em; + background-color: rgba(153, 122, 102, 0.4); + color: #f5f2f0; + font: bold 65%/1.5 sans-serif; + text-align: center; + vertical-align: .3em; + border-radius: 999px; + text-shadow: none; + box-shadow: 0 1px white; } + +.line-highlight[data-end]:after { + content: attr(data-end); + top: auto; + bottom: .4em; } + +.line-numbers .line-highlight:before, +.line-numbers .line-highlight:after { + content: none; } + +pre[id].linkable-line-numbers span.line-numbers-rows { + pointer-events: all; } + +pre[id].linkable-line-numbers span.line-numbers-rows > span:before { + cursor: pointer; } + +pre[id].linkable-line-numbers span.line-numbers-rows > span:hover:before { + background-color: rgba(128, 128, 128, 0.2); } + +pre[class*="language-"].line-numbers { + position: relative; + padding-left: 3.8em; + counter-reset: linenumber; } + +pre[class*="language-"].line-numbers > code { + position: relative; + white-space: inherit; } + +.line-numbers .line-numbers-rows { + position: absolute; + pointer-events: none; + top: 0; + font-size: 100%; + left: -3.8em; + width: 3em; + /* works for line-numbers below 1000 lines */ + letter-spacing: -1px; + border-right: 1px solid #999; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.line-numbers-rows > span { + display: block; + counter-increment: linenumber; } + +.line-numbers-rows > span:before { + content: counter(linenumber); + color: #999; + display: block; + padding-right: 0.8em; + text-align: right; } + +.command-line-prompt { + border-right: 1px solid #999; + display: block; + float: left; + font-size: 100%; + letter-spacing: -1px; + margin-right: 1em; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.command-line-prompt > span:before { + color: #999; + content: ' '; + display: block; + padding-right: 0.8em; } + +.command-line-prompt > span[data-user]:before { + content: "[" attr(data-user) "@" attr(data-host) "] $"; } + +.command-line-prompt > span[data-user="root"]:before { + content: "[" attr(data-user) "@" attr(data-host) "] #"; } + +.command-line-prompt > span[data-prompt]:before { + content: attr(data-prompt); } + +div.code-toolbar { + position: relative; } + +div.code-toolbar > .toolbar { + position: absolute; + top: .3em; + right: .2em; + transition: opacity 0.3s ease-in-out; + opacity: 0; } + +div.code-toolbar:hover > .toolbar { + opacity: 1; } + +/* Separate line b/c rules are thrown out if selector is invalid. + IE11 and old Edge versions don't support :focus-within. */ +div.code-toolbar:focus-within > .toolbar { + opacity: 1; } + +div.code-toolbar > .toolbar > .toolbar-item { + display: inline-block; } + +div.code-toolbar > .toolbar > .toolbar-item > a { + cursor: pointer; } + +div.code-toolbar > .toolbar > .toolbar-item > button { + background: none; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + padding: 0; + -webkit-user-select: none; + /* for button */ + -moz-user-select: none; + -ms-user-select: none; } + +div.code-toolbar > .toolbar > .toolbar-item > a, +div.code-toolbar > .toolbar > .toolbar-item > button, +div.code-toolbar > .toolbar > .toolbar-item > span { + color: #bbb; + font-size: .8em; + padding: 0 .5em; + background: #f5f2f0; + background: rgba(224, 224, 224, 0.2); + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2); + border-radius: .5em; } + +div.code-toolbar > .toolbar > .toolbar-item > a:hover, +div.code-toolbar > .toolbar > .toolbar-item > a:focus, +div.code-toolbar > .toolbar > .toolbar-item > button:hover, +div.code-toolbar > .toolbar > .toolbar-item > button:focus, +div.code-toolbar > .toolbar > .toolbar-item > span:hover, +div.code-toolbar > .toolbar > .toolbar-item > span:focus { + color: inherit; + text-decoration: none; } + +code.language-css, +code.language-scss, +.token.boolean, +.token.string, +.token.entity, +.token.url, +.language-css .token.string, +.language-scss .token.string, +.style .token.string, +.token.attr-value, +.token.keyword, +.token.control, +.token.directive, +.token.statement, +.token.regex, +.token.atrule, +.token.number, +.token.inserted, +.token.important { + color: #FF6266 !important; } + +.token.tag-id, +.token.atrule-id, +.token.operator, +.token.unit, +.token.placeholder, +.token.variable, +.token.tag, +.token.attr-name, +.token.namespace, +.token.deleted, +.token.property, +.token.class-name, +.token.constant, +.token.symbol { + color: rgba(255, 98, 102, 0.7) !important; } + +.token.property, +.token.function, +.token.function-name, +.token.deleted, +code.language-javascript, +code.language-html, +.command-line-prompt > span:before { + color: #9a9999 !important; } + +.token.selector, +.token.tag, +.token.punctuation { + color: white; } + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: rgba(255, 255, 255, 0.3) !important; } + +.token.namespace { + opacity: .7 !important; } + +pre[data-line] { + position: relative; } + +pre[class*="language-"] { + margin: 0; + padding: 0; + overflow: auto; } + +.line-highlight { + position: absolute; + left: 0; + right: 0; + padding: 0; + margin: 0; + background: rgba(245, 104, 107, 0.08); + pointer-events: none; + line-height: inherit; + white-space: pre; } + +.line-highlight:before, +.line-highlight[data-end]:after { + content: attr(data-start); + position: absolute; + /* top: .4em; */ + left: .6em; + min-width: 1em; + padding: 0 .5em; + background-color: rgba(153, 122, 102, 0.4); + color: #f5f2f0; + font: bold 65%/1.5 sans-serif; + text-align: center; + vertical-align: .3em; + border-radius: 999px; + text-shadow: none; + box-shadow: 0 1px white; } + +.line-highlight[data-end]:after { + content: attr(data-end); + top: auto; + bottom: .4em; } + +.line-numbers .line-highlight:before, +.line-numbers .line-highlight:after { + content: none; } + +.code-toolbar { + position: relative; + margin: 40px 0; + padding: 20px; + border: 1px solid rgba(255, 255, 255, 0.1); } + .code-toolbar + .code-toolbar, + .code-toolbar + .highlight, + .code-toolbar + .highlight .code-toolbar { + border-top: 0; + margin-top: calc(-1 * $code-margin); } + .code-toolbar pre, .code-toolbar code { + border: none; } + .code-toolbar code { + display: block; + color: inherit; } + .code-toolbar > .toolbar button { + font-size: .8em !important; + background: rgba(224, 224, 224, 0.2) !important; + color: #bbb !important; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2) !important; + border-radius: 0 !important; + margin: 6px !important; + padding: 10px !important; + user-select: none; } + +.collapsable-code { + position: relative; + width: 100%; + margin: 40px 0; } + .collapsable-code input[type="checkbox"] { + position: absolute; + visibility: hidden; } + .collapsable-code input[type="checkbox"]:checked ~ pre, + .collapsable-code input[type="checkbox"]:checked ~ .code-toolbar pre { + height: 0; + padding: 0; + border-top: none; } + .collapsable-code input[type="checkbox"]:checked ~ .code-toolbar { + padding: 0; + border-top: none; } + .collapsable-code input[type="checkbox"]:checked ~ .code-toolbar .toolbar { + display: none; } + .collapsable-code input[type="checkbox"]:checked ~ label .collapsable-code__toggle:after { + content: attr(data-label-expand); } + .collapsable-code label { + position: relative; + display: flex; + justify-content: space-between; + min-width: 30px; + min-height: 30px; + margin: 0; + border-bottom: 1px solid #f5686b; + cursor: pointer; } + .collapsable-code__title { + flex: 1; + color: #FF6266; + padding: 3px 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + .collapsable-code__language { + color: #FF6266; + border: 1px solid #f5686b; + border-bottom: none; + text-transform: uppercase; + padding: 3px 10px; } + .collapsable-code__toggle { + color: #FF6266; + font-size: 16px; + padding: 3px 10px; } + .collapsable-code__toggle:after { + content: attr(data-label-collapse); } + .collapsable-code pre { + margin-top: 0; } + .collapsable-code pre::first-line { + line-height: 0; } + .collapsable-code .code-toolbar { + margin: 0; } + +.terms h1 { + color: #FF6266; } + +.terms h3 { + font-size: initial; } + +body .gist .blob-num, +body .gist .blob-code-inner { + border: none; } diff --git a/public/fonts/FiraCode-Bold.woff b/public/fonts/FiraCode-Bold.woff new file mode 100644 index 0000000..61d5e64 Binary files /dev/null and b/public/fonts/FiraCode-Bold.woff differ diff --git a/public/fonts/FiraCode-Regular.woff b/public/fonts/FiraCode-Regular.woff new file mode 100644 index 0000000..8a2e453 Binary files /dev/null and b/public/fonts/FiraCode-Regular.woff differ diff --git a/public/img/theme-colors/blue.png b/public/img/theme-colors/blue.png new file mode 100644 index 0000000..cb5fd99 Binary files /dev/null and b/public/img/theme-colors/blue.png differ diff --git a/public/img/theme-colors/green.png b/public/img/theme-colors/green.png new file mode 100644 index 0000000..4909792 Binary files /dev/null and b/public/img/theme-colors/green.png differ diff --git a/public/img/theme-colors/orange.png b/public/img/theme-colors/orange.png new file mode 100644 index 0000000..0ac2c27 Binary files /dev/null and b/public/img/theme-colors/orange.png differ diff --git a/public/img/theme-colors/pink.png b/public/img/theme-colors/pink.png new file mode 100644 index 0000000..96d49ec Binary files /dev/null and b/public/img/theme-colors/pink.png differ diff --git a/public/img/theme-colors/red.png b/public/img/theme-colors/red.png new file mode 100644 index 0000000..a0541a6 Binary files /dev/null and b/public/img/theme-colors/red.png differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..d6c9cd3 --- /dev/null +++ b/public/index.html @@ -0,0 +1,256 @@ + + + + + + the1mason + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + +
+ + + + +
+ + +
+ + +
+
+
+
+
+ +
+
+

Vladislav Belkov

+

Dotnet developer

+
+
+
+

Welcome!

+

This is my site. I don’t post here often, so feel free to check out my GitHub.
+You can also check any of my posts below.

+ +
+ +
+ + + + + + + + + + +
+

+ #1 Plugin-Based Web App in Dotnet - The Idea +

+ + + + + + + + + #1 Plugin-Based Web App in Dotnet - The Idea + + +
+ + Have you ever thought about making a web application, that could be easily extended by third-party developers? I’ve been thinking about making this app for a while, so here’s my experience… + +
+ + + + +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + +
+ + + diff --git a/public/index.xml b/public/index.xml new file mode 100644 index 0000000..708644c --- /dev/null +++ b/public/index.xml @@ -0,0 +1,123 @@ + + + + the1mason + the1mason.com/ + Recent content on the1mason + Hugo -- gohugo.io + en + Sat, 20 Jan 2024 00:00:00 +0000 + + #1 Plugin-Based Web App in Dotnet - The Idea + the1mason.com/posts/modular-app-1/ + Sat, 20 Jan 2024 00:00:00 +0000 + + the1mason.com/posts/modular-app-1/ + Chapters Writing those takes time. Expect to see one published per one-two weeks. +Idea, Stack +Loading plugins +PluginBase, IPlugin +Creating plugin, DependencyInjection +Controllers, Views +Hooks and Triggers - better event system +Advanced: Unit tests, unloading plugins +Introduction Have you ever heard of plugins? These are loadable libraries, extending your application. +This series of articles is an overview of my plugin-based web application prototype and mechanisms behind it&rsquo;s features, as well as my thought process and decision making during development. + <script src="the1mason.com/js/repo-card.js"></script> +<div class="repo-card" data-repo="the1mason/Prototype.ModularMVC" data-theme="dark-theme"></div> +<h1 id="chapters">Chapters</h1> +<p>Writing those takes time. Expect to see one published per one-two weeks.</p> +<ol> +<li> +<p>Idea, Stack</p> +</li> +<li> +<p><del>Loading plugins</del></p> +</li> +<li> +<p><del>PluginBase, IPlugin</del></p> +</li> +<li> +<p><del>Creating plugin, DependencyInjection</del></p> +</li> +<li> +<p><del>Controllers, Views</del></p> +</li> +<li> +<p><del>Hooks and Triggers - better event system</del></p> +</li> +<li> +<p><del>Advanced: Unit tests, unloading plugins</del></p> +</li> +</ol> +<h1 id="introduction">Introduction</h1> +<p>Have you ever heard of plugins? These are loadable libraries, extending your application.<br> +This series of articles is an overview of my plugin-based web application prototype and mechanisms behind it&rsquo;s features, as well as my thought process and decision making during development. These articles are a step by step guide to making your own plugin-based web app prototype.</p> +<p><em>I assume some that readers have some knowledge of C# and design patterns</em></p> +<h1 id="problem">Problem</h1> +<p>Self-hosted web applications can solve different problems and be of use to a variety of different people with slightly different needs. For this to work, I think that such an application should provide an option to extend its functionality. This would allow other people to build an ecosystem of different extensions around it. For example, a shopping website might have plugins for different payment systems, or a comment section under the product page. For me this also means, that instead of making one feature-rich website, that would be so specific to my needs, that it wouldn&rsquo;t of any use to anyone but me, I can write a bunch of smaller modules, that could be used by someone, without having to configure other modules.</p> +<h1 id="choosing-my-stack">Choosing my stack</h1> +<p><img src="the1mason.com/posts/modular-app/stack.svg" alt="C#, MVC, HTMX"></p> +<hr> +<p><strong>C#</strong></p> +<p>I&rsquo;m a dotnet developer and I write C# code for living. This project is as much of an excersise for me as it is an interesting design prototype for C#, that hasn&rsquo;t been described in detail as much online.</p> +<p>I haven&rsquo;t seen such plugin-based sites written in C#. There are some projects, using plugin based architecture&hellip; Well, there&rsquo;s even a <a href="https://learn.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support">Microsoft Learn Article</a> about building such an app!</p> +<blockquote> +<p><strong>Q:</strong> Why would I even bother to write all these posts and making prototypes? Even more: Why would someone be interested in such post?</p> +</blockquote> +<blockquote> +<p><strong>A:</strong> You see&hellip; there&rsquo;s a problem: Neither <code>learn.microsoft.com</code> nor any other webside covers dynamically updating web interface with plugins! If you want to learn about it, it&rsquo;s the right place. Also just loading libraries isn&rsquo;t enough because app also has to provide some ways for plugins to interact with it, which is also covered here!</p> +</blockquote> +<hr> +<p><strong>MVC with HTMX</strong></p> +<p>ASP.NET MVC is a web framework, that incorporates the MVC design pattern and uses SSR (Server Side Rendering) to serve content. It is a perfect fit for the HTMX library. This is a compact JavaScript library that extends basic HTML by adding some custom attributes just enough to build your app around it. You can distribute events, make AJAX requests and build truly dynamic app by using as little JS as possible.</p> +<div style="display: flex; justify-content: center"> + <img src="the1mason.com/posts/modular-app/createdwith.jpeg" style="height: 100px;"/> +</div> +<br> +<p>HTMX uses <a href="https://htmx.org/essays/hateoas/">Hypermedia as the Engine of Application State (HATEOAS)</a> - it&rsquo;s a principle that leaves all state handling to the server, providing the client only with a set of actions that it can take. +Your regular SPA will get raw data from the server (like bank balance) and based on it, it will show or hide certain actions (like we won&rsquo;t show the withdrawal option if balance is 0 or less). With HATEOAS, the server just won&rsquo;t give the link to withdraw money, making this action impossible in the first place.</p> +<p>HTMX would allow this app to be extended more easily as well. Most of the modern JS frameworks require transpiling, bundling and other sorts of stuff. This means that when a plugin is installed the client is most likely will have to be rebuilt. This is slow and needs additional dependencies.</p> +<blockquote> +<p>Have you heard about Blazor WASM? You can just write client code in C#!</p> +</blockquote> +<p>Blazor WASM does not support dynamic loading for plugins. Because of that, plugins won&rsquo;t be able to extend the client. Also it&rsquo;s initial load time is stupidly slow.</p> +<hr> +<p>The next article will cover the following topocs: Loading plugins in runtime, creating plugin&rsquo;s instances, app-plugin communication. I&rsquo;ll have the link here when I&rsquo;m done writing it!</p> +<!-- +--- + +# Loading plugins + +C#, being a compiled language, can't be extended as easily as interpreted languages like Pytnon or PHP. To load plugins, we will need to load precompiled libraries dynamically after the app is compiled. To do this, [Microsoft Learn Article, mentioned before](https://learn.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support) suggests using custom AssemblyLoadContext with AssemblyDependencyResolver. + +> Wait, wait, wait! Using... what? I'm pretty sure you could just `Assembly.Load()` stuff, right? + +Not so easy! If you want to build a really working plugin system, you need a way to determine: whether this assembly has dependencies or not, and what are they. + +Let's imagine, that our plugin uses `Newtonsoft.Json` library - one of the all-time most popular C# libraries. Should we load it together with the plugin and how do we find it? +C# has a built-in mechanism to resolve dependencies. When you compile your project, aside from `Project.Name.dll` you would have `Project.Name.deps.json` file, that will include paths to all it's dependencies! That's where `AssemblyDependencyResolver` comes in. It'll find all of plugin's `.dll` dependencies and load those as well. + +> And also! What it two plugins will have the same library, but conflicting versions? Would we be able to load to of the same assemblies? + +No! And yes. +`AssemblyLoadContext` is used exactly for this. Along with `AssemblyDependencyResolver`, it will create an isolated context with current assembly and all it's dependencies. This will allow multiple plugins to have same dependencies with different versions. + +There's an example of such custom AssemblyLoadContext [Click Me](https://github.com/the1mason/Prototype.ModularMVC/blob/main/Prototype.ModularMVC.App/Prototype.ModularMVC.PluginBase/PluginLoadContext.cs) and also an example of this context being used [Click Me](https://github.com/the1mason/Prototype.ModularMVC/blob/main/Prototype.ModularMVC.App/Prototype.ModularMVC.PluginBase/Impl/PluginLoaders/ManifestBasedPluginLoader.cs#L89). + +--- + + +# Plugin - App interaction + +So now we figured out how we load stuff. Now: how do we interact with the app from out plugins? + +First, we make all plugins to referense the `Prototype.PluginBase` project. This project will provide types that both plugin and our server can understand. We'll build communication using those. + +**Dependency Injection** + +Before the app is built and ran, --> + + + + diff --git a/public/js/repo-card.js b/public/js/repo-card.js new file mode 100644 index 0000000..08dc324 --- /dev/null +++ b/public/js/repo-card.js @@ -0,0 +1,80 @@ +window.tarptaeya = {}; + +window.tarptaeya.reloadRepoCards = async function() { + const CACHE_TIMEOUT = 60000; + async function get(url) { + const now = new Date().getTime(); + const prevResp = JSON.parse(localStorage.getItem(url)); + if (prevResp && Math.abs(now - prevResp.time) < CACHE_TIMEOUT) { + return prevResp.data; + } + const resp = await fetch(url); + const json = await resp.json(); + localStorage.setItem(url, JSON.stringify({time: now, data: json})); + return json; + } + + const emojis = await get('https://api.github.com/emojis'); + const colors = await get('https://raw.githubusercontent.com/ozh/github-colors/master/colors.json'); + + const themes = { + 'light-default': { + background: 'white', + borderColor: '#e1e4e8', + color: '#586069', + linkColor: '#0366d6', + }, + 'dark-theme': { + background: 'rgb(13, 17, 23)', + borderColor: 'rgb(48, 54, 61)', + color: 'rgb(139, 148, 158)', + linkColor: 'rgb(88, 166, 255)', + } + }; + + for (const el of document.querySelectorAll('.repo-card')) { + const name = el.getAttribute('data-repo'); + const theme = themes[el.getAttribute('data-theme') || 'light-default']; + const data = await get(`https://api.github.com/repos/${name}`); + + data.description = (data.description || '').replace(/:\w+:/g, function(match) { + const name = match.substring(1, match.length - 1); + const emoji = emojis[name]; + + if (emoji) { + return `${name}`; + } + + return match; + }); + + el.innerHTML = ` +
+
+ + + ${data.name} + +
+ +
${data.description}
+
+
+ + ${data.language} +
+
+ +   ${data.stargazers_count} +
+
+ +   ${data.forks} +
+
+
+ `; + } +}; + +window.addEventListener('DOMContentLoaded', window.tarptaeya.reloadRepoCards); diff --git a/public/page/1/index.html b/public/page/1/index.html new file mode 100644 index 0000000..b4040ab --- /dev/null +++ b/public/page/1/index.html @@ -0,0 +1,10 @@ + + + + the1mason.com/ + + + + + + diff --git a/public/posts/index.html b/public/posts/index.html new file mode 100644 index 0000000..ff9915e --- /dev/null +++ b/public/posts/index.html @@ -0,0 +1,228 @@ + + + + + Posts :: the1mason + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + +
+ + + + +
+ + +
+ + +
+ +
+

+ #1 Plugin-Based Web App in Dotnet - The Idea +

+ + + + + + + + #1 Plugin-Based Web App in Dotnet - The Idea + + +
+ + Have you ever thought about making a web application, that could be easily extended by third-party developers? I’ve been thinking about making this app for a while, so here’s my experience… + +
+ + + + +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + +
+ + + diff --git a/public/posts/index.xml b/public/posts/index.xml new file mode 100644 index 0000000..64995ae --- /dev/null +++ b/public/posts/index.xml @@ -0,0 +1,123 @@ + + + + Posts on the1mason + the1mason.com/posts/ + Recent content in Posts on the1mason + Hugo -- gohugo.io + en + Sat, 20 Jan 2024 00:00:00 +0000 + + #1 Plugin-Based Web App in Dotnet - The Idea + the1mason.com/posts/modular-app-1/ + Sat, 20 Jan 2024 00:00:00 +0000 + + the1mason.com/posts/modular-app-1/ + Chapters Writing those takes time. Expect to see one published per one-two weeks. +Idea, Stack +Loading plugins +PluginBase, IPlugin +Creating plugin, DependencyInjection +Controllers, Views +Hooks and Triggers - better event system +Advanced: Unit tests, unloading plugins +Introduction Have you ever heard of plugins? These are loadable libraries, extending your application. +This series of articles is an overview of my plugin-based web application prototype and mechanisms behind it&rsquo;s features, as well as my thought process and decision making during development. + <script src="the1mason.com/js/repo-card.js"></script> +<div class="repo-card" data-repo="the1mason/Prototype.ModularMVC" data-theme="dark-theme"></div> +<h1 id="chapters">Chapters</h1> +<p>Writing those takes time. Expect to see one published per one-two weeks.</p> +<ol> +<li> +<p>Idea, Stack</p> +</li> +<li> +<p><del>Loading plugins</del></p> +</li> +<li> +<p><del>PluginBase, IPlugin</del></p> +</li> +<li> +<p><del>Creating plugin, DependencyInjection</del></p> +</li> +<li> +<p><del>Controllers, Views</del></p> +</li> +<li> +<p><del>Hooks and Triggers - better event system</del></p> +</li> +<li> +<p><del>Advanced: Unit tests, unloading plugins</del></p> +</li> +</ol> +<h1 id="introduction">Introduction</h1> +<p>Have you ever heard of plugins? These are loadable libraries, extending your application.<br> +This series of articles is an overview of my plugin-based web application prototype and mechanisms behind it&rsquo;s features, as well as my thought process and decision making during development. These articles are a step by step guide to making your own plugin-based web app prototype.</p> +<p><em>I assume some that readers have some knowledge of C# and design patterns</em></p> +<h1 id="problem">Problem</h1> +<p>Self-hosted web applications can solve different problems and be of use to a variety of different people with slightly different needs. For this to work, I think that such an application should provide an option to extend its functionality. This would allow other people to build an ecosystem of different extensions around it. For example, a shopping website might have plugins for different payment systems, or a comment section under the product page. For me this also means, that instead of making one feature-rich website, that would be so specific to my needs, that it wouldn&rsquo;t of any use to anyone but me, I can write a bunch of smaller modules, that could be used by someone, without having to configure other modules.</p> +<h1 id="choosing-my-stack">Choosing my stack</h1> +<p><img src="the1mason.com/posts/modular-app/stack.svg" alt="C#, MVC, HTMX"></p> +<hr> +<p><strong>C#</strong></p> +<p>I&rsquo;m a dotnet developer and I write C# code for living. This project is as much of an excersise for me as it is an interesting design prototype for C#, that hasn&rsquo;t been described in detail as much online.</p> +<p>I haven&rsquo;t seen such plugin-based sites written in C#. There are some projects, using plugin based architecture&hellip; Well, there&rsquo;s even a <a href="https://learn.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support">Microsoft Learn Article</a> about building such an app!</p> +<blockquote> +<p><strong>Q:</strong> Why would I even bother to write all these posts and making prototypes? Even more: Why would someone be interested in such post?</p> +</blockquote> +<blockquote> +<p><strong>A:</strong> You see&hellip; there&rsquo;s a problem: Neither <code>learn.microsoft.com</code> nor any other webside covers dynamically updating web interface with plugins! If you want to learn about it, it&rsquo;s the right place. Also just loading libraries isn&rsquo;t enough because app also has to provide some ways for plugins to interact with it, which is also covered here!</p> +</blockquote> +<hr> +<p><strong>MVC with HTMX</strong></p> +<p>ASP.NET MVC is a web framework, that incorporates the MVC design pattern and uses SSR (Server Side Rendering) to serve content. It is a perfect fit for the HTMX library. This is a compact JavaScript library that extends basic HTML by adding some custom attributes just enough to build your app around it. You can distribute events, make AJAX requests and build truly dynamic app by using as little JS as possible.</p> +<div style="display: flex; justify-content: center"> + <img src="the1mason.com/posts/modular-app/createdwith.jpeg" style="height: 100px;"/> +</div> +<br> +<p>HTMX uses <a href="https://htmx.org/essays/hateoas/">Hypermedia as the Engine of Application State (HATEOAS)</a> - it&rsquo;s a principle that leaves all state handling to the server, providing the client only with a set of actions that it can take. +Your regular SPA will get raw data from the server (like bank balance) and based on it, it will show or hide certain actions (like we won&rsquo;t show the withdrawal option if balance is 0 or less). With HATEOAS, the server just won&rsquo;t give the link to withdraw money, making this action impossible in the first place.</p> +<p>HTMX would allow this app to be extended more easily as well. Most of the modern JS frameworks require transpiling, bundling and other sorts of stuff. This means that when a plugin is installed the client is most likely will have to be rebuilt. This is slow and needs additional dependencies.</p> +<blockquote> +<p>Have you heard about Blazor WASM? You can just write client code in C#!</p> +</blockquote> +<p>Blazor WASM does not support dynamic loading for plugins. Because of that, plugins won&rsquo;t be able to extend the client. Also it&rsquo;s initial load time is stupidly slow.</p> +<hr> +<p>The next article will cover the following topocs: Loading plugins in runtime, creating plugin&rsquo;s instances, app-plugin communication. I&rsquo;ll have the link here when I&rsquo;m done writing it!</p> +<!-- +--- + +# Loading plugins + +C#, being a compiled language, can't be extended as easily as interpreted languages like Pytnon or PHP. To load plugins, we will need to load precompiled libraries dynamically after the app is compiled. To do this, [Microsoft Learn Article, mentioned before](https://learn.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support) suggests using custom AssemblyLoadContext with AssemblyDependencyResolver. + +> Wait, wait, wait! Using... what? I'm pretty sure you could just `Assembly.Load()` stuff, right? + +Not so easy! If you want to build a really working plugin system, you need a way to determine: whether this assembly has dependencies or not, and what are they. + +Let's imagine, that our plugin uses `Newtonsoft.Json` library - one of the all-time most popular C# libraries. Should we load it together with the plugin and how do we find it? +C# has a built-in mechanism to resolve dependencies. When you compile your project, aside from `Project.Name.dll` you would have `Project.Name.deps.json` file, that will include paths to all it's dependencies! That's where `AssemblyDependencyResolver` comes in. It'll find all of plugin's `.dll` dependencies and load those as well. + +> And also! What it two plugins will have the same library, but conflicting versions? Would we be able to load to of the same assemblies? + +No! And yes. +`AssemblyLoadContext` is used exactly for this. Along with `AssemblyDependencyResolver`, it will create an isolated context with current assembly and all it's dependencies. This will allow multiple plugins to have same dependencies with different versions. + +There's an example of such custom AssemblyLoadContext [Click Me](https://github.com/the1mason/Prototype.ModularMVC/blob/main/Prototype.ModularMVC.App/Prototype.ModularMVC.PluginBase/PluginLoadContext.cs) and also an example of this context being used [Click Me](https://github.com/the1mason/Prototype.ModularMVC/blob/main/Prototype.ModularMVC.App/Prototype.ModularMVC.PluginBase/Impl/PluginLoaders/ManifestBasedPluginLoader.cs#L89). + +--- + + +# Plugin - App interaction + +So now we figured out how we load stuff. Now: how do we interact with the app from out plugins? + +First, we make all plugins to referense the `Prototype.PluginBase` project. This project will provide types that both plugin and our server can understand. We'll build communication using those. + +**Dependency Injection** + +Before the app is built and ran, --> + + + + diff --git a/public/posts/modular-app-1/index.html b/public/posts/modular-app-1/index.html new file mode 100644 index 0000000..919a31f --- /dev/null +++ b/public/posts/modular-app-1/index.html @@ -0,0 +1,314 @@ + + + + + #1 Plugin-Based Web App in Dotnet - The Idea :: the1mason + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + +
+ + + + +
+ + +
+ +
+

+ #1 Plugin-Based Web App in Dotnet - The Idea +

+ + + + + + + #1 Plugin-Based Web App in Dotnet - The Idea + + + + +
+ +
+

Chapters

+

Writing those takes time. Expect to see one published per one-two weeks.

+
    +
  1. +

    Idea, Stack

    +
  2. +
  3. +

    Loading plugins

    +
  4. +
  5. +

    PluginBase, IPlugin

    +
  6. +
  7. +

    Creating plugin, DependencyInjection

    +
  8. +
  9. +

    Controllers, Views

    +
  10. +
  11. +

    Hooks and Triggers - better event system

    +
  12. +
  13. +

    Advanced: Unit tests, unloading plugins

    +
  14. +
+

Introduction

+

Have you ever heard of plugins? These are loadable libraries, extending your application.
+This series of articles is an overview of my plugin-based web application prototype and mechanisms behind it’s features, as well as my thought process and decision making during development. These articles are a step by step guide to making your own plugin-based web app prototype.

+

I assume some that readers have some knowledge of C# and design patterns

+

Problem

+

Self-hosted web applications can solve different problems and be of use to a variety of different people with slightly different needs. For this to work, I think that such an application should provide an option to extend its functionality. This would allow other people to build an ecosystem of different extensions around it. For example, a shopping website might have plugins for different payment systems, or a comment section under the product page. For me this also means, that instead of making one feature-rich website, that would be so specific to my needs, that it wouldn’t of any use to anyone but me, I can write a bunch of smaller modules, that could be used by someone, without having to configure other modules.

+

Choosing my stack

+

C#, MVC, HTMX

+
+

C#

+

I’m a dotnet developer and I write C# code for living. This project is as much of an excersise for me as it is an interesting design prototype for C#, that hasn’t been described in detail as much online.

+

I haven’t seen such plugin-based sites written in C#. There are some projects, using plugin based architecture… Well, there’s even a Microsoft Learn Article about building such an app!

+
+

Q: Why would I even bother to write all these posts and making prototypes? Even more: Why would someone be interested in such post?

+
+
+

A: You see… there’s a problem: Neither learn.microsoft.com nor any other webside covers dynamically updating web interface with plugins! If you want to learn about it, it’s the right place. Also just loading libraries isn’t enough because app also has to provide some ways for plugins to interact with it, which is also covered here!

+
+
+

MVC with HTMX

+

ASP.NET MVC is a web framework, that incorporates the MVC design pattern and uses SSR (Server Side Rendering) to serve content. It is a perfect fit for the HTMX library. This is a compact JavaScript library that extends basic HTML by adding some custom attributes just enough to build your app around it. You can distribute events, make AJAX requests and build truly dynamic app by using as little JS as possible.

+
+ +
+
+

HTMX uses Hypermedia as the Engine of Application State (HATEOAS) - it’s a principle that leaves all state handling to the server, providing the client only with a set of actions that it can take. +Your regular SPA will get raw data from the server (like bank balance) and based on it, it will show or hide certain actions (like we won’t show the withdrawal option if balance is 0 or less). With HATEOAS, the server just won’t give the link to withdraw money, making this action impossible in the first place.

+

HTMX would allow this app to be extended more easily as well. Most of the modern JS frameworks require transpiling, bundling and other sorts of stuff. This means that when a plugin is installed the client is most likely will have to be rebuilt. This is slow and needs additional dependencies.

+
+

Have you heard about Blazor WASM? You can just write client code in C#!

+
+

Blazor WASM does not support dynamic loading for plugins. Because of that, plugins won’t be able to extend the client. Also it’s initial load time is stupidly slow.

+
+

The next article will cover the following topocs: Loading plugins in runtime, creating plugin’s instances, app-plugin communication. I’ll have the link here when I’m done writing it!

+ +
+ + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + +
+ + + diff --git a/public/posts/modular-app/createdwith.jpeg b/public/posts/modular-app/createdwith.jpeg new file mode 100644 index 0000000..8acd8c0 Binary files /dev/null and b/public/posts/modular-app/createdwith.jpeg differ diff --git a/public/posts/modular-app/mvc.png b/public/posts/modular-app/mvc.png new file mode 100644 index 0000000..c0885df Binary files /dev/null and b/public/posts/modular-app/mvc.png differ diff --git a/public/posts/modular-app/stack.svg b/public/posts/modular-app/stack.svg new file mode 100644 index 0000000..c025f3f --- /dev/null +++ b/public/posts/modular-app/stack.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/posts/modular-app/title.svg b/public/posts/modular-app/title.svg new file mode 100644 index 0000000..1cb6750 --- /dev/null +++ b/public/posts/modular-app/title.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/posts/page/1/index.html b/public/posts/page/1/index.html new file mode 100644 index 0000000..1b88057 --- /dev/null +++ b/public/posts/page/1/index.html @@ -0,0 +1,10 @@ + + + + the1mason.com/posts/ + + + + + + diff --git a/public/semitcrab.png b/public/semitcrab.png new file mode 100644 index 0000000..7aeb905 Binary files /dev/null and b/public/semitcrab.png differ diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..6162757 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,28 @@ + + + + the1mason.com/ + 2024-01-20T00:00:00+00:00 + + the1mason.com/posts/modular-app-1/ + 2024-01-20T00:00:00+00:00 + + the1mason.com/tags/dotnet/ + 2024-01-20T00:00:00+00:00 + + the1mason.com/posts/ + 2024-01-20T00:00:00+00:00 + + the1mason.com/tags/prototype/ + 2024-01-20T00:00:00+00:00 + + the1mason.com/tags/ + 2024-01-20T00:00:00+00:00 + + the1mason.com/tags/web/ + 2024-01-20T00:00:00+00:00 + + the1mason.com/categories/ + + diff --git a/public/styles.css b/public/styles.css new file mode 100644 index 0000000..eec46bc --- /dev/null +++ b/public/styles.css @@ -0,0 +1,3 @@ +:root{--phoneWidth: (max-width: 684px);--tabletWidth: (max-width: 900px)}@font-face{font-display:swap;font-family:'Fira Code';font-style:normal;font-weight:400;src:url("../fonts/FiraCode-Regular.woff") format("woff")}@font-face{font-display:swap;font-family:'Fira Code';font-style:normal;font-weight:800;src:url("../fonts/FiraCode-Bold.woff") format("woff")}.button-container{display:table;margin-left:auto;margin-right:auto}button,.button,a.button{position:relative;display:flex;align-items:center;justify-content:center;padding:8px 18px;margin-bottom:5px;text-decoration:none;text-align:center;border-radius:8;border:1px solid #FF6266;background:#FF6266;color:#221f29;font:inherit;font-weight:bold;appearance:none;cursor:pointer;outline:none}button:hover,.button:hover,a.button:hover{background:rgba(255,98,102,0.9)}button.outline,.button.outline,a.button.outline{background:transparent;box-shadow:none;padding:8px 18px}button.outline :hover,.button.outline :hover,a.button.outline :hover{transform:none;box-shadow:none}button.link,.button.link,a.button.link{background:none;font-size:1rem}button.small,.button.small,a.button.small{font-size:.8rem}button.wide,.button.wide,a.button.wide{min-width:200px;padding:14px 24px}a.read-more,a.read-more:hover,a.read-more:active{display:inline-flex;border:none;color:#FF6266;background:none;box-shadow:none;padding:0;margin:20px 0;max-width:100%}.code-toolbar{margin-bottom:20px}.code-toolbar .toolbar-item a{position:relative;display:inline-flex;align-items:center;justify-content:center;padding:3px 8px;margin-bottom:5px;text-decoration:none;text-align:center;font-size:13px;font-weight:500;border-radius:8px;border:1px solid transparent;appearance:none;cursor:pointer;outline:none}input,textarea,select{background:transparent;color:#FF6266;border:1px solid #FF6266;border-radius:0;padding:10px;font:inherit;appearance:none}input:focus,input :active,textarea:focus,textarea :active,select:focus,select :active{border-color:#fff;outline:1px solid #fff}input:active,textarea:active,select:active{box-shadow:none}select{background:#221f29}select option{background:#221f29}::placeholder{color:rgba(255,98,102,0.5)}.header{display:flex;flex-direction:column;position:relative}@media print{.header{display:none}}.header__inner{display:flex;align-items:center;justify-content:space-between}.header__logo{display:flex;flex:1}.header__logo:after{content:'';background:repeating-linear-gradient(90deg, #FF6266, #FF6266 2px, transparent 0, transparent 10px);display:block;width:100%;right:10px}.header__logo a{flex:0 0 auto;max-width:100%;text-decoration:none}.navigation-menu{display:flex;align-items:flex-start;justify-content:space-between;margin:20px 1px}@media (max-width: 684px){.navigation-menu{margin:0}}.navigation-menu__inner{display:flex;flex:1;flex-wrap:wrap;list-style:none;margin:0;padding:0}.navigation-menu__inner>li{flex:0 0 auto;margin-bottom:10px;white-space:nowrap}.navigation-menu__inner>li:not(:last-of-type){margin-right:20px}@media (max-width: 684px){.navigation-menu__inner{flex-direction:column;align-items:flex-start;padding:0}.navigation-menu__inner li{margin:0;padding:5px}}.navigation-menu .spacer{flex-grow:1 !important}.menu{display:flex;flex-direction:column;position:relative;list-style:none;padding:0;margin:0}.menu__trigger{margin-right:0 !important;color:#FF6266;user-select:none;cursor:pointer}.menu__dropdown{display:none;flex-direction:column;position:absolute;background:#221f29;box-shadow:0 10px rgba(34,31,41,0.8),-10px 10px rgba(34,31,41,0.8),10px 10px rgba(34,31,41,0.8);color:white;border:2px solid;margin:0;padding:10px;top:10px;left:0;list-style:none;z-index:99}.open .menu__dropdown{display:flex}.menu__dropdown>li{flex:0 0 auto}.menu__dropdown>li:not(:last-of-type){margin-bottom:10px}.menu__dropdown>li a{display:flex;padding:5px}@media (max-width: 684px){.menu--desktop{display:none}}.menu--mobile .menu__trigger{color:#FF6266;border:2px solid;margin-left:10px;height:100%;padding:3px 8px;margin-bottom:0 !important;position:relative;cursor:pointer;display:none}@media (max-width: 684px){.menu--mobile .menu__trigger{display:block}}@media (max-width: 684px){.menu--mobile .menu__dropdown{left:auto;right:0}}.menu--mobile li{flex:0 0 auto}.menu--mobile li:not(:last-of-type){margin-bottom:10px}.menu--language-selector .menu__trigger{color:#FF6266;border:2px solid;margin-left:10px;height:100%;padding:3px 8px;margin-bottom:0 !important;position:relative;cursor:pointer}@media (max-width: 684px){.menu--language-selector .menu__trigger{display:none}}.menu--language-selector .menu__dropdown{left:auto;right:0}.logo{display:flex;align-items:center;text-decoration:none;background:#FF6266;color:black;padding:5px 10px}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}body{margin:0;padding:0;font-family:'Fira Code', Monaco, Consolas, Ubuntu Mono, monospace;font-size:1rem;line-height:1.54;letter-spacing:-0.02em;background-color:#221f29;color:#fff;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;font-feature-settings:"liga", "tnum", "zero", "ss01", "locl";font-variant-ligatures:contextual;-webkit-overflow-scrolling:touch;-webkit-text-size-adjust:100%}@media (max-width: 684px){body{font-size:1rem}}.headings--one-size h1,.headings--one-size h2,.headings--one-size h3,.headings--one-size h4,.headings--one-size h5,.headings--one-size h6{line-height:1.3}.headings--one-size h1:not(first-child),.headings--one-size h2:not(first-child),.headings--one-size h3:not(first-child),.headings--one-size h4:not(first-child),.headings--one-size h5:not(first-child),.headings--one-size h6:not(first-child){margin-top:40px}.headings--one-size h1,.headings--one-size h2,.headings--one-size h3{font-size:1.4rem}.headings--one-size h4,.headings--one-size h5,.headings--one-size h6{font-size:1.2rem}a{color:inherit}img{display:block;max-width:100%}img.left{margin-right:auto}img.center{margin-left:auto;margin-right:auto}img.right{margin-left:auto}p{margin-bottom:20px}figure{display:table;max-width:100%;margin:25px 0}figure.left{margin-right:auto}figure.center{margin-left:auto;margin-right:auto}figure.right{margin-left:auto}figure figcaption{font-size:14px;padding:5px 10px;margin-top:5px;background:#FF6266;color:#221f29}figure figcaption.left{text-align:left}figure figcaption.center{text-align:center}figure figcaption.right{text-align:right}code,kbd{font-family:'Fira Code', Monaco, Consolas, Ubuntu Mono, monospace !important;font-feature-settings:normal;background:rgba(255,98,102,0.2);color:#FF6266;padding:1px 6px;margin:0 2px;font-size:.95rem}code code,code kbd,kbd code,kbd kbd{background:transparent;padding:0;margin:0}pre{background:transparent !important;padding:20px 10px;margin:40px 0;font-size:.95rem !important;overflow:auto;border-top:1px solid rgba(255,255,255,0.1);border-bottom:1px solid rgba(255,255,255,0.1)}pre+pre{border-top:0;margin-top:-40px}@media (max-width: 684px){pre{white-space:pre-wrap;word-wrap:break-word}}pre code{background:none !important;margin:0;padding:0;font-size:inherit;border:none}blockquote{border-top:1px solid #FF6266;border-bottom:1px solid #FF6266;margin:40px 0;padding:25px}@media (max-width: 684px){blockquote{padding-right:0}}blockquote p:first-of-type{margin-top:0}blockquote p:last-of-type{margin-bottom:0}blockquote p{position:relative}blockquote p:first-of-type:before{content:'>';display:block;position:absolute;left:-25px;color:#FF6266}blockquote.twitter-tweet{position:relative;background:rgba(255,98,102,0.1);font:inherit;color:inherit;border:1px solid #FF6266;padding-top:60px}blockquote.twitter-tweet p:before{content:''}blockquote.twitter-tweet:before{content:'> From Twitter:';position:absolute;top:20px;color:#FF6266;font-weight:bold}blockquote.twitter-tweet a{color:#FF6266}table{table-layout:auto;border-collapse:collapse;width:100%;margin:40px 0}table,th,td{border:1px dashed #FF6266;padding:10px}th{color:#FF6266}ul,ol{margin-left:22px;padding:0}ul li,ol li{position:relative}@media (max-width: 684px){ul,ol{margin-left:20px}}ol{list-style:none;counter-reset:li}ol li{counter-increment:li}ol li:before{content:counter(li);position:absolute;right:calc(100% + 10px);color:#FF6266;display:inline-block;text-align:right}ol ol{margin-left:38px}ol ol li{counter-increment:li}ol ol li:before{content:counters(li, ".") " "}mark{background:#FF6266;color:#221f29}.container{display:flex;flex-direction:column;padding:40px;max-width:864px;min-height:100vh;border-right:1px solid rgba(255,255,255,0.1)}.container.full,.container.center{border:none;margin:0 auto}.container.full{max-width:100%}@media (max-width: 684px){.container{padding:20px}}@media print{.container{display:initial}}.content{display:flex;flex-direction:column}@media print{.content{display:initial}}hr{width:100%;border:none;background:rgba(255,255,255,0.1);height:1px}.hidden{display:none}sup{line-height:0}.index-content{margin-top:20px}.framed{border:1px solid #FF6266;padding:20px}.framed *:first-child{margin-top:0}.framed *:last-child{margin-bottom:0}.posts{width:100%}.post{width:100%;text-align:left;margin:20px auto;padding:20px 0}.post:not(:last-of-type){border-bottom:1px solid rgba(255,255,255,0.1)}.post-meta{font-size:1rem;margin-bottom:10px;color:rgba(255,98,102,0.7)}.post-title{position:relative;color:#FF6266;margin:0 0 15px;padding-bottom:15px;border-bottom:3px dotted #FF6266}.post-title:after{content:'';position:absolute;bottom:2px;display:block;width:100%;border-bottom:3px dotted #FF6266}.post-title a{text-decoration:none}.post-tags{display:block;margin-bottom:20px;font-size:1rem;opacity:.5}.post-tags a{text-decoration:none}.post-content{margin-top:30px}.post-cover{border:20px solid #FF6266;background:transparent;margin:40px 0;padding:20px}@media (max-width: 684px){.post-cover{padding:10px;border-width:10px}}.post ul{list-style:none}.post ul li:not(:empty):before{content:'-';position:absolute;left:-20px;color:#FF6266}.post--regulation h1{justify-content:center}.post--regulation h2{justify-content:center;margin-bottom:10px}.post--regulation h2+h2{margin-top:-10px;margin-bottom:20px}.hanchor{color:rgba(255,98,102,0.9);text-decoration:none;margin-left:10px;visibility:hidden}h1:hover a,h2:hover a,h3:hover a,h4:hover a{visibility:visible}.footnotes{color:rgba(255,255,255,0.5)}.pagination{margin-top:50px}@media print{.pagination{display:none}}.pagination__title{display:flex;text-align:center;position:relative;margin:100px 0 20px}.pagination__title-h{text-align:center;margin:0 auto;padding:5px 10px;background:#221f29;color:rgba(255,255,255,0.3);font-size:.8rem;text-transform:uppercase;text-decoration:none;letter-spacing:.1em;z-index:1}.pagination__title hr{position:absolute;left:0;right:0;width:100%;margin-top:15px;z-index:0}.pagination__buttons{display:flex;align-items:center;justify-content:center;flex-flow:row wrap;gap:10px}.pagination__buttons a{text-decoration:none}.button{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:1rem;padding:0;appearance:none}@media (max-width: 684px){.button{flex:1}}.button a{display:flex;justify-content:center;flex:1;padding:8px 16px;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.button__text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.button.next .button__icon{margin-left:8px}.button.previous .button__icon{margin-right:8px}.footer{padding:40px 0;flex-grow:0;opacity:.5}.footer__inner{display:flex;align-items:center;justify-content:space-between;margin:0;width:760px;max-width:100%}@media (max-width: 900px){.footer__inner{flex-direction:column}}.footer a{color:inherit}.footer .copyright{display:flex;flex-flow:row wrap;flex:1;align-items:center;font-size:1rem;justify-content:center}.footer .copyright--user{margin:auto;text-align:center}.footer .copyright>*:first-child:not(:only-child){margin-right:10px}.footer .copyright span{white-space:nowrap}code[class*="language-"],pre[class*="language-"]{color:#ccc;background:none;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*="language-"]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#2d2d2d}:not(pre)>code[class*="language-"]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999}.token.punctuation{color:#ccc}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.number,.token.function{color:#f08d49}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699}.token.operator,.token.entity,.token.url{color:#67cdcc}.token.important,.token.bold{font-weight:bold}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}pre[data-line]{position:relative;padding:1em 0 1em 3em}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:rgba(153,122,102,0.08);background:linear-gradient(to right, rgba(153,122,102,0.1) 70%, rgba(153,122,102,0));pointer-events:none;line-height:inherit;white-space:pre}@media print{.line-highlight{-webkit-print-color-adjust:exact;color-adjust:exact}}.line-highlight:before,.line-highlight[data-end]:after{content:attr(data-start);position:absolute;top:.4em;left:.6em;min-width:1em;padding:0 .5em;background-color:rgba(153,122,102,0.4);color:#f5f2f0;font:bold 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px white}.line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}.line-numbers .line-highlight:before,.line-numbers .line-highlight:after{content:none}pre[id].linkable-line-numbers span.line-numbers-rows{pointer-events:all}pre[id].linkable-line-numbers span.line-numbers-rows>span:before{cursor:pointer}pre[id].linkable-line-numbers span.line-numbers-rows>span:hover:before{background-color:rgba(128,128,128,0.2)}pre[class*="language-"].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*="language-"].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:0.8em;text-align:right}.command-line-prompt{border-right:1px solid #999;display:block;float:left;font-size:100%;letter-spacing:-1px;margin-right:1em;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.command-line-prompt>span:before{color:#999;content:' ';display:block;padding-right:0.8em}.command-line-prompt>span[data-user]:before{content:"[" attr(data-user) "@" attr(data-host) "] $"}.command-line-prompt>span[data-user="root"]:before{content:"[" attr(data-user) "@" attr(data-host) "] #"}.command-line-prompt>span[data-prompt]:before{content:attr(data-prompt)}div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;top:.3em;right:.2em;transition:opacity 0.3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:none;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,0.2);box-shadow:0 2px 0 0 rgba(0,0,0,0.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus{color:inherit;text-decoration:none}code.language-css,code.language-scss,.token.boolean,.token.string,.token.entity,.token.url,.language-css .token.string,.language-scss .token.string,.style .token.string,.token.attr-value,.token.keyword,.token.control,.token.directive,.token.statement,.token.regex,.token.atrule,.token.number,.token.inserted,.token.important{color:#FF6266 !important}.token.tag-id,.token.atrule-id,.token.operator,.token.unit,.token.placeholder,.token.variable,.token.tag,.token.attr-name,.token.namespace,.token.deleted,.token.property,.token.class-name,.token.constant,.token.symbol{color:rgba(255,98,102,0.7) !important}.token.property,.token.function,.token.function-name,.token.deleted,code.language-javascript,code.language-html,.command-line-prompt>span:before{color:#9a9999 !important}.token.selector,.token.tag,.token.punctuation{color:white}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:rgba(255,255,255,0.3) !important}.token.namespace{opacity:.7 !important}pre[data-line]{position:relative}pre[class*="language-"]{margin:0;padding:0;overflow:auto}.line-highlight{position:absolute;left:0;right:0;padding:0;margin:0;background:rgba(245,104,107,0.08);pointer-events:none;line-height:inherit;white-space:pre}.line-highlight:before,.line-highlight[data-end]:after{content:attr(data-start);position:absolute;left:.6em;min-width:1em;padding:0 .5em;background-color:rgba(153,122,102,0.4);color:#f5f2f0;font:bold 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px white}.line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}.line-numbers .line-highlight:before,.line-numbers .line-highlight:after{content:none}.code-toolbar{position:relative;margin:40px 0;padding:20px;border:1px solid rgba(255,255,255,0.1)}.code-toolbar+.code-toolbar,.code-toolbar+.highlight,.code-toolbar+.highlight .code-toolbar{border-top:0;margin-top:calc(-1 * $code-margin)}.code-toolbar pre,.code-toolbar code{border:none}.code-toolbar code{display:block;color:inherit}.code-toolbar>.toolbar button{font-size:.8em !important;background:rgba(224,224,224,0.2) !important;color:#bbb !important;box-shadow:0 2px 0 0 rgba(0,0,0,0.2) !important;border-radius:0 !important;margin:6px !important;padding:10px !important;user-select:none}.collapsable-code{position:relative;width:100%;margin:40px 0}.collapsable-code input[type="checkbox"]{position:absolute;visibility:hidden}.collapsable-code input[type="checkbox"]:checked~pre,.collapsable-code input[type="checkbox"]:checked~.code-toolbar pre{height:0;padding:0;border-top:none}.collapsable-code input[type="checkbox"]:checked~.code-toolbar{padding:0;border-top:none}.collapsable-code input[type="checkbox"]:checked~.code-toolbar .toolbar{display:none}.collapsable-code input[type="checkbox"]:checked~label .collapsable-code__toggle:after{content:attr(data-label-expand)}.collapsable-code label{position:relative;display:flex;justify-content:space-between;min-width:30px;min-height:30px;margin:0;border-bottom:1px solid #f5686b;cursor:pointer}.collapsable-code__title{flex:1;color:#FF6266;padding:3px 10px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.collapsable-code__language{color:#FF6266;border:1px solid #f5686b;border-bottom:none;text-transform:uppercase;padding:3px 10px}.collapsable-code__toggle{color:#FF6266;font-size:16px;padding:3px 10px}.collapsable-code__toggle:after{content:attr(data-label-collapse)}.collapsable-code pre{margin-top:0}.collapsable-code pre::first-line{line-height:0}.collapsable-code .code-toolbar{margin:0}.terms h1{color:#FF6266}.terms h3{font-size:initial}body .gist .blob-num,body .gist .blob-code-inner{border:none} + +/*# sourceMappingURL=styles.css.map */ \ No newline at end of file diff --git a/public/styles.css.map b/public/styles.css.map new file mode 100644 index 0000000..4d033ee --- /dev/null +++ b/public/styles.css.map @@ -0,0 +1,45 @@ +{ + "version": 3, + "file": "styles.css", + "sourceRoot": "C:/Users/the1m/OneDrive/Desktop/hugo-site/website-hugo", + "sources": [ + "css/base.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/variables.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/font.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/buttons.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/form.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/header.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/menu.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/logo.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/main.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/post.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/pagination.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/footer.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/prism.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/syntax.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/code.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/terms.scss", + "../../../../AppData/Local/hugo_cache/modules/filecache/modules/pkg/mod/github.com/panr/hugo-theme-terminal/v3@v3.1.2/assets/css/gist.scss" + ], + "sourcesContent": [ + "$accent: #FF6266;\n@import \"variables\";\n\n@import \"font\";\n@import \"buttons\";\n@import \"form\";\n\n@import \"header\";\n@import \"menu\";\n@import \"logo\";\n@import \"main\";\n@import \"post\";\n@import \"pagination\";\n@import \"footer\";\n\n@import \"prism\";\n@import \"syntax\";\n@import \"code\";\n@import \"terms\";\n@import \"gist\";\n", + "/* COLOR VARIABLES */\n$background: mix($accent, #1D1E28, 2%);\n$color: white;\n$border-color: rgba(255, 255, 255, .1);\n\n/* MEDIA QUERIES */\n$phone: \"max-width: 684px\";\n$tablet: \"max-width: 900px\";\n\n/* variables for js, must be the same as these in @custom-media queries */\n:root {\n --phoneWidth: (max-width: 684px);\n --tabletWidth: (max-width: 900px);\n}\n", + "@font-face {\n font-display: swap;\n font-family: 'Fira Code';\n font-style: normal;\n font-weight: 400;\n src: url(\"../fonts/FiraCode-Regular.woff\") format(\"woff\");\n}\n\n@font-face {\n font-display: swap;\n font-family: 'Fira Code';\n font-style: normal;\n font-weight: 800;\n src: url(\"../fonts/FiraCode-Bold.woff\") format(\"woff\");\n}\n", + ".button-container {\n display: table;\n margin-left: auto;\n margin-right: auto;\n}\n\nbutton,\n.button,\na.button {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 18px;\n margin-bottom: 5px;\n text-decoration: none;\n text-align: center;\n border-radius: 8;\n border: 1px solid $accent;\n background: $accent;\n color: $background;\n font: inherit;\n font-weight: bold;\n appearance: none;\n cursor: pointer;\n outline: none;\n\n &:hover {\n background: transparentize($accent, .1);\n }\n\n /* variants */\n\n &.outline {\n background: transparent;\n box-shadow: none;\n padding: 8px 18px;\n\n :hover {\n transform: none;\n box-shadow: none;\n }\n }\n\n &.link {\n background: none;\n font-size: 1rem;\n }\n\n /* sizes */\n\n &.small {\n font-size: .8rem;\n }\n\n &.wide {\n min-width: 200px;\n padding: 14px 24px;\n }\n}\n\na.read-more,\na.read-more:hover,\na.read-more:active {\n display: inline-flex;\n border: none;\n color: $accent;\n background: none;\n box-shadow: none;\n padding: 0;\n margin: 20px 0;\n max-width: 100%;\n}\n\n.code-toolbar {\n margin-bottom: 20px;\n\n .toolbar-item a {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px 8px;\n margin-bottom: 5px;\n text-decoration: none;\n text-align: center;\n font-size: 13px;\n font-weight: 500;\n border-radius: 8px;\n border: 1px solid transparent;\n appearance: none;\n cursor: pointer;\n outline: none;\n }\n}\n", + "input, textarea, select {\n background: transparent;\n color: $accent;\n border: 1px solid $accent;\n border-radius: 0;\n padding: 10px;\n font: inherit;\n appearance: none;\n\n &:focus, :active {\n border-color: $color;\n outline: 1px solid $color;\n }\n\n &:active {\n box-shadow: none;\n }\n}\n\nselect {\n background: $background;\n\n option {\n background: $background;\n }\n}\n\n::placeholder {\n color: transparentize($accent, .5);\n}\n", + ".header {\n display: flex;\n flex-direction: column;\n position: relative;\n\n @media print {\n display: none;\n }\n\n &__inner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n &__logo {\n display: flex;\n flex: 1;\n\n &:after {\n content: '';\n background: repeating-linear-gradient(90deg, $accent, $accent 2px, transparent 0, transparent 10px);\n display: block;\n width: 100%;\n right: 10px;\n }\n\n a {\n flex: 0 0 auto;\n max-width: 100%;\n text-decoration: none;\n }\n }\n}\n", + "@mixin menu {\n display: none;\n flex-direction: column;\n $shadow-color: transparentize($background, .2);\n $shadow: 0 10px $shadow-color, -10px 10px $shadow-color, 10px 10px $shadow-color;\n position: absolute;\n background: $background;\n box-shadow: $shadow;\n color: white;\n border: 2px solid;\n margin: 0;\n padding: 10px;\n top: 10px;\n left: 0;\n list-style: none;\n z-index: 99;\n}\n\n@mixin header-menu-trigger {\n color: $accent;\n border: 2px solid;\n margin-left: 10px;\n height: 100%;\n padding: 3px 8px;\n margin-bottom: 0 !important;\n position: relative;\n cursor: pointer;\n}\n\n.navigation-menu {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin: 20px 1px;\n\n @media ($phone) {\n margin: 0;\n }\n\n &__inner {\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n list-style: none;\n margin: 0;\n padding: 0;\n\n > li {\n flex: 0 0 auto;\n margin-bottom: 10px;\n white-space: nowrap;\n\n &:not(:last-of-type) {\n margin-right: 20px;\n }\n }\n\n @media ($phone) {\n flex-direction: column;\n align-items: flex-start;\n padding: 0;\n\n li {\n margin: 0;\n padding: 5px;\n }\n }\n }\n\n .spacer {\n flex-grow: 1 !important;\n }\n}\n\n.menu {\n display: flex;\n flex-direction: column;\n position: relative;\n list-style: none;\n padding: 0;\n margin: 0;\n\n &__trigger {\n margin-right: 0 !important;\n color: $accent;\n user-select: none;\n cursor: pointer;\n }\n\n &__dropdown {\n @include menu;\n\n .open & {\n display: flex;\n }\n\n > li {\n flex: 0 0 auto;\n\n &:not(:last-of-type) {\n margin-bottom: 10px;\n }\n\n a {\n display: flex;\n padding: 5px;\n }\n }\n }\n\n &--desktop {\n @media ($phone) {\n display: none\n }\n }\n\n &--mobile {\n .menu__trigger {\n @include header-menu-trigger;\n display: none;\n\n @media ($phone) {\n display: block;\n }\n }\n\n .menu__dropdown {\n @media ($phone) {\n left: auto;\n right: 0;\n }\n }\n\n li {\n flex: 0 0 auto;\n\n &:not(:last-of-type) {\n margin-bottom: 10px;\n }\n }\n }\n\n &--language-selector {\n .menu__trigger {\n @include header-menu-trigger;\n\n @media ($phone) {\n display: none;\n }\n }\n\n .menu__dropdown {\n left: auto;\n right: 0;\n }\n }\n}\n", + ".logo {\n display: flex;\n align-items: center;\n text-decoration: none;\n background: $accent;\n color: black;\n padding: 5px 10px;\n}\n", + "html {\n box-sizing: border-box;\n}\n\n*,\n*:before,\n*:after {\n box-sizing: inherit;\n}\n\nbody {\n margin: 0;\n padding: 0;\n font-family: 'Fira Code', Monaco, Consolas, Ubuntu Mono, monospace;\n font-size: 1rem;\n line-height: 1.54;\n letter-spacing: -0.02em;\n background-color: $background;\n color: $color;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n font-feature-settings: \"liga\", \"tnum\", \"zero\", \"ss01\", \"locl\";\n font-variant-ligatures: contextual;\n -webkit-overflow-scrolling: touch;\n -webkit-text-size-adjust: 100%;\n\n @media ($phone) {\n font-size: 1rem;\n }\n}\n\n.headings--one-size {\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n line-height: 1.3;\n\n &:not(first-child) {\n margin-top: 40px;\n }\n }\n\n h1,\n h2,\n h3 {\n font-size: 1.4rem;\n }\n\n h4,\n h5,\n h6 {\n font-size: 1.2rem;\n }\n}\n\na {\n color: inherit;\n\n /* Waiting for a better times... */\n /* &:has(code) {\n text-decoration-color: $accent;\n } */\n}\n\nimg {\n display: block;\n max-width: 100%;\n\n &.left {\n margin-right: auto;\n }\n\n &.center {\n margin-left: auto;\n margin-right: auto;\n }\n\n &.right {\n margin-left: auto;\n }\n}\n\np {\n margin-bottom: 20px;\n}\n\nfigure {\n display: table;\n max-width: 100%;\n margin: 25px 0;\n\n &.left {\n margin-right: auto;\n }\n\n &.center {\n margin-left: auto;\n margin-right: auto;\n }\n\n &.right {\n margin-left: auto;\n }\n\n figcaption {\n font-size: 14px;\n padding: 5px 10px;\n margin-top: 5px;\n background: $accent;\n color: $background;\n /* opacity: .8; */\n\n &.left {\n text-align: left;\n }\n\n &.center {\n text-align: center;\n }\n\n &.right {\n text-align: right;\n }\n }\n}\n\ncode, kbd {\n font-family: 'Fira Code', Monaco, Consolas, Ubuntu Mono, monospace !important;\n font-feature-settings: normal;\n background: transparentize($accent, .8);\n color: $accent;\n padding: 1px 6px;\n margin: 0 2px;\n font-size: .95rem;\n\n code, kbd {\n background: transparent;\n padding: 0;\n margin: 0;\n }\n}\n\npre {\n background: transparent !important;\n padding: 20px 10px;\n margin: 40px 0;\n font-size: .95rem !important;\n overflow: auto;\n border-top: 1px solid rgba(255, 255, 255, .1);\n border-bottom: 1px solid rgba(255, 255, 255, .1);\n\n + pre {\n border-top: 0;\n margin-top: -40px;\n }\n\n @media ($phone) {\n white-space: pre-wrap;\n word-wrap: break-word;\n }\n\n code {\n background: none !important;\n margin: 0;\n padding: 0;\n font-size: inherit;\n border: none;\n }\n}\n\nblockquote {\n border-top: 1px solid $accent;\n border-bottom: 1px solid $accent;\n margin: 40px 0;\n padding: 25px;\n\n @media ($phone) {\n padding-right: 0;\n }\n\n p:first-of-type {\n margin-top: 0;\n }\n\n p:last-of-type {\n margin-bottom: 0;\n }\n\n p {\n position: relative;\n }\n\n p:first-of-type:before {\n content: '>';\n display: block;\n position: absolute;\n left: -25px;\n color: $accent;\n }\n\n &.twitter-tweet {\n position: relative;\n background: transparentize($accent, .9);\n font: inherit;\n color: inherit;\n border: 1px solid $accent;\n padding-top: 60px;\n\n p:before {\n content: '';\n }\n\n &:before {\n content: '> From Twitter:';\n position: absolute;\n top: 20px;\n color: $accent;\n font-weight: bold;\n }\n\n a {\n color: $accent;\n }\n }\n}\n\ntable {\n table-layout: auto;\n border-collapse: collapse;\n width: 100%;\n margin: 40px 0;\n}\n\ntable,\nth,\ntd {\n border: 1px dashed $accent;\n padding: 10px;\n}\n\nth {\n color: $accent;\n}\n\nul,\nol {\n margin-left: 22px;\n padding: 0;\n\n li {\n position: relative;\n }\n\n @media ($phone) {\n margin-left: 20px;\n }\n}\n\nol {\n list-style: none;\n counter-reset: li;\n\n li {\n counter-increment: li;\n }\n\n li:before {\n content: counter(li);\n position: absolute;\n right: calc(100% + 10px);\n color: $accent;\n display: inline-block;\n text-align: right;\n }\n\n ol {\n margin-left: 38px;\n\n li {\n counter-increment: li;\n }\n\n li:before {\n content: counters(li, \".\") \" \";\n }\n }\n}\n\nmark {\n background: $accent;\n color: $background;\n}\n\n.container {\n display: flex;\n flex-direction: column;\n padding: 40px;\n max-width: 864px;\n min-height: 100vh;\n border-right: 1px solid rgba(255, 255, 255, 0.1);\n\n &.full,\n &.center {\n border: none;\n margin: 0 auto;\n }\n\n &.full {\n max-width: 100%;\n }\n\n @media ($phone) {\n padding: 20px;\n }\n\n @media print {\n display: initial;\n }\n}\n\n.content {\n display: flex;\n flex-direction: column;\n\n @media print {\n display: initial;\n }\n}\n\nhr {\n width: 100%;\n border: none;\n background: $border-color;\n height: 1px;\n}\n\n.hidden {\n display: none;\n}\n\nsup {\n line-height: 0;\n}\n", + ".index-content {\n margin-top: 20px;\n}\n\n.framed {\n border: 1px solid $accent;\n padding: 20px;\n\n *:first-child {\n margin-top: 0;\n }\n\n *:last-child {\n margin-bottom: 0;\n }\n}\n\n.posts {\n width: 100%;\n}\n\n.post {\n width: 100%;\n text-align: left;\n margin: 20px auto;\n padding: 20px 0;\n\n &:not(:last-of-type) {\n border-bottom: 1px solid $border-color;\n }\n\n &-meta {\n font-size: 1rem;\n margin-bottom: 10px;\n color: transparentize($accent, .3);\n }\n\n &-title {\n $border: 3px dotted $accent;\n position: relative;\n color: $accent;\n margin: 0 0 15px;\n padding-bottom: 15px;\n border-bottom: $border;\n\n &:after {\n content: '';\n position: absolute;\n bottom: 2px;\n display: block;\n width: 100%;\n border-bottom: $border;\n }\n\n a {\n text-decoration: none;\n }\n }\n\n &-tags {\n display: block;\n margin-bottom: 20px;\n font-size: 1rem;\n opacity: .5;\n\n a {\n text-decoration: none;\n }\n }\n\n &-content {\n margin-top: 30px;\n }\n\n &-cover {\n border: 20px solid $accent;\n background: transparent;\n margin: 40px 0;\n padding: 20px;\n\n @media ($phone) {\n padding: 10px;\n border-width: 10px;\n }\n }\n\n ul {\n list-style: none;\n\n li:not(:empty):before {\n content: '-';\n position: absolute;\n left: -20px;\n color: $accent;\n }\n }\n}\n\n.post--regulation {\n h1 {\n justify-content: center;\n }\n\n h2 {\n justify-content: center;\n margin-bottom: 10px;\n\n & + h2 {\n margin-top: -10px;\n margin-bottom: 20px;\n }\n }\n}\n\n.hanchor {\n color: transparentize($accent, .1);\n text-decoration: none;\n margin-left: 10px;\n visibility: hidden;\n}\n\nh1:hover a, h2:hover a, h3:hover a, h4:hover a {\n visibility: visible;\n}\n\n.footnotes {\n color: transparentize($color, .5);\n}\n", + ".pagination {\n margin-top: 50px;\n\n @media print {\n display: none;\n }\n\n &__title {\n display: flex;\n text-align: center;\n position: relative;\n margin: 100px 0 20px;\n\n &-h {\n text-align: center;\n margin: 0 auto;\n padding: 5px 10px;\n background: $background;\n color: transparentize($color, .7);\n font-size: .8rem;\n text-transform: uppercase;\n text-decoration: none;\n letter-spacing: .1em;\n z-index: 1;\n }\n\n hr {\n position: absolute;\n left: 0;\n right: 0;\n width: 100%;\n margin-top: 15px;\n z-index: 0;\n }\n }\n\n &__buttons {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-flow: row wrap;\n gap: 10px;\n\n a {\n text-decoration: none;\n }\n }\n}\n\n.button {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 1rem;\n padding: 0;\n appearance: none;\n\n @media($phone) {\n flex: 1;\n }\n\n a {\n display: flex;\n justify-content: center;\n flex: 1;\n padding: 8px 16px;\n text-decoration: none;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n\n &__text {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n\n &.next .button__icon {\n margin-left: 8px;\n }\n\n &.previous .button__icon {\n margin-right: 8px;\n }\n}\n", + ".footer {\n padding: 40px 0;\n flex-grow: 0;\n opacity: .5;\n\n &__inner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin: 0;\n width: 760px;\n max-width: 100%;\n\n @media ($tablet) {\n flex-direction: column;\n }\n }\n\n a {\n color: inherit;\n }\n\n .copyright {\n display: flex;\n flex-flow: row wrap;\n flex: 1;\n align-items: center;\n font-size: 1rem;\n justify-content: center;\n\n &--user {\n margin: auto;\n text-align: center;\n }\n\n & > *:first-child:not(:only-child) {\n margin-right: 10px;\n }\n\n span {\n white-space: nowrap;\n }\n }\n}\n", + "/* PrismJS 1.24.1\nhttps://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+actionscript+apacheconf+applescript+bash+c+csharp+cpp+cmake+coffeescript+csp+css-extras+diff+django+docker+elixir+elm+erlang+fsharp+flow+git+go+graphql+haml+handlebars+haskell+http+java+json+kotlin+latex+less+llvm+makefile+markdown+markup-templating+nasm+objectivec+ocaml+perl+php+php-extras+powershell+processing+pug+python+r+jsx+tsx+reason+ruby+rust+sass+scss+scala+scheme+sql+stylus+swift+textile+toml+twig+typescript+vim+visual-basic+wasm+yaml&plugins=line-highlight+line-numbers+jsonp-highlight+highlight-keywords+command-line+toolbar+copy-to-clipboard */\n/**\n * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML\n * Based on https://github.com/chriskempson/tomorrow-theme\n * @author Rose Pritchard\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: #ccc;\n\tbackground: none;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #2d2d2d;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.block-comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #999;\n}\n\n.token.punctuation {\n\tcolor: #ccc;\n}\n\n.token.tag,\n.token.attr-name,\n.token.namespace,\n.token.deleted {\n\tcolor: #e2777a;\n}\n\n.token.function-name {\n\tcolor: #6196cc;\n}\n\n.token.boolean,\n.token.number,\n.token.function {\n\tcolor: #f08d49;\n}\n\n.token.property,\n.token.class-name,\n.token.constant,\n.token.symbol {\n\tcolor: #f8c555;\n}\n\n.token.selector,\n.token.important,\n.token.atrule,\n.token.keyword,\n.token.builtin {\n\tcolor: #cc99cd;\n}\n\n.token.string,\n.token.char,\n.token.attr-value,\n.token.regex,\n.token.variable {\n\tcolor: #7ec699;\n}\n\n.token.operator,\n.token.entity,\n.token.url {\n\tcolor: #67cdcc;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n.token.inserted {\n\tcolor: green;\n}\n\npre[data-line] {\n\tposition: relative;\n\tpadding: 1em 0 1em 3em;\n}\n\n.line-highlight {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\tpadding: inherit 0;\n\tmargin-top: 1em; /* Same as .prism’s padding-top */\n\n\tbackground: hsla(24, 20%, 50%,.08);\n\tbackground: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));\n\n\tpointer-events: none;\n\n\tline-height: inherit;\n\twhite-space: pre;\n}\n\n@media print {\n\t.line-highlight {\n\t\t/*\n\t\t * This will prevent browsers from replacing the background color with white.\n\t\t * It's necessary because the element is layered on top of the displayed code.\n\t\t */\n\t\t-webkit-print-color-adjust: exact;\n\t\tcolor-adjust: exact;\n\t}\n}\n\n\t.line-highlight:before,\n\t.line-highlight[data-end]:after {\n\t\tcontent: attr(data-start);\n\t\tposition: absolute;\n\t\ttop: .4em;\n\t\tleft: .6em;\n\t\tmin-width: 1em;\n\t\tpadding: 0 .5em;\n\t\tbackground-color: hsla(24, 20%, 50%,.4);\n\t\tcolor: hsl(24, 20%, 95%);\n\t\tfont: bold 65%/1.5 sans-serif;\n\t\ttext-align: center;\n\t\tvertical-align: .3em;\n\t\tborder-radius: 999px;\n\t\ttext-shadow: none;\n\t\tbox-shadow: 0 1px white;\n\t}\n\n\t.line-highlight[data-end]:after {\n\t\tcontent: attr(data-end);\n\t\ttop: auto;\n\t\tbottom: .4em;\n\t}\n\n.line-numbers .line-highlight:before,\n.line-numbers .line-highlight:after {\n\tcontent: none;\n}\n\npre[id].linkable-line-numbers span.line-numbers-rows {\n\tpointer-events: all;\n}\npre[id].linkable-line-numbers span.line-numbers-rows > span:before {\n\tcursor: pointer;\n}\npre[id].linkable-line-numbers span.line-numbers-rows > span:hover:before {\n\tbackground-color: rgba(128, 128, 128, .2);\n}\n\npre[class*=\"language-\"].line-numbers {\n\tposition: relative;\n\tpadding-left: 3.8em;\n\tcounter-reset: linenumber;\n}\n\npre[class*=\"language-\"].line-numbers > code {\n\tposition: relative;\n\twhite-space: inherit;\n}\n\n.line-numbers .line-numbers-rows {\n\tposition: absolute;\n\tpointer-events: none;\n\ttop: 0;\n\tfont-size: 100%;\n\tleft: -3.8em;\n\twidth: 3em; /* works for line-numbers below 1000 lines */\n\tletter-spacing: -1px;\n\tborder-right: 1px solid #999;\n\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\n}\n\n\t.line-numbers-rows > span {\n\t\tdisplay: block;\n\t\tcounter-increment: linenumber;\n\t}\n\n\t\t.line-numbers-rows > span:before {\n\t\t\tcontent: counter(linenumber);\n\t\t\tcolor: #999;\n\t\t\tdisplay: block;\n\t\t\tpadding-right: 0.8em;\n\t\t\ttext-align: right;\n\t\t}\n\n.command-line-prompt {\n\tborder-right: 1px solid #999;\n\tdisplay: block;\n\tfloat: left;\n\tfont-size: 100%;\n\tletter-spacing: -1px;\n\tmargin-right: 1em;\n\tpointer-events: none;\n\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.command-line-prompt > span:before {\n\tcolor: #999;\n\tcontent: ' ';\n\tdisplay: block;\n\tpadding-right: 0.8em;\n}\n\n.command-line-prompt > span[data-user]:before {\n\tcontent: \"[\" attr(data-user) \"@\" attr(data-host) \"] $\";\n}\n\n.command-line-prompt > span[data-user=\"root\"]:before {\n\tcontent: \"[\" attr(data-user) \"@\" attr(data-host) \"] #\";\n}\n\n.command-line-prompt > span[data-prompt]:before {\n\tcontent: attr(data-prompt);\n}\n\ndiv.code-toolbar {\n\tposition: relative;\n}\n\ndiv.code-toolbar > .toolbar {\n\tposition: absolute;\n\ttop: .3em;\n\tright: .2em;\n\ttransition: opacity 0.3s ease-in-out;\n\topacity: 0;\n}\n\ndiv.code-toolbar:hover > .toolbar {\n\topacity: 1;\n}\n\n/* Separate line b/c rules are thrown out if selector is invalid.\n IE11 and old Edge versions don't support :focus-within. */\ndiv.code-toolbar:focus-within > .toolbar {\n\topacity: 1;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item {\n\tdisplay: inline-block;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a {\n\tcursor: pointer;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > button {\n\tbackground: none;\n\tborder: 0;\n\tcolor: inherit;\n\tfont: inherit;\n\tline-height: normal;\n\toverflow: visible;\n\tpadding: 0;\n\t-webkit-user-select: none; /* for button */\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a,\ndiv.code-toolbar > .toolbar > .toolbar-item > button,\ndiv.code-toolbar > .toolbar > .toolbar-item > span {\n\tcolor: #bbb;\n\tfont-size: .8em;\n\tpadding: 0 .5em;\n\tbackground: #f5f2f0;\n\tbackground: rgba(224, 224, 224, 0.2);\n\tbox-shadow: 0 2px 0 0 rgba(0,0,0,0.2);\n\tborder-radius: .5em;\n}\n\ndiv.code-toolbar > .toolbar > .toolbar-item > a:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > a:focus,\ndiv.code-toolbar > .toolbar > .toolbar-item > button:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > button:focus,\ndiv.code-toolbar > .toolbar > .toolbar-item > span:hover,\ndiv.code-toolbar > .toolbar > .toolbar-item > span:focus {\n\tcolor: inherit;\n\ttext-decoration: none;\n}\n\n", + "code.language-css,\ncode.language-scss,\n.token.boolean,\n.token.string,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.language-scss .token.string,\n.style .token.string,\n.token.attr-value,\n.token.keyword,\n.token.control,\n.token.directive,\n.token.statement,\n.token.regex,\n.token.atrule,\n.token.number,\n.token.inserted,\n.token.important {\n color: $accent !important;\n}\n\n.token.tag-id,\n.token.atrule-id,\n.token.operator,\n.token.unit,\n.token.placeholder,\n.token.variable,\n.token.tag,\n.token.attr-name,\n.token.namespace,\n.token.deleted,\n.token.property,\n.token.class-name,\n.token.constant,\n.token.symbol {\n color: transparentize($accent, .3) !important;\n}\n\n.token.property,\n.token.function,\n.token.function-name,\n.token.deleted,\ncode.language-javascript,\ncode.language-html,\n.command-line-prompt > span:before {\n color: mix($accent, #999, .9) !important;\n}\n\n.token.selector,\n.token.tag,\n.token.punctuation {\n color: white;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n color: rgba(255, 255, 255, .3) !important;\n}\n\n.token.namespace {\n opacity: .7 !important;\n}\n\npre[data-line] {\n position: relative;\n}\n\npre[class*=\"language-\"] {\n margin: 0;\n padding: 0;\n overflow: auto;\n}\n\n.line-highlight {\n position: absolute;\n left: 0;\n right: 0;\n padding: 0;\n margin: 0;\n background: transparentize(mix($accent, #999, 90%), .92);\n pointer-events: none;\n line-height: inherit;\n white-space: pre;\n}\n\n.line-highlight:before,\n.line-highlight[data-end]:after {\n content: attr(data-start);\n position: absolute;\n /* top: .4em; */\n left: .6em;\n min-width: 1em;\n padding: 0 .5em;\n background-color: hsla(24, 20%, 50%, .4);\n color: hsl(24, 20%, 95%);\n font: bold 65%/1.5 sans-serif;\n text-align: center;\n vertical-align: .3em;\n border-radius: 999px;\n text-shadow: none;\n box-shadow: 0 1px white;\n}\n\n.line-highlight[data-end]:after {\n content: attr(data-end);\n top: auto;\n bottom: .4em;\n}\n\n.line-numbers .line-highlight:before,\n.line-numbers .line-highlight:after {\n content: none;\n}\n\n.code-toolbar {\n $code-margin: 40px;\n\tposition: relative;\n\tmargin: $code-margin 0;\n\tpadding: 20px;\n\tborder: 1px solid rgba(255, 255, 255, .1);\n\n\t+ .code-toolbar,\n\t+ .highlight,\n\t+ .highlight .code-toolbar {\n\t\tborder-top: 0;\n\t\tmargin-top: calc(-1 * $code-margin);\n\t}\n\n\tpre, code {\n\t\tborder: none;\n\t}\n\n\tcode {\n\t\tdisplay: block;\n\t\tcolor: inherit;\n\t}\n\n > .toolbar {\n button {\n font-size: .8em !important;\n background: hsla(0,0%,87.8%,.2) !important;\n color: #bbb !important;\n box-shadow: 0 2px 0 0 rgba(0,0,0,.2) !important;\n border-radius: 0 !important;\n margin: 6px !important;\n padding: 10px !important;\n user-select:none\n }\n }\n}\n", + ".collapsable-code {\n $border-color: mix($accent, #999, 90%);\n\n position: relative;\n width: 100%;\n margin: 40px 0;\n\n input[type=\"checkbox\"] {\n position: absolute;\n visibility: hidden;\n }\n\n input[type=\"checkbox\"]:checked {\n ~ pre,\n ~ .code-toolbar pre {\n height: 0;\n padding: 0;\n border-top: none;\n }\n\n ~ .code-toolbar {\n padding: 0;\n border-top: none;\n\n .toolbar {\n display: none;\n }\n }\n\n ~ label .collapsable-code__toggle:after {\n content: attr(data-label-expand);\n }\n }\n\n label {\n position: relative;\n display: flex;\n justify-content: space-between;\n min-width: 30px;\n min-height: 30px;\n margin: 0;\n border-bottom: 1px solid $border-color;\n cursor: pointer;\n }\n\n &__title {\n flex: 1;\n color: $accent;\n padding: 3px 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n\n &__language {\n color: $accent;\n border: 1px solid $border-color;\n border-bottom: none;\n text-transform: uppercase;\n padding: 3px 10px;\n }\n\n &__toggle {\n color: $accent;\n font-size: 16px;\n padding: 3px 10px;\n\n &:after {\n content: attr(data-label-collapse);\n }\n }\n\n pre {\n margin-top: 0;\n\n &::first-line {\n line-height: 0;\n }\n }\n\n .code-toolbar {\n margin: 0;\n }\n}\n", + ".terms {\n h1 {\n color: $accent;\n }\n\n h3 {\n font-size: initial;\n }\n}\n", + "body .gist .blob-num /* line numbers */,\nbody .gist .blob-code-inner\n{\n border: none;\n}\n\n" + ], + "names": [], + "mappings": "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" +} \ No newline at end of file diff --git a/public/tags/dotnet/index.html b/public/tags/dotnet/index.html new file mode 100644 index 0000000..a3fa521 --- /dev/null +++ b/public/tags/dotnet/index.html @@ -0,0 +1,228 @@ + + + + + dotnet :: the1mason + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + +
+ + + + +
+ + +
+ + +
+ +
+

+ #1 Plugin-Based Web App in Dotnet - The Idea +

+ + + + + + + + #1 Plugin-Based Web App in Dotnet - The Idea + + +
+ + Have you ever thought about making a web application, that could be easily extended by third-party developers? I’ve been thinking about making this app for a while, so here’s my experience… + +
+ + + + +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + +
+ + + diff --git a/public/tags/dotnet/index.xml b/public/tags/dotnet/index.xml new file mode 100644 index 0000000..bb8964b --- /dev/null +++ b/public/tags/dotnet/index.xml @@ -0,0 +1,123 @@ + + + + dotnet on the1mason + the1mason.com/tags/dotnet/ + Recent content in dotnet on the1mason + Hugo -- gohugo.io + en + Sat, 20 Jan 2024 00:00:00 +0000 + + #1 Plugin-Based Web App in Dotnet - The Idea + the1mason.com/posts/modular-app-1/ + Sat, 20 Jan 2024 00:00:00 +0000 + + the1mason.com/posts/modular-app-1/ + Chapters Writing those takes time. Expect to see one published per one-two weeks. +Idea, Stack +Loading plugins +PluginBase, IPlugin +Creating plugin, DependencyInjection +Controllers, Views +Hooks and Triggers - better event system +Advanced: Unit tests, unloading plugins +Introduction Have you ever heard of plugins? These are loadable libraries, extending your application. +This series of articles is an overview of my plugin-based web application prototype and mechanisms behind it&rsquo;s features, as well as my thought process and decision making during development. + <script src="the1mason.com/js/repo-card.js"></script> +<div class="repo-card" data-repo="the1mason/Prototype.ModularMVC" data-theme="dark-theme"></div> +<h1 id="chapters">Chapters</h1> +<p>Writing those takes time. Expect to see one published per one-two weeks.</p> +<ol> +<li> +<p>Idea, Stack</p> +</li> +<li> +<p><del>Loading plugins</del></p> +</li> +<li> +<p><del>PluginBase, IPlugin</del></p> +</li> +<li> +<p><del>Creating plugin, DependencyInjection</del></p> +</li> +<li> +<p><del>Controllers, Views</del></p> +</li> +<li> +<p><del>Hooks and Triggers - better event system</del></p> +</li> +<li> +<p><del>Advanced: Unit tests, unloading plugins</del></p> +</li> +</ol> +<h1 id="introduction">Introduction</h1> +<p>Have you ever heard of plugins? These are loadable libraries, extending your application.<br> +This series of articles is an overview of my plugin-based web application prototype and mechanisms behind it&rsquo;s features, as well as my thought process and decision making during development. These articles are a step by step guide to making your own plugin-based web app prototype.</p> +<p><em>I assume some that readers have some knowledge of C# and design patterns</em></p> +<h1 id="problem">Problem</h1> +<p>Self-hosted web applications can solve different problems and be of use to a variety of different people with slightly different needs. For this to work, I think that such an application should provide an option to extend its functionality. This would allow other people to build an ecosystem of different extensions around it. For example, a shopping website might have plugins for different payment systems, or a comment section under the product page. For me this also means, that instead of making one feature-rich website, that would be so specific to my needs, that it wouldn&rsquo;t of any use to anyone but me, I can write a bunch of smaller modules, that could be used by someone, without having to configure other modules.</p> +<h1 id="choosing-my-stack">Choosing my stack</h1> +<p><img src="the1mason.com/posts/modular-app/stack.svg" alt="C#, MVC, HTMX"></p> +<hr> +<p><strong>C#</strong></p> +<p>I&rsquo;m a dotnet developer and I write C# code for living. This project is as much of an excersise for me as it is an interesting design prototype for C#, that hasn&rsquo;t been described in detail as much online.</p> +<p>I haven&rsquo;t seen such plugin-based sites written in C#. There are some projects, using plugin based architecture&hellip; Well, there&rsquo;s even a <a href="https://learn.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support">Microsoft Learn Article</a> about building such an app!</p> +<blockquote> +<p><strong>Q:</strong> Why would I even bother to write all these posts and making prototypes? Even more: Why would someone be interested in such post?</p> +</blockquote> +<blockquote> +<p><strong>A:</strong> You see&hellip; there&rsquo;s a problem: Neither <code>learn.microsoft.com</code> nor any other webside covers dynamically updating web interface with plugins! If you want to learn about it, it&rsquo;s the right place. Also just loading libraries isn&rsquo;t enough because app also has to provide some ways for plugins to interact with it, which is also covered here!</p> +</blockquote> +<hr> +<p><strong>MVC with HTMX</strong></p> +<p>ASP.NET MVC is a web framework, that incorporates the MVC design pattern and uses SSR (Server Side Rendering) to serve content. It is a perfect fit for the HTMX library. This is a compact JavaScript library that extends basic HTML by adding some custom attributes just enough to build your app around it. You can distribute events, make AJAX requests and build truly dynamic app by using as little JS as possible.</p> +<div style="display: flex; justify-content: center"> + <img src="the1mason.com/posts/modular-app/createdwith.jpeg" style="height: 100px;"/> +</div> +<br> +<p>HTMX uses <a href="https://htmx.org/essays/hateoas/">Hypermedia as the Engine of Application State (HATEOAS)</a> - it&rsquo;s a principle that leaves all state handling to the server, providing the client only with a set of actions that it can take. +Your regular SPA will get raw data from the server (like bank balance) and based on it, it will show or hide certain actions (like we won&rsquo;t show the withdrawal option if balance is 0 or less). With HATEOAS, the server just won&rsquo;t give the link to withdraw money, making this action impossible in the first place.</p> +<p>HTMX would allow this app to be extended more easily as well. Most of the modern JS frameworks require transpiling, bundling and other sorts of stuff. This means that when a plugin is installed the client is most likely will have to be rebuilt. This is slow and needs additional dependencies.</p> +<blockquote> +<p>Have you heard about Blazor WASM? You can just write client code in C#!</p> +</blockquote> +<p>Blazor WASM does not support dynamic loading for plugins. Because of that, plugins won&rsquo;t be able to extend the client. Also it&rsquo;s initial load time is stupidly slow.</p> +<hr> +<p>The next article will cover the following topocs: Loading plugins in runtime, creating plugin&rsquo;s instances, app-plugin communication. I&rsquo;ll have the link here when I&rsquo;m done writing it!</p> +<!-- +--- + +# Loading plugins + +C#, being a compiled language, can't be extended as easily as interpreted languages like Pytnon or PHP. To load plugins, we will need to load precompiled libraries dynamically after the app is compiled. To do this, [Microsoft Learn Article, mentioned before](https://learn.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support) suggests using custom AssemblyLoadContext with AssemblyDependencyResolver. + +> Wait, wait, wait! Using... what? I'm pretty sure you could just `Assembly.Load()` stuff, right? + +Not so easy! If you want to build a really working plugin system, you need a way to determine: whether this assembly has dependencies or not, and what are they. + +Let's imagine, that our plugin uses `Newtonsoft.Json` library - one of the all-time most popular C# libraries. Should we load it together with the plugin and how do we find it? +C# has a built-in mechanism to resolve dependencies. When you compile your project, aside from `Project.Name.dll` you would have `Project.Name.deps.json` file, that will include paths to all it's dependencies! That's where `AssemblyDependencyResolver` comes in. It'll find all of plugin's `.dll` dependencies and load those as well. + +> And also! What it two plugins will have the same library, but conflicting versions? Would we be able to load to of the same assemblies? + +No! And yes. +`AssemblyLoadContext` is used exactly for this. Along with `AssemblyDependencyResolver`, it will create an isolated context with current assembly and all it's dependencies. This will allow multiple plugins to have same dependencies with different versions. + +There's an example of such custom AssemblyLoadContext [Click Me](https://github.com/the1mason/Prototype.ModularMVC/blob/main/Prototype.ModularMVC.App/Prototype.ModularMVC.PluginBase/PluginLoadContext.cs) and also an example of this context being used [Click Me](https://github.com/the1mason/Prototype.ModularMVC/blob/main/Prototype.ModularMVC.App/Prototype.ModularMVC.PluginBase/Impl/PluginLoaders/ManifestBasedPluginLoader.cs#L89). + +--- + + +# Plugin - App interaction + +So now we figured out how we load stuff. Now: how do we interact with the app from out plugins? + +First, we make all plugins to referense the `Prototype.PluginBase` project. This project will provide types that both plugin and our server can understand. We'll build communication using those. + +**Dependency Injection** + +Before the app is built and ran, --> + + + + diff --git a/public/tags/dotnet/page/1/index.html b/public/tags/dotnet/page/1/index.html new file mode 100644 index 0000000..7f3c2cd --- /dev/null +++ b/public/tags/dotnet/page/1/index.html @@ -0,0 +1,10 @@ + + + + the1mason.com/tags/dotnet/ + + + + + + diff --git a/public/tags/index.html b/public/tags/index.html new file mode 100644 index 0000000..31cfd5f --- /dev/null +++ b/public/tags/index.html @@ -0,0 +1,200 @@ + + + + + Tags :: the1mason + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + +
+ + + + +
+ + +
+ +
+

Tags

+ +
+ +
+ + + + + + + + + + + + + + + + +
+ + + diff --git a/public/tags/index.xml b/public/tags/index.xml new file mode 100644 index 0000000..7048b00 --- /dev/null +++ b/public/tags/index.xml @@ -0,0 +1,41 @@ + + + + Tags on the1mason + the1mason.com/tags/ + Recent content in Tags on the1mason + Hugo -- gohugo.io + en + Sat, 20 Jan 2024 00:00:00 +0000 + + dotnet + the1mason.com/tags/dotnet/ + Sat, 20 Jan 2024 00:00:00 +0000 + + the1mason.com/tags/dotnet/ + + + + + + prototype + the1mason.com/tags/prototype/ + Sat, 20 Jan 2024 00:00:00 +0000 + + the1mason.com/tags/prototype/ + + + + + + web + the1mason.com/tags/web/ + Sat, 20 Jan 2024 00:00:00 +0000 + + the1mason.com/tags/web/ + + + + + + diff --git a/public/tags/prototype/index.html b/public/tags/prototype/index.html new file mode 100644 index 0000000..60d88c7 --- /dev/null +++ b/public/tags/prototype/index.html @@ -0,0 +1,228 @@ + + + + + prototype :: the1mason + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + +
+ + + + +
+ + +
+ + +
+ +
+

+ #1 Plugin-Based Web App in Dotnet - The Idea +

+ + + + + + + + #1 Plugin-Based Web App in Dotnet - The Idea + + +
+ + Have you ever thought about making a web application, that could be easily extended by third-party developers? I’ve been thinking about making this app for a while, so here’s my experience… + +
+ + + + +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + +
+ + + diff --git a/public/tags/prototype/index.xml b/public/tags/prototype/index.xml new file mode 100644 index 0000000..ff4395a --- /dev/null +++ b/public/tags/prototype/index.xml @@ -0,0 +1,123 @@ + + + + prototype on the1mason + the1mason.com/tags/prototype/ + Recent content in prototype on the1mason + Hugo -- gohugo.io + en + Sat, 20 Jan 2024 00:00:00 +0000 + + #1 Plugin-Based Web App in Dotnet - The Idea + the1mason.com/posts/modular-app-1/ + Sat, 20 Jan 2024 00:00:00 +0000 + + the1mason.com/posts/modular-app-1/ + Chapters Writing those takes time. Expect to see one published per one-two weeks. +Idea, Stack +Loading plugins +PluginBase, IPlugin +Creating plugin, DependencyInjection +Controllers, Views +Hooks and Triggers - better event system +Advanced: Unit tests, unloading plugins +Introduction Have you ever heard of plugins? These are loadable libraries, extending your application. +This series of articles is an overview of my plugin-based web application prototype and mechanisms behind it&rsquo;s features, as well as my thought process and decision making during development. + <script src="the1mason.com/js/repo-card.js"></script> +<div class="repo-card" data-repo="the1mason/Prototype.ModularMVC" data-theme="dark-theme"></div> +<h1 id="chapters">Chapters</h1> +<p>Writing those takes time. Expect to see one published per one-two weeks.</p> +<ol> +<li> +<p>Idea, Stack</p> +</li> +<li> +<p><del>Loading plugins</del></p> +</li> +<li> +<p><del>PluginBase, IPlugin</del></p> +</li> +<li> +<p><del>Creating plugin, DependencyInjection</del></p> +</li> +<li> +<p><del>Controllers, Views</del></p> +</li> +<li> +<p><del>Hooks and Triggers - better event system</del></p> +</li> +<li> +<p><del>Advanced: Unit tests, unloading plugins</del></p> +</li> +</ol> +<h1 id="introduction">Introduction</h1> +<p>Have you ever heard of plugins? These are loadable libraries, extending your application.<br> +This series of articles is an overview of my plugin-based web application prototype and mechanisms behind it&rsquo;s features, as well as my thought process and decision making during development. These articles are a step by step guide to making your own plugin-based web app prototype.</p> +<p><em>I assume some that readers have some knowledge of C# and design patterns</em></p> +<h1 id="problem">Problem</h1> +<p>Self-hosted web applications can solve different problems and be of use to a variety of different people with slightly different needs. For this to work, I think that such an application should provide an option to extend its functionality. This would allow other people to build an ecosystem of different extensions around it. For example, a shopping website might have plugins for different payment systems, or a comment section under the product page. For me this also means, that instead of making one feature-rich website, that would be so specific to my needs, that it wouldn&rsquo;t of any use to anyone but me, I can write a bunch of smaller modules, that could be used by someone, without having to configure other modules.</p> +<h1 id="choosing-my-stack">Choosing my stack</h1> +<p><img src="the1mason.com/posts/modular-app/stack.svg" alt="C#, MVC, HTMX"></p> +<hr> +<p><strong>C#</strong></p> +<p>I&rsquo;m a dotnet developer and I write C# code for living. This project is as much of an excersise for me as it is an interesting design prototype for C#, that hasn&rsquo;t been described in detail as much online.</p> +<p>I haven&rsquo;t seen such plugin-based sites written in C#. There are some projects, using plugin based architecture&hellip; Well, there&rsquo;s even a <a href="https://learn.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support">Microsoft Learn Article</a> about building such an app!</p> +<blockquote> +<p><strong>Q:</strong> Why would I even bother to write all these posts and making prototypes? Even more: Why would someone be interested in such post?</p> +</blockquote> +<blockquote> +<p><strong>A:</strong> You see&hellip; there&rsquo;s a problem: Neither <code>learn.microsoft.com</code> nor any other webside covers dynamically updating web interface with plugins! If you want to learn about it, it&rsquo;s the right place. Also just loading libraries isn&rsquo;t enough because app also has to provide some ways for plugins to interact with it, which is also covered here!</p> +</blockquote> +<hr> +<p><strong>MVC with HTMX</strong></p> +<p>ASP.NET MVC is a web framework, that incorporates the MVC design pattern and uses SSR (Server Side Rendering) to serve content. It is a perfect fit for the HTMX library. This is a compact JavaScript library that extends basic HTML by adding some custom attributes just enough to build your app around it. You can distribute events, make AJAX requests and build truly dynamic app by using as little JS as possible.</p> +<div style="display: flex; justify-content: center"> + <img src="the1mason.com/posts/modular-app/createdwith.jpeg" style="height: 100px;"/> +</div> +<br> +<p>HTMX uses <a href="https://htmx.org/essays/hateoas/">Hypermedia as the Engine of Application State (HATEOAS)</a> - it&rsquo;s a principle that leaves all state handling to the server, providing the client only with a set of actions that it can take. +Your regular SPA will get raw data from the server (like bank balance) and based on it, it will show or hide certain actions (like we won&rsquo;t show the withdrawal option if balance is 0 or less). With HATEOAS, the server just won&rsquo;t give the link to withdraw money, making this action impossible in the first place.</p> +<p>HTMX would allow this app to be extended more easily as well. Most of the modern JS frameworks require transpiling, bundling and other sorts of stuff. This means that when a plugin is installed the client is most likely will have to be rebuilt. This is slow and needs additional dependencies.</p> +<blockquote> +<p>Have you heard about Blazor WASM? You can just write client code in C#!</p> +</blockquote> +<p>Blazor WASM does not support dynamic loading for plugins. Because of that, plugins won&rsquo;t be able to extend the client. Also it&rsquo;s initial load time is stupidly slow.</p> +<hr> +<p>The next article will cover the following topocs: Loading plugins in runtime, creating plugin&rsquo;s instances, app-plugin communication. I&rsquo;ll have the link here when I&rsquo;m done writing it!</p> +<!-- +--- + +# Loading plugins + +C#, being a compiled language, can't be extended as easily as interpreted languages like Pytnon or PHP. To load plugins, we will need to load precompiled libraries dynamically after the app is compiled. To do this, [Microsoft Learn Article, mentioned before](https://learn.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support) suggests using custom AssemblyLoadContext with AssemblyDependencyResolver. + +> Wait, wait, wait! Using... what? I'm pretty sure you could just `Assembly.Load()` stuff, right? + +Not so easy! If you want to build a really working plugin system, you need a way to determine: whether this assembly has dependencies or not, and what are they. + +Let's imagine, that our plugin uses `Newtonsoft.Json` library - one of the all-time most popular C# libraries. Should we load it together with the plugin and how do we find it? +C# has a built-in mechanism to resolve dependencies. When you compile your project, aside from `Project.Name.dll` you would have `Project.Name.deps.json` file, that will include paths to all it's dependencies! That's where `AssemblyDependencyResolver` comes in. It'll find all of plugin's `.dll` dependencies and load those as well. + +> And also! What it two plugins will have the same library, but conflicting versions? Would we be able to load to of the same assemblies? + +No! And yes. +`AssemblyLoadContext` is used exactly for this. Along with `AssemblyDependencyResolver`, it will create an isolated context with current assembly and all it's dependencies. This will allow multiple plugins to have same dependencies with different versions. + +There's an example of such custom AssemblyLoadContext [Click Me](https://github.com/the1mason/Prototype.ModularMVC/blob/main/Prototype.ModularMVC.App/Prototype.ModularMVC.PluginBase/PluginLoadContext.cs) and also an example of this context being used [Click Me](https://github.com/the1mason/Prototype.ModularMVC/blob/main/Prototype.ModularMVC.App/Prototype.ModularMVC.PluginBase/Impl/PluginLoaders/ManifestBasedPluginLoader.cs#L89). + +--- + + +# Plugin - App interaction + +So now we figured out how we load stuff. Now: how do we interact with the app from out plugins? + +First, we make all plugins to referense the `Prototype.PluginBase` project. This project will provide types that both plugin and our server can understand. We'll build communication using those. + +**Dependency Injection** + +Before the app is built and ran, --> + + + + diff --git a/public/tags/prototype/page/1/index.html b/public/tags/prototype/page/1/index.html new file mode 100644 index 0000000..9d47cfe --- /dev/null +++ b/public/tags/prototype/page/1/index.html @@ -0,0 +1,10 @@ + + + + the1mason.com/tags/prototype/ + + + + + + diff --git a/public/tags/web/index.html b/public/tags/web/index.html new file mode 100644 index 0000000..6f18839 --- /dev/null +++ b/public/tags/web/index.html @@ -0,0 +1,228 @@ + + + + + web :: the1mason + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + +
+ + + + +
+ + +
+ + +
+ +
+

+ #1 Plugin-Based Web App in Dotnet - The Idea +

+ + + + + + + + #1 Plugin-Based Web App in Dotnet - The Idea + + +
+ + Have you ever thought about making a web application, that could be easily extended by third-party developers? I’ve been thinking about making this app for a while, so here’s my experience… + +
+ + + + +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + +
+ + + diff --git a/public/tags/web/index.xml b/public/tags/web/index.xml new file mode 100644 index 0000000..34db6a2 --- /dev/null +++ b/public/tags/web/index.xml @@ -0,0 +1,123 @@ + + + + web on the1mason + the1mason.com/tags/web/ + Recent content in web on the1mason + Hugo -- gohugo.io + en + Sat, 20 Jan 2024 00:00:00 +0000 + + #1 Plugin-Based Web App in Dotnet - The Idea + the1mason.com/posts/modular-app-1/ + Sat, 20 Jan 2024 00:00:00 +0000 + + the1mason.com/posts/modular-app-1/ + Chapters Writing those takes time. Expect to see one published per one-two weeks. +Idea, Stack +Loading plugins +PluginBase, IPlugin +Creating plugin, DependencyInjection +Controllers, Views +Hooks and Triggers - better event system +Advanced: Unit tests, unloading plugins +Introduction Have you ever heard of plugins? These are loadable libraries, extending your application. +This series of articles is an overview of my plugin-based web application prototype and mechanisms behind it&rsquo;s features, as well as my thought process and decision making during development. + <script src="the1mason.com/js/repo-card.js"></script> +<div class="repo-card" data-repo="the1mason/Prototype.ModularMVC" data-theme="dark-theme"></div> +<h1 id="chapters">Chapters</h1> +<p>Writing those takes time. Expect to see one published per one-two weeks.</p> +<ol> +<li> +<p>Idea, Stack</p> +</li> +<li> +<p><del>Loading plugins</del></p> +</li> +<li> +<p><del>PluginBase, IPlugin</del></p> +</li> +<li> +<p><del>Creating plugin, DependencyInjection</del></p> +</li> +<li> +<p><del>Controllers, Views</del></p> +</li> +<li> +<p><del>Hooks and Triggers - better event system</del></p> +</li> +<li> +<p><del>Advanced: Unit tests, unloading plugins</del></p> +</li> +</ol> +<h1 id="introduction">Introduction</h1> +<p>Have you ever heard of plugins? These are loadable libraries, extending your application.<br> +This series of articles is an overview of my plugin-based web application prototype and mechanisms behind it&rsquo;s features, as well as my thought process and decision making during development. These articles are a step by step guide to making your own plugin-based web app prototype.</p> +<p><em>I assume some that readers have some knowledge of C# and design patterns</em></p> +<h1 id="problem">Problem</h1> +<p>Self-hosted web applications can solve different problems and be of use to a variety of different people with slightly different needs. For this to work, I think that such an application should provide an option to extend its functionality. This would allow other people to build an ecosystem of different extensions around it. For example, a shopping website might have plugins for different payment systems, or a comment section under the product page. For me this also means, that instead of making one feature-rich website, that would be so specific to my needs, that it wouldn&rsquo;t of any use to anyone but me, I can write a bunch of smaller modules, that could be used by someone, without having to configure other modules.</p> +<h1 id="choosing-my-stack">Choosing my stack</h1> +<p><img src="the1mason.com/posts/modular-app/stack.svg" alt="C#, MVC, HTMX"></p> +<hr> +<p><strong>C#</strong></p> +<p>I&rsquo;m a dotnet developer and I write C# code for living. This project is as much of an excersise for me as it is an interesting design prototype for C#, that hasn&rsquo;t been described in detail as much online.</p> +<p>I haven&rsquo;t seen such plugin-based sites written in C#. There are some projects, using plugin based architecture&hellip; Well, there&rsquo;s even a <a href="https://learn.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support">Microsoft Learn Article</a> about building such an app!</p> +<blockquote> +<p><strong>Q:</strong> Why would I even bother to write all these posts and making prototypes? Even more: Why would someone be interested in such post?</p> +</blockquote> +<blockquote> +<p><strong>A:</strong> You see&hellip; there&rsquo;s a problem: Neither <code>learn.microsoft.com</code> nor any other webside covers dynamically updating web interface with plugins! If you want to learn about it, it&rsquo;s the right place. Also just loading libraries isn&rsquo;t enough because app also has to provide some ways for plugins to interact with it, which is also covered here!</p> +</blockquote> +<hr> +<p><strong>MVC with HTMX</strong></p> +<p>ASP.NET MVC is a web framework, that incorporates the MVC design pattern and uses SSR (Server Side Rendering) to serve content. It is a perfect fit for the HTMX library. This is a compact JavaScript library that extends basic HTML by adding some custom attributes just enough to build your app around it. You can distribute events, make AJAX requests and build truly dynamic app by using as little JS as possible.</p> +<div style="display: flex; justify-content: center"> + <img src="the1mason.com/posts/modular-app/createdwith.jpeg" style="height: 100px;"/> +</div> +<br> +<p>HTMX uses <a href="https://htmx.org/essays/hateoas/">Hypermedia as the Engine of Application State (HATEOAS)</a> - it&rsquo;s a principle that leaves all state handling to the server, providing the client only with a set of actions that it can take. +Your regular SPA will get raw data from the server (like bank balance) and based on it, it will show or hide certain actions (like we won&rsquo;t show the withdrawal option if balance is 0 or less). With HATEOAS, the server just won&rsquo;t give the link to withdraw money, making this action impossible in the first place.</p> +<p>HTMX would allow this app to be extended more easily as well. Most of the modern JS frameworks require transpiling, bundling and other sorts of stuff. This means that when a plugin is installed the client is most likely will have to be rebuilt. This is slow and needs additional dependencies.</p> +<blockquote> +<p>Have you heard about Blazor WASM? You can just write client code in C#!</p> +</blockquote> +<p>Blazor WASM does not support dynamic loading for plugins. Because of that, plugins won&rsquo;t be able to extend the client. Also it&rsquo;s initial load time is stupidly slow.</p> +<hr> +<p>The next article will cover the following topocs: Loading plugins in runtime, creating plugin&rsquo;s instances, app-plugin communication. I&rsquo;ll have the link here when I&rsquo;m done writing it!</p> +<!-- +--- + +# Loading plugins + +C#, being a compiled language, can't be extended as easily as interpreted languages like Pytnon or PHP. To load plugins, we will need to load precompiled libraries dynamically after the app is compiled. To do this, [Microsoft Learn Article, mentioned before](https://learn.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support) suggests using custom AssemblyLoadContext with AssemblyDependencyResolver. + +> Wait, wait, wait! Using... what? I'm pretty sure you could just `Assembly.Load()` stuff, right? + +Not so easy! If you want to build a really working plugin system, you need a way to determine: whether this assembly has dependencies or not, and what are they. + +Let's imagine, that our plugin uses `Newtonsoft.Json` library - one of the all-time most popular C# libraries. Should we load it together with the plugin and how do we find it? +C# has a built-in mechanism to resolve dependencies. When you compile your project, aside from `Project.Name.dll` you would have `Project.Name.deps.json` file, that will include paths to all it's dependencies! That's where `AssemblyDependencyResolver` comes in. It'll find all of plugin's `.dll` dependencies and load those as well. + +> And also! What it two plugins will have the same library, but conflicting versions? Would we be able to load to of the same assemblies? + +No! And yes. +`AssemblyLoadContext` is used exactly for this. Along with `AssemblyDependencyResolver`, it will create an isolated context with current assembly and all it's dependencies. This will allow multiple plugins to have same dependencies with different versions. + +There's an example of such custom AssemblyLoadContext [Click Me](https://github.com/the1mason/Prototype.ModularMVC/blob/main/Prototype.ModularMVC.App/Prototype.ModularMVC.PluginBase/PluginLoadContext.cs) and also an example of this context being used [Click Me](https://github.com/the1mason/Prototype.ModularMVC/blob/main/Prototype.ModularMVC.App/Prototype.ModularMVC.PluginBase/Impl/PluginLoaders/ManifestBasedPluginLoader.cs#L89). + +--- + + +# Plugin - App interaction + +So now we figured out how we load stuff. Now: how do we interact with the app from out plugins? + +First, we make all plugins to referense the `Prototype.PluginBase` project. This project will provide types that both plugin and our server can understand. We'll build communication using those. + +**Dependency Injection** + +Before the app is built and ran, --> + + + + diff --git a/public/tags/web/page/1/index.html b/public/tags/web/page/1/index.html new file mode 100644 index 0000000..779ce3f --- /dev/null +++ b/public/tags/web/page/1/index.html @@ -0,0 +1,10 @@ + + + + the1mason.com/tags/web/ + + + + + + diff --git a/resources/_gen/assets/scss/the1mason.com/css/base.scss_3b33337114e481782feeb60752452e17.content b/resources/_gen/assets/scss/the1mason.com/css/base.scss_3b33337114e481782feeb60752452e17.content new file mode 100644 index 0000000..eec46bc --- /dev/null +++ b/resources/_gen/assets/scss/the1mason.com/css/base.scss_3b33337114e481782feeb60752452e17.content @@ -0,0 +1,3 @@ +:root{--phoneWidth: (max-width: 684px);--tabletWidth: (max-width: 900px)}@font-face{font-display:swap;font-family:'Fira Code';font-style:normal;font-weight:400;src:url("../fonts/FiraCode-Regular.woff") format("woff")}@font-face{font-display:swap;font-family:'Fira Code';font-style:normal;font-weight:800;src:url("../fonts/FiraCode-Bold.woff") format("woff")}.button-container{display:table;margin-left:auto;margin-right:auto}button,.button,a.button{position:relative;display:flex;align-items:center;justify-content:center;padding:8px 18px;margin-bottom:5px;text-decoration:none;text-align:center;border-radius:8;border:1px solid #FF6266;background:#FF6266;color:#221f29;font:inherit;font-weight:bold;appearance:none;cursor:pointer;outline:none}button:hover,.button:hover,a.button:hover{background:rgba(255,98,102,0.9)}button.outline,.button.outline,a.button.outline{background:transparent;box-shadow:none;padding:8px 18px}button.outline :hover,.button.outline :hover,a.button.outline :hover{transform:none;box-shadow:none}button.link,.button.link,a.button.link{background:none;font-size:1rem}button.small,.button.small,a.button.small{font-size:.8rem}button.wide,.button.wide,a.button.wide{min-width:200px;padding:14px 24px}a.read-more,a.read-more:hover,a.read-more:active{display:inline-flex;border:none;color:#FF6266;background:none;box-shadow:none;padding:0;margin:20px 0;max-width:100%}.code-toolbar{margin-bottom:20px}.code-toolbar .toolbar-item a{position:relative;display:inline-flex;align-items:center;justify-content:center;padding:3px 8px;margin-bottom:5px;text-decoration:none;text-align:center;font-size:13px;font-weight:500;border-radius:8px;border:1px solid transparent;appearance:none;cursor:pointer;outline:none}input,textarea,select{background:transparent;color:#FF6266;border:1px solid #FF6266;border-radius:0;padding:10px;font:inherit;appearance:none}input:focus,input :active,textarea:focus,textarea :active,select:focus,select :active{border-color:#fff;outline:1px solid #fff}input:active,textarea:active,select:active{box-shadow:none}select{background:#221f29}select option{background:#221f29}::placeholder{color:rgba(255,98,102,0.5)}.header{display:flex;flex-direction:column;position:relative}@media print{.header{display:none}}.header__inner{display:flex;align-items:center;justify-content:space-between}.header__logo{display:flex;flex:1}.header__logo:after{content:'';background:repeating-linear-gradient(90deg, #FF6266, #FF6266 2px, transparent 0, transparent 10px);display:block;width:100%;right:10px}.header__logo a{flex:0 0 auto;max-width:100%;text-decoration:none}.navigation-menu{display:flex;align-items:flex-start;justify-content:space-between;margin:20px 1px}@media (max-width: 684px){.navigation-menu{margin:0}}.navigation-menu__inner{display:flex;flex:1;flex-wrap:wrap;list-style:none;margin:0;padding:0}.navigation-menu__inner>li{flex:0 0 auto;margin-bottom:10px;white-space:nowrap}.navigation-menu__inner>li:not(:last-of-type){margin-right:20px}@media (max-width: 684px){.navigation-menu__inner{flex-direction:column;align-items:flex-start;padding:0}.navigation-menu__inner li{margin:0;padding:5px}}.navigation-menu .spacer{flex-grow:1 !important}.menu{display:flex;flex-direction:column;position:relative;list-style:none;padding:0;margin:0}.menu__trigger{margin-right:0 !important;color:#FF6266;user-select:none;cursor:pointer}.menu__dropdown{display:none;flex-direction:column;position:absolute;background:#221f29;box-shadow:0 10px rgba(34,31,41,0.8),-10px 10px rgba(34,31,41,0.8),10px 10px rgba(34,31,41,0.8);color:white;border:2px solid;margin:0;padding:10px;top:10px;left:0;list-style:none;z-index:99}.open .menu__dropdown{display:flex}.menu__dropdown>li{flex:0 0 auto}.menu__dropdown>li:not(:last-of-type){margin-bottom:10px}.menu__dropdown>li a{display:flex;padding:5px}@media (max-width: 684px){.menu--desktop{display:none}}.menu--mobile .menu__trigger{color:#FF6266;border:2px solid;margin-left:10px;height:100%;padding:3px 8px;margin-bottom:0 !important;position:relative;cursor:pointer;display:none}@media (max-width: 684px){.menu--mobile .menu__trigger{display:block}}@media (max-width: 684px){.menu--mobile .menu__dropdown{left:auto;right:0}}.menu--mobile li{flex:0 0 auto}.menu--mobile li:not(:last-of-type){margin-bottom:10px}.menu--language-selector .menu__trigger{color:#FF6266;border:2px solid;margin-left:10px;height:100%;padding:3px 8px;margin-bottom:0 !important;position:relative;cursor:pointer}@media (max-width: 684px){.menu--language-selector .menu__trigger{display:none}}.menu--language-selector .menu__dropdown{left:auto;right:0}.logo{display:flex;align-items:center;text-decoration:none;background:#FF6266;color:black;padding:5px 10px}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}body{margin:0;padding:0;font-family:'Fira Code', Monaco, Consolas, Ubuntu Mono, monospace;font-size:1rem;line-height:1.54;letter-spacing:-0.02em;background-color:#221f29;color:#fff;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;font-feature-settings:"liga", "tnum", "zero", "ss01", "locl";font-variant-ligatures:contextual;-webkit-overflow-scrolling:touch;-webkit-text-size-adjust:100%}@media (max-width: 684px){body{font-size:1rem}}.headings--one-size h1,.headings--one-size h2,.headings--one-size h3,.headings--one-size h4,.headings--one-size h5,.headings--one-size h6{line-height:1.3}.headings--one-size h1:not(first-child),.headings--one-size h2:not(first-child),.headings--one-size h3:not(first-child),.headings--one-size h4:not(first-child),.headings--one-size h5:not(first-child),.headings--one-size h6:not(first-child){margin-top:40px}.headings--one-size h1,.headings--one-size h2,.headings--one-size h3{font-size:1.4rem}.headings--one-size h4,.headings--one-size h5,.headings--one-size h6{font-size:1.2rem}a{color:inherit}img{display:block;max-width:100%}img.left{margin-right:auto}img.center{margin-left:auto;margin-right:auto}img.right{margin-left:auto}p{margin-bottom:20px}figure{display:table;max-width:100%;margin:25px 0}figure.left{margin-right:auto}figure.center{margin-left:auto;margin-right:auto}figure.right{margin-left:auto}figure figcaption{font-size:14px;padding:5px 10px;margin-top:5px;background:#FF6266;color:#221f29}figure figcaption.left{text-align:left}figure figcaption.center{text-align:center}figure figcaption.right{text-align:right}code,kbd{font-family:'Fira Code', Monaco, Consolas, Ubuntu Mono, monospace !important;font-feature-settings:normal;background:rgba(255,98,102,0.2);color:#FF6266;padding:1px 6px;margin:0 2px;font-size:.95rem}code code,code kbd,kbd code,kbd kbd{background:transparent;padding:0;margin:0}pre{background:transparent !important;padding:20px 10px;margin:40px 0;font-size:.95rem !important;overflow:auto;border-top:1px solid rgba(255,255,255,0.1);border-bottom:1px solid rgba(255,255,255,0.1)}pre+pre{border-top:0;margin-top:-40px}@media (max-width: 684px){pre{white-space:pre-wrap;word-wrap:break-word}}pre code{background:none !important;margin:0;padding:0;font-size:inherit;border:none}blockquote{border-top:1px solid #FF6266;border-bottom:1px solid #FF6266;margin:40px 0;padding:25px}@media (max-width: 684px){blockquote{padding-right:0}}blockquote p:first-of-type{margin-top:0}blockquote p:last-of-type{margin-bottom:0}blockquote p{position:relative}blockquote p:first-of-type:before{content:'>';display:block;position:absolute;left:-25px;color:#FF6266}blockquote.twitter-tweet{position:relative;background:rgba(255,98,102,0.1);font:inherit;color:inherit;border:1px solid #FF6266;padding-top:60px}blockquote.twitter-tweet p:before{content:''}blockquote.twitter-tweet:before{content:'> From Twitter:';position:absolute;top:20px;color:#FF6266;font-weight:bold}blockquote.twitter-tweet a{color:#FF6266}table{table-layout:auto;border-collapse:collapse;width:100%;margin:40px 0}table,th,td{border:1px dashed #FF6266;padding:10px}th{color:#FF6266}ul,ol{margin-left:22px;padding:0}ul li,ol li{position:relative}@media (max-width: 684px){ul,ol{margin-left:20px}}ol{list-style:none;counter-reset:li}ol li{counter-increment:li}ol li:before{content:counter(li);position:absolute;right:calc(100% + 10px);color:#FF6266;display:inline-block;text-align:right}ol ol{margin-left:38px}ol ol li{counter-increment:li}ol ol li:before{content:counters(li, ".") " "}mark{background:#FF6266;color:#221f29}.container{display:flex;flex-direction:column;padding:40px;max-width:864px;min-height:100vh;border-right:1px solid rgba(255,255,255,0.1)}.container.full,.container.center{border:none;margin:0 auto}.container.full{max-width:100%}@media (max-width: 684px){.container{padding:20px}}@media print{.container{display:initial}}.content{display:flex;flex-direction:column}@media print{.content{display:initial}}hr{width:100%;border:none;background:rgba(255,255,255,0.1);height:1px}.hidden{display:none}sup{line-height:0}.index-content{margin-top:20px}.framed{border:1px solid #FF6266;padding:20px}.framed *:first-child{margin-top:0}.framed *:last-child{margin-bottom:0}.posts{width:100%}.post{width:100%;text-align:left;margin:20px auto;padding:20px 0}.post:not(:last-of-type){border-bottom:1px solid rgba(255,255,255,0.1)}.post-meta{font-size:1rem;margin-bottom:10px;color:rgba(255,98,102,0.7)}.post-title{position:relative;color:#FF6266;margin:0 0 15px;padding-bottom:15px;border-bottom:3px dotted #FF6266}.post-title:after{content:'';position:absolute;bottom:2px;display:block;width:100%;border-bottom:3px dotted #FF6266}.post-title a{text-decoration:none}.post-tags{display:block;margin-bottom:20px;font-size:1rem;opacity:.5}.post-tags a{text-decoration:none}.post-content{margin-top:30px}.post-cover{border:20px solid #FF6266;background:transparent;margin:40px 0;padding:20px}@media (max-width: 684px){.post-cover{padding:10px;border-width:10px}}.post ul{list-style:none}.post ul li:not(:empty):before{content:'-';position:absolute;left:-20px;color:#FF6266}.post--regulation h1{justify-content:center}.post--regulation h2{justify-content:center;margin-bottom:10px}.post--regulation h2+h2{margin-top:-10px;margin-bottom:20px}.hanchor{color:rgba(255,98,102,0.9);text-decoration:none;margin-left:10px;visibility:hidden}h1:hover a,h2:hover a,h3:hover a,h4:hover a{visibility:visible}.footnotes{color:rgba(255,255,255,0.5)}.pagination{margin-top:50px}@media print{.pagination{display:none}}.pagination__title{display:flex;text-align:center;position:relative;margin:100px 0 20px}.pagination__title-h{text-align:center;margin:0 auto;padding:5px 10px;background:#221f29;color:rgba(255,255,255,0.3);font-size:.8rem;text-transform:uppercase;text-decoration:none;letter-spacing:.1em;z-index:1}.pagination__title hr{position:absolute;left:0;right:0;width:100%;margin-top:15px;z-index:0}.pagination__buttons{display:flex;align-items:center;justify-content:center;flex-flow:row wrap;gap:10px}.pagination__buttons a{text-decoration:none}.button{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:1rem;padding:0;appearance:none}@media (max-width: 684px){.button{flex:1}}.button a{display:flex;justify-content:center;flex:1;padding:8px 16px;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.button__text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.button.next .button__icon{margin-left:8px}.button.previous .button__icon{margin-right:8px}.footer{padding:40px 0;flex-grow:0;opacity:.5}.footer__inner{display:flex;align-items:center;justify-content:space-between;margin:0;width:760px;max-width:100%}@media (max-width: 900px){.footer__inner{flex-direction:column}}.footer a{color:inherit}.footer .copyright{display:flex;flex-flow:row wrap;flex:1;align-items:center;font-size:1rem;justify-content:center}.footer .copyright--user{margin:auto;text-align:center}.footer .copyright>*:first-child:not(:only-child){margin-right:10px}.footer .copyright span{white-space:nowrap}code[class*="language-"],pre[class*="language-"]{color:#ccc;background:none;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*="language-"]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#2d2d2d}:not(pre)>code[class*="language-"]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999}.token.punctuation{color:#ccc}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.number,.token.function{color:#f08d49}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699}.token.operator,.token.entity,.token.url{color:#67cdcc}.token.important,.token.bold{font-weight:bold}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}pre[data-line]{position:relative;padding:1em 0 1em 3em}.line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:rgba(153,122,102,0.08);background:linear-gradient(to right, rgba(153,122,102,0.1) 70%, rgba(153,122,102,0));pointer-events:none;line-height:inherit;white-space:pre}@media print{.line-highlight{-webkit-print-color-adjust:exact;color-adjust:exact}}.line-highlight:before,.line-highlight[data-end]:after{content:attr(data-start);position:absolute;top:.4em;left:.6em;min-width:1em;padding:0 .5em;background-color:rgba(153,122,102,0.4);color:#f5f2f0;font:bold 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px white}.line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}.line-numbers .line-highlight:before,.line-numbers .line-highlight:after{content:none}pre[id].linkable-line-numbers span.line-numbers-rows{pointer-events:all}pre[id].linkable-line-numbers span.line-numbers-rows>span:before{cursor:pointer}pre[id].linkable-line-numbers span.line-numbers-rows>span:hover:before{background-color:rgba(128,128,128,0.2)}pre[class*="language-"].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*="language-"].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:0.8em;text-align:right}.command-line-prompt{border-right:1px solid #999;display:block;float:left;font-size:100%;letter-spacing:-1px;margin-right:1em;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.command-line-prompt>span:before{color:#999;content:' ';display:block;padding-right:0.8em}.command-line-prompt>span[data-user]:before{content:"[" attr(data-user) "@" attr(data-host) "] $"}.command-line-prompt>span[data-user="root"]:before{content:"[" attr(data-user) "@" attr(data-host) "] #"}.command-line-prompt>span[data-prompt]:before{content:attr(data-prompt)}div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;top:.3em;right:.2em;transition:opacity 0.3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:none;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,0.2);box-shadow:0 2px 0 0 rgba(0,0,0,0.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus{color:inherit;text-decoration:none}code.language-css,code.language-scss,.token.boolean,.token.string,.token.entity,.token.url,.language-css .token.string,.language-scss .token.string,.style .token.string,.token.attr-value,.token.keyword,.token.control,.token.directive,.token.statement,.token.regex,.token.atrule,.token.number,.token.inserted,.token.important{color:#FF6266 !important}.token.tag-id,.token.atrule-id,.token.operator,.token.unit,.token.placeholder,.token.variable,.token.tag,.token.attr-name,.token.namespace,.token.deleted,.token.property,.token.class-name,.token.constant,.token.symbol{color:rgba(255,98,102,0.7) !important}.token.property,.token.function,.token.function-name,.token.deleted,code.language-javascript,code.language-html,.command-line-prompt>span:before{color:#9a9999 !important}.token.selector,.token.tag,.token.punctuation{color:white}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:rgba(255,255,255,0.3) !important}.token.namespace{opacity:.7 !important}pre[data-line]{position:relative}pre[class*="language-"]{margin:0;padding:0;overflow:auto}.line-highlight{position:absolute;left:0;right:0;padding:0;margin:0;background:rgba(245,104,107,0.08);pointer-events:none;line-height:inherit;white-space:pre}.line-highlight:before,.line-highlight[data-end]:after{content:attr(data-start);position:absolute;left:.6em;min-width:1em;padding:0 .5em;background-color:rgba(153,122,102,0.4);color:#f5f2f0;font:bold 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px white}.line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}.line-numbers .line-highlight:before,.line-numbers .line-highlight:after{content:none}.code-toolbar{position:relative;margin:40px 0;padding:20px;border:1px solid rgba(255,255,255,0.1)}.code-toolbar+.code-toolbar,.code-toolbar+.highlight,.code-toolbar+.highlight .code-toolbar{border-top:0;margin-top:calc(-1 * $code-margin)}.code-toolbar pre,.code-toolbar code{border:none}.code-toolbar code{display:block;color:inherit}.code-toolbar>.toolbar button{font-size:.8em !important;background:rgba(224,224,224,0.2) !important;color:#bbb !important;box-shadow:0 2px 0 0 rgba(0,0,0,0.2) !important;border-radius:0 !important;margin:6px !important;padding:10px !important;user-select:none}.collapsable-code{position:relative;width:100%;margin:40px 0}.collapsable-code input[type="checkbox"]{position:absolute;visibility:hidden}.collapsable-code input[type="checkbox"]:checked~pre,.collapsable-code input[type="checkbox"]:checked~.code-toolbar pre{height:0;padding:0;border-top:none}.collapsable-code input[type="checkbox"]:checked~.code-toolbar{padding:0;border-top:none}.collapsable-code input[type="checkbox"]:checked~.code-toolbar .toolbar{display:none}.collapsable-code input[type="checkbox"]:checked~label .collapsable-code__toggle:after{content:attr(data-label-expand)}.collapsable-code label{position:relative;display:flex;justify-content:space-between;min-width:30px;min-height:30px;margin:0;border-bottom:1px solid #f5686b;cursor:pointer}.collapsable-code__title{flex:1;color:#FF6266;padding:3px 10px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.collapsable-code__language{color:#FF6266;border:1px solid #f5686b;border-bottom:none;text-transform:uppercase;padding:3px 10px}.collapsable-code__toggle{color:#FF6266;font-size:16px;padding:3px 10px}.collapsable-code__toggle:after{content:attr(data-label-collapse)}.collapsable-code pre{margin-top:0}.collapsable-code pre::first-line{line-height:0}.collapsable-code .code-toolbar{margin:0}.terms h1{color:#FF6266}.terms h3{font-size:initial}body .gist .blob-num,body .gist .blob-code-inner{border:none} + +/*# sourceMappingURL=styles.css.map */ \ No newline at end of file diff --git a/resources/_gen/assets/scss/the1mason.com/css/base.scss_3b33337114e481782feeb60752452e17.json b/resources/_gen/assets/scss/the1mason.com/css/base.scss_3b33337114e481782feeb60752452e17.json new file mode 100644 index 0000000..e7b8e7c --- /dev/null +++ b/resources/_gen/assets/scss/the1mason.com/css/base.scss_3b33337114e481782feeb60752452e17.json @@ -0,0 +1 @@ +{"Target":"styles.css","MediaType":"text/css","Data":{}} \ No newline at end of file diff --git a/resources/_gen/assets/scss/the1mason.com/css/red-local.scss_f120a3f402b106f64b18d498afd3d82e.content b/resources/_gen/assets/scss/the1mason.com/css/red-local.scss_f120a3f402b106f64b18d498afd3d82e.content new file mode 100644 index 0000000..02d3ba1 --- /dev/null +++ b/resources/_gen/assets/scss/the1mason.com/css/red-local.scss_f120a3f402b106f64b18d498afd3d82e.content @@ -0,0 +1,1191 @@ +@charset "UTF-8"; +/* COLOR VARIABLES */ +/* MEDIA QUERIES */ +/* variables for js, must be the same as these in @custom-media queries */ +:root { + --phoneWidth: (max-width: 684px); + --tabletWidth: (max-width: 900px); } + +@font-face { + font-display: swap; + font-family: 'Fira Code'; + font-style: normal; + font-weight: 400; + src: url("../fonts/FiraCode-Regular.woff") format("woff"); } + +@font-face { + font-display: swap; + font-family: 'Fira Code'; + font-style: normal; + font-weight: 800; + src: url("../fonts/FiraCode-Bold.woff") format("woff"); } + +.button-container { + display: table; + margin-left: auto; + margin-right: auto; } + +button, +.button, +a.button { + position: relative; + display: flex; + align-items: center; + justify-content: center; + padding: 8px 18px; + margin-bottom: 5px; + text-decoration: none; + text-align: center; + border-radius: 8; + border: 1px solid #FF6266; + background: #FF6266; + color: #221f29; + font: inherit; + font-weight: bold; + appearance: none; + cursor: pointer; + outline: none; + /* variants */ + /* sizes */ } + button:hover, + .button:hover, + a.button:hover { + background: rgba(255, 98, 102, 0.9); } + button.outline, + .button.outline, + a.button.outline { + background: transparent; + box-shadow: none; + padding: 8px 18px; } + button.outline :hover, + .button.outline :hover, + a.button.outline :hover { + transform: none; + box-shadow: none; } + button.link, + .button.link, + a.button.link { + background: none; + font-size: 1rem; } + button.small, + .button.small, + a.button.small { + font-size: .8rem; } + button.wide, + .button.wide, + a.button.wide { + min-width: 200px; + padding: 14px 24px; } + +a.read-more, +a.read-more:hover, +a.read-more:active { + display: inline-flex; + border: none; + color: #FF6266; + background: none; + box-shadow: none; + padding: 0; + margin: 20px 0; + max-width: 100%; } + +.code-toolbar { + margin-bottom: 20px; } + .code-toolbar .toolbar-item a { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 3px 8px; + margin-bottom: 5px; + text-decoration: none; + text-align: center; + font-size: 13px; + font-weight: 500; + border-radius: 8px; + border: 1px solid transparent; + appearance: none; + cursor: pointer; + outline: none; } + +input, textarea, select { + background: transparent; + color: #FF6266; + border: 1px solid #FF6266; + border-radius: 0; + padding: 10px; + font: inherit; + appearance: none; } + input:focus, input :active, textarea:focus, textarea :active, select:focus, select :active { + border-color: white; + outline: 1px solid white; } + input:active, textarea:active, select:active { + box-shadow: none; } + +select { + background: #221f29; } + select option { + background: #221f29; } + +::placeholder { + color: rgba(255, 98, 102, 0.5); } + +.header { + display: flex; + flex-direction: column; + position: relative; } + @media print { + .header { + display: none; } } + .header__inner { + display: flex; + align-items: center; + justify-content: space-between; } + .header__logo { + display: flex; + flex: 1; } + .header__logo:after { + content: ''; + background: repeating-linear-gradient(90deg, #FF6266, #FF6266 2px, transparent 0, transparent 10px); + display: block; + width: 100%; + right: 10px; } + .header__logo a { + flex: 0 0 auto; + max-width: 100%; + text-decoration: none; } + +.navigation-menu { + display: flex; + align-items: flex-start; + justify-content: space-between; + margin: 20px 1px; } + @media (max-width: 684px) { + .navigation-menu { + margin: 0; } } + .navigation-menu__inner { + display: flex; + flex: 1; + flex-wrap: wrap; + list-style: none; + margin: 0; + padding: 0; } + .navigation-menu__inner > li { + flex: 0 0 auto; + margin-bottom: 10px; + white-space: nowrap; } + .navigation-menu__inner > li:not(:last-of-type) { + margin-right: 20px; } + @media (max-width: 684px) { + .navigation-menu__inner { + flex-direction: column; + align-items: flex-start; + padding: 0; } + .navigation-menu__inner li { + margin: 0; + padding: 5px; } } + .navigation-menu .spacer { + flex-grow: 1 !important; } + +.menu { + display: flex; + flex-direction: column; + position: relative; + list-style: none; + padding: 0; + margin: 0; } + .menu__trigger { + margin-right: 0 !important; + color: #FF6266; + user-select: none; + cursor: pointer; } + .menu__dropdown { + display: none; + flex-direction: column; + position: absolute; + background: #221f29; + box-shadow: 0 10px rgba(34, 31, 41, 0.8), -10px 10px rgba(34, 31, 41, 0.8), 10px 10px rgba(34, 31, 41, 0.8); + color: white; + border: 2px solid; + margin: 0; + padding: 10px; + top: 10px; + left: 0; + list-style: none; + z-index: 99; } + .open .menu__dropdown { + display: flex; } + .menu__dropdown > li { + flex: 0 0 auto; } + .menu__dropdown > li:not(:last-of-type) { + margin-bottom: 10px; } + .menu__dropdown > li a { + display: flex; + padding: 5px; } + @media (max-width: 684px) { + .menu--desktop { + display: none; } } + .menu--mobile .menu__trigger { + color: #FF6266; + border: 2px solid; + margin-left: 10px; + height: 100%; + padding: 3px 8px; + margin-bottom: 0 !important; + position: relative; + cursor: pointer; + display: none; } + @media (max-width: 684px) { + .menu--mobile .menu__trigger { + display: block; } } + @media (max-width: 684px) { + .menu--mobile .menu__dropdown { + left: auto; + right: 0; } } + .menu--mobile li { + flex: 0 0 auto; } + .menu--mobile li:not(:last-of-type) { + margin-bottom: 10px; } + .menu--language-selector .menu__trigger { + color: #FF6266; + border: 2px solid; + margin-left: 10px; + height: 100%; + padding: 3px 8px; + margin-bottom: 0 !important; + position: relative; + cursor: pointer; } + @media (max-width: 684px) { + .menu--language-selector .menu__trigger { + display: none; } } + .menu--language-selector .menu__dropdown { + left: auto; + right: 0; } + +.logo { + display: flex; + align-items: center; + text-decoration: none; + background: #FF6266; + color: black; + padding: 5px 10px; } + +html { + box-sizing: border-box; } + +*, +*:before, +*:after { + box-sizing: inherit; } + +body { + margin: 0; + padding: 0; + font-family: 'Fira Code', Monaco, Consolas, Ubuntu Mono, monospace; + font-size: 1rem; + line-height: 1.54; + letter-spacing: -0.02em; + background-color: #221f29; + color: white; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + font-feature-settings: "liga", "tnum", "zero", "ss01", "locl"; + font-variant-ligatures: contextual; + -webkit-overflow-scrolling: touch; + -webkit-text-size-adjust: 100%; } + @media (max-width: 684px) { + body { + font-size: 1rem; } } +.headings--one-size h1, +.headings--one-size h2, +.headings--one-size h3, +.headings--one-size h4, +.headings--one-size h5, +.headings--one-size h6 { + line-height: 1.3; } + .headings--one-size h1:not(first-child), + .headings--one-size h2:not(first-child), + .headings--one-size h3:not(first-child), + .headings--one-size h4:not(first-child), + .headings--one-size h5:not(first-child), + .headings--one-size h6:not(first-child) { + margin-top: 40px; } + +.headings--one-size h1, +.headings--one-size h2, +.headings--one-size h3 { + font-size: 1.4rem; } + +.headings--one-size h4, +.headings--one-size h5, +.headings--one-size h6 { + font-size: 1.2rem; } + +a { + color: inherit; + /* Waiting for a better times... */ + /* &:has(code) { + text-decoration-color: $accent; + } */ } + +img { + display: block; + max-width: 100%; } + img.left { + margin-right: auto; } + img.center { + margin-left: auto; + margin-right: auto; } + img.right { + margin-left: auto; } + +p { + margin-bottom: 20px; } + +figure { + display: table; + max-width: 100%; + margin: 25px 0; } + figure.left { + margin-right: auto; } + figure.center { + margin-left: auto; + margin-right: auto; } + figure.right { + margin-left: auto; } + figure figcaption { + font-size: 14px; + padding: 5px 10px; + margin-top: 5px; + background: #FF6266; + color: #221f29; + /* opacity: .8; */ } + figure figcaption.left { + text-align: left; } + figure figcaption.center { + text-align: center; } + figure figcaption.right { + text-align: right; } + +code, kbd { + font-family: 'Fira Code', Monaco, Consolas, Ubuntu Mono, monospace !important; + font-feature-settings: normal; + background: rgba(255, 98, 102, 0.2); + color: #FF6266; + padding: 1px 6px; + margin: 0 2px; + font-size: .95rem; } + code code, code kbd, kbd code, kbd kbd { + background: transparent; + padding: 0; + margin: 0; } + +pre { + background: transparent !important; + padding: 20px 10px; + margin: 40px 0; + font-size: .95rem !important; + overflow: auto; + border-top: 1px solid rgba(255, 255, 255, 0.1); + border-bottom: 1px solid rgba(255, 255, 255, 0.1); } + pre + pre { + border-top: 0; + margin-top: -40px; } + @media (max-width: 684px) { + pre { + white-space: pre-wrap; + word-wrap: break-word; } } + pre code { + background: none !important; + margin: 0; + padding: 0; + font-size: inherit; + border: none; } + +blockquote { + border-top: 1px solid #FF6266; + border-bottom: 1px solid #FF6266; + margin: 40px 0; + padding: 25px; } + @media (max-width: 684px) { + blockquote { + padding-right: 0; } } + blockquote p:first-of-type { + margin-top: 0; } + blockquote p:last-of-type { + margin-bottom: 0; } + blockquote p { + position: relative; } + blockquote p:first-of-type:before { + content: '>'; + display: block; + position: absolute; + left: -25px; + color: #FF6266; } + blockquote.twitter-tweet { + position: relative; + background: rgba(255, 98, 102, 0.1); + font: inherit; + color: inherit; + border: 1px solid #FF6266; + padding-top: 60px; } + blockquote.twitter-tweet p:before { + content: ''; } + blockquote.twitter-tweet:before { + content: '> From Twitter:'; + position: absolute; + top: 20px; + color: #FF6266; + font-weight: bold; } + blockquote.twitter-tweet a { + color: #FF6266; } + +table { + table-layout: auto; + border-collapse: collapse; + width: 100%; + margin: 40px 0; } + +table, +th, +td { + border: 1px dashed #FF6266; + padding: 10px; } + +th { + color: #FF6266; } + +ul, +ol { + margin-left: 22px; + padding: 0; } + ul li, + ol li { + position: relative; } + @media (max-width: 684px) { + ul, + ol { + margin-left: 20px; } } +ol { + list-style: none; + counter-reset: li; } + ol li { + counter-increment: li; } + ol li:before { + content: counter(li); + position: absolute; + right: calc(100% + 10px); + color: #FF6266; + display: inline-block; + text-align: right; } + ol ol { + margin-left: 38px; } + ol ol li { + counter-increment: li; } + ol ol li:before { + content: counters(li, ".") " "; } + +mark { + background: #FF6266; + color: #221f29; } + +.container { + display: flex; + flex-direction: column; + padding: 40px; + max-width: 864px; + min-height: 100vh; + border-right: 1px solid rgba(255, 255, 255, 0.1); } + .container.full, .container.center { + border: none; + margin: 0 auto; } + .container.full { + max-width: 100%; } + @media (max-width: 684px) { + .container { + padding: 20px; } } + @media print { + .container { + display: initial; } } +.content { + display: flex; + flex-direction: column; } + @media print { + .content { + display: initial; } } +hr { + width: 100%; + border: none; + background: rgba(255, 255, 255, 0.1); + height: 1px; } + +.hidden { + display: none; } + +sup { + line-height: 0; } + +.index-content { + margin-top: 20px; } + +.framed { + border: 1px solid #FF6266; + padding: 20px; } + .framed *:first-child { + margin-top: 0; } + .framed *:last-child { + margin-bottom: 0; } + +.posts { + width: 100%; } + +.post { + width: 100%; + text-align: left; + margin: 20px auto; + padding: 20px 0; } + .post:not(:last-of-type) { + border-bottom: 1px solid rgba(255, 255, 255, 0.1); } + .post-meta { + font-size: 1rem; + margin-bottom: 10px; + color: rgba(255, 98, 102, 0.7); } + .post-title { + position: relative; + color: #FF6266; + margin: 0 0 15px; + padding-bottom: 15px; + border-bottom: 3px dotted #FF6266; } + .post-title:after { + content: ''; + position: absolute; + bottom: 2px; + display: block; + width: 100%; + border-bottom: 3px dotted #FF6266; } + .post-title a { + text-decoration: none; } + .post-tags { + display: block; + margin-bottom: 20px; + font-size: 1rem; + opacity: .5; } + .post-tags a { + text-decoration: none; } + .post-content { + margin-top: 30px; } + .post-cover { + border: 20px solid #FF6266; + background: transparent; + margin: 40px 0; + padding: 20px; } + @media (max-width: 684px) { + .post-cover { + padding: 10px; + border-width: 10px; } } + .post ul { + list-style: none; } + .post ul li:not(:empty):before { + content: '-'; + position: absolute; + left: -20px; + color: #FF6266; } + +.post--regulation h1 { + justify-content: center; } + +.post--regulation h2 { + justify-content: center; + margin-bottom: 10px; } + .post--regulation h2 + h2 { + margin-top: -10px; + margin-bottom: 20px; } + +.hanchor { + color: rgba(255, 98, 102, 0.9); + text-decoration: none; + margin-left: 10px; + visibility: hidden; } + +h1:hover a, h2:hover a, h3:hover a, h4:hover a { + visibility: visible; } + +.footnotes { + color: rgba(255, 255, 255, 0.5); } + +.pagination { + margin-top: 50px; } + @media print { + .pagination { + display: none; } } + .pagination__title { + display: flex; + text-align: center; + position: relative; + margin: 100px 0 20px; } + .pagination__title-h { + text-align: center; + margin: 0 auto; + padding: 5px 10px; + background: #221f29; + color: rgba(255, 255, 255, 0.3); + font-size: .8rem; + text-transform: uppercase; + text-decoration: none; + letter-spacing: .1em; + z-index: 1; } + .pagination__title hr { + position: absolute; + left: 0; + right: 0; + width: 100%; + margin-top: 15px; + z-index: 0; } + .pagination__buttons { + display: flex; + align-items: center; + justify-content: center; + flex-flow: row wrap; + gap: 10px; } + .pagination__buttons a { + text-decoration: none; } + +.button { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 1rem; + padding: 0; + appearance: none; } + @media (max-width: 684px) { + .button { + flex: 1; } } + .button a { + display: flex; + justify-content: center; + flex: 1; + padding: 8px 16px; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + .button__text { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + .button.next .button__icon { + margin-left: 8px; } + .button.previous .button__icon { + margin-right: 8px; } + +.footer { + padding: 40px 0; + flex-grow: 0; + opacity: .5; } + .footer__inner { + display: flex; + align-items: center; + justify-content: space-between; + margin: 0; + width: 760px; + max-width: 100%; } + @media (max-width: 900px) { + .footer__inner { + flex-direction: column; } } + .footer a { + color: inherit; } + .footer .copyright { + display: flex; + flex-flow: row wrap; + flex: 1; + align-items: center; + font-size: 1rem; + justify-content: center; } + .footer .copyright--user { + margin: auto; + text-align: center; } + .footer .copyright > *:first-child:not(:only-child) { + margin-right: 10px; } + .footer .copyright span { + white-space: nowrap; } + +/* PrismJS 1.24.1 +https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+actionscript+apacheconf+applescript+bash+c+csharp+cpp+cmake+coffeescript+csp+css-extras+diff+django+docker+elixir+elm+erlang+fsharp+flow+git+go+graphql+haml+handlebars+haskell+http+java+json+kotlin+latex+less+llvm+makefile+markdown+markup-templating+nasm+objectivec+ocaml+perl+php+php-extras+powershell+processing+pug+python+r+jsx+tsx+reason+ruby+rust+sass+scss+scala+scheme+sql+stylus+swift+textile+toml+twig+typescript+vim+visual-basic+wasm+yaml&plugins=line-highlight+line-numbers+jsonp-highlight+highlight-keywords+command-line+toolbar+copy-to-clipboard */ +/** + * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML + * Based on https://github.com/chriskempson/tomorrow-theme + * @author Rose Pritchard + */ +code[class*="language-"], +pre[class*="language-"] { + color: #ccc; + background: none; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; } + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; } + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #2d2d2d; } + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; } + +.token.comment, +.token.block-comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #999; } + +.token.punctuation { + color: #ccc; } + +.token.tag, +.token.attr-name, +.token.namespace, +.token.deleted { + color: #e2777a; } + +.token.function-name { + color: #6196cc; } + +.token.boolean, +.token.number, +.token.function { + color: #f08d49; } + +.token.property, +.token.class-name, +.token.constant, +.token.symbol { + color: #f8c555; } + +.token.selector, +.token.important, +.token.atrule, +.token.keyword, +.token.builtin { + color: #cc99cd; } + +.token.string, +.token.char, +.token.attr-value, +.token.regex, +.token.variable { + color: #7ec699; } + +.token.operator, +.token.entity, +.token.url { + color: #67cdcc; } + +.token.important, +.token.bold { + font-weight: bold; } + +.token.italic { + font-style: italic; } + +.token.entity { + cursor: help; } + +.token.inserted { + color: green; } + +pre[data-line] { + position: relative; + padding: 1em 0 1em 3em; } + +.line-highlight { + position: absolute; + left: 0; + right: 0; + padding: inherit 0; + margin-top: 1em; + /* Same as .prism’s padding-top */ + background: rgba(153, 122, 102, 0.08); + background: linear-gradient(to right, rgba(153, 122, 102, 0.1) 70%, rgba(153, 122, 102, 0)); + pointer-events: none; + line-height: inherit; + white-space: pre; } + +@media print { + .line-highlight { + /* + * This will prevent browsers from replacing the background color with white. + * It's necessary because the element is layered on top of the displayed code. + */ + -webkit-print-color-adjust: exact; + color-adjust: exact; } } + +.line-highlight:before, +.line-highlight[data-end]:after { + content: attr(data-start); + position: absolute; + top: .4em; + left: .6em; + min-width: 1em; + padding: 0 .5em; + background-color: rgba(153, 122, 102, 0.4); + color: #f5f2f0; + font: bold 65%/1.5 sans-serif; + text-align: center; + vertical-align: .3em; + border-radius: 999px; + text-shadow: none; + box-shadow: 0 1px white; } + +.line-highlight[data-end]:after { + content: attr(data-end); + top: auto; + bottom: .4em; } + +.line-numbers .line-highlight:before, +.line-numbers .line-highlight:after { + content: none; } + +pre[id].linkable-line-numbers span.line-numbers-rows { + pointer-events: all; } + +pre[id].linkable-line-numbers span.line-numbers-rows > span:before { + cursor: pointer; } + +pre[id].linkable-line-numbers span.line-numbers-rows > span:hover:before { + background-color: rgba(128, 128, 128, 0.2); } + +pre[class*="language-"].line-numbers { + position: relative; + padding-left: 3.8em; + counter-reset: linenumber; } + +pre[class*="language-"].line-numbers > code { + position: relative; + white-space: inherit; } + +.line-numbers .line-numbers-rows { + position: absolute; + pointer-events: none; + top: 0; + font-size: 100%; + left: -3.8em; + width: 3em; + /* works for line-numbers below 1000 lines */ + letter-spacing: -1px; + border-right: 1px solid #999; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.line-numbers-rows > span { + display: block; + counter-increment: linenumber; } + +.line-numbers-rows > span:before { + content: counter(linenumber); + color: #999; + display: block; + padding-right: 0.8em; + text-align: right; } + +.command-line-prompt { + border-right: 1px solid #999; + display: block; + float: left; + font-size: 100%; + letter-spacing: -1px; + margin-right: 1em; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.command-line-prompt > span:before { + color: #999; + content: ' '; + display: block; + padding-right: 0.8em; } + +.command-line-prompt > span[data-user]:before { + content: "[" attr(data-user) "@" attr(data-host) "] $"; } + +.command-line-prompt > span[data-user="root"]:before { + content: "[" attr(data-user) "@" attr(data-host) "] #"; } + +.command-line-prompt > span[data-prompt]:before { + content: attr(data-prompt); } + +div.code-toolbar { + position: relative; } + +div.code-toolbar > .toolbar { + position: absolute; + top: .3em; + right: .2em; + transition: opacity 0.3s ease-in-out; + opacity: 0; } + +div.code-toolbar:hover > .toolbar { + opacity: 1; } + +/* Separate line b/c rules are thrown out if selector is invalid. + IE11 and old Edge versions don't support :focus-within. */ +div.code-toolbar:focus-within > .toolbar { + opacity: 1; } + +div.code-toolbar > .toolbar > .toolbar-item { + display: inline-block; } + +div.code-toolbar > .toolbar > .toolbar-item > a { + cursor: pointer; } + +div.code-toolbar > .toolbar > .toolbar-item > button { + background: none; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + padding: 0; + -webkit-user-select: none; + /* for button */ + -moz-user-select: none; + -ms-user-select: none; } + +div.code-toolbar > .toolbar > .toolbar-item > a, +div.code-toolbar > .toolbar > .toolbar-item > button, +div.code-toolbar > .toolbar > .toolbar-item > span { + color: #bbb; + font-size: .8em; + padding: 0 .5em; + background: #f5f2f0; + background: rgba(224, 224, 224, 0.2); + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2); + border-radius: .5em; } + +div.code-toolbar > .toolbar > .toolbar-item > a:hover, +div.code-toolbar > .toolbar > .toolbar-item > a:focus, +div.code-toolbar > .toolbar > .toolbar-item > button:hover, +div.code-toolbar > .toolbar > .toolbar-item > button:focus, +div.code-toolbar > .toolbar > .toolbar-item > span:hover, +div.code-toolbar > .toolbar > .toolbar-item > span:focus { + color: inherit; + text-decoration: none; } + +code.language-css, +code.language-scss, +.token.boolean, +.token.string, +.token.entity, +.token.url, +.language-css .token.string, +.language-scss .token.string, +.style .token.string, +.token.attr-value, +.token.keyword, +.token.control, +.token.directive, +.token.statement, +.token.regex, +.token.atrule, +.token.number, +.token.inserted, +.token.important { + color: #FF6266 !important; } + +.token.tag-id, +.token.atrule-id, +.token.operator, +.token.unit, +.token.placeholder, +.token.variable, +.token.tag, +.token.attr-name, +.token.namespace, +.token.deleted, +.token.property, +.token.class-name, +.token.constant, +.token.symbol { + color: rgba(255, 98, 102, 0.7) !important; } + +.token.property, +.token.function, +.token.function-name, +.token.deleted, +code.language-javascript, +code.language-html, +.command-line-prompt > span:before { + color: #9a9999 !important; } + +.token.selector, +.token.tag, +.token.punctuation { + color: white; } + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: rgba(255, 255, 255, 0.3) !important; } + +.token.namespace { + opacity: .7 !important; } + +pre[data-line] { + position: relative; } + +pre[class*="language-"] { + margin: 0; + padding: 0; + overflow: auto; } + +.line-highlight { + position: absolute; + left: 0; + right: 0; + padding: 0; + margin: 0; + background: rgba(245, 104, 107, 0.08); + pointer-events: none; + line-height: inherit; + white-space: pre; } + +.line-highlight:before, +.line-highlight[data-end]:after { + content: attr(data-start); + position: absolute; + /* top: .4em; */ + left: .6em; + min-width: 1em; + padding: 0 .5em; + background-color: rgba(153, 122, 102, 0.4); + color: #f5f2f0; + font: bold 65%/1.5 sans-serif; + text-align: center; + vertical-align: .3em; + border-radius: 999px; + text-shadow: none; + box-shadow: 0 1px white; } + +.line-highlight[data-end]:after { + content: attr(data-end); + top: auto; + bottom: .4em; } + +.line-numbers .line-highlight:before, +.line-numbers .line-highlight:after { + content: none; } + +.code-toolbar { + position: relative; + margin: 40px 0; + padding: 20px; + border: 1px solid rgba(255, 255, 255, 0.1); } + .code-toolbar + .code-toolbar, + .code-toolbar + .highlight, + .code-toolbar + .highlight .code-toolbar { + border-top: 0; + margin-top: calc(-1 * $code-margin); } + .code-toolbar pre, .code-toolbar code { + border: none; } + .code-toolbar code { + display: block; + color: inherit; } + .code-toolbar > .toolbar button { + font-size: .8em !important; + background: rgba(224, 224, 224, 0.2) !important; + color: #bbb !important; + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2) !important; + border-radius: 0 !important; + margin: 6px !important; + padding: 10px !important; + user-select: none; } + +.collapsable-code { + position: relative; + width: 100%; + margin: 40px 0; } + .collapsable-code input[type="checkbox"] { + position: absolute; + visibility: hidden; } + .collapsable-code input[type="checkbox"]:checked ~ pre, + .collapsable-code input[type="checkbox"]:checked ~ .code-toolbar pre { + height: 0; + padding: 0; + border-top: none; } + .collapsable-code input[type="checkbox"]:checked ~ .code-toolbar { + padding: 0; + border-top: none; } + .collapsable-code input[type="checkbox"]:checked ~ .code-toolbar .toolbar { + display: none; } + .collapsable-code input[type="checkbox"]:checked ~ label .collapsable-code__toggle:after { + content: attr(data-label-expand); } + .collapsable-code label { + position: relative; + display: flex; + justify-content: space-between; + min-width: 30px; + min-height: 30px; + margin: 0; + border-bottom: 1px solid #f5686b; + cursor: pointer; } + .collapsable-code__title { + flex: 1; + color: #FF6266; + padding: 3px 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + .collapsable-code__language { + color: #FF6266; + border: 1px solid #f5686b; + border-bottom: none; + text-transform: uppercase; + padding: 3px 10px; } + .collapsable-code__toggle { + color: #FF6266; + font-size: 16px; + padding: 3px 10px; } + .collapsable-code__toggle:after { + content: attr(data-label-collapse); } + .collapsable-code pre { + margin-top: 0; } + .collapsable-code pre::first-line { + line-height: 0; } + .collapsable-code .code-toolbar { + margin: 0; } + +.terms h1 { + color: #FF6266; } + +.terms h3 { + font-size: initial; } + +body .gist .blob-num, +body .gist .blob-code-inner { + border: none; } diff --git a/resources/_gen/assets/scss/the1mason.com/css/red-local.scss_f120a3f402b106f64b18d498afd3d82e.json b/resources/_gen/assets/scss/the1mason.com/css/red-local.scss_f120a3f402b106f64b18d498afd3d82e.json new file mode 100644 index 0000000..77df676 --- /dev/null +++ b/resources/_gen/assets/scss/the1mason.com/css/red-local.scss_f120a3f402b106f64b18d498afd3d82e.json @@ -0,0 +1 @@ +{"Target":"css/red-local.css","MediaType":"text/css","Data":{}} \ No newline at end of file