From b5de2ff8b126181551aa367d97027b5fa2bd75ad Mon Sep 17 00:00:00 2001
From: hex <hex@iwakura.rip>
Date: Thu, 1 May 2025 00:48:48 +0200
Subject: [PATCH] include warning and some other stuff

---
 .obsidian/plugins/markdown-tags/main.js       |   8 +
 .obsidian/plugins/markdown-tags/manifest.json |  13 ++
 .obsidian/plugins/markdown-tags/styles.css    | 149 ++++++++++++++++++
 .obsidian/workspace.json                      |  23 ++-
 Common Keywords & Other.md                    |  11 ++
 Common Keywords.md                            |   6 -
 Existing Projects.md                          |   3 +
 README.md                                     |   3 +
 8 files changed, 206 insertions(+), 10 deletions(-)
 create mode 100644 .obsidian/plugins/markdown-tags/main.js
 create mode 100644 .obsidian/plugins/markdown-tags/manifest.json
 create mode 100644 .obsidian/plugins/markdown-tags/styles.css
 create mode 100644 Common Keywords & Other.md
 delete mode 100644 Common Keywords.md
 create mode 100644 Existing Projects.md

diff --git a/.obsidian/plugins/markdown-tags/main.js b/.obsidian/plugins/markdown-tags/main.js
new file mode 100644
index 0000000..86e631c
--- /dev/null
+++ b/.obsidian/plugins/markdown-tags/main.js
@@ -0,0 +1,8 @@
+/*
+THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
+if you want to view the source, please visit the github repository of this plugin
+*/
+
+var C=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var B=(t,e,o)=>e in t?C(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o;var F=(t,e)=>{for(var o in e)C(t,o,{get:e[o],enumerable:!0})},O=(t,e,o,c)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of E(e))!A.call(t,s)&&s!==o&&C(t,s,{get:()=>e[s],enumerable:!(c=V(e,s))||c.enumerable});return t};var R=t=>O(C({},"__esModule",{value:!0}),t);var k=(t,e,o)=>(B(t,typeof e!="symbol"?e+"":e,o),o);var q={};F(q,{default:()=>w});module.exports=R(q);var S=require("obsidian"),f=require("@codemirror/view"),v=require("@codemirror/state");var W=["todo","planned","in-progress","doing","done","tip","on-hold","tbd","proposed","draft","wip","mvp","blocked","canceled","error","warning","warn"],P=["grey","green","yellow","orange","blue","purple","red"],H=/\(\(<?tag\|(?<label>[^)|]+)(?:\|(?<bgcolor>[^)|]*))?(?:\|(?<fgcolor>[^)|]*))?\)\)/g,$=t=>/^#([0-9A-Fa-f]{3}){1,2}$/.test(t),m=t=>$(t)||P.includes(t.toLowerCase()),D=t=>t.replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e]||e);function T(t,e,o,c=!1){let s=W.includes(t.toLowerCase())?t.toLowerCase():"",u=e&&P.includes(e.toLowerCase())?e.toLowerCase():"grey",a=e&&$(e)?e:null,d=o&&$(o)?o:null,p=`bn-tags ${s} ${u} ${c?"bn-arrow-tags":""}`.trim(),n=`${a?`background-color: ${a};`:""}${d?` color: ${d};`:""}`;return f.Decoration.mark({class:p,attributes:{style:n}})}var w=class extends S.Plugin{async onload(){this.registerEditorExtension(this.editModeTagsHighlighter()),this.registerMarkdownPostProcessor(this.viewModeTagsHighlighter())}editModeTagsHighlighter(){return f.ViewPlugin.fromClass(class{constructor(e){k(this,"decorations");this.decorations=this.buildDecorations(e)}update(e){(e.docChanged||e.viewportChanged||e.selectionSet)&&(this.decorations=this.buildDecorations(e.view))}buildDecorations(e){var s,u;let o=new v.RangeSetBuilder,c=e.state.selection.main.head;for(let{from:a,to:d}of e.visibleRanges){let p=e.state.doc.sliceString(a,d),n,x=r=>{let g=e.state.doc.lineAt(r),i=!1;for(let l=1;l<=e.state.doc.lines;l++)if(e.state.doc.line(l).text.trim().startsWith("```")&&(i=!i),l===g.number)return i;return!1};for(;(n=H.exec(p))!==null;){let r=a+((s=n.index)!=null?s:0),g=r+n[0].length;if(c>=r&&c<=g||x(r))continue;let{label:i="",bgcolor:l="",fgcolor:h=""}=(u=n.groups)!=null?u:{},M=D(i),b=l&&m(l)?l:"",L=h&&m(h)?h:"",y=n[0].startsWith("((<");o.add(r,r+n[0].indexOf(i),f.Decoration.mark({class:"bn-hidden"})),o.add(r+n[0].indexOf(i),r+n[0].indexOf(i)+i.length,T(M,b,L,y)),o.add(r+n[0].indexOf(i)+i.length,g,f.Decoration.mark({class:"bn-hidden"}))}}return o.finish()}},{decorations:e=>e.decorations})}viewModeTagsHighlighter(){return(e,o)=>{Array.from(e.querySelectorAll("p, li, span, div")).forEach(s=>{var n;let u=s.textContent;if(!u)return;let a,d=s.innerHTML,p=!1;for(;(a=H.exec(u))!==null;){p=!0;let{label:x="",bgcolor:r="",fgcolor:g=""}=(n=a.groups)!=null?n:{},i=D(x),l=r&&m(r)?r:"",h=g&&m(g)?g:"",M=a[0].startsWith("((<"),b=T(i,l,h,M),L=`<span class="${b.spec.class}" style="${b.spec.attributes.style}">${i}</span>`,y=D(a[0]);d=d.replace(y,L)}p&&(s.innerHTML=d)})}}};
+
+/* nosourcemap */
\ No newline at end of file
diff --git a/.obsidian/plugins/markdown-tags/manifest.json b/.obsidian/plugins/markdown-tags/manifest.json
new file mode 100644
index 0000000..fdd99a1
--- /dev/null
+++ b/.obsidian/plugins/markdown-tags/manifest.json
@@ -0,0 +1,13 @@
+{
+	"id": "markdown-tags",
+	"name": "Tags for Markdown",
+	"version": "1.2.3",
+	"minAppVersion": "0.12.0",
+	"description": "Enhance your documents with custom tags. Use predefined or custom labels, customizable colors, and arrow indicators to visually track tasks and statuses.",
+	"author": "John Smith III",
+	"authorUrl": "https://binarynoir.tech",
+	"fundingUrl": {
+		"Buy Me a Coffee": "https://buymeacoffee.com/binarynoir"
+	},
+	"isDesktopOnly": false
+}
\ No newline at end of file
diff --git a/.obsidian/plugins/markdown-tags/styles.css b/.obsidian/plugins/markdown-tags/styles.css
new file mode 100644
index 0000000..0befadf
--- /dev/null
+++ b/.obsidian/plugins/markdown-tags/styles.css
@@ -0,0 +1,149 @@
+.bn-tags {
+	display: inline-block;
+	vertical-align: middle !important;
+	font-size: 14px;
+	font-weight: 500;
+	height: 20px;
+	line-height: 20px;
+	border-radius: 15px;
+	padding: 0 10px;
+	color: white;
+	text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+
+	&.bn-arrow-tags {
+		all: unset;
+		all: inherit;
+		display: inline-block;
+		height: 20px;
+		line-height: 20px;
+		/* left: 10px; */
+		right: -6px;
+		position: relative;
+		margin: 0 8px 0 10px;
+		padding: 0 10px 0 12px;
+		border-bottom-left-radius: 2px;
+		border-top-left-radius: 2px;
+		border-bottom-right-radius: 3px;
+		border-top-right-radius: 3px;
+		box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+		color: white !important;
+		font-size: 14px;
+		font-weight: 500;
+		text-decoration: none;
+		text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+		-webkit-text-fill-color: #ffffff !important;
+
+		&:before {
+			content: "";
+			position: absolute;
+			top: 0;
+			left: -11px;
+			width: 0;
+			height: 0;
+			border-color: transparent;
+			border-radius: 15%;
+			border-style: solid;
+			border-width: 10px 12px 10px 0;
+		}
+
+		&:after {
+			content: "";
+			position: absolute;
+			top: 7.5px;
+			left: .5px;
+			float: left;
+			width: 5px;
+			height: 5px;
+			border-radius: 50%;
+			background: white;
+			box-shadow: -1px -1px 2px rgba(0, 0, 0, 0.4);
+		}
+	}
+
+	&.todo,
+	&.planned,
+	&.grey {
+		background-color: #6e6e6e;
+
+		&:before {
+			border-right-color: #6e6e6e;
+		}
+	}
+
+	&.doing,
+	&.in-progress,
+	&.orange {
+		background-color: #ff7f00;
+
+		&:before {
+			border-right-color: #ff7f00;
+		}
+	}
+
+	&.done,
+	&.tip,
+	&.green {
+		background-color: #42b983;
+
+		&:before {
+			border-right-color: #42b983;
+		}
+	}
+
+	&.on-hold,
+	&.tbd,
+	&.wip,
+	&.proposed,
+	&.draft,
+	&.blue {
+		background-color: #7aa0dd;
+
+		&:before {
+			border-right-color: #7aa0dd;
+		}
+	}
+
+	&.mvp,
+	&.purple {
+		background-color: #7a5add;
+
+		&:before {
+			border-right-color: #7a5add;
+		}
+	}
+
+	&.warn,
+	&.warning,
+	&.yellow {
+		background-color: #e7c000;
+
+		&:before {
+			border-right-color: #e7c000;
+		}
+	}
+
+	&.tbd,
+	&.mvp,
+	&.wip,
+	&.draft {
+		text-transform: uppercase;
+	}
+
+	&.blocked,
+	&.canceled,
+	&.error,
+	&.red {
+		background-color: #da5961;
+
+		&:before {
+			border-right-color: #da5961;
+		}
+	}
+
+	& + & {
+		margin-left: 5px;
+	}
+}
+.bn-hidden {
+	display: none;
+}
diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json
index b335d5a..8a6633f 100644
--- a/.obsidian/workspace.json
+++ b/.obsidian/workspace.json
@@ -48,9 +48,23 @@
               "icon": "lucide-file",
               "title": "README"
             }
+          },
+          {
+            "id": "61305ec449b9cef0",
+            "type": "leaf",
+            "state": {
+              "type": "split-diff-view",
+              "state": {
+                "aFile": ".obsidian/plugins/markdown-tags/main.js",
+                "bFile": ".obsidian/plugins/markdown-tags/main.js",
+                "aRef": ""
+              },
+              "icon": "diff",
+              "title": "Diff: main.js"
+            }
           }
         ],
-        "currentTab": 2
+        "currentTab": 3
       }
     ],
     "direction": "vertical"
@@ -208,12 +222,13 @@
       "obsidian-git:Open Git source control": false
     }
   },
-  "active": "19771929f635aa5d",
+  "active": "61305ec449b9cef0",
   "lastOpenFiles": [
+    "Existing Projects.md",
+    "Common Keywords & Other.md",
+    "README.md",
     "mitm/Instructions.md",
     "Sources.md",
-    "Common Keywords.md",
-    "README.md",
     "mitm"
   ]
 }
\ No newline at end of file
diff --git a/Common Keywords & Other.md b/Common Keywords & Other.md
new file mode 100644
index 0000000..5b571c5
--- /dev/null
+++ b/Common Keywords & Other.md	
@@ -0,0 +1,11 @@
+# Common Keywords/Formats
+
+| Keyword | Definition                            |
+| ------- | ------------------------------------- |
+| CTR     | A generic code-name used for the 3DS. |
+| MiTM    | Man-in-The-Middle                     |
+
+| File  | Definition                                                                                          |
+| ----- | --------------------------------------------------------------------------------------------------- |
+| .3dsx | Universally agreed-upon format for 3ds homebrew. Can only be launched through the Homebrew Launcher |
+| .cia  | Official format that contains the game, its metadata and a ticket.                                  |
diff --git a/Common Keywords.md b/Common Keywords.md
deleted file mode 100644
index 3695ebb..0000000
--- a/Common Keywords.md	
+++ /dev/null
@@ -1,6 +0,0 @@
-# Common Keywords
-
-| Keyword | Definition                            |
-| ------- | ------------------------------------- |
-| CTR     | A generic code-name used for the 3DS. |
-| MiTM    | Man-in-The-Middle                     |
diff --git a/Existing Projects.md b/Existing Projects.md
new file mode 100644
index 0000000..6e1321e
--- /dev/null
+++ b/Existing Projects.md	
@@ -0,0 +1,3 @@
+# Existing Projects
+
+https://github.com/Aftendo/shopdeck
\ No newline at end of file
diff --git a/README.md b/README.md
index c883913..3abad9e 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,8 @@
 # Reversing the 3DS e-Shop
 
+> [!WARNING]
+> Information documented here may be incorrect. You are very welcome to send patches to my (hex) e-mail, or you can open a PR. Do your own fact-checking.
+
 This is an attempt to document and organize my (and others) findings on the eShop, its workings & a proof-of-concept replacement store. The end-goal here is to open the possibility for some kind of custom homebrew store using existing mechanisms and a familiar theme.
 
 There are already similar projects, like [Universal-Updater](https://universal-team.net/projects/universal-updater) which aim to allow the downloading of other homebrew applications, though it features a pretty poor UI and lets be honest, we all want to have an excuse to hear that sweet eShop music again.