diff --git a/.gitignore b/.gitignore index 3f4eb3b..5abc3b9 100644 --- a/.gitignore +++ b/.gitignore @@ -15,8 +15,8 @@ main.js # Exclude sourcemaps *.map -# Font files generated by esbuild from bundled dependencies -main.css +# CSS and font files generated by esbuild from bundled dependencies +styles.css *.woff *.woff2 *.ttf diff --git a/Conversations/ConversationContent.ts b/Conversations/ConversationContent.ts index af92a1e..7ad3568 100644 --- a/Conversations/ConversationContent.ts +++ b/Conversations/ConversationContent.ts @@ -37,7 +37,6 @@ export class ConversationContent { "timestamp" in data && "isFunctionCall" in data && "isFunctionCallResponse" in data && - "errorType" in data && typeof data.role === "string" && typeof data.content === "string" && typeof data.promptContent === "string" && @@ -45,7 +44,10 @@ export class ConversationContent { typeof data.timestamp === "string" && typeof data.isFunctionCall === "boolean" && typeof data.isFunctionCallResponse === "boolean" && - (typeof data.errorType === "string" || data.errorType === undefined) + + // optional conversation data fields + (!("toolId" in data) || typeof data.toolId === "string") && + (!("errorType" in data) || typeof data.errorType === "string") ); } } \ No newline at end of file diff --git a/Enums/Event.ts b/Enums/Event.ts new file mode 100644 index 0000000..7a3be3d --- /dev/null +++ b/Enums/Event.ts @@ -0,0 +1,4 @@ +export enum Event { + DiffOpened = "diffOpened", + DiffClosed = "diffClosed" +} \ No newline at end of file diff --git a/Services/ConversationFileSystemService.ts b/Services/ConversationFileSystemService.ts index ceb5a03..9b98e50 100644 --- a/Services/ConversationFileSystemService.ts +++ b/Services/ConversationFileSystemService.ts @@ -46,7 +46,7 @@ export class ConversationFileSystemService { })) }; - const result = await this.fileSystemService.writeObjectToFile(this.currentConversationPath, conversationData, true); + const result = await this.fileSystemService.writeObjectToFile(this.currentConversationPath, conversationData, true, false); if (result instanceof Error) { return result; diff --git a/Services/DiffService.ts b/Services/DiffService.ts new file mode 100644 index 0000000..c8524cf --- /dev/null +++ b/Services/DiffService.ts @@ -0,0 +1,82 @@ +import * as Diff from 'diff'; +import type VaultkeeperAIPlugin from 'main'; +import { Resolve } from './DependencyService'; +import { Services } from './Services'; +import type { EventService } from './EventService'; +import { Event } from 'Enums/Event'; +import type { Diff2HtmlUIConfig } from 'diff2html/lib/ui/js/diff2html-ui'; +import { ColorSchemeType, OutputFormatType } from 'diff2html/lib/types'; +import { Platform } from 'obsidian'; + +interface DiffResult { + accepted: boolean; + suggestion?: string; +} + +export class DiffService { + + private readonly plugin: VaultkeeperAIPlugin; + private readonly eventService: EventService; + + private diffResolve?: (result: DiffResult) => void; + + public constructor() { + this.plugin = Resolve(Services.VaultkeeperAIPlugin); + this.eventService = Resolve(Services.EventService); + } + + public async requestDiff(oldFileName: string, newFileName: string, oldContent: string, newContent: string): Promise { + const diffString = this.createDiffString(oldFileName, newFileName, oldContent, newContent); + + const outputFormat: OutputFormatType = (Platform.isMobile || oldContent.trim() === "") ? "line-by-line" : "side-by-side"; + + const config: Diff2HtmlUIConfig = { + drawFileList: false, + matching: "words", + outputFormat: outputFormat, + highlight: true, + fileListToggle: false, + fileContentToggle: false, + synchronisedScroll: true, + colorScheme: ColorSchemeType.AUTO + }; + + return new Promise((resolve) => { + this.diffResolve = resolve; + + void this.plugin.activateDiffView(diffString, config); + this.eventService.trigger(Event.DiffOpened); + }); + } + + public onAccept() { + if (this.diffResolve) { + this.diffResolve({ accepted: true }); + } + this.finishDiff(); + } + + public onReject() { + if (this.diffResolve) { + this.diffResolve({ accepted: false }); + } + this.finishDiff(); + } + + public onSuggest(suggestion: string) { + if (this.diffResolve) { + this.diffResolve({ accepted: false, suggestion: suggestion }); + } + this.finishDiff(); + } + + private createDiffString(oldFileName: string, newFileName: string, oldContent: string, newContent: string): string { + return Diff.createTwoFilesPatch(oldFileName, newFileName, oldContent, newContent); + } + + private finishDiff() { + this.diffResolve = undefined; + this.eventService.trigger(Event.DiffClosed); + } + +} \ No newline at end of file diff --git a/Services/EventService.ts b/Services/EventService.ts new file mode 100644 index 0000000..941706d --- /dev/null +++ b/Services/EventService.ts @@ -0,0 +1,13 @@ +import type { Event } from "Enums/Event"; +import { Events } from "obsidian"; + +export class EventService extends Events { + + public trigger(name: Event.DiffOpened, data?: unknown): void; + public trigger(name: Event.DiffClosed, data?: unknown): void; + + public trigger(name: string, ...data: unknown[]): void { + super.trigger(name, ...data); + } + +} \ No newline at end of file diff --git a/Services/FileSystemService.ts b/Services/FileSystemService.ts index 6dfdb1b..9cd9ccf 100644 --- a/Services/FileSystemService.ts +++ b/Services/FileSystemService.ts @@ -70,15 +70,15 @@ export class FileSystemService { return Exception.new(`File not found: ${filePath}`); } - public async writeObjectToFile(filePath: string, data: object, allowAccessToPluginRoot: boolean = false): Promise { + public async writeObjectToFile(filePath: string, data: object, allowAccessToPluginRoot: boolean = false, requiresConfirmation: boolean = true): Promise { const file: TAbstractFile | null = this.vaultService.getAbstractFileByPath(filePath, allowAccessToPluginRoot); let result: TFile | Error; if (file && file instanceof TFile) { - result = await this.vaultService.modify(file, JSON.stringify(data, null, 4), allowAccessToPluginRoot); + result = await this.vaultService.modify(file, JSON.stringify(data, null, 4), allowAccessToPluginRoot, requiresConfirmation); } else { - result = await this.vaultService.create(filePath, JSON.stringify(data, null, 4), allowAccessToPluginRoot); + result = await this.vaultService.create(filePath, JSON.stringify(data, null, 4), allowAccessToPluginRoot, requiresConfirmation); } return result; diff --git a/Services/ServiceRegistration.ts b/Services/ServiceRegistration.ts index f47e52d..6a0f4e0 100644 --- a/Services/ServiceRegistration.ts +++ b/Services/ServiceRegistration.ts @@ -11,7 +11,6 @@ import { StreamingMarkdownService } from "./StreamingMarkdownService"; import { FileSystemService } from "./FileSystemService"; import { ConversationFileSystemService } from "./ConversationFileSystemService"; import { ConversationHistoryModal } from "Modals/ConversationHistoryModal"; -import { FileManager } from "obsidian"; import { AIFunctionService } from "./AIFunctionService"; import { StreamingService } from "./StreamingService"; import { AIFunctionDefinitions } from "AIClasses/FunctionDefinitions/AIFunctionDefinitions"; @@ -36,6 +35,8 @@ import { InputService } from "./InputService"; import { HTMLService } from "./HTMLService"; import { SettingsService, type IVaultkeeperAISettings } from "./SettingsService"; import { HelpModal } from "Modals/HelpModal"; +import { EventService } from "./EventService"; +import { DiffService } from "./DiffService"; export async function RegisterPlugin(plugin: VaultkeeperAIPlugin) { RegisterSingleton(Services.VaultkeeperAIPlugin, plugin); @@ -43,12 +44,11 @@ export async function RegisterPlugin(plugin: VaultkeeperAIPlugin) { } export function RegisterDependencies() { - const plugin = Resolve(Services.VaultkeeperAIPlugin); - - RegisterSingleton(Services.FileManager, plugin.app.fileManager); + RegisterSingleton(Services.EventService, new EventService()); RegisterSingleton(Services.StatusBarService, new StatusBarService()); RegisterSingleton(Services.HTMLService, new HTMLService()); RegisterSingleton(Services.SanitiserService, new SanitiserService()); + RegisterSingleton(Services.DiffService, new DiffService()); RegisterSingleton(Services.VaultService, new VaultService()); RegisterSingleton(Services.VaultCacheService, new VaultCacheService()); RegisterSingleton(Services.SearchStateStore, new SearchStateStore()); diff --git a/Services/Services.ts b/Services/Services.ts index 7bc9497..a4581de 100644 --- a/Services/Services.ts +++ b/Services/Services.ts @@ -1,9 +1,9 @@ export class Services { static VaultkeeperAIPlugin = Symbol("VaultkeeperAIPlugin"); static SettingsService = Symbol("SettingsService"); + static EventService = Symbol("EventService"); static StatusBarService = Symbol("StatusBarService"); static HTMLService = Symbol("HTMLService"); - static FileManager = Symbol("FileManager"); static VaultService = Symbol("VaultService"); static VaultCacheService = Symbol("VaultCacheService"); static UserInputService = Symbol("UserInputService"); @@ -19,6 +19,7 @@ export class Services { static ChatService = Symbol("ChatService"); static SanitiserService = Symbol("SanitiserService"); static InputService = Symbol("InputService"); + static DiffService = Symbol("DiffService"); // stores static SearchStateStore = Symbol("SearchStateStore"); diff --git a/Services/VaultService.ts b/Services/VaultService.ts index acf1587..01e7490 100644 --- a/Services/VaultService.ts +++ b/Services/VaultService.ts @@ -10,6 +10,10 @@ import type { SanitiserService } from "./SanitiserService"; import { FileEvent } from "Enums/FileEvent"; import type { SettingsService } from "./SettingsService"; import { Exception } from "Helpers/Exception"; +import type { EventService } from "./EventService"; +import { DiffService } from "./DiffService"; +import * as path from "path-browserify"; +import { Event } from "Enums/Event"; interface IFileEventArgs { oldPath: string; @@ -26,13 +30,19 @@ export class VaultService { private readonly settingsService: SettingsService; private readonly fileManager: FileManager; private readonly sanitiserService: SanitiserService; + private readonly diffService: DiffService; + private readonly eventService: EventService; public constructor() { this.plugin = Resolve(Services.VaultkeeperAIPlugin); + this.vault = this.plugin.app.vault; + this.fileManager = this.plugin.app.fileManager + this.settingsService = Resolve(Services.SettingsService); - this.fileManager = Resolve(Services.FileManager); this.sanitiserService = Resolve(Services.SanitiserService); + this.diffService = Resolve(Services.DiffService); + this.eventService = Resolve(Services.EventService); } public registerFileEvents(handleFileEvent: (event: FileEvent, file: TAbstractFile, args: IFileEventArgs) => void) { @@ -74,34 +84,31 @@ export class VaultService { return await this.vault.read(file); } - public async create(filePath: string, content: string, allowAccessToPluginRoot: boolean = false): Promise { + public async create(filePath: string, content: string, allowAccessToPluginRoot: boolean = false, requiresConfirmation: boolean = true): Promise { filePath = this.sanitiserService.sanitize(filePath); if (this.isExclusion(filePath, allowAccessToPluginRoot)) { Exception.log(`Plugin attempted to create a file that is in the exclusion list: ${filePath}`); return Exception.new(`Failed to create file, permission denied: ${filePath}`); } - try { + + const fileName = path.basename(filePath); + return this.proposeChange(fileName, fileName, "", content, requiresConfirmation, async () => { await this.createDirectories(filePath, allowAccessToPluginRoot); return await this.vault.create(filePath, content); - } catch (error) { - Exception.log(error); - return Exception.new(error); - } + }); } - public async modify(file: TFile, content: string, allowAccessToPluginRoot: boolean = false): Promise { + public async modify(file: TFile, content: string, allowAccessToPluginRoot: boolean = false, requiresConfirmation: boolean = true): Promise { const filePath = this.sanitiserService.sanitize(file.path); if (this.isExclusion(file.path, allowAccessToPluginRoot)) { Exception.log(`Plugin attempted to modify a file that is in the exclusion list: ${filePath}`); return Exception.new(`File does not exist: ${filePath}`); } - try { + + return this.proposeChange(file.name, file.name, await this.vault.read(file), content, requiresConfirmation, async () => { await this.vault.process(file, () => content); return file; - } catch (error) { - Exception.log(error); - return Exception.new(error); - } + }); } public async delete(file: TAbstractFile, allowAccessToPluginRoot: boolean = false): Promise { @@ -408,4 +415,26 @@ export class VaultService { return merged; } + + private async proposeChange(oldFileName: string, newFileName: string, oldContent: string, newContent: string, + requiresConfirmation: boolean = true, performChange: () => Promise): Promise { + try { + const result = requiresConfirmation ? + await this.diffService.requestDiff(oldFileName, newFileName, oldContent, newContent) : { accepted: true }; + + if (result.accepted) { + return await performChange(); + } + + let response = "User rejected this change"; // maybe need an event to abort an ongoing function call exchange? + if (result.suggestion) { + response = `User has rejected the input with the following suggestion: ${result.suggestion}`; + } + return Exception.new(response); + } catch (error) { + this.eventService.trigger(Event.DiffClosed); + Exception.log(error); + return Exception.new(error); + } + } } \ No newline at end of file diff --git a/Styles/custom_styles.css b/Styles/custom_styles.css new file mode 100644 index 0000000..dcd95dc --- /dev/null +++ b/Styles/custom_styles.css @@ -0,0 +1,1279 @@ +/* ============================== */ +/* Main View Customization */ +/* ============================== */ + +.workspace-leaf-content[data-type="vaultkeeper-ai-main-view"] { + background-color: var(--background-secondary); +} + +.workspace-leaf-content[data-type="vaultkeeper-ai-main-view"] .view-content { + align-self: center; + max-width: 1000px; + background-color: var(--background-secondary); + padding-top: 0; +} + +/* ============================== */ +/* Settings Styles */ +/* ============================== */ + +.api-key-setting-ok input[type="text"], +.api-key-setting-ok input[type="password"], +.api-key-setting-ok textarea { + border-color: var(--color-green) !important; +} + +.api-key-setting-error input[type="text"], +.api-key-setting-error input[type="password"], +.api-key-setting-error textarea { + border-color: var(--color-red) !important; +} + +.api-key-setting-error .setting-item-control { + animation: shake 0.5s ease-in-out; +} + +@keyframes shake { + 0%, 100% { transform: translateX(0); } + 25% { transform: translateX(-5px); } + 75% { transform: translateX(5px); } +} + +.ai-exclusions-input { + width: 350px; + height: 110px; + font: var(--font-monospace); + font-size: 0.9em; + resize: none; +} + +/* ============================== */ +/* CSS Variables for Common Components */ +/* ============================== */ + +.search-trigger { + color: var(--interactive-accent); + cursor: default; +} + +.search-trigger:hover { + text-decoration: underline; +} + +/* Typing-in animation (used across components) */ +.typing-in { + overflow: hidden; + white-space: nowrap; + animation: reveal-center var(--typing-in-duration, 1.5s) ease-in-out forwards; + max-width: 0; + margin: 0 auto; + padding: 5px; +} + +@keyframes reveal-center { + 0% { + max-width: 0; + opacity: 0; + filter: blur(1px); + } + 100% { + max-width: 100%; + opacity: 1; + filter: blur(0px); + } +} + +.conversation-history-modal { + padding: 0px; + overflow: hidden; +} +.conversation-history-modal .modal-header { + display: none; +} +.conversation-history-modal .modal-close-button { + display: none; +} + +.help-modal { + padding: 0px; + overflow: hidden; +} +.help-modal .modal-header { + display: none; +} +.help-modal .modal-close-button { + display: none; +} + +.top-bar-button { + margin: var(--size-4-2) 0px var(--size-4-2) 0px; + padding: var(--size-4-1) var(--size-4-2) var(--size-4-1) var(--size-4-2); + color: var(--text-muted); +} + +.top-bar-button:hover { + background-color: var(--background-modifier-hover); +} + +.error-selector { + display: inline-block; + color: var(--color-red); + border: var(--color-red); + border-style: solid; + border-width: var(--border-width); + border-radius: var(--radius-m); + padding: var(--size-2-3); + margin: var(--size-4-2) 0; +} + +/* ============================== */ +/* CSS Variables for Theming */ +/* ============================== */ + +/* Custom variables mapped to Obsidian theme variables */ +body { + --code-background-inline: var(--code-background); + --text-color: var(--text-normal); + --link-color: var(--link-color); + --blockquote-border: var(--blockquote-border-color); + --table-border: var(--table-border-color); + --table-header-background: var(--table-header-background); + --hr-color: var(--hr-color); + --checkbox-bg: var(--background-primary); + --checkbox-border: var(--background-modifier-border); + --checkbox-checked-bg: var(--interactive-accent); + --footnote-border: var(--background-modifier-border); + --alt-interactive-accent: color-mix( + in hsl longer hue, + var(--interactive-accent) 50%, + hsl(130, 100%, 50%) 50% + ); + --alt-interactive-accent-hover: color-mix( + in hsl longer hue, + var(--interactive-accent-hover) 50%, + hsl(130 100% 50%) 50% + ); + --alt-background-primary: color-mix( + in hsl shorter hue, + var(--background-primary) 75%, + hsl(0 0% 0%) 25% + ); +} + +/* ============================== */ +/* GFM Task Lists */ +/* ============================== */ + +/* Task list container */ +.contains-task-list, +ul.contains-task-list { + list-style: none; + padding-left: 0; +} + +/* Task list items */ +.task-list-item, +li.task-list-item { + position: relative; + list-style: none; + padding-left: 1.75em; + margin-left: 0; +} + +/* Task list checkboxes */ +.task-list-item > input[type="checkbox"], +.task-list-item input[type="checkbox"] { + position: absolute; + left: 0; + top: 0.25em; + margin: 0; + width: 1em; + height: 1em; + cursor: pointer; + background-color: var(--checkbox-bg); + border: 1px solid var(--checkbox-border); + border-radius: 3px; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; +} + +/* Checked state */ +.task-list-item > input[type="checkbox"]:checked, +.task-list-item input[type="checkbox"]:checked { + background-color: var(--checkbox-checked-bg); + border-color: var(--checkbox-checked-bg); +} + +/* Checkmark for checked boxes */ +.task-list-item > input[type="checkbox"]:checked::after, +.task-list-item input[type="checkbox"]:checked::after { + content: "✓"; + display: block; + text-align: center; + color: var(--text-on-accent); + font-size: 0.75em; + line-height: 1em; + font-weight: bold; +} + +/* Disabled state */ +.task-list-item > input[type="checkbox"]:disabled, +.task-list-item input[type="checkbox"]:disabled { + cursor: not-allowed; + opacity: 0.6; +} + +/* Nested task lists */ +.task-list-item .contains-task-list { + margin-top: 0.25em; + margin-bottom: 0.25em; +} + +/* ============================== */ +/* GFM Footnotes */ +/* ============================== */ + +/* Footnote references */ +sup[data-footnote-ref], +a[data-footnote-ref] { + font-weight: bold; + text-decoration: none; + color: var(--link-color); +} + +sup[data-footnote-ref]::before { + content: "["; +} + +sup[data-footnote-ref]::after { + content: "]"; +} + +/* Footnote section */ +section[data-footnotes], +.footnotes { + margin-top: 2em; + padding-top: 1em; + border-top: 1px solid var(--footnote-border); + font-size: 0.9em; +} + +/* Footnote list */ +section[data-footnotes] ol, +.footnotes ol { + padding-left: 1.5em; +} + +/* Footnote back references */ +a[data-footnote-backref] { + text-decoration: none; + margin-left: 0.25em; +} + +/* ============================== */ +/* KaTeX Math Rendering Styles */ +/* ============================== */ + +.katex { + font: normal 1.21em KaTeX_Main, "Times New Roman", serif; + line-height: 1.2; + text-indent: 0; + text-rendering: auto; +} + +.katex * { + -ms-high-contrast-adjust: none !important; + border-color: currentColor; +} + +.katex .katex-mathml { + clip: rect(1px, 1px, 1px, 1px); + border: 0; + height: 1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +.katex .katex-html > .newline { + display: block; +} + +.katex .base { + position: relative; + white-space: nowrap; + width: -webkit-min-content; + width: -moz-min-content; + width: min-content; +} + +.katex .base, +.katex .strut { + display: inline-block; +} + +.katex .textbf { + font-weight: 700; +} + +.katex .textit { + font-style: italic; +} + +.katex .textrm { + font-family: KaTeX_Main; +} + +.katex .textsf { + font-family: KaTeX_SansSerif; +} + +.katex .texttt { + font-family: KaTeX_Typewriter; +} + +.katex .mathnormal { + font-family: KaTeX_Math; + font-style: italic; +} + +.katex .mathit { + font-family: KaTeX_Main; + font-style: italic; +} + +.katex .mathrm { + font-style: normal; +} + +.katex .mathbf { + font-family: KaTeX_Main; + font-weight: 700; +} + +.katex .boldsymbol { + font-family: KaTeX_Math; + font-style: italic; + font-weight: 700; +} + +.katex .amsrm, +.katex .mathbb, +.katex .textbb { + font-family: KaTeX_AMS; +} + +.katex .mathcal { + font-family: KaTeX_Caligraphic; +} + +.katex .mathfrak, +.katex .textfrak { + font-family: KaTeX_Fraktur; +} + +.katex .mathboldfrak, +.katex .textboldfrak { + font-family: KaTeX_Fraktur; + font-weight: 700; +} + +.katex .mathtt { + font-family: KaTeX_Typewriter; +} + +.katex .mathscr, +.katex .textscr { + font-family: KaTeX_Script; +} + +.katex .mathsf { + font-family: KaTeX_SansSerif; +} + +.katex .mathboldsf, +.katex .textboldsf { + font-family: KaTeX_SansSerif; + font-weight: 700; +} + +.katex .mathitsf, +.katex .mathsfit, +.katex .textitsf { + font-family: KaTeX_SansSerif; + font-style: italic; +} + +.katex .mainrm { + font-family: KaTeX_Main; + font-style: normal; +} + +/* KaTeX Layout */ +.katex .vlist-t { + border-collapse: collapse; + display: inline-table; + table-layout: fixed; +} + +.katex .vlist-r { + display: table-row; +} + +.katex .vlist { + display: table-cell; + position: relative; + vertical-align: bottom; +} + +.katex .vlist > span { + display: block; + height: 0; + position: relative; +} + +.katex .vlist > span > span { + display: inline-block; +} + +.katex .vlist > span > .pstrut { + overflow: hidden; + width: 0; +} + +.katex .vlist-t2 { + margin-right: -2px; +} + +.katex .vlist-s { + display: table-cell; + font-size: 1px; + min-width: 2px; + vertical-align: bottom; + width: 2px; +} + +.katex .vbox { + align-items: baseline; + display: inline-flex; + flex-direction: column; +} + +.katex .hbox { + width: 100%; + display: inline-flex; + flex-direction: row; +} + +.katex .thinbox { + display: inline-flex; + flex-direction: row; + max-width: 0; + width: 0; +} + +/* KaTeX Fractions and Lines */ +.katex .msupsub { + text-align: left; +} + +.katex .mfrac > span > span { + text-align: center; +} + +.katex .mfrac .frac-line { + border-bottom-style: solid; + display: inline-block; + width: 100%; +} + +.katex .hdashline, +.katex .hline, +.katex .mfrac .frac-line, +.katex .overline .overline-line, +.katex .rule, +.katex .underline .underline-line { + min-height: 1px; +} + +.katex .mspace { + display: inline-block; +} + +/* KaTeX Positioning */ +.katex .clap, +.katex .llap, +.katex .rlap { + position: relative; + width: 0; +} + +.katex .clap > .inner, +.katex .llap > .inner, +.katex .rlap > .inner { + position: absolute; +} + +.katex .clap > .fix, +.katex .llap > .fix, +.katex .rlap > .fix { + display: inline-block; +} + +.katex .llap > .inner { + right: 0; +} + +.katex .clap > .inner, +.katex .rlap > .inner { + left: 0; +} + +.katex .clap > .inner > span { + margin-left: -50%; + margin-right: 50%; +} + +/* KaTeX Rules and Lines */ +.katex .rule { + border: 0 solid; + display: inline-block; + position: relative; +} + +.katex .hline, +.katex .overline .overline-line, +.katex .underline .underline-line { + border-bottom-style: solid; + display: inline-block; + width: 100%; +} + +.katex .hdashline { + border-bottom-style: dashed; + display: inline-block; + width: 100%; +} + +/* KaTeX Square Root */ +.katex .sqrt > .root { + margin-left: 0.27777778em; + margin-right: -0.55555556em; +} + +/* KaTeX Sizing - Essential subset */ +.katex .fontsize-ensurer.reset-size1.size1, +.katex .sizing.reset-size1.size1 { + font-size: 1em; +} + +.katex .fontsize-ensurer.reset-size1.size2, +.katex .sizing.reset-size1.size2 { + font-size: 1.2em; +} + +.katex .fontsize-ensurer.reset-size1.size3, +.katex .sizing.reset-size1.size3 { + font-size: 1.4em; +} + +.katex .fontsize-ensurer.reset-size1.size4, +.katex .sizing.reset-size1.size4 { + font-size: 1.6em; +} + +.katex .fontsize-ensurer.reset-size1.size5, +.katex .sizing.reset-size1.size5 { + font-size: 1.8em; +} + +.katex .fontsize-ensurer.reset-size1.size6, +.katex .sizing.reset-size1.size6 { + font-size: 2em; +} + +.katex .fontsize-ensurer.reset-size1.size7, +.katex .sizing.reset-size1.size7 { + font-size: 2.4em; +} + +/* KaTeX Delimiters */ +.katex .delimsizing.size1 { + font-family: KaTeX_Size1; +} + +.katex .delimsizing.size2 { + font-family: KaTeX_Size2; +} + +.katex .delimsizing.size3 { + font-family: KaTeX_Size3; +} + +.katex .delimsizing.size4 { + font-family: KaTeX_Size4; +} + +.katex .nulldelimiter { + display: inline-block; + width: 0.12em; +} + +.katex .delimcenter, +.katex .op-symbol { + position: relative; +} + +.katex .op-symbol.small-op { + font-family: KaTeX_Size1; +} + +.katex .op-symbol.large-op { + font-family: KaTeX_Size2; +} + +/* KaTeX Accents and Symbols */ +.katex .accent > .vlist-t, +.katex .op-limits > .vlist-t { + text-align: center; +} + +.katex .accent .accent-body { + position: relative; +} + +.katex .accent .accent-body:not(.accent-full) { + width: 0; +} + +.katex .overlay { + display: block; +} + +/* KaTeX Tables */ +.katex .mtable .vertical-separator { + display: inline-block; + min-width: 1px; +} + +.katex .mtable .arraycolsep { + display: inline-block; +} + +.katex .mtable .col-align-c > .vlist-t { + text-align: center; +} + +.katex .mtable .col-align-l > .vlist-t { + text-align: left; +} + +.katex .mtable .col-align-r > .vlist-t { + text-align: right; +} + +/* KaTeX SVG Support */ +.katex .svg-align { + text-align: left; +} + +.katex svg { + fill: currentColor; + stroke: currentColor; + fill-rule: nonzero; + fill-opacity: 1; + stroke-width: 1; + stroke-linecap: butt; + stroke-linejoin: miter; + stroke-miterlimit: 4; + stroke-dasharray: none; + stroke-dashoffset: 0; + stroke-opacity: 1; + display: block; + height: inherit; + position: absolute; + width: 100%; +} + +.katex svg path { + stroke: none; +} + +.katex img { + border-style: none; + max-height: none; + max-width: none; + min-height: 0; + min-width: 0; +} + +/* KaTeX Stretchy Elements */ +.katex .stretchy { + display: block; + overflow: hidden; + position: relative; + width: 100%; +} + +.katex .stretchy::after, +.katex .stretchy::before { + content: ""; +} + +.katex .hide-tail { + overflow: hidden; + position: relative; + width: 100%; +} + +/* KaTeX Arrows and Braces */ +.katex .halfarrow-left { + left: 0; + overflow: hidden; + position: absolute; + width: 50.2%; +} + +.katex .halfarrow-right { + overflow: hidden; + position: absolute; + right: 0; + width: 50.2%; +} + +.katex .brace-left { + left: 0; + overflow: hidden; + position: absolute; + width: 25.1%; +} + +.katex .brace-center { + left: 25%; + overflow: hidden; + position: absolute; + width: 50%; +} + +.katex .brace-right { + overflow: hidden; + position: absolute; + right: 0; + width: 25.1%; +} + +/* KaTeX Padding and Boxes */ +.katex .x-arrow-pad { + padding: 0 0.5em; +} + +.katex .cd-arrow-pad { + padding: 0 0.55556em 0 0.27778em; +} + +.katex .mover, +.katex .munder, +.katex .x-arrow { + text-align: center; +} + +.katex .boxpad { + padding: 0 0.3em; +} + +.katex .fbox, +.katex .fcolorbox { + border: 0.04em solid; + box-sizing: border-box; +} + +/* KaTeX Cancel */ +.katex .cancel-pad { + padding: 0 0.2em; +} + +.katex .cancel-lap { + margin-left: -0.2em; + margin-right: -0.2em; +} + +.katex .sout { + border-bottom-style: solid; + border-bottom-width: 0.08em; +} + +/* KaTeX Angles */ +.katex .angl { + border-right: 0.049em solid; + border-top: 0.049em solid; + box-sizing: border-box; + margin-right: 0.03889em; +} + +.katex .anglpad { + padding: 0 0.03889em; +} + +/* KaTeX Equation Numbers */ +.katex .eqn-num::before { + content: "(" counter(katexEqnNo) ")"; + counter-increment: katexEqnNo; +} + +.katex .mml-eqn-num::before { + content: "(" counter(mmlEqnNo) ")"; + counter-increment: mmlEqnNo; +} + +/* KaTeX Display Mode */ +.katex-display { + display: block; + margin: 1em 0; + text-align: center; +} + +.katex-display > .katex { + display: block; + text-align: center; + white-space: nowrap; +} + +.katex-display > .katex > .katex-html { + display: block; + position: relative; +} + +.katex-display > .katex > .katex-html > .tag { + position: absolute; + right: 0; +} + +.katex-display.leqno > .katex > .katex-html > .tag { + left: 0; + right: auto; +} + +.katex-display.fleqn > .katex { + padding-left: 2em; + text-align: left; +} + +body { + counter-reset: katexEqnNo mmlEqnNo; +} + +/* ============================== */ +/* KaTeX Font Fallbacks */ +/* For Obsidian, we'll use system fonts as fallbacks */ +/* ============================== */ + +.katex { + font-family: "KaTeX_Main", "Times New Roman", Times, serif; +} + +.katex .mathit, +.katex .mathnormal { + font-family: "KaTeX_Math", "Times New Roman", Times, serif; + font-style: italic; +} + +.katex .mathbf { + font-family: "KaTeX_Main", "Times New Roman", Times, serif; + font-weight: bold; +} + +.katex .amsrm, +.katex .mathbb, +.katex .textbb { + font-family: "KaTeX_AMS", "Times New Roman", Times, serif; +} + +.katex .mathcal { + font-family: "KaTeX_Caligraphic", "Lucida Calligraphy", "Brush Script MT", cursive; +} + +.katex .mathfrak, +.katex .textfrak { + font-family: "KaTeX_Fraktur", "Lucida Blackletter", fantasy; +} + +.katex .mathtt { + font-family: "KaTeX_Typewriter", "Courier New", Courier, monospace; +} + +.katex .mathscr, +.katex .textscr { + font-family: "KaTeX_Script", "Lucida Handwriting", "Segoe Script", cursive; +} + +.katex .mathsf, +.katex .textsf { + font-family: "KaTeX_SansSerif", Arial, Helvetica, sans-serif; +} + +/* ============================== */ +/* Additional Markdown Styles */ +/* ============================== */ + +/* Headings in assistant messages */ +.message-bubble.assistant h1 { + font-size: 1.5em; + font-weight: 600; + margin: 0.67em 0; + line-height: 1.2; +} + +.message-bubble.assistant h2 { + font-size: 1.3em; + font-weight: 600; + margin: 0.75em 0; + line-height: 1.2; +} + +.message-bubble.assistant h3 { + font-size: 1.1em; + font-weight: 600; + margin: 0.83em 0; + line-height: 1.3; +} + +.message-bubble.assistant h4 { + font-size: 1em; + font-weight: 600; + margin: 1.12em 0; + line-height: 1.3; +} + +.message-bubble.assistant h5 { + font-size: 0.9em; + font-weight: 600; + margin: 1.5em 0; + line-height: 1.3; +} + +.message-bubble.assistant h6 { + font-size: 0.85em; + font-weight: 600; + margin: 1.67em 0; + line-height: 1.3; +} + +/* Paragraphs */ +.message-bubble.assistant p { + margin: 0.5em 0; + line-height: 1.6; +} + +/* Lists */ +.message-bubble.assistant ul, +.message-bubble.assistant ol { + margin: 0.5em 0; + padding-left: 2em; + list-style-position: outside; +} + +.message-bubble.assistant ol { + list-style-type: decimal; +} + +.message-bubble.assistant ul { + list-style-type: disc; +} + +.message-bubble.assistant li { + margin: 0.25em 0; + padding-left: 0.25em; + display: list-item; +} + +/* Handle nested lists properly */ +.message-bubble.assistant ol ol, +.message-bubble.assistant ul ul, +.message-bubble.assistant ol ul, +.message-bubble.assistant ul ol { + margin: 0.25em 0; + padding-left: 1.5em; +} + +/* Ensure nested list numbering works correctly */ +.message-bubble.assistant ol ol { + list-style-type: lower-alpha; +} + +.message-bubble.assistant ol ol ol { + list-style-type: lower-roman; +} + +/* Fix paragraph spacing inside list items */ +.message-bubble.assistant li > p { + margin: 0; +} + +.message-bubble.assistant li > p:first-child { + margin-top: 0; +} + +.message-bubble.assistant li > p:last-child { + margin-bottom: 0; +} + +/* Code blocks */ +.message-bubble.assistant pre { + background-color: var(--code-background); + border-radius: 4px; + padding: 0.5em; + overflow-x: auto; + margin: 0.5em 0; + position: relative; +} + +.message-bubble.assistant code { + background-color: var(--code-background-inline); + border-radius: 3px; + padding: 0.2em 0.4em; + font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; + font-size: 0.9em; +} + +.message-bubble.assistant pre code { + background-color: transparent; + padding: 0; + border-radius: 0; +} + +/* Blockquotes */ +.message-bubble.assistant blockquote { + border-left: 4px solid var(--blockquote-border); + padding-left: 1em; + margin: 0.5em 0; + color: var(--text-muted); +} + +/* Tables */ +.message-bubble.assistant table { + border-collapse: collapse; + margin: 0.5em 0; + width: 100%; + overflow-x: auto; + display: block; +} + +.message-bubble.assistant th, +.message-bubble.assistant td { + border: 1px solid var(--table-border); + padding: 0.5em; + text-align: left; + min-width: 100px; +} + +.message-bubble.assistant th { + background-color: var(--table-header-background); + font-weight: 600; +} + +/* Table alignment classes from GFM */ +.message-bubble.assistant th[align="center"], +.message-bubble.assistant td[align="center"] { + text-align: center; +} + +.message-bubble.assistant th[align="right"], +.message-bubble.assistant td[align="right"] { + text-align: right; +} + +/* Links */ +.message-bubble.assistant a { + color: var(--link-color-hover); + text-decoration: none; +} + +.message-bubble.assistant a:hover { + text-decoration: var(--link-decoration-hover); +} + +/* Horizontal rules */ +.message-bubble.assistant hr { + border: none; + border-top: 1px solid var(--hr-color); + margin: 1em 0; +} + +/* Images */ +.message-bubble.assistant img { + max-width: 100%; + height: auto; + display: block; + margin: 0.5em 0; +} + +/* Emphasis */ +.message-bubble.assistant em { + font-style: italic; +} + +.message-bubble.assistant strong { + font-weight: 600; +} + +/* Strikethrough */ +.message-bubble.assistant del { + text-decoration: line-through; + opacity: 0.7; +} + +/* ============================== */ +/* Additional HTML Elements */ +/* ============================== */ + +/* Keyboard input */ +.message-bubble.assistant kbd { + display: inline-block; + padding: 0.2em 0.4em; + font-size: 0.875em; + font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; + line-height: 1; + color: var(--text-color); + vertical-align: middle; + background-color: var(--code-background-inline); + border: 1px solid var(--table-border); + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +/* Mark/highlight */ +.message-bubble.assistant mark { + background-color: var(--text-highlight-bg); + color: var(--text-normal); + padding: 0.2em; + border-radius: 2px; +} + +/* Subscript and Superscript */ +.message-bubble.assistant sub { + font-size: 0.75em; + vertical-align: sub; +} + +.message-bubble.assistant sup { + font-size: 0.75em; + vertical-align: super; +} + +/* Abbreviations */ +.message-bubble.assistant abbr[title] { + text-decoration: underline dotted; + cursor: help; +} + +/* Definition lists */ +.message-bubble.assistant dl { + margin: 0.5em 0; +} + +.message-bubble.assistant dt { + font-weight: 600; + margin-top: 0.5em; +} + +.message-bubble.assistant dd { + margin-left: 2em; + margin-bottom: 0.5em; +} + +/* Details/Summary (collapsible sections) */ +.message-bubble.assistant details { + margin: 0.5em 0; + padding: 0.5em; + border: 1px solid var(--table-border); + border-radius: 4px; +} + +.message-bubble.assistant summary { + cursor: pointer; + font-weight: 600; + padding: 0.25em; +} + +.message-bubble.assistant details[open] summary { + margin-bottom: 0.5em; +} + +/* ============================== */ +/* Emoji Support */ +/* ============================== */ + +.message-bubble.assistant .emoji { + font-family: "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-weight: normal; + line-height: 1; +} + +/* ============================== */ +/* Line Numbers for Code Blocks (optional) */ +/* ============================== */ + +/* If using line numbers with rehype-highlight */ +.hljs .code-line { + display: block; + padding-left: 1em; + margin-left: -1em; +} + +.hljs .numbered-code-line::before { + content: attr(data-line-number); + display: inline-block; + width: 2em; + text-align: right; + margin-right: 1em; + color: var(--text-faint); + user-select: none; +} + +/* ============================== */ +/* Responsive adjustments */ +/* ============================== */ + +@media (max-width: 768px) { + .message-bubble.assistant table { + font-size: 0.875em; + } + + .message-bubble.assistant th, + .message-bubble.assistant td { + padding: 0.25em; + min-width: 50px; + } + + .message-bubble.assistant pre { + padding: 0.25em; + } +} + +/* ============================== */ +/* Print styles */ +/* ============================== */ + +@media print { + .message-bubble.assistant { + color: #000; + } + + .message-bubble.assistant a { + color: #0969da; + text-decoration: underline; + } + + .message-bubble.assistant pre, + .message-bubble.assistant code { + background-color: #f6f8fa; + color: #000; + } + + .hljs { + background: #fff; + color: #000; + } +} \ No newline at end of file diff --git a/Styles/diff2html_styles.css b/Styles/diff2html_styles.css new file mode 100644 index 0000000..31d54c9 --- /dev/null +++ b/Styles/diff2html_styles.css @@ -0,0 +1,400 @@ +/** + * Diff2html Obsidian Theme Override + * + * This stylesheet overrides diff2html's default styling to use Obsidian's CSS variables + * + */ + +/* ======================================== + ROOT VARIABLE OVERRIDES - LIGHT THEME + ======================================== */ + +:root { + /* Background colors */ + --d2h-bg-color: var(--background-primary); + --d2h-file-header-bg-color: var(--background-secondary); + --d2h-file-diff-wrapper-bg-color: var(--background-primary); + --d2h-file-list-wrapper-bg-color: var(--background-secondary); + --d2h-file-list-header-bg-color: var(--background-secondary-alt); + + /* Border colors */ + --d2h-border-color: var(--background-modifier-border); + --d2h-file-border-color: var(--background-modifier-border); + --d2h-line-border-color: var(--background-modifier-border); + + /* Text colors */ + --d2h-text-color: var(--text-normal); + --d2h-muted-text-color: var(--text-muted); + --d2h-file-name-color: var(--text-normal); + --d2h-file-stats-color: var(--text-muted); + --d2h-line-number-color: var(--text-muted); + + /* Insertion colors (additions) */ + --d2h-ins-bg-color: color-mix(in srgb, var(--color-green) 15%, var(--background-primary)); + --d2h-ins-label-color: var(--color-green); + --d2h-ins-highlight-bg-color: color-mix(in srgb, var(--color-green) 30%, var(--background-primary)); + --d2h-ins-border-color: color-mix(in srgb, var(--color-green) 40%, var(--background-modifier-border)); + + /* Deletion colors (removals) */ + --d2h-del-bg-color: color-mix(in srgb, var(--color-red) 15%, var(--background-primary)); + --d2h-del-label-color: var(--color-red); + --d2h-del-highlight-bg-color: color-mix(in srgb, var(--color-red) 30%, var(--background-primary)); + --d2h-del-border-color: color-mix(in srgb, var(--color-red) 40%, var(--background-modifier-border)); + + /* Change/modification colors */ + --d2h-change-bg-color: color-mix(in srgb, var(--color-yellow) 15%, var(--background-primary)); + --d2h-change-label-color: var(--color-yellow); + + /* Info colors */ + --d2h-info-bg-color: color-mix(in srgb, var(--color-cyan) 10%, var(--background-secondary)); + --d2h-info-text-color: var(--text-muted); + + /* Link colors */ + --d2h-link-color: var(--interactive-accent); + --d2h-link-hover-color: var(--interactive-accent-hover); + + /* Code colors */ + --d2h-code-bg-color: var(--background-primary-alt); + --d2h-code-text-color: var(--text-normal); + + /* Selection and hover */ + --d2h-hover-bg-color: var(--background-modifier-hover); + --d2h-selected-bg-color: var(--background-modifier-active-hover); +} + +/* ======================================== + DARK THEME OVERRIDES + ======================================== */ + +/* Dark theme with explicit class */ +.d2h-dark-color-scheme, +.theme-dark { + /* Background colors */ + --d2h-dark-bg-color: var(--background-primary); + --d2h-dark-file-header-bg-color: var(--background-secondary); + --d2h-dark-file-diff-wrapper-bg-color: var(--background-primary); + --d2h-dark-file-list-wrapper-bg-color: var(--background-secondary); + --d2h-dark-file-list-header-bg-color: var(--background-secondary-alt); + + /* Border colors */ + --d2h-dark-border-color: var(--background-modifier-border); + --d2h-dark-file-border-color: var(--background-modifier-border); + --d2h-dark-line-border-color: var(--background-modifier-border); + + /* Text colors */ + --d2h-dark-text-color: var(--text-normal); + --d2h-dark-muted-text-color: var(--text-muted); + --d2h-dark-file-name-color: var(--text-normal); + --d2h-dark-file-stats-color: var(--text-muted); + --d2h-dark-line-number-color: var(--text-muted); + + /* Insertion colors (additions) */ + --d2h-dark-ins-bg-color: color-mix(in srgb, var(--color-green) 15%, var(--background-primary)); + --d2h-dark-ins-label-color: color-mix(in srgb, var(--color-green) 120%, white); + --d2h-dark-ins-highlight-bg-color: color-mix(in srgb, var(--color-green) 30%, var(--background-primary)); + --d2h-dark-ins-border-color: color-mix(in srgb, var(--color-green) 50%, var(--background-modifier-border)); + + /* Deletion colors (removals) */ + --d2h-dark-del-bg-color: color-mix(in srgb, var(--color-red) 20%, var(--background-primary)); + --d2h-dark-del-label-color: color-mix(in srgb, var(--color-red) 120%, white); + --d2h-dark-del-highlight-bg-color: color-mix(in srgb, var(--color-red) 35%, var(--background-primary)); + --d2h-dark-del-border-color: color-mix(in srgb, var(--color-red) 50%, var(--background-modifier-border)); + + /* Change/modification colors */ + --d2h-dark-change-bg-color: color-mix(in srgb, var(--color-yellow) 20%, var(--background-primary)); + --d2h-dark-change-label-color: color-mix(in srgb, var(--color-yellow) 120%, white); + + /* Info colors */ + --d2h-dark-info-bg-color: color-mix(in srgb, var(--color-cyan) 15%, var(--background-secondary)); + --d2h-dark-info-text-color: var(--text-muted); + + /* Link colors */ + --d2h-dark-link-color: var(--interactive-accent); + --d2h-dark-link-hover-color: var(--interactive-accent-hover); + + /* Code colors */ + --d2h-dark-code-bg-color: var(--background-primary-alt); + --d2h-dark-code-text-color: var(--text-normal); + + /* Selection and hover */ + --d2h-dark-hover-bg-color: var(--background-modifier-hover); + --d2h-dark-selected-bg-color: var(--background-modifier-active-hover); +} + +/* Auto theme - follows system preference */ +@media (prefers-color-scheme: dark) { + .d2h-auto-color-scheme { + /* Apply dark theme variables */ + --d2h-bg-color: var(--d2h-dark-bg-color); + --d2h-file-header-bg-color: var(--d2h-dark-file-header-bg-color); + --d2h-border-color: var(--d2h-dark-border-color); + --d2h-text-color: var(--d2h-dark-text-color); + --d2h-ins-bg-color: var(--d2h-dark-ins-bg-color); + --d2h-ins-label-color: var(--d2h-dark-ins-label-color); + --d2h-ins-highlight-bg-color: var(--d2h-dark-ins-highlight-bg-color); + --d2h-del-bg-color: var(--d2h-dark-del-bg-color); + --d2h-del-label-color: var(--d2h-dark-del-label-color); + --d2h-del-highlight-bg-color: var(--d2h-dark-del-highlight-bg-color); + } +} + +/* ======================================== + COMPONENT-SPECIFIC OVERRIDES + ======================================== */ + +/* File wrapper */ +.d2h-wrapper { + background-color: var(--background-primary); + color: var(--text-normal); + font-family: var(--font-interface); + font-size: var(--font-ui-small); +} + +/* File header */ +.d2h-file-header { + background-color: var(--background-secondary); + border-color: var(--background-modifier-border); + color: var(--text-normal); +} + +.d2h-file-name { + color: var(--text-normal); + font-family: var(--font-monospace); +} + +.d2h-file-stats { + color: var(--text-muted); + font-size: var(--font-ui-smaller); +} + +/* Code lines */ +.d2h-code-line { + color: var(--text-normal); + font-family: var(--font-monospace); + font-size: var(--font-ui-small); +} + +.d2h-code-line-ctn { + color: var(--text-normal); +} + +.d2h-code-line-prefix { + color: var(--text-muted); +} + +/* Line numbers */ +.d2h-code-linenumber { + background-color: var(--background-secondary-alt); + color: var(--text-muted); + border-color: var(--background-modifier-border); +} + +/* Insertion (added) lines */ +.d2h-ins { + background-color: var(--d2h-ins-bg-color); +} + +.d2h-ins .d2h-code-line-prefix { + color: var(--d2h-ins-label-color); +} + +.d2h-ins .d2h-code-line-ctn { + background-color: transparent; +} + +.d2h-ins.d2h-change { + background-color: var(--d2h-change-bg-color); +} + +/* Deletion (removed) lines */ +.d2h-del { + background-color: var(--d2h-del-bg-color); +} + +.d2h-del .d2h-code-line-prefix { + color: var(--d2h-del-label-color); +} + +.d2h-del .d2h-code-line-ctn { + background-color: transparent; +} + +.d2h-del.d2h-change { + background-color: var(--d2h-change-bg-color); +} + +/* Word-level highlighting */ +.d2h-ins .d2h-change-highlight { + background-color: var(--d2h-ins-highlight-bg-color); + border-radius: 2px; + padding: 0 2px; +} + +.d2h-del .d2h-change-highlight { + background-color: var(--d2h-del-highlight-bg-color); + border-radius: 2px; + padding: 0 2px; +} + +/* Context (unchanged) lines */ +.d2h-cxt { + background-color: var(--background-primary); + color: var(--text-normal); +} + +/* Info lines */ +.d2h-info { + background-color: var(--d2h-info-bg-color); + color: var(--d2h-info-text-color); + border-color: var(--background-modifier-border); +} + +/* File list */ +.d2h-file-list-wrapper { + background-color: var(--background-secondary); + border-color: var(--background-modifier-border); +} + +.d2h-file-list-header { + background-color: var(--background-secondary-alt); + border-color: var(--background-modifier-border); + color: var(--text-normal); +} + +.d2h-file-list-line { + border-color: var(--background-modifier-border); +} + +.d2h-file-list-line:hover { + background-color: var(--background-modifier-hover); +} + +/* Links */ +.d2h-file-name-link, +.d2h-file-link { + color: var(--interactive-accent); + text-decoration: none; +} + +.d2h-file-name-link:hover, +.d2h-file-link:hover { + color: var(--interactive-accent-hover); + text-decoration: underline; +} + +/* Tag/label styling */ +.d2h-tag { + background-color: var(--background-modifier-border); + color: var(--text-normal); + border-radius: var(--radius-s); + padding: 2px 6px; + font-size: var(--font-ui-smaller); +} + +/* Diff table */ +.d2h-diff-table { + border-color: var(--background-modifier-border); + background-color: var(--background-primary); +} + +/* Empty placeholder */ +.d2h-empty-placeholder { + color: var(--text-faint); + background-color: var(--background-secondary); +} + +/* ======================================== + OBSIDIAN-SPECIFIC ENHANCEMENTS + ======================================== */ + +/* Integrate with Obsidian's scrollbar styling */ +.d2h-wrapper::-webkit-scrollbar { + width: var(--scrollbar-width); +} + +.d2h-wrapper::-webkit-scrollbar-track { + background: var(--background-primary); +} + +.d2h-wrapper::-webkit-scrollbar-thumb { + background: var(--scrollbar-thumb-bg); + border-radius: var(--radius-s); +} + +.d2h-wrapper::-webkit-scrollbar-thumb:hover { + background: var(--scrollbar-active-thumb-bg); +} + +/* Match Obsidian's border radius */ +.d2h-file-wrapper { + border-radius: var(--radius-m); +} + +.d2h-file-header { + border-top-left-radius: var(--radius-m); + border-top-right-radius: var(--radius-m); +} + +/* Ensure proper contrast in Obsidian's theme */ +.theme-light .d2h-code-line, +.theme-light .d2h-code-linenumber { + border-color: var(--background-modifier-border); +} + +.theme-dark .d2h-code-line, +.theme-dark .d2h-code-linenumber { + border-color: var(--background-modifier-border); +} + +/* Responsive adjustments for mobile */ +.is-mobile .d2h-wrapper { + font-size: var(--font-ui-smaller); +} + +.is-mobile .d2h-code-line { + font-size: var(--font-ui-smaller); + padding: var(--size-2-1) var(--size-2-2); +} + +/* ======================================== + ACCESSIBILITY IMPROVEMENTS + ======================================== */ + +/* Ensure focus states are visible */ +.d2h-file-list-line:focus, +.d2h-file-name-link:focus { + outline: 2px solid var(--interactive-accent); + outline-offset: 2px; +} + +/* Improve contrast for line numbers */ +.d2h-code-linenumber { + opacity: 0.7; +} + +.d2h-code-line:hover .d2h-code-linenumber { + opacity: 1; +} + +/* ======================================== + PRINT STYLES + ======================================== */ + +@media print { + .d2h-wrapper { + background: white; + color: black; + } + + .d2h-ins { + background-color: #d4ffd4 !important; + } + + .d2h-del { + background-color: #ffd4d4 !important; + } + + .d2h-code-linenumber { + background-color: #f5f5f5 !important; + } +} \ No newline at end of file diff --git a/Views/DiffView.ts b/Views/DiffView.ts new file mode 100644 index 0000000..9dc6264 --- /dev/null +++ b/Views/DiffView.ts @@ -0,0 +1,61 @@ +import { Diff2HtmlUI, type Diff2HtmlUIConfig } from "diff2html/lib/ui/js/diff2html-ui"; +import { ItemView, WorkspaceLeaf, type ViewStateResult } from "obsidian"; + +export const VIEW_TYPE_DIFF = 'vaultkeeper-ai-diff-view'; + +interface DiffViewState { + diffString: string; + config: Diff2HtmlUIConfig; +} + +export class DiffView extends ItemView { + + private diffString: string = ""; + private config: Diff2HtmlUIConfig = {}; + + private diffContainer: HTMLElement | null = null; + + constructor(leaf: WorkspaceLeaf) { + super(leaf); + } + + public getViewType(): string { + return VIEW_TYPE_DIFF; + } + + public getDisplayText(): string { + return "Vaultkeeper AI diff"; + } + + public async setState(state: DiffViewState, result: ViewStateResult): Promise { + this.diffString = state.diffString; + this.config = state.config; + + this.renderDiff(); + + return super.setState(state, result); + } + + public getState(): Record { + return { + diffString: this.diffString, + config: this.config + }; + } + + private renderDiff() { + const container = this.contentEl; + container.empty(); + + if (this.diffContainer) { + this.diffContainer.remove(); + this.diffContainer = null + } + + this.diffContainer = container.createDiv({ cls: 'd2h-wrapper' }); + const diff2htmlUi = new Diff2HtmlUI(this.diffContainer, this.diffString, this.config); + + diff2htmlUi.draw(); + } + +} \ No newline at end of file diff --git a/Views/MainView.ts b/Views/MainView.ts index 0ec06bc..063466f 100644 --- a/Views/MainView.ts +++ b/Views/MainView.ts @@ -24,20 +24,20 @@ export class MainView extends ItemView { topBar: ReturnType | undefined; input: ChatWindowComponent | undefined; - getViewType() { + public getViewType() { return VIEW_TYPE_MAIN; } - getDisplayText() { + public getDisplayText() { return "Vaultkeeper AI"; } - getIcon(): string { + public getIcon(): string { return 'sparkles'; } // eslint-disable-next-line @typescript-eslint/require-await -- mount operations are valid but synchronous - async onOpen() { + public async onOpen() { const container = this.contentEl; container.empty(); @@ -60,7 +60,7 @@ export class MainView extends ItemView { }) as ChatWindowComponent; } - async onClose() { + public async onClose() { if (this.topBar) { await unmount(this.topBar); } diff --git a/__tests__/Conversations/Conversation.test.ts b/__tests__/Conversations/Conversation.test.ts index c839d9a..ce5882a 100644 --- a/__tests__/Conversations/Conversation.test.ts +++ b/__tests__/Conversations/Conversation.test.ts @@ -66,8 +66,7 @@ describe('Conversation', () => { functionCall: '', timestamp: '2024-01-01T00:00:00.000Z', isFunctionCall: false, - isFunctionCallResponse: false, - errorType: undefined + isFunctionCallResponse: false } ] }; diff --git a/__tests__/Conversations/ConversationContent.test.ts b/__tests__/Conversations/ConversationContent.test.ts index 2cca689..7f98119 100644 --- a/__tests__/Conversations/ConversationContent.test.ts +++ b/__tests__/Conversations/ConversationContent.test.ts @@ -122,10 +122,9 @@ describe('ConversationContent', () => { content: 'Hello', promptContent: '', functionCall: '', - timestamp: '2024-01-01T00:00:00.000Z', + timestamp: '2024-01-01T00:00:00:00.000Z', isFunctionCall: false, - isFunctionCallResponse: false, - errorType: undefined + isFunctionCallResponse: false }; expect(ConversationContent.isConversationContentData(validData)).toBe(true); @@ -140,8 +139,7 @@ describe('ConversationContent', () => { timestamp: '2024-01-01T00:00:00.000Z', isFunctionCall: true, isFunctionCallResponse: false, - toolId: 'tool-123', - errorType: undefined + toolId: 'tool-123' }; expect(ConversationContent.isConversationContentData(validData)).toBe(true); @@ -328,8 +326,7 @@ describe('ConversationContent', () => { functionCall: '', timestamp: '2024-01-01T00:00:00.000Z', isFunctionCall: false, - isFunctionCallResponse: false, - errorType: undefined + isFunctionCallResponse: false }; expect(ConversationContent.isConversationContentData(validData)).toBe(true); @@ -343,8 +340,7 @@ describe('ConversationContent', () => { functionCall: '', timestamp: '', isFunctionCall: false, - isFunctionCallResponse: false, - errorType: undefined + isFunctionCallResponse: false }; expect(ConversationContent.isConversationContentData(validData)).toBe(true); diff --git a/__tests__/Services/ConversationFileSystemService.test.ts b/__tests__/Services/ConversationFileSystemService.test.ts index f76762d..2730e80 100644 --- a/__tests__/Services/ConversationFileSystemService.test.ts +++ b/__tests__/Services/ConversationFileSystemService.test.ts @@ -127,7 +127,8 @@ describe('ConversationFileSystemService - Integration Tests', () => { }) ]) }), - true + true, + false ); }); @@ -377,8 +378,7 @@ describe('ConversationFileSystemService - Integration Tests', () => { functionCall: '', timestamp: '2024-01-01T10:00:00.000Z', isFunctionCall: false, - isFunctionCallResponse: false, - errorType: undefined + isFunctionCallResponse: false } ] }) @@ -394,8 +394,7 @@ describe('ConversationFileSystemService - Integration Tests', () => { functionCall: '', timestamp: '2024-01-02T10:00:00.000Z', isFunctionCall: false, - isFunctionCallResponse: false, - errorType: undefined + isFunctionCallResponse: false } ] }); @@ -428,8 +427,7 @@ describe('ConversationFileSystemService - Integration Tests', () => { functionCall: '', timestamp: '2024-01-01T10:00:00.000Z', isFunctionCall: false, - isFunctionCallResponse: false, - errorType: undefined + isFunctionCallResponse: false }, { role: Role.Assistant, @@ -438,8 +436,7 @@ describe('ConversationFileSystemService - Integration Tests', () => { functionCall: '', timestamp: '2024-01-01T10:01:00.000Z', isFunctionCall: false, - isFunctionCallResponse: false, - errorType: undefined + isFunctionCallResponse: false } ] }); @@ -506,8 +503,7 @@ describe('ConversationFileSystemService - Integration Tests', () => { timestamp: '2024-01-01T10:00:00.000Z', isFunctionCall: true, isFunctionCallResponse: false, - toolId: 'tool_1', - errorType: undefined + toolId: 'tool_1' }, { role: Role.User, @@ -517,8 +513,7 @@ describe('ConversationFileSystemService - Integration Tests', () => { timestamp: '2024-01-01T10:01:00.000Z', isFunctionCall: false, isFunctionCallResponse: true, - toolId: 'tool_1', - errorType: undefined + toolId: 'tool_1' } ] }); @@ -614,7 +609,8 @@ describe('ConversationFileSystemService - Integration Tests', () => { mockFileSystemService.listFilesInDirectory.mockResolvedValue(mockFiles); const savedData = mockFileSystemService.writeObjectToFile.mock.calls[0][1]; - mockFileSystemService.readObjectFromFile.mockResolvedValue(savedData); + // Simulate JSON serialization/deserialization which removes undefined values + mockFileSystemService.readObjectFromFile.mockResolvedValue(JSON.parse(JSON.stringify(savedData))); const loaded = await service.getAllConversations(); expect(loaded[0].title).toBe('Original'); @@ -677,7 +673,8 @@ describe('ConversationFileSystemService - Integration Tests', () => { mockFileSystemService.listFilesInDirectory.mockResolvedValue([ createMockFile('Vaultkeeper AI/Conversations/Complete Test.json') ]); - mockFileSystemService.readObjectFromFile.mockResolvedValue(savedData); + // Simulate JSON serialization/deserialization which removes undefined values + mockFileSystemService.readObjectFromFile.mockResolvedValue(JSON.parse(JSON.stringify(savedData))); const loaded = await service.getAllConversations(); const reconstructed = loaded[0]; diff --git a/__tests__/Services/FileSystemService.test.ts b/__tests__/Services/FileSystemService.test.ts index 854a868..fe3404a 100644 --- a/__tests__/Services/FileSystemService.test.ts +++ b/__tests__/Services/FileSystemService.test.ts @@ -489,7 +489,7 @@ describe('FileSystemService', () => { const result = await fileSystemService.writeObjectToFile('data.json', data); expect(result).toBe(mockFile); - expect(mockVaultService.create).toHaveBeenCalledWith('data.json', expectedJson, false); + expect(mockVaultService.create).toHaveBeenCalledWith('data.json', expectedJson, false, true); }); it('should serialize and write object to existing file', async () => { @@ -503,7 +503,7 @@ describe('FileSystemService', () => { const result = await fileSystemService.writeObjectToFile('existing.json', data); expect(result).toBe(mockFile); - expect(mockVaultService.modify).toHaveBeenCalledWith(mockFile, expectedJson, false); + expect(mockVaultService.modify).toHaveBeenCalledWith(mockFile, expectedJson, false, true); }); it('should format JSON with 4-space indentation', async () => { @@ -515,7 +515,7 @@ describe('FileSystemService', () => { await fileSystemService.writeObjectToFile('formatted.json', data); const expectedJson = JSON.stringify(data, null, 4); - expect(mockVaultService.create).toHaveBeenCalledWith('formatted.json', expectedJson, false); + expect(mockVaultService.create).toHaveBeenCalledWith('formatted.json', expectedJson, false, true); // Verify it contains newlines and indentation expect(expectedJson).toContain('\n'); expect(expectedJson).toContain(' '); @@ -532,7 +532,7 @@ describe('FileSystemService', () => { const result = await fileSystemService.writeObjectToFile('empty.json', data); expect(result).toBe(mockFile); - expect(mockVaultService.create).toHaveBeenCalledWith('empty.json', expectedJson, false); + expect(mockVaultService.create).toHaveBeenCalledWith('empty.json', expectedJson, false, true); }); it('should handle arrays', async () => { @@ -546,7 +546,7 @@ describe('FileSystemService', () => { const result = await fileSystemService.writeObjectToFile('array.json', data); expect(result).toBe(mockFile); - expect(mockVaultService.create).toHaveBeenCalledWith('array.json', expectedJson, false); + expect(mockVaultService.create).toHaveBeenCalledWith('array.json', expectedJson, false, true); }); it('should respect allowAccessToPluginRoot parameter', async () => { @@ -559,7 +559,7 @@ describe('FileSystemService', () => { await fileSystemService.writeObjectToFile('plugin/config.json', data, true); expect(mockVaultService.getAbstractFileByPath).toHaveBeenCalledWith('plugin/config.json', true); - expect(mockVaultService.create).toHaveBeenCalledWith('plugin/config.json', expectedJson, true); + expect(mockVaultService.create).toHaveBeenCalledWith('plugin/config.json', expectedJson, true, true); }); it('should return Error on write error', async () => { diff --git a/__tests__/Services/VaultCacheService.performance.test.ts b/__tests__/Services/VaultCacheService.performance.test.ts index b1d02b6..a502032 100644 --- a/__tests__/Services/VaultCacheService.performance.test.ts +++ b/__tests__/Services/VaultCacheService.performance.test.ts @@ -452,9 +452,19 @@ beforeEach(() => { // Register services RegisterSingleton(Services.VaultkeeperAIPlugin, mockPlugin); - RegisterSingleton(Services.FileManager, mockFileManager); RegisterSingleton(Services.SanitiserService, new SanitiserService()); + // Mock EventService and DiffService to avoid Obsidian Events dependency + const mockEventService = { trigger: vi.fn(), on: vi.fn(), off: vi.fn() }; + const mockDiffService = { + requestDiff: vi.fn().mockResolvedValue({ accepted: true }), + onAccept: vi.fn(), + onReject: vi.fn(), + onSuggest: vi.fn() + }; + RegisterSingleton(Services.EventService, mockEventService as any); + RegisterSingleton(Services.DiffService, mockDiffService as any); + // Create settings service settingsService = new SettingsService(mockSettings); RegisterSingleton(Services.SettingsService, settingsService); diff --git a/__tests__/Services/VaultService.performance.test.ts b/__tests__/Services/VaultService.performance.test.ts index e8a6dc0..26b58aa 100644 --- a/__tests__/Services/VaultService.performance.test.ts +++ b/__tests__/Services/VaultService.performance.test.ts @@ -353,9 +353,19 @@ beforeEach(() => { // Register services RegisterSingleton(Services.VaultkeeperAIPlugin, mockPlugin); - RegisterSingleton(Services.FileManager, mockFileManager); RegisterSingleton(Services.SanitiserService, new SanitiserService()); + // Mock EventService and DiffService to avoid Obsidian Events dependency + const mockEventService = { trigger: vi.fn(), on: vi.fn(), off: vi.fn() }; + const mockDiffService = { + requestDiff: vi.fn().mockResolvedValue({ accepted: true }), + onAccept: vi.fn(), + onReject: vi.fn(), + onSuggest: vi.fn() + }; + RegisterSingleton(Services.EventService, mockEventService as any); + RegisterSingleton(Services.DiffService, mockDiffService as any); + // Create settings service with test configuration settingsService = new SettingsService(mockSettings); RegisterSingleton(Services.SettingsService, settingsService); diff --git a/__tests__/Services/VaultService.test.ts b/__tests__/Services/VaultService.test.ts index f7cad51..9618e72 100644 --- a/__tests__/Services/VaultService.test.ts +++ b/__tests__/Services/VaultService.test.ts @@ -121,9 +121,19 @@ describe('VaultService - Integration Tests', () => { // Register real dependencies in DependencyService RegisterSingleton(Services.VaultkeeperAIPlugin, mockPlugin as any); - RegisterSingleton(Services.FileManager, mockFileManager); RegisterSingleton(Services.SanitiserService, new SanitiserService()); + // Mock EventService and DiffService to avoid Obsidian Events dependency + const mockEventService = { trigger: vi.fn(), on: vi.fn(), off: vi.fn() }; + const mockDiffService = { + requestDiff: vi.fn().mockResolvedValue({ accepted: true }), + onAccept: vi.fn(), + onReject: vi.fn(), + onSuggest: vi.fn() + }; + RegisterSingleton(Services.EventService, mockEventService as any); + RegisterSingleton(Services.DiffService, mockDiffService as any); + // Create and register SettingsService settingsService = new SettingsService(mockSettings); RegisterSingleton(Services.SettingsService, settingsService); diff --git a/esbuild.config.mjs b/esbuild.config.mjs index 0f0c5db..00ea1aa 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -1,9 +1,10 @@ import esbuild from "esbuild"; import process from "process"; import builtins from "builtin-modules"; -import { copyFileSync, mkdirSync, existsSync, readdirSync, statSync } from "fs"; -import esbuildSvelte from 'esbuild-svelte'; -import { sveltePreprocess } from 'svelte-preprocess'; +import { copyFileSync, mkdirSync, existsSync, readdirSync, statSync, readFileSync, writeFileSync, unlinkSync } from "fs"; +import { join } from "path"; +import esbuildSvelte from "esbuild-svelte"; +import { sveltePreprocess } from "svelte-preprocess"; const banner = `/* @@ -14,18 +15,21 @@ if you want to view the source, please visit the github repository of this plugi const prod = (process.argv[2] === "production"); +// Clean up build artifacts that aren"t needed (main.css, main.js, font files) +const CLEANUP_BUILD_ARTIFACTS = true; // Set to false if you need to debug these files + // Function to copy directory recursively function copyDir(src, dest) { if (!existsSync(dest)) { mkdirSync(dest, { recursive: true }); } - + const files = readdirSync(src); - + for (const file of files) { const srcPath = join(src, file); const destPath = join(dest, file); - + if (statSync(srcPath).isDirectory()) { copyDir(srcPath, destPath); } else { @@ -35,12 +39,76 @@ function copyDir(src, dest) { } } +// Plugin to merge CSS files into styles.css and cleanup build artifacts +const cssMergerPlugin = { + name: "css-merger", + setup(build) { + build.onEnd(() => { + // esbuild outputs CSS as main.css (based on outfile: main.js) + const generatedCss = "main.css"; + const customCssDir = "Styles"; + const outputCss = "styles.css"; + + let mergedCss = ""; + + // Read generated CSS from dependencies if it exists + if (existsSync(generatedCss)) { + mergedCss += readFileSync(generatedCss, "utf-8"); + mergedCss += "\n\n/* Custom Styles */\n\n"; + } + + // Append custom CSS files from styles directory + if (existsSync(customCssDir)) { + const cssFiles = readdirSync(customCssDir) + .filter(file => file.endsWith(".css")) + .sort(); + + for (const cssFile of cssFiles) { + const cssPath = join(customCssDir, cssFile); + mergedCss += readFileSync(cssPath, "utf-8"); + mergedCss += "\n\n"; + console.log(`📦 Merged: ${cssPath}`); + } + } + + // Write merged CSS to styles.css + writeFileSync(outputCss, mergedCss); + console.log(`✅ Generated: ${outputCss}`); + + // Clean up build artifacts if enabled + if (CLEANUP_BUILD_ARTIFACTS) { + // Remove main.css (intermediate CSS file) + if (existsSync(generatedCss)) { + unlinkSync(generatedCss); + console.log(`🗑️ Removed: ${generatedCss}`); + } + + // Remove KaTeX font files + let anyRemoved = false; + const fontExtensions = [".woff", ".woff2", ".ttf"]; + const files = readdirSync("."); + for (const file of files) { + const ext = file.substring(file.lastIndexOf(".")); + if (fontExtensions.includes(ext)) { + unlinkSync(file); + anyRemoved = true; + } + } + if (anyRemoved) { + console.log("🗑️ Removed KaTeX Font Files"); + } + } + }); + } +}; + const buildOptions = { plugins: [ esbuildSvelte({ - compilerOptions: { css: 'injected' }, + compilerOptions: { css: "injected" }, preprocess: sveltePreprocess(), }), + cssMergerPlugin, ], banner: { js: banner, @@ -70,10 +138,10 @@ const buildOptions = { outfile: "main.js", minify: prod, loader: { - '.css': 'css', - '.ttf': 'file', - '.woff': 'file', - '.woff2': 'file', + ".css": "css", + ".ttf": "file", + ".woff": "file", + ".woff2": "file", }, }; @@ -83,5 +151,4 @@ if (prod) { } else { const ctx = await esbuild.context(buildOptions); await ctx.watch(); - console.log("👀 Watching for changes..."); } \ No newline at end of file diff --git a/main.ts b/main.ts index 68c88da..8bfca22 100644 --- a/main.ts +++ b/main.ts @@ -2,6 +2,7 @@ import { WorkspaceLeaf, Plugin } from "obsidian"; import { MainView, VIEW_TYPE_MAIN } from "Views/MainView"; import { RegisterDependencies, RegisterPlugin } from "Services/ServiceRegistration"; import { VaultkeeperAISettingTab } from "VaultkeeperAISettingTab"; +import { DiffView, VIEW_TYPE_DIFF } from "Views/DiffView"; import { Services } from "Services/Services"; import type { StatusBarService } from "Services/StatusBarService"; import { DeregisterAllServices, Resolve } from "Services/DependencyService"; @@ -9,9 +10,12 @@ import type { VaultService } from "Services/VaultService"; import { Path } from "Enums/Path"; import { Copy } from "Enums/Copy"; import type { SettingsService } from "Services/SettingsService"; +import type { Diff2HtmlUIConfig } from "diff2html/lib/ui/js/diff2html-ui"; import "katex/dist/katex.min.css"; -import "./styles.css"; +import 'highlight.js/styles/github.min.css'; +import 'diff2html/bundles/css/diff2html.min.css'; +import 'diff2html/bundles/js/diff2html-ui.min.js'; export default class VaultkeeperAIPlugin extends Plugin { @@ -23,17 +27,21 @@ export default class VaultkeeperAIPlugin extends Plugin { VIEW_TYPE_MAIN, (leaf) => new MainView(leaf) ); + this.registerView( + VIEW_TYPE_DIFF, + (leaf) => new DiffView(leaf) + ); this.addCommand({ id: "open", name: "Open", callback: async () => { - await this.activateView(); + await this.activateMainView(); } }); this.addRibbonIcon("sparkles", "Vaultkeeper AI", async () => { - await this.activateView(); + await this.activateMainView(); }); this.addSettingTab(new VaultkeeperAISettingTab()); @@ -48,7 +56,7 @@ export default class VaultkeeperAIPlugin extends Plugin { DeregisterAllServices(); } - public async activateView() { + public async activateMainView() { const { workspace } = this.app; let leaf: WorkspaceLeaf | null = null; @@ -66,6 +74,25 @@ export default class VaultkeeperAIPlugin extends Plugin { } } + public async activateDiffView(diffString: string, config: Diff2HtmlUIConfig) { + const { workspace } = this.app; + + let leaf: WorkspaceLeaf | null = null; + const leaves = workspace.getLeavesOfType(VIEW_TYPE_DIFF); + + leaf = leaves.length > 0 ? leaves[0] : workspace.getLeaf("tab"); + + await leaf?.setViewState({ + type: VIEW_TYPE_DIFF, + active: true, + state: { diffString, config } + }); + + if (leaf != null) { + await workspace.revealLeaf(leaf); + } + } + // create example user instruction (on first launch only) private async setup() { const settingsService = Resolve(Services.SettingsService); diff --git a/package-lock.json b/package-lock.json index e62f325..e0836bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@google/genai": "^1.30.0", "@shikijs/rehype": "^3.15.0", "core-js": "^3.47.0", + "diff": "^8.0.2", "diff2html": "^3.4.52", "express": "^5.1.0", "fuzzysort": "^3.1.0", @@ -3036,9 +3037,9 @@ } }, "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -3060,6 +3061,15 @@ "highlight.js": "11.9.0" } }, + "node_modules/diff2html/node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff2html/node_modules/highlight.js": { "version": "11.9.0", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz", diff --git a/package.json b/package.json index e594a0a..08cd58d 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "@google/genai": "^1.30.0", "@shikijs/rehype": "^3.15.0", "core-js": "^3.47.0", + "diff": "^8.0.2", "diff2html": "^3.4.52", "express": "^5.1.0", "fuzzysort": "^3.1.0", diff --git a/styles.css b/styles.css index b53f59f..ab96570 100644 --- a/styles.css +++ b/styles.css @@ -1,3 +1,1987 @@ +/* node_modules/katex/dist/katex.min.css */ +@font-face { + font-display: block; + font-family: KaTeX_AMS; + font-style: normal; + font-weight: 400; + src: + url("./KaTeX_AMS-Regular-U6PRYMIZ.woff2") format("woff2"), + url("./KaTeX_AMS-Regular-CYEKBG2K.woff") format("woff"), + url("./KaTeX_AMS-Regular-JKX5W2C4.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Caligraphic; + font-style: normal; + font-weight: 700; + src: + url("./KaTeX_Caligraphic-Bold-5QL5CMTE.woff2") format("woff2"), + url("./KaTeX_Caligraphic-Bold-WZ3QSGD3.woff") format("woff"), + url("./KaTeX_Caligraphic-Bold-ZTS3R3HK.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Caligraphic; + font-style: normal; + font-weight: 400; + src: + url("./KaTeX_Caligraphic-Regular-KX5MEWCF.woff2") format("woff2"), + url("./KaTeX_Caligraphic-Regular-3LKEU76G.woff") format("woff"), + url("./KaTeX_Caligraphic-Regular-A7XRTZ5Q.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Fraktur; + font-style: normal; + font-weight: 700; + src: + url("./KaTeX_Fraktur-Bold-2QVFK6NQ.woff2") format("woff2"), + url("./KaTeX_Fraktur-Bold-T4SWXBMT.woff") format("woff"), + url("./KaTeX_Fraktur-Bold-WGHVTYOR.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Fraktur; + font-style: normal; + font-weight: 400; + src: + url("./KaTeX_Fraktur-Regular-2PEIFJSJ.woff2") format("woff2"), + url("./KaTeX_Fraktur-Regular-PQMHCIK6.woff") format("woff"), + url("./KaTeX_Fraktur-Regular-5U4OPH2X.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Main; + font-style: normal; + font-weight: 700; + src: + url("./KaTeX_Main-Bold-YP5VVQRP.woff2") format("woff2"), + url("./KaTeX_Main-Bold-2GA4IZIN.woff") format("woff"), + url("./KaTeX_Main-Bold-W5FBVCZM.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Main; + font-style: italic; + font-weight: 700; + src: + url("./KaTeX_Main-BoldItalic-N4V3DX7S.woff2") format("woff2"), + url("./KaTeX_Main-BoldItalic-4P4C7HJH.woff") format("woff"), + url("./KaTeX_Main-BoldItalic-ODMLBJJQ.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Main; + font-style: italic; + font-weight: 400; + src: + url("./KaTeX_Main-Italic-RELBIK7M.woff2") format("woff2"), + url("./KaTeX_Main-Italic-SASNQFN2.woff") format("woff"), + url("./KaTeX_Main-Italic-I43T2HSR.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Main; + font-style: normal; + font-weight: 400; + src: + url("./KaTeX_Main-Regular-ARRPAO67.woff2") format("woff2"), + url("./KaTeX_Main-Regular-P5I74A2A.woff") format("woff"), + url("./KaTeX_Main-Regular-W74P5G27.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Math; + font-style: italic; + font-weight: 700; + src: + url("./KaTeX_Math-BoldItalic-K4WTGH3J.woff2") format("woff2"), + url("./KaTeX_Math-BoldItalic-6EBV3DK5.woff") format("woff"), + url("./KaTeX_Math-BoldItalic-VB447A4D.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Math; + font-style: italic; + font-weight: 400; + src: + url("./KaTeX_Math-Italic-6KGCHLFN.woff2") format("woff2"), + url("./KaTeX_Math-Italic-KKK3USB2.woff") format("woff"), + url("./KaTeX_Math-Italic-SON4MRCA.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: "KaTeX_SansSerif"; + font-style: normal; + font-weight: 700; + src: + url("./KaTeX_SansSerif-Bold-RRNVJFFW.woff2") format("woff2"), + url("./KaTeX_SansSerif-Bold-X5M5EMOD.woff") format("woff"), + url("./KaTeX_SansSerif-Bold-STQ6RXC7.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: "KaTeX_SansSerif"; + font-style: italic; + font-weight: 400; + src: + url("./KaTeX_SansSerif-Italic-HMPFTM52.woff2") format("woff2"), + url("./KaTeX_SansSerif-Italic-PSN4QKYX.woff") format("woff"), + url("./KaTeX_SansSerif-Italic-WTBAZBGY.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: "KaTeX_SansSerif"; + font-style: normal; + font-weight: 400; + src: + url("./KaTeX_SansSerif-Regular-XIQ62X4E.woff2") format("woff2"), + url("./KaTeX_SansSerif-Regular-OQCII6EP.woff") format("woff"), + url("./KaTeX_SansSerif-Regular-2TL3USAE.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Script; + font-style: normal; + font-weight: 400; + src: + url("./KaTeX_Script-Regular-APUWIHLP.woff2") format("woff2"), + url("./KaTeX_Script-Regular-A5IFOEBS.woff") format("woff"), + url("./KaTeX_Script-Regular-72OLXYNA.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Size1; + font-style: normal; + font-weight: 400; + src: + url("./KaTeX_Size1-Regular-5LRUTBFT.woff2") format("woff2"), + url("./KaTeX_Size1-Regular-4HRHTS65.woff") format("woff"), + url("./KaTeX_Size1-Regular-7K6AASVL.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Size2; + font-style: normal; + font-weight: 400; + src: + url("./KaTeX_Size2-Regular-LELKET5D.woff2") format("woff2"), + url("./KaTeX_Size2-Regular-K5ZHAIS6.woff") format("woff"), + url("./KaTeX_Size2-Regular-222HN3GT.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Size3; + font-style: normal; + font-weight: 400; + src: + url("./KaTeX_Size3-Regular-WQRQ47UD.woff2") format("woff2"), + url("./KaTeX_Size3-Regular-TLFPAHDE.woff") format("woff"), + url("./KaTeX_Size3-Regular-UFCO6WCA.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Size4; + font-style: normal; + font-weight: 400; + src: + url("./KaTeX_Size4-Regular-CDMV7U5C.woff2") format("woff2"), + url("./KaTeX_Size4-Regular-PKMWZHNC.woff") format("woff"), + url("./KaTeX_Size4-Regular-7PGNVPQK.ttf") format("truetype"); +} +@font-face { + font-display: block; + font-family: KaTeX_Typewriter; + font-style: normal; + font-weight: 400; + src: + url("./KaTeX_Typewriter-Regular-VBYJ4NRC.woff2") format("woff2"), + url("./KaTeX_Typewriter-Regular-MJMFSK64.woff") format("woff"), + url("./KaTeX_Typewriter-Regular-3F5K6SQ6.ttf") format("truetype"); +} +.katex { + font: + normal 1.21em KaTeX_Main, + Times New Roman, + serif; + line-height: 1.2; + text-indent: 0; + text-rendering: auto; +} +.katex * { + -ms-high-contrast-adjust: none !important; + border-color: currentColor; +} +.katex .katex-version:after { + content: "0.16.25"; +} +.katex .katex-mathml { + clip: rect(1px, 1px, 1px, 1px); + border: 0; + height: 1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.katex .katex-html > .newline { + display: block; +} +.katex .base { + position: relative; + white-space: nowrap; + width: -webkit-min-content; + width: -moz-min-content; + width: min-content; +} +.katex .base, +.katex .strut { + display: inline-block; +} +.katex .textbf { + font-weight: 700; +} +.katex .textit { + font-style: italic; +} +.katex .textrm { + font-family: KaTeX_Main; +} +.katex .textsf { + font-family: KaTeX_SansSerif; +} +.katex .texttt { + font-family: KaTeX_Typewriter; +} +.katex .mathnormal { + font-family: KaTeX_Math; + font-style: italic; +} +.katex .mathit { + font-family: KaTeX_Main; + font-style: italic; +} +.katex .mathrm { + font-style: normal; +} +.katex .mathbf { + font-family: KaTeX_Main; + font-weight: 700; +} +.katex .boldsymbol { + font-family: KaTeX_Math; + font-style: italic; + font-weight: 700; +} +.katex .amsrm, +.katex .mathbb, +.katex .textbb { + font-family: KaTeX_AMS; +} +.katex .mathcal { + font-family: KaTeX_Caligraphic; +} +.katex .mathfrak, +.katex .textfrak { + font-family: KaTeX_Fraktur; +} +.katex .mathboldfrak, +.katex .textboldfrak { + font-family: KaTeX_Fraktur; + font-weight: 700; +} +.katex .mathtt { + font-family: KaTeX_Typewriter; +} +.katex .mathscr, +.katex .textscr { + font-family: KaTeX_Script; +} +.katex .mathsf, +.katex .textsf { + font-family: KaTeX_SansSerif; +} +.katex .mathboldsf, +.katex .textboldsf { + font-family: KaTeX_SansSerif; + font-weight: 700; +} +.katex .mathitsf, +.katex .mathsfit, +.katex .textitsf { + font-family: KaTeX_SansSerif; + font-style: italic; +} +.katex .mainrm { + font-family: KaTeX_Main; + font-style: normal; +} +.katex .vlist-t { + border-collapse: collapse; + display: inline-table; + table-layout: fixed; +} +.katex .vlist-r { + display: table-row; +} +.katex .vlist { + display: table-cell; + position: relative; + vertical-align: bottom; +} +.katex .vlist > span { + display: block; + height: 0; + position: relative; +} +.katex .vlist > span > span { + display: inline-block; +} +.katex .vlist > span > .pstrut { + overflow: hidden; + width: 0; +} +.katex .vlist-t2 { + margin-right: -2px; +} +.katex .vlist-s { + display: table-cell; + font-size: 1px; + min-width: 2px; + vertical-align: bottom; + width: 2px; +} +.katex .vbox { + align-items: baseline; + display: inline-flex; + flex-direction: column; +} +.katex .hbox { + width: 100%; +} +.katex .hbox, +.katex .thinbox { + display: inline-flex; + flex-direction: row; +} +.katex .thinbox { + max-width: 0; + width: 0; +} +.katex .msupsub { + text-align: left; +} +.katex .mfrac > span > span { + text-align: center; +} +.katex .mfrac .frac-line { + border-bottom-style: solid; + display: inline-block; + width: 100%; +} +.katex .hdashline, +.katex .hline, +.katex .mfrac .frac-line, +.katex .overline .overline-line, +.katex .rule, +.katex .underline .underline-line { + min-height: 1px; +} +.katex .mspace { + display: inline-block; +} +.katex .clap, +.katex .llap, +.katex .rlap { + position: relative; + width: 0; +} +.katex .clap > .inner, +.katex .llap > .inner, +.katex .rlap > .inner { + position: absolute; +} +.katex .clap > .fix, +.katex .llap > .fix, +.katex .rlap > .fix { + display: inline-block; +} +.katex .llap > .inner { + right: 0; +} +.katex .clap > .inner, +.katex .rlap > .inner { + left: 0; +} +.katex .clap > .inner > span { + margin-left: -50%; + margin-right: 50%; +} +.katex .rule { + border: 0 solid; + display: inline-block; + position: relative; +} +.katex .hline, +.katex .overline .overline-line, +.katex .underline .underline-line { + border-bottom-style: solid; + display: inline-block; + width: 100%; +} +.katex .hdashline { + border-bottom-style: dashed; + display: inline-block; + width: 100%; +} +.katex .sqrt > .root { + margin-left: .2777777778em; + margin-right: -.5555555556em; +} +.katex .fontsize-ensurer.reset-size1.size1, +.katex .sizing.reset-size1.size1 { + font-size: 1em; +} +.katex .fontsize-ensurer.reset-size1.size2, +.katex .sizing.reset-size1.size2 { + font-size: 1.2em; +} +.katex .fontsize-ensurer.reset-size1.size3, +.katex .sizing.reset-size1.size3 { + font-size: 1.4em; +} +.katex .fontsize-ensurer.reset-size1.size4, +.katex .sizing.reset-size1.size4 { + font-size: 1.6em; +} +.katex .fontsize-ensurer.reset-size1.size5, +.katex .sizing.reset-size1.size5 { + font-size: 1.8em; +} +.katex .fontsize-ensurer.reset-size1.size6, +.katex .sizing.reset-size1.size6 { + font-size: 2em; +} +.katex .fontsize-ensurer.reset-size1.size7, +.katex .sizing.reset-size1.size7 { + font-size: 2.4em; +} +.katex .fontsize-ensurer.reset-size1.size8, +.katex .sizing.reset-size1.size8 { + font-size: 2.88em; +} +.katex .fontsize-ensurer.reset-size1.size9, +.katex .sizing.reset-size1.size9 { + font-size: 3.456em; +} +.katex .fontsize-ensurer.reset-size1.size10, +.katex .sizing.reset-size1.size10 { + font-size: 4.148em; +} +.katex .fontsize-ensurer.reset-size1.size11, +.katex .sizing.reset-size1.size11 { + font-size: 4.976em; +} +.katex .fontsize-ensurer.reset-size2.size1, +.katex .sizing.reset-size2.size1 { + font-size: .8333333333em; +} +.katex .fontsize-ensurer.reset-size2.size2, +.katex .sizing.reset-size2.size2 { + font-size: 1em; +} +.katex .fontsize-ensurer.reset-size2.size3, +.katex .sizing.reset-size2.size3 { + font-size: 1.1666666667em; +} +.katex .fontsize-ensurer.reset-size2.size4, +.katex .sizing.reset-size2.size4 { + font-size: 1.3333333333em; +} +.katex .fontsize-ensurer.reset-size2.size5, +.katex .sizing.reset-size2.size5 { + font-size: 1.5em; +} +.katex .fontsize-ensurer.reset-size2.size6, +.katex .sizing.reset-size2.size6 { + font-size: 1.6666666667em; +} +.katex .fontsize-ensurer.reset-size2.size7, +.katex .sizing.reset-size2.size7 { + font-size: 2em; +} +.katex .fontsize-ensurer.reset-size2.size8, +.katex .sizing.reset-size2.size8 { + font-size: 2.4em; +} +.katex .fontsize-ensurer.reset-size2.size9, +.katex .sizing.reset-size2.size9 { + font-size: 2.88em; +} +.katex .fontsize-ensurer.reset-size2.size10, +.katex .sizing.reset-size2.size10 { + font-size: 3.4566666667em; +} +.katex .fontsize-ensurer.reset-size2.size11, +.katex .sizing.reset-size2.size11 { + font-size: 4.1466666667em; +} +.katex .fontsize-ensurer.reset-size3.size1, +.katex .sizing.reset-size3.size1 { + font-size: .7142857143em; +} +.katex .fontsize-ensurer.reset-size3.size2, +.katex .sizing.reset-size3.size2 { + font-size: .8571428571em; +} +.katex .fontsize-ensurer.reset-size3.size3, +.katex .sizing.reset-size3.size3 { + font-size: 1em; +} +.katex .fontsize-ensurer.reset-size3.size4, +.katex .sizing.reset-size3.size4 { + font-size: 1.1428571429em; +} +.katex .fontsize-ensurer.reset-size3.size5, +.katex .sizing.reset-size3.size5 { + font-size: 1.2857142857em; +} +.katex .fontsize-ensurer.reset-size3.size6, +.katex .sizing.reset-size3.size6 { + font-size: 1.4285714286em; +} +.katex .fontsize-ensurer.reset-size3.size7, +.katex .sizing.reset-size3.size7 { + font-size: 1.7142857143em; +} +.katex .fontsize-ensurer.reset-size3.size8, +.katex .sizing.reset-size3.size8 { + font-size: 2.0571428571em; +} +.katex .fontsize-ensurer.reset-size3.size9, +.katex .sizing.reset-size3.size9 { + font-size: 2.4685714286em; +} +.katex .fontsize-ensurer.reset-size3.size10, +.katex .sizing.reset-size3.size10 { + font-size: 2.9628571429em; +} +.katex .fontsize-ensurer.reset-size3.size11, +.katex .sizing.reset-size3.size11 { + font-size: 3.5542857143em; +} +.katex .fontsize-ensurer.reset-size4.size1, +.katex .sizing.reset-size4.size1 { + font-size: .625em; +} +.katex .fontsize-ensurer.reset-size4.size2, +.katex .sizing.reset-size4.size2 { + font-size: .75em; +} +.katex .fontsize-ensurer.reset-size4.size3, +.katex .sizing.reset-size4.size3 { + font-size: .875em; +} +.katex .fontsize-ensurer.reset-size4.size4, +.katex .sizing.reset-size4.size4 { + font-size: 1em; +} +.katex .fontsize-ensurer.reset-size4.size5, +.katex .sizing.reset-size4.size5 { + font-size: 1.125em; +} +.katex .fontsize-ensurer.reset-size4.size6, +.katex .sizing.reset-size4.size6 { + font-size: 1.25em; +} +.katex .fontsize-ensurer.reset-size4.size7, +.katex .sizing.reset-size4.size7 { + font-size: 1.5em; +} +.katex .fontsize-ensurer.reset-size4.size8, +.katex .sizing.reset-size4.size8 { + font-size: 1.8em; +} +.katex .fontsize-ensurer.reset-size4.size9, +.katex .sizing.reset-size4.size9 { + font-size: 2.16em; +} +.katex .fontsize-ensurer.reset-size4.size10, +.katex .sizing.reset-size4.size10 { + font-size: 2.5925em; +} +.katex .fontsize-ensurer.reset-size4.size11, +.katex .sizing.reset-size4.size11 { + font-size: 3.11em; +} +.katex .fontsize-ensurer.reset-size5.size1, +.katex .sizing.reset-size5.size1 { + font-size: .5555555556em; +} +.katex .fontsize-ensurer.reset-size5.size2, +.katex .sizing.reset-size5.size2 { + font-size: .6666666667em; +} +.katex .fontsize-ensurer.reset-size5.size3, +.katex .sizing.reset-size5.size3 { + font-size: .7777777778em; +} +.katex .fontsize-ensurer.reset-size5.size4, +.katex .sizing.reset-size5.size4 { + font-size: .8888888889em; +} +.katex .fontsize-ensurer.reset-size5.size5, +.katex .sizing.reset-size5.size5 { + font-size: 1em; +} +.katex .fontsize-ensurer.reset-size5.size6, +.katex .sizing.reset-size5.size6 { + font-size: 1.1111111111em; +} +.katex .fontsize-ensurer.reset-size5.size7, +.katex .sizing.reset-size5.size7 { + font-size: 1.3333333333em; +} +.katex .fontsize-ensurer.reset-size5.size8, +.katex .sizing.reset-size5.size8 { + font-size: 1.6em; +} +.katex .fontsize-ensurer.reset-size5.size9, +.katex .sizing.reset-size5.size9 { + font-size: 1.92em; +} +.katex .fontsize-ensurer.reset-size5.size10, +.katex .sizing.reset-size5.size10 { + font-size: 2.3044444444em; +} +.katex .fontsize-ensurer.reset-size5.size11, +.katex .sizing.reset-size5.size11 { + font-size: 2.7644444444em; +} +.katex .fontsize-ensurer.reset-size6.size1, +.katex .sizing.reset-size6.size1 { + font-size: .5em; +} +.katex .fontsize-ensurer.reset-size6.size2, +.katex .sizing.reset-size6.size2 { + font-size: .6em; +} +.katex .fontsize-ensurer.reset-size6.size3, +.katex .sizing.reset-size6.size3 { + font-size: .7em; +} +.katex .fontsize-ensurer.reset-size6.size4, +.katex .sizing.reset-size6.size4 { + font-size: .8em; +} +.katex .fontsize-ensurer.reset-size6.size5, +.katex .sizing.reset-size6.size5 { + font-size: .9em; +} +.katex .fontsize-ensurer.reset-size6.size6, +.katex .sizing.reset-size6.size6 { + font-size: 1em; +} +.katex .fontsize-ensurer.reset-size6.size7, +.katex .sizing.reset-size6.size7 { + font-size: 1.2em; +} +.katex .fontsize-ensurer.reset-size6.size8, +.katex .sizing.reset-size6.size8 { + font-size: 1.44em; +} +.katex .fontsize-ensurer.reset-size6.size9, +.katex .sizing.reset-size6.size9 { + font-size: 1.728em; +} +.katex .fontsize-ensurer.reset-size6.size10, +.katex .sizing.reset-size6.size10 { + font-size: 2.074em; +} +.katex .fontsize-ensurer.reset-size6.size11, +.katex .sizing.reset-size6.size11 { + font-size: 2.488em; +} +.katex .fontsize-ensurer.reset-size7.size1, +.katex .sizing.reset-size7.size1 { + font-size: .4166666667em; +} +.katex .fontsize-ensurer.reset-size7.size2, +.katex .sizing.reset-size7.size2 { + font-size: .5em; +} +.katex .fontsize-ensurer.reset-size7.size3, +.katex .sizing.reset-size7.size3 { + font-size: .5833333333em; +} +.katex .fontsize-ensurer.reset-size7.size4, +.katex .sizing.reset-size7.size4 { + font-size: .6666666667em; +} +.katex .fontsize-ensurer.reset-size7.size5, +.katex .sizing.reset-size7.size5 { + font-size: .75em; +} +.katex .fontsize-ensurer.reset-size7.size6, +.katex .sizing.reset-size7.size6 { + font-size: .8333333333em; +} +.katex .fontsize-ensurer.reset-size7.size7, +.katex .sizing.reset-size7.size7 { + font-size: 1em; +} +.katex .fontsize-ensurer.reset-size7.size8, +.katex .sizing.reset-size7.size8 { + font-size: 1.2em; +} +.katex .fontsize-ensurer.reset-size7.size9, +.katex .sizing.reset-size7.size9 { + font-size: 1.44em; +} +.katex .fontsize-ensurer.reset-size7.size10, +.katex .sizing.reset-size7.size10 { + font-size: 1.7283333333em; +} +.katex .fontsize-ensurer.reset-size7.size11, +.katex .sizing.reset-size7.size11 { + font-size: 2.0733333333em; +} +.katex .fontsize-ensurer.reset-size8.size1, +.katex .sizing.reset-size8.size1 { + font-size: .3472222222em; +} +.katex .fontsize-ensurer.reset-size8.size2, +.katex .sizing.reset-size8.size2 { + font-size: .4166666667em; +} +.katex .fontsize-ensurer.reset-size8.size3, +.katex .sizing.reset-size8.size3 { + font-size: .4861111111em; +} +.katex .fontsize-ensurer.reset-size8.size4, +.katex .sizing.reset-size8.size4 { + font-size: .5555555556em; +} +.katex .fontsize-ensurer.reset-size8.size5, +.katex .sizing.reset-size8.size5 { + font-size: .625em; +} +.katex .fontsize-ensurer.reset-size8.size6, +.katex .sizing.reset-size8.size6 { + font-size: .6944444444em; +} +.katex .fontsize-ensurer.reset-size8.size7, +.katex .sizing.reset-size8.size7 { + font-size: .8333333333em; +} +.katex .fontsize-ensurer.reset-size8.size8, +.katex .sizing.reset-size8.size8 { + font-size: 1em; +} +.katex .fontsize-ensurer.reset-size8.size9, +.katex .sizing.reset-size8.size9 { + font-size: 1.2em; +} +.katex .fontsize-ensurer.reset-size8.size10, +.katex .sizing.reset-size8.size10 { + font-size: 1.4402777778em; +} +.katex .fontsize-ensurer.reset-size8.size11, +.katex .sizing.reset-size8.size11 { + font-size: 1.7277777778em; +} +.katex .fontsize-ensurer.reset-size9.size1, +.katex .sizing.reset-size9.size1 { + font-size: .2893518519em; +} +.katex .fontsize-ensurer.reset-size9.size2, +.katex .sizing.reset-size9.size2 { + font-size: .3472222222em; +} +.katex .fontsize-ensurer.reset-size9.size3, +.katex .sizing.reset-size9.size3 { + font-size: .4050925926em; +} +.katex .fontsize-ensurer.reset-size9.size4, +.katex .sizing.reset-size9.size4 { + font-size: .462962963em; +} +.katex .fontsize-ensurer.reset-size9.size5, +.katex .sizing.reset-size9.size5 { + font-size: .5208333333em; +} +.katex .fontsize-ensurer.reset-size9.size6, +.katex .sizing.reset-size9.size6 { + font-size: .5787037037em; +} +.katex .fontsize-ensurer.reset-size9.size7, +.katex .sizing.reset-size9.size7 { + font-size: .6944444444em; +} +.katex .fontsize-ensurer.reset-size9.size8, +.katex .sizing.reset-size9.size8 { + font-size: .8333333333em; +} +.katex .fontsize-ensurer.reset-size9.size9, +.katex .sizing.reset-size9.size9 { + font-size: 1em; +} +.katex .fontsize-ensurer.reset-size9.size10, +.katex .sizing.reset-size9.size10 { + font-size: 1.2002314815em; +} +.katex .fontsize-ensurer.reset-size9.size11, +.katex .sizing.reset-size9.size11 { + font-size: 1.4398148148em; +} +.katex .fontsize-ensurer.reset-size10.size1, +.katex .sizing.reset-size10.size1 { + font-size: .2410800386em; +} +.katex .fontsize-ensurer.reset-size10.size2, +.katex .sizing.reset-size10.size2 { + font-size: .2892960463em; +} +.katex .fontsize-ensurer.reset-size10.size3, +.katex .sizing.reset-size10.size3 { + font-size: .337512054em; +} +.katex .fontsize-ensurer.reset-size10.size4, +.katex .sizing.reset-size10.size4 { + font-size: .3857280617em; +} +.katex .fontsize-ensurer.reset-size10.size5, +.katex .sizing.reset-size10.size5 { + font-size: .4339440694em; +} +.katex .fontsize-ensurer.reset-size10.size6, +.katex .sizing.reset-size10.size6 { + font-size: .4821600771em; +} +.katex .fontsize-ensurer.reset-size10.size7, +.katex .sizing.reset-size10.size7 { + font-size: .5785920926em; +} +.katex .fontsize-ensurer.reset-size10.size8, +.katex .sizing.reset-size10.size8 { + font-size: .6943105111em; +} +.katex .fontsize-ensurer.reset-size10.size9, +.katex .sizing.reset-size10.size9 { + font-size: .8331726133em; +} +.katex .fontsize-ensurer.reset-size10.size10, +.katex .sizing.reset-size10.size10 { + font-size: 1em; +} +.katex .fontsize-ensurer.reset-size10.size11, +.katex .sizing.reset-size10.size11 { + font-size: 1.1996142719em; +} +.katex .fontsize-ensurer.reset-size11.size1, +.katex .sizing.reset-size11.size1 { + font-size: .2009646302em; +} +.katex .fontsize-ensurer.reset-size11.size2, +.katex .sizing.reset-size11.size2 { + font-size: .2411575563em; +} +.katex .fontsize-ensurer.reset-size11.size3, +.katex .sizing.reset-size11.size3 { + font-size: .2813504823em; +} +.katex .fontsize-ensurer.reset-size11.size4, +.katex .sizing.reset-size11.size4 { + font-size: .3215434084em; +} +.katex .fontsize-ensurer.reset-size11.size5, +.katex .sizing.reset-size11.size5 { + font-size: .3617363344em; +} +.katex .fontsize-ensurer.reset-size11.size6, +.katex .sizing.reset-size11.size6 { + font-size: .4019292605em; +} +.katex .fontsize-ensurer.reset-size11.size7, +.katex .sizing.reset-size11.size7 { + font-size: .4823151125em; +} +.katex .fontsize-ensurer.reset-size11.size8, +.katex .sizing.reset-size11.size8 { + font-size: .578778135em; +} +.katex .fontsize-ensurer.reset-size11.size9, +.katex .sizing.reset-size11.size9 { + font-size: .6945337621em; +} +.katex .fontsize-ensurer.reset-size11.size10, +.katex .sizing.reset-size11.size10 { + font-size: .8336012862em; +} +.katex .fontsize-ensurer.reset-size11.size11, +.katex .sizing.reset-size11.size11 { + font-size: 1em; +} +.katex .delimsizing.size1 { + font-family: KaTeX_Size1; +} +.katex .delimsizing.size2 { + font-family: KaTeX_Size2; +} +.katex .delimsizing.size3 { + font-family: KaTeX_Size3; +} +.katex .delimsizing.size4 { + font-family: KaTeX_Size4; +} +.katex .delimsizing.mult .delim-size1 > span { + font-family: KaTeX_Size1; +} +.katex .delimsizing.mult .delim-size4 > span { + font-family: KaTeX_Size4; +} +.katex .nulldelimiter { + display: inline-block; + width: .12em; +} +.katex .delimcenter, +.katex .op-symbol { + position: relative; +} +.katex .op-symbol.small-op { + font-family: KaTeX_Size1; +} +.katex .op-symbol.large-op { + font-family: KaTeX_Size2; +} +.katex .accent > .vlist-t, +.katex .op-limits > .vlist-t { + text-align: center; +} +.katex .accent .accent-body { + position: relative; +} +.katex .accent .accent-body:not(.accent-full) { + width: 0; +} +.katex .overlay { + display: block; +} +.katex .mtable .vertical-separator { + display: inline-block; + min-width: 1px; +} +.katex .mtable .arraycolsep { + display: inline-block; +} +.katex .mtable .col-align-c > .vlist-t { + text-align: center; +} +.katex .mtable .col-align-l > .vlist-t { + text-align: left; +} +.katex .mtable .col-align-r > .vlist-t { + text-align: right; +} +.katex .svg-align { + text-align: left; +} +.katex svg { + fill: currentColor; + stroke: currentColor; + fill-rule: nonzero; + fill-opacity: 1; + stroke-width: 1; + stroke-linecap: butt; + stroke-linejoin: miter; + stroke-miterlimit: 4; + stroke-dasharray: none; + stroke-dashoffset: 0; + stroke-opacity: 1; + display: block; + height: inherit; + position: absolute; + width: 100%; +} +.katex svg path { + stroke: none; +} +.katex img { + border-style: none; + max-height: none; + max-width: none; + min-height: 0; + min-width: 0; +} +.katex .stretchy { + display: block; + overflow: hidden; + position: relative; + width: 100%; +} +.katex .stretchy:after, +.katex .stretchy:before { + content: ""; +} +.katex .hide-tail { + overflow: hidden; + position: relative; + width: 100%; +} +.katex .halfarrow-left { + left: 0; + overflow: hidden; + position: absolute; + width: 50.2%; +} +.katex .halfarrow-right { + overflow: hidden; + position: absolute; + right: 0; + width: 50.2%; +} +.katex .brace-left { + left: 0; + overflow: hidden; + position: absolute; + width: 25.1%; +} +.katex .brace-center { + left: 25%; + overflow: hidden; + position: absolute; + width: 50%; +} +.katex .brace-right { + overflow: hidden; + position: absolute; + right: 0; + width: 25.1%; +} +.katex .x-arrow-pad { + padding: 0 .5em; +} +.katex .cd-arrow-pad { + padding: 0 .55556em 0 .27778em; +} +.katex .mover, +.katex .munder, +.katex .x-arrow { + text-align: center; +} +.katex .boxpad { + padding: 0 .3em; +} +.katex .fbox, +.katex .fcolorbox { + border: .04em solid; + box-sizing: border-box; +} +.katex .cancel-pad { + padding: 0 .2em; +} +.katex .cancel-lap { + margin-left: -.2em; + margin-right: -.2em; +} +.katex .sout { + border-bottom-style: solid; + border-bottom-width: .08em; +} +.katex .angl { + border-right: .049em solid; + border-top: .049em solid; + box-sizing: border-box; + margin-right: .03889em; +} +.katex .anglpad { + padding: 0 .03889em; +} +.katex .eqn-num:before { + content: "(" counter(katexEqnNo) ")"; + counter-increment: katexEqnNo; +} +.katex .mml-eqn-num:before { + content: "(" counter(mmlEqnNo) ")"; + counter-increment: mmlEqnNo; +} +.katex .mtr-glue { + width: 50%; +} +.katex .cd-vert-arrow { + display: inline-block; + position: relative; +} +.katex .cd-label-left { + display: inline-block; + position: absolute; + right: calc(50% + .3em); + text-align: left; +} +.katex .cd-label-right { + display: inline-block; + left: calc(50% + .3em); + position: absolute; + text-align: right; +} +.katex-display { + display: block; + margin: 1em 0; + text-align: center; +} +.katex-display > .katex { + display: block; + text-align: center; + white-space: nowrap; +} +.katex-display > .katex > .katex-html { + display: block; + position: relative; +} +.katex-display > .katex > .katex-html > .tag { + position: absolute; + right: 0; +} +.katex-display.leqno > .katex > .katex-html > .tag { + left: 0; + right: auto; +} +.katex-display.fleqn > .katex { + padding-left: 2em; + text-align: left; +} +body { + counter-reset: katexEqnNo mmlEqnNo; +} + +/* node_modules/highlight.js/styles/github.min.css */ +pre code.hljs { + display: block; + overflow-x: auto; + padding: 1em; +} +code.hljs { + padding: 3px 5px; +} +.hljs { + color: #24292e; + background: #fff; +} +.hljs-doctag, +.hljs-keyword, +.hljs-meta .hljs-keyword, +.hljs-template-tag, +.hljs-template-variable, +.hljs-type, +.hljs-variable.language_ { + color: #d73a49; +} +.hljs-title, +.hljs-title.class_, +.hljs-title.class_.inherited__, +.hljs-title.function_ { + color: #6f42c1; +} +.hljs-attr, +.hljs-attribute, +.hljs-literal, +.hljs-meta, +.hljs-number, +.hljs-operator, +.hljs-selector-attr, +.hljs-selector-class, +.hljs-selector-id, +.hljs-variable { + color: #005cc5; +} +.hljs-meta .hljs-string, +.hljs-regexp, +.hljs-string { + color: #032f62; +} +.hljs-built_in, +.hljs-symbol { + color: #e36209; +} +.hljs-code, +.hljs-comment, +.hljs-formula { + color: #6a737d; +} +.hljs-name, +.hljs-quote, +.hljs-selector-pseudo, +.hljs-selector-tag { + color: #22863a; +} +.hljs-subst { + color: #24292e; +} +.hljs-section { + color: #005cc5; + font-weight: 700; +} +.hljs-bullet { + color: #735c0f; +} +.hljs-emphasis { + color: #24292e; + font-style: italic; +} +.hljs-strong { + color: #24292e; + font-weight: 700; +} +.hljs-addition { + color: #22863a; + background-color: #f0fff4; +} +.hljs-deletion { + color: #b31d28; + background-color: #ffeef0; +} + +/* node_modules/diff2html/bundles/css/diff2html.min.css */ +:host, +:root { + --d2h-bg-color:#fff; + --d2h-border-color:#ddd; + --d2h-dim-color:rgba(0,0,0,.3); + --d2h-line-border-color:#eee; + --d2h-file-header-bg-color:#f7f7f7; + --d2h-file-header-border-color:#d8d8d8; + --d2h-empty-placeholder-bg-color:#f1f1f1; + --d2h-empty-placeholder-border-color:#e1e1e1; + --d2h-selected-color:#c8e1ff; + --d2h-ins-bg-color:#dfd; + --d2h-ins-border-color:#b4e2b4; + --d2h-ins-highlight-bg-color:#97f295; + --d2h-ins-label-color:#399839; + --d2h-del-bg-color:#fee8e9; + --d2h-del-border-color:#e9aeae; + --d2h-del-highlight-bg-color:#ffb6ba; + --d2h-del-label-color:#c33; + --d2h-change-del-color:#fdf2d0; + --d2h-change-ins-color:#ded; + --d2h-info-bg-color:#f8fafd; + --d2h-info-border-color:#d5e4f2; + --d2h-change-label-color:#d0b44c; + --d2h-moved-label-color:#3572b0; + --d2h-dark-color:#e6edf3; + --d2h-dark-bg-color:#0d1117; + --d2h-dark-border-color:#30363d; + --d2h-dark-dim-color:#6e7681; + --d2h-dark-line-border-color:#21262d; + --d2h-dark-file-header-bg-color:#161b22; + --d2h-dark-file-header-border-color:#30363d; + --d2h-dark-empty-placeholder-bg-color:hsla(215,8%,47%,.1); + --d2h-dark-empty-placeholder-border-color:#30363d; + --d2h-dark-selected-color:rgba(56,139,253,.1); + --d2h-dark-ins-bg-color:rgba(46,160,67,.15); + --d2h-dark-ins-border-color:rgba(46,160,67,.4); + --d2h-dark-ins-highlight-bg-color:rgba(46,160,67,.4); + --d2h-dark-ins-label-color:#3fb950; + --d2h-dark-del-bg-color:rgba(248,81,73,.1); + --d2h-dark-del-border-color:rgba(248,81,73,.4); + --d2h-dark-del-highlight-bg-color:rgba(248,81,73,.4); + --d2h-dark-del-label-color:#f85149; + --d2h-dark-change-del-color:rgba(210,153,34,.2); + --d2h-dark-change-ins-color:rgba(46,160,67,.25); + --d2h-dark-info-bg-color:rgba(56,139,253,.1); + --d2h-dark-info-border-color:rgba(56,139,253,.4); + --d2h-dark-change-label-color:#d29922; + --d2h-dark-moved-label-color:#3572b0; +} +.d2h-wrapper { + text-align: left; +} +.d2h-file-header { + background-color: #f7f7f7; + background-color: var(--d2h-file-header-bg-color); + border-bottom: 1px solid #d8d8d8; + border-bottom: 1px solid var(--d2h-file-header-border-color); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + font-family: + Source Sans Pro, + Helvetica Neue, + Helvetica, + Arial, + sans-serif; + height: 35px; + padding: 5px 10px; +} +.d2h-file-header.d2h-sticky-header { + position: sticky; + top: 0; + z-index: 1; +} +.d2h-file-stats { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + font-size: 14px; + margin-left: auto; +} +.d2h-lines-added { + border: 1px solid #b4e2b4; + border: 1px solid var(--d2h-ins-border-color); + border-radius: 5px 0 0 5px; + color: #399839; + color: var(--d2h-ins-label-color); + padding: 2px; + text-align: right; + vertical-align: middle; +} +.d2h-lines-deleted { + border: 1px solid #e9aeae; + border: 1px solid var(--d2h-del-border-color); + border-radius: 0 5px 5px 0; + color: #c33; + color: var(--d2h-del-label-color); + margin-left: 1px; + padding: 2px; + text-align: left; + vertical-align: middle; +} +.d2h-file-name-wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-size: 15px; + width: 100%; +} +.d2h-file-name { + overflow-x: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.d2h-file-wrapper { + border: 1px solid #ddd; + border: 1px solid var(--d2h-border-color); + border-radius: 3px; + margin-bottom: 1em; +} +.d2h-file-collapse { + -webkit-box-pack: end; + -ms-flex-pack: end; + cursor: pointer; + display: none; + font-size: 12px; + justify-content: flex-end; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border: 1px solid #ddd; + border: 1px solid var(--d2h-border-color); + border-radius: 3px; + padding: 4px 8px; +} +.d2h-file-collapse.d2h-selected { + background-color: #c8e1ff; + background-color: var(--d2h-selected-color); +} +.d2h-file-collapse-input { + margin: 0 4px 0 0; +} +.d2h-diff-table { + border-collapse: collapse; + font-family: + Menlo, + Consolas, + monospace; + font-size: 13px; + width: 100%; +} +.d2h-files-diff { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + width: 100%; +} +.d2h-file-diff { + overflow-y: hidden; +} +.d2h-file-diff.d2h-d-none, +.d2h-files-diff.d2h-d-none { + display: none; +} +.d2h-file-side-diff { + display: inline-block; + overflow-x: scroll; + overflow-y: hidden; + width: 50%; +} +.d2h-code-line { + padding: 0 8em; + width: calc(100% - 16em); +} +.d2h-code-line, +.d2h-code-side-line { + display: inline-block; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + white-space: nowrap; +} +.d2h-code-side-line { + padding: 0 4.5em; + width: calc(100% - 9em); +} +.d2h-code-line-ctn { + background: none; + display: inline-block; + padding: 0; + word-wrap: normal; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + vertical-align: middle; + white-space: pre; + width: 100%; +} +.d2h-code-line del, +.d2h-code-side-line del { + background-color: #ffb6ba; + background-color: var(--d2h-del-highlight-bg-color); +} +.d2h-code-line del, +.d2h-code-line ins, +.d2h-code-side-line del, +.d2h-code-side-line ins { + border-radius: .2em; + display: inline-block; + margin-top: -1px; + -webkit-text-decoration: none; + text-decoration: none; +} +.d2h-code-line ins, +.d2h-code-side-line ins { + background-color: #97f295; + background-color: var(--d2h-ins-highlight-bg-color); + text-align: left; +} +.d2h-code-line-prefix { + background: none; + display: inline; + padding: 0; + word-wrap: normal; + white-space: pre; +} +.line-num1 { + float: left; +} +.line-num1, +.line-num2 { + -webkit-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden; + padding: 0 .5em; + text-overflow: ellipsis; + width: 3.5em; +} +.line-num2 { + float: right; +} +.d2h-code-linenumber { + background-color: #fff; + background-color: var(--d2h-bg-color); + border: solid #eee; + border: solid var(--d2h-line-border-color); + border-width: 0 1px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: rgba(0, 0, 0, .3); + color: var(--d2h-dim-color); + cursor: pointer; + display: inline-block; + position: absolute; + text-align: right; + width: 7.5em; +} +.d2h-code-linenumber:after { + content: "\200b"; +} +.d2h-code-side-linenumber { + background-color: #fff; + background-color: var(--d2h-bg-color); + border: solid #eee; + border: solid var(--d2h-line-border-color); + border-width: 0 1px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: rgba(0, 0, 0, .3); + color: var(--d2h-dim-color); + cursor: pointer; + display: inline-block; + overflow: hidden; + padding: 0 .5em; + position: absolute; + text-align: right; + text-overflow: ellipsis; + width: 4em; +} +.d2h-code-side-linenumber:after { + content: "\200b"; +} +.d2h-code-side-emptyplaceholder, +.d2h-emptyplaceholder { + background-color: #f1f1f1; + background-color: var(--d2h-empty-placeholder-bg-color); + border-color: #e1e1e1; + border-color: var(--d2h-empty-placeholder-border-color); +} +.d2h-code-line-prefix, +.d2h-code-linenumber, +.d2h-code-side-linenumber, +.d2h-emptyplaceholder { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.d2h-code-linenumber, +.d2h-code-side-linenumber { + direction: rtl; +} +.d2h-del { + background-color: #fee8e9; + background-color: var(--d2h-del-bg-color); + border-color: #e9aeae; + border-color: var(--d2h-del-border-color); +} +.d2h-ins { + background-color: #dfd; + background-color: var(--d2h-ins-bg-color); + border-color: #b4e2b4; + border-color: var(--d2h-ins-border-color); +} +.d2h-info { + background-color: #f8fafd; + background-color: var(--d2h-info-bg-color); + border-color: #d5e4f2; + border-color: var(--d2h-info-border-color); + color: rgba(0, 0, 0, .3); + color: var(--d2h-dim-color); +} +.d2h-file-diff .d2h-del.d2h-change { + background-color: #fdf2d0; + background-color: var(--d2h-change-del-color); +} +.d2h-file-diff .d2h-ins.d2h-change { + background-color: #ded; + background-color: var(--d2h-change-ins-color); +} +.d2h-file-list-wrapper { + margin-bottom: 10px; +} +.d2h-file-list-wrapper a { + -webkit-text-decoration: none; + text-decoration: none; +} +.d2h-file-list-wrapper a, +.d2h-file-list-wrapper a:visited { + color: #3572b0; + color: var(--d2h-moved-label-color); +} +.d2h-file-list-header { + text-align: left; +} +.d2h-file-list-title { + font-weight: 700; +} +.d2h-file-list-line { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + text-align: left; +} +.d2h-file-list { + display: block; + list-style: none; + margin: 0; + padding: 0; +} +.d2h-file-list > li { + border-bottom: 1px solid #ddd; + border-bottom: 1px solid var(--d2h-border-color); + margin: 0; + padding: 5px 10px; +} +.d2h-file-list > li:last-child { + border-bottom: none; +} +.d2h-file-switch { + cursor: pointer; + display: none; + font-size: 10px; +} +.d2h-icon { + margin-right: 10px; + vertical-align: middle; + fill: currentColor; +} +.d2h-deleted { + color: #c33; + color: var(--d2h-del-label-color); +} +.d2h-added { + color: #399839; + color: var(--d2h-ins-label-color); +} +.d2h-changed { + color: #d0b44c; + color: var(--d2h-change-label-color); +} +.d2h-moved { + color: #3572b0; + color: var(--d2h-moved-label-color); +} +.d2h-tag { + background-color: #fff; + background-color: var(--d2h-bg-color); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + font-size: 10px; + margin-left: 5px; + padding: 0 2px; +} +.d2h-deleted-tag { + border: 1px solid #c33; + border: 1px solid var(--d2h-del-label-color); +} +.d2h-added-tag { + border: 1px solid #399839; + border: 1px solid var(--d2h-ins-label-color); +} +.d2h-changed-tag { + border: 1px solid #d0b44c; + border: 1px solid var(--d2h-change-label-color); +} +.d2h-moved-tag { + border: 1px solid #3572b0; + border: 1px solid var(--d2h-moved-label-color); +} +.d2h-dark-color-scheme { + background-color: #0d1117; + background-color: var(--d2h-dark-bg-color); + color: #e6edf3; + color: var(--d2h-dark-color); +} +.d2h-dark-color-scheme .d2h-file-header { + background-color: #161b22; + background-color: var(--d2h-dark-file-header-bg-color); + border-bottom: #30363d; + border-bottom: var(--d2h-dark-file-header-border-color); +} +.d2h-dark-color-scheme .d2h-lines-added { + border: 1px solid rgba(46, 160, 67, .4); + border: 1px solid var(--d2h-dark-ins-border-color); + color: #3fb950; + color: var(--d2h-dark-ins-label-color); +} +.d2h-dark-color-scheme .d2h-lines-deleted { + border: 1px solid rgba(248, 81, 73, .4); + border: 1px solid var(--d2h-dark-del-border-color); + color: #f85149; + color: var(--d2h-dark-del-label-color); +} +.d2h-dark-color-scheme .d2h-code-line del, +.d2h-dark-color-scheme .d2h-code-side-line del { + background-color: rgba(248, 81, 73, .4); + background-color: var(--d2h-dark-del-highlight-bg-color); +} +.d2h-dark-color-scheme .d2h-code-line ins, +.d2h-dark-color-scheme .d2h-code-side-line ins { + background-color: rgba(46, 160, 67, .4); + background-color: var(--d2h-dark-ins-highlight-bg-color); +} +.d2h-dark-color-scheme .d2h-diff-tbody { + border-color: #30363d; + border-color: var(--d2h-dark-border-color); +} +.d2h-dark-color-scheme .d2h-code-side-linenumber { + background-color: #0d1117; + background-color: var(--d2h-dark-bg-color); + border-color: #21262d; + border-color: var(--d2h-dark-line-border-color); + color: #6e7681; + color: var(--d2h-dark-dim-color); +} +.d2h-dark-color-scheme .d2h-files-diff .d2h-code-side-emptyplaceholder, +.d2h-dark-color-scheme .d2h-files-diff .d2h-emptyplaceholder { + background-color: hsla(215, 8%, 47%, .1); + background-color: var(--d2h-dark-empty-placeholder-bg-color); + border-color: #30363d; + border-color: var(--d2h-dark-empty-placeholder-border-color); +} +.d2h-dark-color-scheme .d2h-code-linenumber { + background-color: #0d1117; + background-color: var(--d2h-dark-bg-color); + border-color: #21262d; + border-color: var(--d2h-dark-line-border-color); + color: #6e7681; + color: var(--d2h-dark-dim-color); +} +.d2h-dark-color-scheme .d2h-del { + background-color: rgba(248, 81, 73, .1); + background-color: var(--d2h-dark-del-bg-color); + border-color: rgba(248, 81, 73, .4); + border-color: var(--d2h-dark-del-border-color); +} +.d2h-dark-color-scheme .d2h-ins { + background-color: rgba(46, 160, 67, .15); + background-color: var(--d2h-dark-ins-bg-color); + border-color: rgba(46, 160, 67, .4); + border-color: var(--d2h-dark-ins-border-color); +} +.d2h-dark-color-scheme .d2h-info { + background-color: rgba(56, 139, 253, .1); + background-color: var(--d2h-dark-info-bg-color); + border-color: rgba(56, 139, 253, .4); + border-color: var(--d2h-dark-info-border-color); + color: #6e7681; + color: var(--d2h-dark-dim-color); +} +.d2h-dark-color-scheme .d2h-file-diff .d2h-del.d2h-change { + background-color: rgba(210, 153, 34, .2); + background-color: var(--d2h-dark-change-del-color); +} +.d2h-dark-color-scheme .d2h-file-diff .d2h-ins.d2h-change { + background-color: rgba(46, 160, 67, .25); + background-color: var(--d2h-dark-change-ins-color); +} +.d2h-dark-color-scheme .d2h-file-wrapper { + border: 1px solid #30363d; + border: 1px solid var(--d2h-dark-border-color); +} +.d2h-dark-color-scheme .d2h-file-collapse { + border: 1px solid #0d1117; + border: 1px solid var(--d2h-dark-bg-color); +} +.d2h-dark-color-scheme .d2h-file-collapse.d2h-selected { + background-color: rgba(56, 139, 253, .1); + background-color: var(--d2h-dark-selected-color); +} +.d2h-dark-color-scheme .d2h-file-list-wrapper a, +.d2h-dark-color-scheme .d2h-file-list-wrapper a:visited { + color: #3572b0; + color: var(--d2h-dark-moved-label-color); +} +.d2h-dark-color-scheme .d2h-file-list > li { + border-bottom: 1px solid #0d1117; + border-bottom: 1px solid var(--d2h-dark-bg-color); +} +.d2h-dark-color-scheme .d2h-deleted { + color: #f85149; + color: var(--d2h-dark-del-label-color); +} +.d2h-dark-color-scheme .d2h-added { + color: #3fb950; + color: var(--d2h-dark-ins-label-color); +} +.d2h-dark-color-scheme .d2h-changed { + color: #d29922; + color: var(--d2h-dark-change-label-color); +} +.d2h-dark-color-scheme .d2h-moved { + color: #3572b0; + color: var(--d2h-dark-moved-label-color); +} +.d2h-dark-color-scheme .d2h-tag { + background-color: #0d1117; + background-color: var(--d2h-dark-bg-color); +} +.d2h-dark-color-scheme .d2h-deleted-tag { + border: 1px solid #f85149; + border: 1px solid var(--d2h-dark-del-label-color); +} +.d2h-dark-color-scheme .d2h-added-tag { + border: 1px solid #3fb950; + border: 1px solid var(--d2h-dark-ins-label-color); +} +.d2h-dark-color-scheme .d2h-changed-tag { + border: 1px solid #d29922; + border: 1px solid var(--d2h-dark-change-label-color); +} +.d2h-dark-color-scheme .d2h-moved-tag { + border: 1px solid #3572b0; + border: 1px solid var(--d2h-dark-moved-label-color); +} +@media (prefers-color-scheme: dark) { + .d2h-auto-color-scheme { + background-color: #0d1117; + background-color: var(--d2h-dark-bg-color); + color: #e6edf3; + color: var(--d2h-dark-color); + } + .d2h-auto-color-scheme .d2h-file-header { + background-color: #161b22; + background-color: var(--d2h-dark-file-header-bg-color); + border-bottom: #30363d; + border-bottom: var(--d2h-dark-file-header-border-color); + } + .d2h-auto-color-scheme .d2h-lines-added { + border: 1px solid rgba(46, 160, 67, .4); + border: 1px solid var(--d2h-dark-ins-border-color); + color: #3fb950; + color: var(--d2h-dark-ins-label-color); + } + .d2h-auto-color-scheme .d2h-lines-deleted { + border: 1px solid rgba(248, 81, 73, .4); + border: 1px solid var(--d2h-dark-del-border-color); + color: #f85149; + color: var(--d2h-dark-del-label-color); + } + .d2h-auto-color-scheme .d2h-code-line del, + .d2h-auto-color-scheme .d2h-code-side-line del { + background-color: rgba(248, 81, 73, .4); + background-color: var(--d2h-dark-del-highlight-bg-color); + } + .d2h-auto-color-scheme .d2h-code-line ins, + .d2h-auto-color-scheme .d2h-code-side-line ins { + background-color: rgba(46, 160, 67, .4); + background-color: var(--d2h-dark-ins-highlight-bg-color); + } + .d2h-auto-color-scheme .d2h-diff-tbody { + border-color: #30363d; + border-color: var(--d2h-dark-border-color); + } + .d2h-auto-color-scheme .d2h-code-side-linenumber { + background-color: #0d1117; + background-color: var(--d2h-dark-bg-color); + border-color: #21262d; + border-color: var(--d2h-dark-line-border-color); + color: #6e7681; + color: var(--d2h-dark-dim-color); + } + .d2h-auto-color-scheme .d2h-files-diff .d2h-code-side-emptyplaceholder, + .d2h-auto-color-scheme .d2h-files-diff .d2h-emptyplaceholder { + background-color: hsla(215, 8%, 47%, .1); + background-color: var(--d2h-dark-empty-placeholder-bg-color); + border-color: #30363d; + border-color: var(--d2h-dark-empty-placeholder-border-color); + } + .d2h-auto-color-scheme .d2h-code-linenumber { + background-color: #0d1117; + background-color: var(--d2h-dark-bg-color); + border-color: #21262d; + border-color: var(--d2h-dark-line-border-color); + color: #6e7681; + color: var(--d2h-dark-dim-color); + } + .d2h-auto-color-scheme .d2h-del { + background-color: rgba(248, 81, 73, .1); + background-color: var(--d2h-dark-del-bg-color); + border-color: rgba(248, 81, 73, .4); + border-color: var(--d2h-dark-del-border-color); + } + .d2h-auto-color-scheme .d2h-ins { + background-color: rgba(46, 160, 67, .15); + background-color: var(--d2h-dark-ins-bg-color); + border-color: rgba(46, 160, 67, .4); + border-color: var(--d2h-dark-ins-border-color); + } + .d2h-auto-color-scheme .d2h-info { + background-color: rgba(56, 139, 253, .1); + background-color: var(--d2h-dark-info-bg-color); + border-color: rgba(56, 139, 253, .4); + border-color: var(--d2h-dark-info-border-color); + color: #6e7681; + color: var(--d2h-dark-dim-color); + } + .d2h-auto-color-scheme .d2h-file-diff .d2h-del.d2h-change { + background-color: rgba(210, 153, 34, .2); + background-color: var(--d2h-dark-change-del-color); + } + .d2h-auto-color-scheme .d2h-file-diff .d2h-ins.d2h-change { + background-color: rgba(46, 160, 67, .25); + background-color: var(--d2h-dark-change-ins-color); + } + .d2h-auto-color-scheme .d2h-file-wrapper { + border: 1px solid #30363d; + border: 1px solid var(--d2h-dark-border-color); + } + .d2h-auto-color-scheme .d2h-file-collapse { + border: 1px solid #0d1117; + border: 1px solid var(--d2h-dark-bg-color); + } + .d2h-auto-color-scheme .d2h-file-collapse.d2h-selected { + background-color: rgba(56, 139, 253, .1); + background-color: var(--d2h-dark-selected-color); + } + .d2h-auto-color-scheme .d2h-file-list-wrapper a, + .d2h-auto-color-scheme .d2h-file-list-wrapper a:visited { + color: #3572b0; + color: var(--d2h-dark-moved-label-color); + } + .d2h-auto-color-scheme .d2h-file-list > li { + border-bottom: 1px solid #0d1117; + border-bottom: 1px solid var(--d2h-dark-bg-color); + } + .d2h-dark-color-scheme .d2h-deleted { + color: #f85149; + color: var(--d2h-dark-del-label-color); + } + .d2h-auto-color-scheme .d2h-added { + color: #3fb950; + color: var(--d2h-dark-ins-label-color); + } + .d2h-auto-color-scheme .d2h-changed { + color: #d29922; + color: var(--d2h-dark-change-label-color); + } + .d2h-auto-color-scheme .d2h-moved { + color: #3572b0; + color: var(--d2h-dark-moved-label-color); + } + .d2h-auto-color-scheme .d2h-tag { + background-color: #0d1117; + background-color: var(--d2h-dark-bg-color); + } + .d2h-auto-color-scheme .d2h-deleted-tag { + border: 1px solid #f85149; + border: 1px solid var(--d2h-dark-del-label-color); + } + .d2h-auto-color-scheme .d2h-added-tag { + border: 1px solid #3fb950; + border: 1px solid var(--d2h-dark-ins-label-color); + } + .d2h-auto-color-scheme .d2h-changed-tag { + border: 1px solid #d29922; + border: 1px solid var(--d2h-dark-change-label-color); + } + .d2h-auto-color-scheme .d2h-moved-tag { + border: 1px solid #3572b0; + border: 1px solid var(--d2h-dark-moved-label-color); + } +} +/*! Bundled license information: + +highlight.js/styles/github.min.css: + (*! + Theme: GitHub + Description: Light theme as seen on github.com + Author: github.com + Maintainer: @Hirse + Updated: 2021-05-15 + + Outdated base version: https://github.com/primer/github-syntax-light + Current colors taken from GitHub's CSS + *) +*/ +/*# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2thdGV4L2Rpc3Qva2F0ZXgubWluLmNzcyIsICJub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL3N0eWxlcy9naXRodWIubWluLmNzcyIsICJub2RlX21vZHVsZXMvZGlmZjJodG1sL2J1bmRsZXMvY3NzL2RpZmYyaHRtbC5taW4uY3NzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJAZm9udC1mYWNle2ZvbnQtZGlzcGxheTpibG9jaztmb250LWZhbWlseTpLYVRlWF9BTVM7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO3NyYzp1cmwoZm9udHMvS2FUZVhfQU1TLVJlZ3VsYXIud29mZjIpIGZvcm1hdChcIndvZmYyXCIpLHVybChmb250cy9LYVRlWF9BTVMtUmVndWxhci53b2ZmKSBmb3JtYXQoXCJ3b2ZmXCIpLHVybChmb250cy9LYVRlWF9BTVMtUmVndWxhci50dGYpIGZvcm1hdChcInRydWV0eXBlXCIpfUBmb250LWZhY2V7Zm9udC1kaXNwbGF5OmJsb2NrO2ZvbnQtZmFtaWx5OkthVGVYX0NhbGlncmFwaGljO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjcwMDtzcmM6dXJsKGZvbnRzL0thVGVYX0NhbGlncmFwaGljLUJvbGQud29mZjIpIGZvcm1hdChcIndvZmYyXCIpLHVybChmb250cy9LYVRlWF9DYWxpZ3JhcGhpYy1Cb2xkLndvZmYpIGZvcm1hdChcIndvZmZcIiksdXJsKGZvbnRzL0thVGVYX0NhbGlncmFwaGljLUJvbGQudHRmKSBmb3JtYXQoXCJ0cnVldHlwZVwiKX1AZm9udC1mYWNle2ZvbnQtZGlzcGxheTpibG9jaztmb250LWZhbWlseTpLYVRlWF9DYWxpZ3JhcGhpYztmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7c3JjOnVybChmb250cy9LYVRlWF9DYWxpZ3JhcGhpYy1SZWd1bGFyLndvZmYyKSBmb3JtYXQoXCJ3b2ZmMlwiKSx1cmwoZm9udHMvS2FUZVhfQ2FsaWdyYXBoaWMtUmVndWxhci53b2ZmKSBmb3JtYXQoXCJ3b2ZmXCIpLHVybChmb250cy9LYVRlWF9DYWxpZ3JhcGhpYy1SZWd1bGFyLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6S2FUZVhfRnJha3R1cjtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo3MDA7c3JjOnVybChmb250cy9LYVRlWF9GcmFrdHVyLUJvbGQud29mZjIpIGZvcm1hdChcIndvZmYyXCIpLHVybChmb250cy9LYVRlWF9GcmFrdHVyLUJvbGQud29mZikgZm9ybWF0KFwid29mZlwiKSx1cmwoZm9udHMvS2FUZVhfRnJha3R1ci1Cb2xkLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6S2FUZVhfRnJha3R1cjtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7c3JjOnVybChmb250cy9LYVRlWF9GcmFrdHVyLVJlZ3VsYXIud29mZjIpIGZvcm1hdChcIndvZmYyXCIpLHVybChmb250cy9LYVRlWF9GcmFrdHVyLVJlZ3VsYXIud29mZikgZm9ybWF0KFwid29mZlwiKSx1cmwoZm9udHMvS2FUZVhfRnJha3R1ci1SZWd1bGFyLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6S2FUZVhfTWFpbjtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo3MDA7c3JjOnVybChmb250cy9LYVRlWF9NYWluLUJvbGQud29mZjIpIGZvcm1hdChcIndvZmYyXCIpLHVybChmb250cy9LYVRlWF9NYWluLUJvbGQud29mZikgZm9ybWF0KFwid29mZlwiKSx1cmwoZm9udHMvS2FUZVhfTWFpbi1Cb2xkLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6S2FUZVhfTWFpbjtmb250LXN0eWxlOml0YWxpYztmb250LXdlaWdodDo3MDA7c3JjOnVybChmb250cy9LYVRlWF9NYWluLUJvbGRJdGFsaWMud29mZjIpIGZvcm1hdChcIndvZmYyXCIpLHVybChmb250cy9LYVRlWF9NYWluLUJvbGRJdGFsaWMud29mZikgZm9ybWF0KFwid29mZlwiKSx1cmwoZm9udHMvS2FUZVhfTWFpbi1Cb2xkSXRhbGljLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6S2FUZVhfTWFpbjtmb250LXN0eWxlOml0YWxpYztmb250LXdlaWdodDo0MDA7c3JjOnVybChmb250cy9LYVRlWF9NYWluLUl0YWxpYy53b2ZmMikgZm9ybWF0KFwid29mZjJcIiksdXJsKGZvbnRzL0thVGVYX01haW4tSXRhbGljLndvZmYpIGZvcm1hdChcIndvZmZcIiksdXJsKGZvbnRzL0thVGVYX01haW4tSXRhbGljLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6S2FUZVhfTWFpbjtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7c3JjOnVybChmb250cy9LYVRlWF9NYWluLVJlZ3VsYXIud29mZjIpIGZvcm1hdChcIndvZmYyXCIpLHVybChmb250cy9LYVRlWF9NYWluLVJlZ3VsYXIud29mZikgZm9ybWF0KFwid29mZlwiKSx1cmwoZm9udHMvS2FUZVhfTWFpbi1SZWd1bGFyLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6S2FUZVhfTWF0aDtmb250LXN0eWxlOml0YWxpYztmb250LXdlaWdodDo3MDA7c3JjOnVybChmb250cy9LYVRlWF9NYXRoLUJvbGRJdGFsaWMud29mZjIpIGZvcm1hdChcIndvZmYyXCIpLHVybChmb250cy9LYVRlWF9NYXRoLUJvbGRJdGFsaWMud29mZikgZm9ybWF0KFwid29mZlwiKSx1cmwoZm9udHMvS2FUZVhfTWF0aC1Cb2xkSXRhbGljLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6S2FUZVhfTWF0aDtmb250LXN0eWxlOml0YWxpYztmb250LXdlaWdodDo0MDA7c3JjOnVybChmb250cy9LYVRlWF9NYXRoLUl0YWxpYy53b2ZmMikgZm9ybWF0KFwid29mZjJcIiksdXJsKGZvbnRzL0thVGVYX01hdGgtSXRhbGljLndvZmYpIGZvcm1hdChcIndvZmZcIiksdXJsKGZvbnRzL0thVGVYX01hdGgtSXRhbGljLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6XCJLYVRlWF9TYW5zU2VyaWZcIjtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo3MDA7c3JjOnVybChmb250cy9LYVRlWF9TYW5zU2VyaWYtQm9sZC53b2ZmMikgZm9ybWF0KFwid29mZjJcIiksdXJsKGZvbnRzL0thVGVYX1NhbnNTZXJpZi1Cb2xkLndvZmYpIGZvcm1hdChcIndvZmZcIiksdXJsKGZvbnRzL0thVGVYX1NhbnNTZXJpZi1Cb2xkLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6XCJLYVRlWF9TYW5zU2VyaWZcIjtmb250LXN0eWxlOml0YWxpYztmb250LXdlaWdodDo0MDA7c3JjOnVybChmb250cy9LYVRlWF9TYW5zU2VyaWYtSXRhbGljLndvZmYyKSBmb3JtYXQoXCJ3b2ZmMlwiKSx1cmwoZm9udHMvS2FUZVhfU2Fuc1NlcmlmLUl0YWxpYy53b2ZmKSBmb3JtYXQoXCJ3b2ZmXCIpLHVybChmb250cy9LYVRlWF9TYW5zU2VyaWYtSXRhbGljLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6XCJLYVRlWF9TYW5zU2VyaWZcIjtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7c3JjOnVybChmb250cy9LYVRlWF9TYW5zU2VyaWYtUmVndWxhci53b2ZmMikgZm9ybWF0KFwid29mZjJcIiksdXJsKGZvbnRzL0thVGVYX1NhbnNTZXJpZi1SZWd1bGFyLndvZmYpIGZvcm1hdChcIndvZmZcIiksdXJsKGZvbnRzL0thVGVYX1NhbnNTZXJpZi1SZWd1bGFyLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6S2FUZVhfU2NyaXB0O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjQwMDtzcmM6dXJsKGZvbnRzL0thVGVYX1NjcmlwdC1SZWd1bGFyLndvZmYyKSBmb3JtYXQoXCJ3b2ZmMlwiKSx1cmwoZm9udHMvS2FUZVhfU2NyaXB0LVJlZ3VsYXIud29mZikgZm9ybWF0KFwid29mZlwiKSx1cmwoZm9udHMvS2FUZVhfU2NyaXB0LVJlZ3VsYXIudHRmKSBmb3JtYXQoXCJ0cnVldHlwZVwiKX1AZm9udC1mYWNle2ZvbnQtZGlzcGxheTpibG9jaztmb250LWZhbWlseTpLYVRlWF9TaXplMTtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7c3JjOnVybChmb250cy9LYVRlWF9TaXplMS1SZWd1bGFyLndvZmYyKSBmb3JtYXQoXCJ3b2ZmMlwiKSx1cmwoZm9udHMvS2FUZVhfU2l6ZTEtUmVndWxhci53b2ZmKSBmb3JtYXQoXCJ3b2ZmXCIpLHVybChmb250cy9LYVRlWF9TaXplMS1SZWd1bGFyLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6S2FUZVhfU2l6ZTI7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO3NyYzp1cmwoZm9udHMvS2FUZVhfU2l6ZTItUmVndWxhci53b2ZmMikgZm9ybWF0KFwid29mZjJcIiksdXJsKGZvbnRzL0thVGVYX1NpemUyLVJlZ3VsYXIud29mZikgZm9ybWF0KFwid29mZlwiKSx1cmwoZm9udHMvS2FUZVhfU2l6ZTItUmVndWxhci50dGYpIGZvcm1hdChcInRydWV0eXBlXCIpfUBmb250LWZhY2V7Zm9udC1kaXNwbGF5OmJsb2NrO2ZvbnQtZmFtaWx5OkthVGVYX1NpemUzO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjQwMDtzcmM6dXJsKGZvbnRzL0thVGVYX1NpemUzLVJlZ3VsYXIud29mZjIpIGZvcm1hdChcIndvZmYyXCIpLHVybChmb250cy9LYVRlWF9TaXplMy1SZWd1bGFyLndvZmYpIGZvcm1hdChcIndvZmZcIiksdXJsKGZvbnRzL0thVGVYX1NpemUzLVJlZ3VsYXIudHRmKSBmb3JtYXQoXCJ0cnVldHlwZVwiKX1AZm9udC1mYWNle2ZvbnQtZGlzcGxheTpibG9jaztmb250LWZhbWlseTpLYVRlWF9TaXplNDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7c3JjOnVybChmb250cy9LYVRlWF9TaXplNC1SZWd1bGFyLndvZmYyKSBmb3JtYXQoXCJ3b2ZmMlwiKSx1cmwoZm9udHMvS2FUZVhfU2l6ZTQtUmVndWxhci53b2ZmKSBmb3JtYXQoXCJ3b2ZmXCIpLHVybChmb250cy9LYVRlWF9TaXplNC1SZWd1bGFyLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9QGZvbnQtZmFjZXtmb250LWRpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6S2FUZVhfVHlwZXdyaXRlcjtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7c3JjOnVybChmb250cy9LYVRlWF9UeXBld3JpdGVyLVJlZ3VsYXIud29mZjIpIGZvcm1hdChcIndvZmYyXCIpLHVybChmb250cy9LYVRlWF9UeXBld3JpdGVyLVJlZ3VsYXIud29mZikgZm9ybWF0KFwid29mZlwiKSx1cmwoZm9udHMvS2FUZVhfVHlwZXdyaXRlci1SZWd1bGFyLnR0ZikgZm9ybWF0KFwidHJ1ZXR5cGVcIil9LmthdGV4e2ZvbnQ6bm9ybWFsIDEuMjFlbSBLYVRlWF9NYWluLFRpbWVzIE5ldyBSb21hbixzZXJpZjtsaW5lLWhlaWdodDoxLjI7dGV4dC1pbmRlbnQ6MDt0ZXh0LXJlbmRlcmluZzphdXRvfS5rYXRleCAqey1tcy1oaWdoLWNvbnRyYXN0LWFkanVzdDpub25lIWltcG9ydGFudDtib3JkZXItY29sb3I6Y3VycmVudENvbG9yfS5rYXRleCAua2F0ZXgtdmVyc2lvbjphZnRlcntjb250ZW50OlwiMC4xNi4yNVwifS5rYXRleCAua2F0ZXgtbWF0aG1se2NsaXA6cmVjdCgxcHgsMXB4LDFweCwxcHgpO2JvcmRlcjowO2hlaWdodDoxcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHh9LmthdGV4IC5rYXRleC1odG1sPi5uZXdsaW5le2Rpc3BsYXk6YmxvY2t9LmthdGV4IC5iYXNle3Bvc2l0aW9uOnJlbGF0aXZlO3doaXRlLXNwYWNlOm5vd3JhcDt3aWR0aDotd2Via2l0LW1pbi1jb250ZW50O3dpZHRoOi1tb3otbWluLWNvbnRlbnQ7d2lkdGg6bWluLWNvbnRlbnR9LmthdGV4IC5iYXNlLC5rYXRleCAuc3RydXR7ZGlzcGxheTppbmxpbmUtYmxvY2t9LmthdGV4IC50ZXh0YmZ7Zm9udC13ZWlnaHQ6NzAwfS5rYXRleCAudGV4dGl0e2ZvbnQtc3R5bGU6aXRhbGljfS5rYXRleCAudGV4dHJte2ZvbnQtZmFtaWx5OkthVGVYX01haW59LmthdGV4IC50ZXh0c2Z7Zm9udC1mYW1pbHk6S2FUZVhfU2Fuc1NlcmlmfS5rYXRleCAudGV4dHR0e2ZvbnQtZmFtaWx5OkthVGVYX1R5cGV3cml0ZXJ9LmthdGV4IC5tYXRobm9ybWFse2ZvbnQtZmFtaWx5OkthVGVYX01hdGg7Zm9udC1zdHlsZTppdGFsaWN9LmthdGV4IC5tYXRoaXR7Zm9udC1mYW1pbHk6S2FUZVhfTWFpbjtmb250LXN0eWxlOml0YWxpY30ua2F0ZXggLm1hdGhybXtmb250LXN0eWxlOm5vcm1hbH0ua2F0ZXggLm1hdGhiZntmb250LWZhbWlseTpLYVRlWF9NYWluO2ZvbnQtd2VpZ2h0OjcwMH0ua2F0ZXggLmJvbGRzeW1ib2x7Zm9udC1mYW1pbHk6S2FUZVhfTWF0aDtmb250LXN0eWxlOml0YWxpYztmb250LXdlaWdodDo3MDB9LmthdGV4IC5hbXNybSwua2F0ZXggLm1hdGhiYiwua2F0ZXggLnRleHRiYntmb250LWZhbWlseTpLYVRlWF9BTVN9LmthdGV4IC5tYXRoY2Fse2ZvbnQtZmFtaWx5OkthVGVYX0NhbGlncmFwaGljfS5rYXRleCAubWF0aGZyYWssLmthdGV4IC50ZXh0ZnJha3tmb250LWZhbWlseTpLYVRlWF9GcmFrdHVyfS5rYXRleCAubWF0aGJvbGRmcmFrLC5rYXRleCAudGV4dGJvbGRmcmFre2ZvbnQtZmFtaWx5OkthVGVYX0ZyYWt0dXI7Zm9udC13ZWlnaHQ6NzAwfS5rYXRleCAubWF0aHR0e2ZvbnQtZmFtaWx5OkthVGVYX1R5cGV3cml0ZXJ9LmthdGV4IC5tYXRoc2NyLC5rYXRleCAudGV4dHNjcntmb250LWZhbWlseTpLYVRlWF9TY3JpcHR9LmthdGV4IC5tYXRoc2YsLmthdGV4IC50ZXh0c2Z7Zm9udC1mYW1pbHk6S2FUZVhfU2Fuc1NlcmlmfS5rYXRleCAubWF0aGJvbGRzZiwua2F0ZXggLnRleHRib2xkc2Z7Zm9udC1mYW1pbHk6S2FUZVhfU2Fuc1NlcmlmO2ZvbnQtd2VpZ2h0OjcwMH0ua2F0ZXggLm1hdGhpdHNmLC5rYXRleCAubWF0aHNmaXQsLmthdGV4IC50ZXh0aXRzZntmb250LWZhbWlseTpLYVRlWF9TYW5zU2VyaWY7Zm9udC1zdHlsZTppdGFsaWN9LmthdGV4IC5tYWlucm17Zm9udC1mYW1pbHk6S2FUZVhfTWFpbjtmb250LXN0eWxlOm5vcm1hbH0ua2F0ZXggLnZsaXN0LXR7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2Rpc3BsYXk6aW5saW5lLXRhYmxlO3RhYmxlLWxheW91dDpmaXhlZH0ua2F0ZXggLnZsaXN0LXJ7ZGlzcGxheTp0YWJsZS1yb3d9LmthdGV4IC52bGlzdHtkaXNwbGF5OnRhYmxlLWNlbGw7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246Ym90dG9tfS5rYXRleCAudmxpc3Q+c3BhbntkaXNwbGF5OmJsb2NrO2hlaWdodDowO3Bvc2l0aW9uOnJlbGF0aXZlfS5rYXRleCAudmxpc3Q+c3Bhbj5zcGFue2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5rYXRleCAudmxpc3Q+c3Bhbj4ucHN0cnV0e292ZXJmbG93OmhpZGRlbjt3aWR0aDowfS5rYXRleCAudmxpc3QtdDJ7bWFyZ2luLXJpZ2h0Oi0ycHh9LmthdGV4IC52bGlzdC1ze2Rpc3BsYXk6dGFibGUtY2VsbDtmb250LXNpemU6MXB4O21pbi13aWR0aDoycHg7dmVydGljYWwtYWxpZ246Ym90dG9tO3dpZHRoOjJweH0ua2F0ZXggLnZib3h7YWxpZ24taXRlbXM6YmFzZWxpbmU7ZGlzcGxheTppbmxpbmUtZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmthdGV4IC5oYm94e3dpZHRoOjEwMCV9LmthdGV4IC5oYm94LC5rYXRleCAudGhpbmJveHtkaXNwbGF5OmlubGluZS1mbGV4O2ZsZXgtZGlyZWN0aW9uOnJvd30ua2F0ZXggLnRoaW5ib3h7bWF4LXdpZHRoOjA7d2lkdGg6MH0ua2F0ZXggLm1zdXBzdWJ7dGV4dC1hbGlnbjpsZWZ0fS5rYXRleCAubWZyYWM+c3Bhbj5zcGFue3RleHQtYWxpZ246Y2VudGVyfS5rYXRleCAubWZyYWMgLmZyYWMtbGluZXtib3JkZXItYm90dG9tLXN0eWxlOnNvbGlkO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCV9LmthdGV4IC5oZGFzaGxpbmUsLmthdGV4IC5obGluZSwua2F0ZXggLm1mcmFjIC5mcmFjLWxpbmUsLmthdGV4IC5vdmVybGluZSAub3ZlcmxpbmUtbGluZSwua2F0ZXggLnJ1bGUsLmthdGV4IC51bmRlcmxpbmUgLnVuZGVybGluZS1saW5le21pbi1oZWlnaHQ6MXB4fS5rYXRleCAubXNwYWNle2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5rYXRleCAuY2xhcCwua2F0ZXggLmxsYXAsLmthdGV4IC5ybGFwe3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjB9LmthdGV4IC5jbGFwPi5pbm5lciwua2F0ZXggLmxsYXA+LmlubmVyLC5rYXRleCAucmxhcD4uaW5uZXJ7cG9zaXRpb246YWJzb2x1dGV9LmthdGV4IC5jbGFwPi5maXgsLmthdGV4IC5sbGFwPi5maXgsLmthdGV4IC5ybGFwPi5maXh7ZGlzcGxheTppbmxpbmUtYmxvY2t9LmthdGV4IC5sbGFwPi5pbm5lcntyaWdodDowfS5rYXRleCAuY2xhcD4uaW5uZXIsLmthdGV4IC5ybGFwPi5pbm5lcntsZWZ0OjB9LmthdGV4IC5jbGFwPi5pbm5lcj5zcGFue21hcmdpbi1sZWZ0Oi01MCU7bWFyZ2luLXJpZ2h0OjUwJX0ua2F0ZXggLnJ1bGV7Ym9yZGVyOjAgc29saWQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmV9LmthdGV4IC5obGluZSwua2F0ZXggLm92ZXJsaW5lIC5vdmVybGluZS1saW5lLC5rYXRleCAudW5kZXJsaW5lIC51bmRlcmxpbmUtbGluZXtib3JkZXItYm90dG9tLXN0eWxlOnNvbGlkO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCV9LmthdGV4IC5oZGFzaGxpbmV7Ym9yZGVyLWJvdHRvbS1zdHlsZTpkYXNoZWQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJX0ua2F0ZXggLnNxcnQ+LnJvb3R7bWFyZ2luLWxlZnQ6LjI3Nzc3Nzc3NzhlbTttYXJnaW4tcmlnaHQ6LS41NTU1NTU1NTU2ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUxLnNpemUxLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemUxLnNpemUxe2ZvbnQtc2l6ZToxZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUxLnNpemUyLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemUxLnNpemUye2ZvbnQtc2l6ZToxLjJlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTEuc2l6ZTMsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTEuc2l6ZTN7Zm9udC1zaXplOjEuNGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMS5zaXplNCwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMS5zaXplNHtmb250LXNpemU6MS42ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUxLnNpemU1LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemUxLnNpemU1e2ZvbnQtc2l6ZToxLjhlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTEuc2l6ZTYsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTEuc2l6ZTZ7Zm9udC1zaXplOjJlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTEuc2l6ZTcsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTEuc2l6ZTd7Zm9udC1zaXplOjIuNGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMS5zaXplOCwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMS5zaXplOHtmb250LXNpemU6Mi44OGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMS5zaXplOSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMS5zaXplOXtmb250LXNpemU6My40NTZlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTEuc2l6ZTEwLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemUxLnNpemUxMHtmb250LXNpemU6NC4xNDhlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTEuc2l6ZTExLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemUxLnNpemUxMXtmb250LXNpemU6NC45NzZlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTIuc2l6ZTEsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTIuc2l6ZTF7Zm9udC1zaXplOi44MzMzMzMzMzMzZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUyLnNpemUyLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemUyLnNpemUye2ZvbnQtc2l6ZToxZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUyLnNpemUzLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemUyLnNpemUze2ZvbnQtc2l6ZToxLjE2NjY2NjY2NjdlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTIuc2l6ZTQsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTIuc2l6ZTR7Zm9udC1zaXplOjEuMzMzMzMzMzMzM2VtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMi5zaXplNSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMi5zaXplNXtmb250LXNpemU6MS41ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUyLnNpemU2LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemUyLnNpemU2e2ZvbnQtc2l6ZToxLjY2NjY2NjY2NjdlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTIuc2l6ZTcsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTIuc2l6ZTd7Zm9udC1zaXplOjJlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTIuc2l6ZTgsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTIuc2l6ZTh7Zm9udC1zaXplOjIuNGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMi5zaXplOSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMi5zaXplOXtmb250LXNpemU6Mi44OGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMi5zaXplMTAsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTIuc2l6ZTEwe2ZvbnQtc2l6ZTozLjQ1NjY2NjY2NjdlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTIuc2l6ZTExLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemUyLnNpemUxMXtmb250LXNpemU6NC4xNDY2NjY2NjY3ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUzLnNpemUxLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemUzLnNpemUxe2ZvbnQtc2l6ZTouNzE0Mjg1NzE0M2VtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMy5zaXplMiwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMy5zaXplMntmb250LXNpemU6Ljg1NzE0Mjg1NzFlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTMuc2l6ZTMsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTMuc2l6ZTN7Zm9udC1zaXplOjFlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTMuc2l6ZTQsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTMuc2l6ZTR7Zm9udC1zaXplOjEuMTQyODU3MTQyOWVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMy5zaXplNSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMy5zaXplNXtmb250LXNpemU6MS4yODU3MTQyODU3ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUzLnNpemU2LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemUzLnNpemU2e2ZvbnQtc2l6ZToxLjQyODU3MTQyODZlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTMuc2l6ZTcsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTMuc2l6ZTd7Zm9udC1zaXplOjEuNzE0Mjg1NzE0M2VtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMy5zaXplOCwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMy5zaXplOHtmb250LXNpemU6Mi4wNTcxNDI4NTcxZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUzLnNpemU5LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemUzLnNpemU5e2ZvbnQtc2l6ZToyLjQ2ODU3MTQyODZlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTMuc2l6ZTEwLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemUzLnNpemUxMHtmb250LXNpemU6Mi45NjI4NTcxNDI5ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUzLnNpemUxMSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMy5zaXplMTF7Zm9udC1zaXplOjMuNTU0Mjg1NzE0M2VtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNC5zaXplMSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplNC5zaXplMXtmb250LXNpemU6LjYyNWVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNC5zaXplMiwua2F0ZXggLnNpemluZy5yZXNldC1zaXplNC5zaXplMntmb250LXNpemU6Ljc1ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU0LnNpemUzLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU0LnNpemUze2ZvbnQtc2l6ZTouODc1ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU0LnNpemU0LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU0LnNpemU0e2ZvbnQtc2l6ZToxZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU0LnNpemU1LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU0LnNpemU1e2ZvbnQtc2l6ZToxLjEyNWVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNC5zaXplNiwua2F0ZXggLnNpemluZy5yZXNldC1zaXplNC5zaXplNntmb250LXNpemU6MS4yNWVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNC5zaXplNywua2F0ZXggLnNpemluZy5yZXNldC1zaXplNC5zaXplN3tmb250LXNpemU6MS41ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU0LnNpemU4LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU0LnNpemU4e2ZvbnQtc2l6ZToxLjhlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTQuc2l6ZTksLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTQuc2l6ZTl7Zm9udC1zaXplOjIuMTZlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTQuc2l6ZTEwLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU0LnNpemUxMHtmb250LXNpemU6Mi41OTI1ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU0LnNpemUxMSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplNC5zaXplMTF7Zm9udC1zaXplOjMuMTFlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTUuc2l6ZTEsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTUuc2l6ZTF7Zm9udC1zaXplOi41NTU1NTU1NTU2ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU1LnNpemUyLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU1LnNpemUye2ZvbnQtc2l6ZTouNjY2NjY2NjY2N2VtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNS5zaXplMywua2F0ZXggLnNpemluZy5yZXNldC1zaXplNS5zaXplM3tmb250LXNpemU6Ljc3Nzc3Nzc3NzhlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTUuc2l6ZTQsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTUuc2l6ZTR7Zm9udC1zaXplOi44ODg4ODg4ODg5ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU1LnNpemU1LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU1LnNpemU1e2ZvbnQtc2l6ZToxZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU1LnNpemU2LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU1LnNpemU2e2ZvbnQtc2l6ZToxLjExMTExMTExMTFlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTUuc2l6ZTcsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTUuc2l6ZTd7Zm9udC1zaXplOjEuMzMzMzMzMzMzM2VtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNS5zaXplOCwua2F0ZXggLnNpemluZy5yZXNldC1zaXplNS5zaXplOHtmb250LXNpemU6MS42ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU1LnNpemU5LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU1LnNpemU5e2ZvbnQtc2l6ZToxLjkyZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU1LnNpemUxMCwua2F0ZXggLnNpemluZy5yZXNldC1zaXplNS5zaXplMTB7Zm9udC1zaXplOjIuMzA0NDQ0NDQ0NGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNS5zaXplMTEsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTUuc2l6ZTExe2ZvbnQtc2l6ZToyLjc2NDQ0NDQ0NDRlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTYuc2l6ZTEsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTYuc2l6ZTF7Zm9udC1zaXplOi41ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU2LnNpemUyLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU2LnNpemUye2ZvbnQtc2l6ZTouNmVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNi5zaXplMywua2F0ZXggLnNpemluZy5yZXNldC1zaXplNi5zaXplM3tmb250LXNpemU6LjdlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTYuc2l6ZTQsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTYuc2l6ZTR7Zm9udC1zaXplOi44ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU2LnNpemU1LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU2LnNpemU1e2ZvbnQtc2l6ZTouOWVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNi5zaXplNiwua2F0ZXggLnNpemluZy5yZXNldC1zaXplNi5zaXplNntmb250LXNpemU6MWVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNi5zaXplNywua2F0ZXggLnNpemluZy5yZXNldC1zaXplNi5zaXplN3tmb250LXNpemU6MS4yZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU2LnNpemU4LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU2LnNpemU4e2ZvbnQtc2l6ZToxLjQ0ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU2LnNpemU5LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU2LnNpemU5e2ZvbnQtc2l6ZToxLjcyOGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNi5zaXplMTAsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTYuc2l6ZTEwe2ZvbnQtc2l6ZToyLjA3NGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNi5zaXplMTEsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTYuc2l6ZTExe2ZvbnQtc2l6ZToyLjQ4OGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNy5zaXplMSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplNy5zaXplMXtmb250LXNpemU6LjQxNjY2NjY2NjdlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTcuc2l6ZTIsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTcuc2l6ZTJ7Zm9udC1zaXplOi41ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU3LnNpemUzLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU3LnNpemUze2ZvbnQtc2l6ZTouNTgzMzMzMzMzM2VtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNy5zaXplNCwua2F0ZXggLnNpemluZy5yZXNldC1zaXplNy5zaXplNHtmb250LXNpemU6LjY2NjY2NjY2NjdlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTcuc2l6ZTUsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTcuc2l6ZTV7Zm9udC1zaXplOi43NWVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNy5zaXplNiwua2F0ZXggLnNpemluZy5yZXNldC1zaXplNy5zaXplNntmb250LXNpemU6LjgzMzMzMzMzMzNlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTcuc2l6ZTcsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTcuc2l6ZTd7Zm9udC1zaXplOjFlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTcuc2l6ZTgsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTcuc2l6ZTh7Zm9udC1zaXplOjEuMmVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNy5zaXplOSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplNy5zaXplOXtmb250LXNpemU6MS40NGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplNy5zaXplMTAsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTcuc2l6ZTEwe2ZvbnQtc2l6ZToxLjcyODMzMzMzMzNlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTcuc2l6ZTExLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU3LnNpemUxMXtmb250LXNpemU6Mi4wNzMzMzMzMzMzZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU4LnNpemUxLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU4LnNpemUxe2ZvbnQtc2l6ZTouMzQ3MjIyMjIyMmVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplOC5zaXplMiwua2F0ZXggLnNpemluZy5yZXNldC1zaXplOC5zaXplMntmb250LXNpemU6LjQxNjY2NjY2NjdlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTguc2l6ZTMsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTguc2l6ZTN7Zm9udC1zaXplOi40ODYxMTExMTExZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU4LnNpemU0LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU4LnNpemU0e2ZvbnQtc2l6ZTouNTU1NTU1NTU1NmVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplOC5zaXplNSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplOC5zaXplNXtmb250LXNpemU6LjYyNWVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplOC5zaXplNiwua2F0ZXggLnNpemluZy5yZXNldC1zaXplOC5zaXplNntmb250LXNpemU6LjY5NDQ0NDQ0NDRlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTguc2l6ZTcsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTguc2l6ZTd7Zm9udC1zaXplOi44MzMzMzMzMzMzZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU4LnNpemU4LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU4LnNpemU4e2ZvbnQtc2l6ZToxZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU4LnNpemU5LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU4LnNpemU5e2ZvbnQtc2l6ZToxLjJlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTguc2l6ZTEwLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU4LnNpemUxMHtmb250LXNpemU6MS40NDAyNzc3Nzc4ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU4LnNpemUxMSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplOC5zaXplMTF7Zm9udC1zaXplOjEuNzI3Nzc3Nzc3OGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplOS5zaXplMSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplOS5zaXplMXtmb250LXNpemU6LjI4OTM1MTg1MTllbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTkuc2l6ZTIsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTkuc2l6ZTJ7Zm9udC1zaXplOi4zNDcyMjIyMjIyZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU5LnNpemUzLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU5LnNpemUze2ZvbnQtc2l6ZTouNDA1MDkyNTkyNmVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplOS5zaXplNCwua2F0ZXggLnNpemluZy5yZXNldC1zaXplOS5zaXplNHtmb250LXNpemU6LjQ2Mjk2Mjk2M2VtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplOS5zaXplNSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplOS5zaXplNXtmb250LXNpemU6LjUyMDgzMzMzMzNlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTkuc2l6ZTYsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTkuc2l6ZTZ7Zm9udC1zaXplOi41Nzg3MDM3MDM3ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU5LnNpemU3LC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU5LnNpemU3e2ZvbnQtc2l6ZTouNjk0NDQ0NDQ0NGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplOS5zaXplOCwua2F0ZXggLnNpemluZy5yZXNldC1zaXplOS5zaXplOHtmb250LXNpemU6LjgzMzMzMzMzMzNlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTkuc2l6ZTksLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTkuc2l6ZTl7Zm9udC1zaXplOjFlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTkuc2l6ZTEwLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemU5LnNpemUxMHtmb250LXNpemU6MS4yMDAyMzE0ODE1ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemU5LnNpemUxMSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplOS5zaXplMTF7Zm9udC1zaXplOjEuNDM5ODE0ODE0OGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMTAuc2l6ZTEsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTEwLnNpemUxe2ZvbnQtc2l6ZTouMjQxMDgwMDM4NmVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMTAuc2l6ZTIsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTEwLnNpemUye2ZvbnQtc2l6ZTouMjg5Mjk2MDQ2M2VtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMTAuc2l6ZTMsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTEwLnNpemUze2ZvbnQtc2l6ZTouMzM3NTEyMDU0ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUxMC5zaXplNCwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMTAuc2l6ZTR7Zm9udC1zaXplOi4zODU3MjgwNjE3ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUxMC5zaXplNSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMTAuc2l6ZTV7Zm9udC1zaXplOi40MzM5NDQwNjk0ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUxMC5zaXplNiwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMTAuc2l6ZTZ7Zm9udC1zaXplOi40ODIxNjAwNzcxZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUxMC5zaXplNywua2F0ZXggLnNpemluZy5yZXNldC1zaXplMTAuc2l6ZTd7Zm9udC1zaXplOi41Nzg1OTIwOTI2ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUxMC5zaXplOCwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMTAuc2l6ZTh7Zm9udC1zaXplOi42OTQzMTA1MTExZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUxMC5zaXplOSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMTAuc2l6ZTl7Zm9udC1zaXplOi44MzMxNzI2MTMzZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUxMC5zaXplMTAsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTEwLnNpemUxMHtmb250LXNpemU6MWVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMTAuc2l6ZTExLC5rYXRleCAuc2l6aW5nLnJlc2V0LXNpemUxMC5zaXplMTF7Zm9udC1zaXplOjEuMTk5NjE0MjcxOWVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMTEuc2l6ZTEsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTExLnNpemUxe2ZvbnQtc2l6ZTouMjAwOTY0NjMwMmVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMTEuc2l6ZTIsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTExLnNpemUye2ZvbnQtc2l6ZTouMjQxMTU3NTU2M2VtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMTEuc2l6ZTMsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTExLnNpemUze2ZvbnQtc2l6ZTouMjgxMzUwNDgyM2VtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMTEuc2l6ZTQsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTExLnNpemU0e2ZvbnQtc2l6ZTouMzIxNTQzNDA4NGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMTEuc2l6ZTUsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTExLnNpemU1e2ZvbnQtc2l6ZTouMzYxNzM2MzM0NGVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMTEuc2l6ZTYsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTExLnNpemU2e2ZvbnQtc2l6ZTouNDAxOTI5MjYwNWVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMTEuc2l6ZTcsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTExLnNpemU3e2ZvbnQtc2l6ZTouNDgyMzE1MTEyNWVtfS5rYXRleCAuZm9udHNpemUtZW5zdXJlci5yZXNldC1zaXplMTEuc2l6ZTgsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTExLnNpemU4e2ZvbnQtc2l6ZTouNTc4Nzc4MTM1ZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUxMS5zaXplOSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMTEuc2l6ZTl7Zm9udC1zaXplOi42OTQ1MzM3NjIxZW19LmthdGV4IC5mb250c2l6ZS1lbnN1cmVyLnJlc2V0LXNpemUxMS5zaXplMTAsLmthdGV4IC5zaXppbmcucmVzZXQtc2l6ZTExLnNpemUxMHtmb250LXNpemU6LjgzMzYwMTI4NjJlbX0ua2F0ZXggLmZvbnRzaXplLWVuc3VyZXIucmVzZXQtc2l6ZTExLnNpemUxMSwua2F0ZXggLnNpemluZy5yZXNldC1zaXplMTEuc2l6ZTExe2ZvbnQtc2l6ZToxZW19LmthdGV4IC5kZWxpbXNpemluZy5zaXplMXtmb250LWZhbWlseTpLYVRlWF9TaXplMX0ua2F0ZXggLmRlbGltc2l6aW5nLnNpemUye2ZvbnQtZmFtaWx5OkthVGVYX1NpemUyfS5rYXRleCAuZGVsaW1zaXppbmcuc2l6ZTN7Zm9udC1mYW1pbHk6S2FUZVhfU2l6ZTN9LmthdGV4IC5kZWxpbXNpemluZy5zaXplNHtmb250LWZhbWlseTpLYVRlWF9TaXplNH0ua2F0ZXggLmRlbGltc2l6aW5nLm11bHQgLmRlbGltLXNpemUxPnNwYW57Zm9udC1mYW1pbHk6S2FUZVhfU2l6ZTF9LmthdGV4IC5kZWxpbXNpemluZy5tdWx0IC5kZWxpbS1zaXplND5zcGFue2ZvbnQtZmFtaWx5OkthVGVYX1NpemU0fS5rYXRleCAubnVsbGRlbGltaXRlcntkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDouMTJlbX0ua2F0ZXggLmRlbGltY2VudGVyLC5rYXRleCAub3Atc3ltYm9se3Bvc2l0aW9uOnJlbGF0aXZlfS5rYXRleCAub3Atc3ltYm9sLnNtYWxsLW9we2ZvbnQtZmFtaWx5OkthVGVYX1NpemUxfS5rYXRleCAub3Atc3ltYm9sLmxhcmdlLW9we2ZvbnQtZmFtaWx5OkthVGVYX1NpemUyfS5rYXRleCAuYWNjZW50Pi52bGlzdC10LC5rYXRleCAub3AtbGltaXRzPi52bGlzdC10e3RleHQtYWxpZ246Y2VudGVyfS5rYXRleCAuYWNjZW50IC5hY2NlbnQtYm9keXtwb3NpdGlvbjpyZWxhdGl2ZX0ua2F0ZXggLmFjY2VudCAuYWNjZW50LWJvZHk6bm90KC5hY2NlbnQtZnVsbCl7d2lkdGg6MH0ua2F0ZXggLm92ZXJsYXl7ZGlzcGxheTpibG9ja30ua2F0ZXggLm10YWJsZSAudmVydGljYWwtc2VwYXJhdG9ye2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi13aWR0aDoxcHh9LmthdGV4IC5tdGFibGUgLmFycmF5Y29sc2Vwe2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5rYXRleCAubXRhYmxlIC5jb2wtYWxpZ24tYz4udmxpc3QtdHt0ZXh0LWFsaWduOmNlbnRlcn0ua2F0ZXggLm10YWJsZSAuY29sLWFsaWduLWw+LnZsaXN0LXR7dGV4dC1hbGlnbjpsZWZ0fS5rYXRleCAubXRhYmxlIC5jb2wtYWxpZ24tcj4udmxpc3QtdHt0ZXh0LWFsaWduOnJpZ2h0fS5rYXRleCAuc3ZnLWFsaWdue3RleHQtYWxpZ246bGVmdH0ua2F0ZXggc3Zne2ZpbGw6Y3VycmVudENvbG9yO3N0cm9rZTpjdXJyZW50Q29sb3I7ZmlsbC1ydWxlOm5vbnplcm87ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OmluaGVyaXQ7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJX0ua2F0ZXggc3ZnIHBhdGh7c3Ryb2tlOm5vbmV9LmthdGV4IGltZ3tib3JkZXItc3R5bGU6bm9uZTttYXgtaGVpZ2h0Om5vbmU7bWF4LXdpZHRoOm5vbmU7bWluLWhlaWdodDowO21pbi13aWR0aDowfS5rYXRleCAuc3RyZXRjaHl7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJX0ua2F0ZXggLnN0cmV0Y2h5OmFmdGVyLC5rYXRleCAuc3RyZXRjaHk6YmVmb3Jle2NvbnRlbnQ6XCJcIn0ua2F0ZXggLmhpZGUtdGFpbHtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJX0ua2F0ZXggLmhhbGZhcnJvdy1sZWZ0e2xlZnQ6MDtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6NTAuMiV9LmthdGV4IC5oYWxmYXJyb3ctcmlnaHR7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7d2lkdGg6NTAuMiV9LmthdGV4IC5icmFjZS1sZWZ0e2xlZnQ6MDtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MjUuMSV9LmthdGV4IC5icmFjZS1jZW50ZXJ7bGVmdDoyNSU7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjUwJX0ua2F0ZXggLmJyYWNlLXJpZ2h0e292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3dpZHRoOjI1LjElfS5rYXRleCAueC1hcnJvdy1wYWR7cGFkZGluZzowIC41ZW19LmthdGV4IC5jZC1hcnJvdy1wYWR7cGFkZGluZzowIC41NTU1NmVtIDAgLjI3Nzc4ZW19LmthdGV4IC5tb3Zlciwua2F0ZXggLm11bmRlciwua2F0ZXggLngtYXJyb3d7dGV4dC1hbGlnbjpjZW50ZXJ9LmthdGV4IC5ib3hwYWR7cGFkZGluZzowIC4zZW19LmthdGV4IC5mYm94LC5rYXRleCAuZmNvbG9yYm94e2JvcmRlcjouMDRlbSBzb2xpZDtib3gtc2l6aW5nOmJvcmRlci1ib3h9LmthdGV4IC5jYW5jZWwtcGFke3BhZGRpbmc6MCAuMmVtfS5rYXRleCAuY2FuY2VsLWxhcHttYXJnaW4tbGVmdDotLjJlbTttYXJnaW4tcmlnaHQ6LS4yZW19LmthdGV4IC5zb3V0e2JvcmRlci1ib3R0b20tc3R5bGU6c29saWQ7Ym9yZGVyLWJvdHRvbS13aWR0aDouMDhlbX0ua2F0ZXggLmFuZ2x7Ym9yZGVyLXJpZ2h0Oi4wNDllbSBzb2xpZDtib3JkZXItdG9wOi4wNDllbSBzb2xpZDtib3gtc2l6aW5nOmJvcmRlci1ib3g7bWFyZ2luLXJpZ2h0Oi4wMzg4OWVtfS5rYXRleCAuYW5nbHBhZHtwYWRkaW5nOjAgLjAzODg5ZW19LmthdGV4IC5lcW4tbnVtOmJlZm9yZXtjb250ZW50OlwiKFwiIGNvdW50ZXIoa2F0ZXhFcW5ObykgXCIpXCI7Y291bnRlci1pbmNyZW1lbnQ6a2F0ZXhFcW5Ob30ua2F0ZXggLm1tbC1lcW4tbnVtOmJlZm9yZXtjb250ZW50OlwiKFwiIGNvdW50ZXIobW1sRXFuTm8pIFwiKVwiO2NvdW50ZXItaW5jcmVtZW50Om1tbEVxbk5vfS5rYXRleCAubXRyLWdsdWV7d2lkdGg6NTAlfS5rYXRleCAuY2QtdmVydC1hcnJvd3tkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZX0ua2F0ZXggLmNkLWxhYmVsLWxlZnR7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6Y2FsYyg1MCUgKyAuM2VtKTt0ZXh0LWFsaWduOmxlZnR9LmthdGV4IC5jZC1sYWJlbC1yaWdodHtkaXNwbGF5OmlubGluZS1ibG9jaztsZWZ0OmNhbGMoNTAlICsgLjNlbSk7cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpyaWdodH0ua2F0ZXgtZGlzcGxheXtkaXNwbGF5OmJsb2NrO21hcmdpbjoxZW0gMDt0ZXh0LWFsaWduOmNlbnRlcn0ua2F0ZXgtZGlzcGxheT4ua2F0ZXh7ZGlzcGxheTpibG9jazt0ZXh0LWFsaWduOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXB9LmthdGV4LWRpc3BsYXk+LmthdGV4Pi5rYXRleC1odG1se2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmV9LmthdGV4LWRpc3BsYXk+LmthdGV4Pi5rYXRleC1odG1sPi50YWd7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MH0ua2F0ZXgtZGlzcGxheS5sZXFubz4ua2F0ZXg+LmthdGV4LWh0bWw+LnRhZ3tsZWZ0OjA7cmlnaHQ6YXV0b30ua2F0ZXgtZGlzcGxheS5mbGVxbj4ua2F0ZXh7cGFkZGluZy1sZWZ0OjJlbTt0ZXh0LWFsaWduOmxlZnR9Ym9keXtjb3VudGVyLXJlc2V0OmthdGV4RXFuTm8gbW1sRXFuTm99XG4iLCAicHJlIGNvZGUuaGxqc3tkaXNwbGF5OmJsb2NrO292ZXJmbG93LXg6YXV0bztwYWRkaW5nOjFlbX1jb2RlLmhsanN7cGFkZGluZzozcHggNXB4fS8qIVxuICBUaGVtZTogR2l0SHViXG4gIERlc2NyaXB0aW9uOiBMaWdodCB0aGVtZSBhcyBzZWVuIG9uIGdpdGh1Yi5jb21cbiAgQXV0aG9yOiBnaXRodWIuY29tXG4gIE1haW50YWluZXI6IEBIaXJzZVxuICBVcGRhdGVkOiAyMDIxLTA1LTE1XG5cbiAgT3V0ZGF0ZWQgYmFzZSB2ZXJzaW9uOiBodHRwczovL2dpdGh1Yi5jb20vcHJpbWVyL2dpdGh1Yi1zeW50YXgtbGlnaHRcbiAgQ3VycmVudCBjb2xvcnMgdGFrZW4gZnJvbSBHaXRIdWIncyBDU1NcbiovLmhsanN7Y29sb3I6IzI0MjkyZTtiYWNrZ3JvdW5kOiNmZmZ9LmhsanMtZG9jdGFnLC5obGpzLWtleXdvcmQsLmhsanMtbWV0YSAuaGxqcy1rZXl3b3JkLC5obGpzLXRlbXBsYXRlLXRhZywuaGxqcy10ZW1wbGF0ZS12YXJpYWJsZSwuaGxqcy10eXBlLC5obGpzLXZhcmlhYmxlLmxhbmd1YWdlX3tjb2xvcjojZDczYTQ5fS5obGpzLXRpdGxlLC5obGpzLXRpdGxlLmNsYXNzXywuaGxqcy10aXRsZS5jbGFzc18uaW5oZXJpdGVkX18sLmhsanMtdGl0bGUuZnVuY3Rpb25fe2NvbG9yOiM2ZjQyYzF9LmhsanMtYXR0ciwuaGxqcy1hdHRyaWJ1dGUsLmhsanMtbGl0ZXJhbCwuaGxqcy1tZXRhLC5obGpzLW51bWJlciwuaGxqcy1vcGVyYXRvciwuaGxqcy1zZWxlY3Rvci1hdHRyLC5obGpzLXNlbGVjdG9yLWNsYXNzLC5obGpzLXNlbGVjdG9yLWlkLC5obGpzLXZhcmlhYmxle2NvbG9yOiMwMDVjYzV9LmhsanMtbWV0YSAuaGxqcy1zdHJpbmcsLmhsanMtcmVnZXhwLC5obGpzLXN0cmluZ3tjb2xvcjojMDMyZjYyfS5obGpzLWJ1aWx0X2luLC5obGpzLXN5bWJvbHtjb2xvcjojZTM2MjA5fS5obGpzLWNvZGUsLmhsanMtY29tbWVudCwuaGxqcy1mb3JtdWxhe2NvbG9yOiM2YTczN2R9LmhsanMtbmFtZSwuaGxqcy1xdW90ZSwuaGxqcy1zZWxlY3Rvci1wc2V1ZG8sLmhsanMtc2VsZWN0b3ItdGFne2NvbG9yOiMyMjg2M2F9LmhsanMtc3Vic3R7Y29sb3I6IzI0MjkyZX0uaGxqcy1zZWN0aW9ue2NvbG9yOiMwMDVjYzU7Zm9udC13ZWlnaHQ6NzAwfS5obGpzLWJ1bGxldHtjb2xvcjojNzM1YzBmfS5obGpzLWVtcGhhc2lze2NvbG9yOiMyNDI5MmU7Zm9udC1zdHlsZTppdGFsaWN9LmhsanMtc3Ryb25ne2NvbG9yOiMyNDI5MmU7Zm9udC13ZWlnaHQ6NzAwfS5obGpzLWFkZGl0aW9ue2NvbG9yOiMyMjg2M2E7YmFja2dyb3VuZC1jb2xvcjojZjBmZmY0fS5obGpzLWRlbGV0aW9ue2NvbG9yOiNiMzFkMjg7YmFja2dyb3VuZC1jb2xvcjojZmZlZWYwfSIsICI6aG9zdCw6cm9vdHstLWQyaC1iZy1jb2xvcjojZmZmOy0tZDJoLWJvcmRlci1jb2xvcjojZGRkOy0tZDJoLWRpbS1jb2xvcjpyZ2JhKDAsMCwwLC4zKTstLWQyaC1saW5lLWJvcmRlci1jb2xvcjojZWVlOy0tZDJoLWZpbGUtaGVhZGVyLWJnLWNvbG9yOiNmN2Y3Zjc7LS1kMmgtZmlsZS1oZWFkZXItYm9yZGVyLWNvbG9yOiNkOGQ4ZDg7LS1kMmgtZW1wdHktcGxhY2Vob2xkZXItYmctY29sb3I6I2YxZjFmMTstLWQyaC1lbXB0eS1wbGFjZWhvbGRlci1ib3JkZXItY29sb3I6I2UxZTFlMTstLWQyaC1zZWxlY3RlZC1jb2xvcjojYzhlMWZmOy0tZDJoLWlucy1iZy1jb2xvcjojZGZkOy0tZDJoLWlucy1ib3JkZXItY29sb3I6I2I0ZTJiNDstLWQyaC1pbnMtaGlnaGxpZ2h0LWJnLWNvbG9yOiM5N2YyOTU7LS1kMmgtaW5zLWxhYmVsLWNvbG9yOiMzOTk4Mzk7LS1kMmgtZGVsLWJnLWNvbG9yOiNmZWU4ZTk7LS1kMmgtZGVsLWJvcmRlci1jb2xvcjojZTlhZWFlOy0tZDJoLWRlbC1oaWdobGlnaHQtYmctY29sb3I6I2ZmYjZiYTstLWQyaC1kZWwtbGFiZWwtY29sb3I6I2MzMzstLWQyaC1jaGFuZ2UtZGVsLWNvbG9yOiNmZGYyZDA7LS1kMmgtY2hhbmdlLWlucy1jb2xvcjojZGVkOy0tZDJoLWluZm8tYmctY29sb3I6I2Y4ZmFmZDstLWQyaC1pbmZvLWJvcmRlci1jb2xvcjojZDVlNGYyOy0tZDJoLWNoYW5nZS1sYWJlbC1jb2xvcjojZDBiNDRjOy0tZDJoLW1vdmVkLWxhYmVsLWNvbG9yOiMzNTcyYjA7LS1kMmgtZGFyay1jb2xvcjojZTZlZGYzOy0tZDJoLWRhcmstYmctY29sb3I6IzBkMTExNzstLWQyaC1kYXJrLWJvcmRlci1jb2xvcjojMzAzNjNkOy0tZDJoLWRhcmstZGltLWNvbG9yOiM2ZTc2ODE7LS1kMmgtZGFyay1saW5lLWJvcmRlci1jb2xvcjojMjEyNjJkOy0tZDJoLWRhcmstZmlsZS1oZWFkZXItYmctY29sb3I6IzE2MWIyMjstLWQyaC1kYXJrLWZpbGUtaGVhZGVyLWJvcmRlci1jb2xvcjojMzAzNjNkOy0tZDJoLWRhcmstZW1wdHktcGxhY2Vob2xkZXItYmctY29sb3I6aHNsYSgyMTUsOCUsNDclLC4xKTstLWQyaC1kYXJrLWVtcHR5LXBsYWNlaG9sZGVyLWJvcmRlci1jb2xvcjojMzAzNjNkOy0tZDJoLWRhcmstc2VsZWN0ZWQtY29sb3I6cmdiYSg1NiwxMzksMjUzLC4xKTstLWQyaC1kYXJrLWlucy1iZy1jb2xvcjpyZ2JhKDQ2LDE2MCw2NywuMTUpOy0tZDJoLWRhcmstaW5zLWJvcmRlci1jb2xvcjpyZ2JhKDQ2LDE2MCw2NywuNCk7LS1kMmgtZGFyay1pbnMtaGlnaGxpZ2h0LWJnLWNvbG9yOnJnYmEoNDYsMTYwLDY3LC40KTstLWQyaC1kYXJrLWlucy1sYWJlbC1jb2xvcjojM2ZiOTUwOy0tZDJoLWRhcmstZGVsLWJnLWNvbG9yOnJnYmEoMjQ4LDgxLDczLC4xKTstLWQyaC1kYXJrLWRlbC1ib3JkZXItY29sb3I6cmdiYSgyNDgsODEsNzMsLjQpOy0tZDJoLWRhcmstZGVsLWhpZ2hsaWdodC1iZy1jb2xvcjpyZ2JhKDI0OCw4MSw3MywuNCk7LS1kMmgtZGFyay1kZWwtbGFiZWwtY29sb3I6I2Y4NTE0OTstLWQyaC1kYXJrLWNoYW5nZS1kZWwtY29sb3I6cmdiYSgyMTAsMTUzLDM0LC4yKTstLWQyaC1kYXJrLWNoYW5nZS1pbnMtY29sb3I6cmdiYSg0NiwxNjAsNjcsLjI1KTstLWQyaC1kYXJrLWluZm8tYmctY29sb3I6cmdiYSg1NiwxMzksMjUzLC4xKTstLWQyaC1kYXJrLWluZm8tYm9yZGVyLWNvbG9yOnJnYmEoNTYsMTM5LDI1MywuNCk7LS1kMmgtZGFyay1jaGFuZ2UtbGFiZWwtY29sb3I6I2QyOTkyMjstLWQyaC1kYXJrLW1vdmVkLWxhYmVsLWNvbG9yOiMzNTcyYjB9LmQyaC13cmFwcGVye3RleHQtYWxpZ246bGVmdH0uZDJoLWZpbGUtaGVhZGVye2JhY2tncm91bmQtY29sb3I6I2Y3ZjdmNztiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWQyaC1maWxlLWhlYWRlci1iZy1jb2xvcik7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2Q4ZDhkODtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1kMmgtZmlsZS1oZWFkZXItYm9yZGVyLWNvbG9yKTtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4O2ZvbnQtZmFtaWx5OlNvdXJjZSBTYW5zIFBybyxIZWx2ZXRpY2EgTmV1ZSxIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtoZWlnaHQ6MzVweDtwYWRkaW5nOjVweCAxMHB4fS5kMmgtZmlsZS1oZWFkZXIuZDJoLXN0aWNreS1oZWFkZXJ7cG9zaXRpb246c3RpY2t5O3RvcDowO3otaW5kZXg6MX0uZDJoLWZpbGUtc3RhdHN7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDtmb250LXNpemU6MTRweDttYXJnaW4tbGVmdDphdXRvfS5kMmgtbGluZXMtYWRkZWR7Ym9yZGVyOjFweCBzb2xpZCAjYjRlMmI0O2JvcmRlcjoxcHggc29saWQgdmFyKC0tZDJoLWlucy1ib3JkZXItY29sb3IpO2JvcmRlci1yYWRpdXM6NXB4IDAgMCA1cHg7Y29sb3I6IzM5OTgzOTtjb2xvcjp2YXIoLS1kMmgtaW5zLWxhYmVsLWNvbG9yKTtwYWRkaW5nOjJweDt0ZXh0LWFsaWduOnJpZ2h0O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uZDJoLWxpbmVzLWRlbGV0ZWR7Ym9yZGVyOjFweCBzb2xpZCAjZTlhZWFlO2JvcmRlcjoxcHggc29saWQgdmFyKC0tZDJoLWRlbC1ib3JkZXItY29sb3IpO2JvcmRlci1yYWRpdXM6MCA1cHggNXB4IDA7Y29sb3I6I2MzMztjb2xvcjp2YXIoLS1kMmgtZGVsLWxhYmVsLWNvbG9yKTttYXJnaW4tbGVmdDoxcHg7cGFkZGluZzoycHg7dGV4dC1hbGlnbjpsZWZ0O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uZDJoLWZpbGUtbmFtZS13cmFwcGVye2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7Zm9udC1zaXplOjE1cHg7d2lkdGg6MTAwJX0uZDJoLWZpbGUtbmFtZXtvdmVyZmxvdy14OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0uZDJoLWZpbGUtd3JhcHBlcntib3JkZXI6MXB4IHNvbGlkICNkZGQ7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1kMmgtYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOjNweDttYXJnaW4tYm90dG9tOjFlbX0uZDJoLWZpbGUtY29sbGFwc2V7LXdlYmtpdC1ib3gtcGFjazplbmQ7LW1zLWZsZXgtcGFjazplbmQ7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpub25lO2ZvbnQtc2l6ZToxMnB4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDstd2Via2l0LWJveC1hbGlnbjpjZW50ZXI7LW1zLWZsZXgtYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtib3JkZXI6MXB4IHNvbGlkICNkZGQ7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1kMmgtYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjRweCA4cHh9LmQyaC1maWxlLWNvbGxhcHNlLmQyaC1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOiNjOGUxZmY7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kMmgtc2VsZWN0ZWQtY29sb3IpfS5kMmgtZmlsZS1jb2xsYXBzZS1pbnB1dHttYXJnaW46MCA0cHggMCAwfS5kMmgtZGlmZi10YWJsZXtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Zm9udC1mYW1pbHk6TWVubG8sQ29uc29sYXMsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxM3B4O3dpZHRoOjEwMCV9LmQyaC1maWxlcy1kaWZme2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7d2lkdGg6MTAwJX0uZDJoLWZpbGUtZGlmZntvdmVyZmxvdy15OmhpZGRlbn0uZDJoLWZpbGUtZGlmZi5kMmgtZC1ub25lLC5kMmgtZmlsZXMtZGlmZi5kMmgtZC1ub25le2Rpc3BsYXk6bm9uZX0uZDJoLWZpbGUtc2lkZS1kaWZme2Rpc3BsYXk6aW5saW5lLWJsb2NrO292ZXJmbG93LXg6c2Nyb2xsO292ZXJmbG93LXk6aGlkZGVuO3dpZHRoOjUwJX0uZDJoLWNvZGUtbGluZXtwYWRkaW5nOjAgOGVtO3dpZHRoOmNhbGMoMTAwJSAtIDE2ZW0pfS5kMmgtY29kZS1saW5lLC5kMmgtY29kZS1zaWRlLWxpbmV7ZGlzcGxheTppbmxpbmUtYmxvY2s7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3doaXRlLXNwYWNlOm5vd3JhcH0uZDJoLWNvZGUtc2lkZS1saW5le3BhZGRpbmc6MCA0LjVlbTt3aWR0aDpjYWxjKDEwMCUgLSA5ZW0pfS5kMmgtY29kZS1saW5lLWN0bntiYWNrZ3JvdW5kOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzowO3dvcmQtd3JhcDpub3JtYWw7LXdlYmtpdC11c2VyLXNlbGVjdDp0ZXh0Oy1tb3otdXNlci1zZWxlY3Q6dGV4dDstbXMtdXNlci1zZWxlY3Q6dGV4dDt1c2VyLXNlbGVjdDp0ZXh0O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt3aGl0ZS1zcGFjZTpwcmU7d2lkdGg6MTAwJX0uZDJoLWNvZGUtbGluZSBkZWwsLmQyaC1jb2RlLXNpZGUtbGluZSBkZWx7YmFja2dyb3VuZC1jb2xvcjojZmZiNmJhO2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWRlbC1oaWdobGlnaHQtYmctY29sb3IpfS5kMmgtY29kZS1saW5lIGRlbCwuZDJoLWNvZGUtbGluZSBpbnMsLmQyaC1jb2RlLXNpZGUtbGluZSBkZWwsLmQyaC1jb2RlLXNpZGUtbGluZSBpbnN7Ym9yZGVyLXJhZGl1czouMmVtO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6LTFweDstd2Via2l0LXRleHQtZGVjb3JhdGlvbjpub25lO3RleHQtZGVjb3JhdGlvbjpub25lfS5kMmgtY29kZS1saW5lIGlucywuZDJoLWNvZGUtc2lkZS1saW5lIGluc3tiYWNrZ3JvdW5kLWNvbG9yOiM5N2YyOTU7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kMmgtaW5zLWhpZ2hsaWdodC1iZy1jb2xvcik7dGV4dC1hbGlnbjpsZWZ0fS5kMmgtY29kZS1saW5lLXByZWZpeHtiYWNrZ3JvdW5kOm5vbmU7ZGlzcGxheTppbmxpbmU7cGFkZGluZzowO3dvcmQtd3JhcDpub3JtYWw7d2hpdGUtc3BhY2U6cHJlfS5saW5lLW51bTF7ZmxvYXQ6bGVmdH0ubGluZS1udW0xLC5saW5lLW51bTJ7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjAgLjVlbTt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3dpZHRoOjMuNWVtfS5saW5lLW51bTJ7ZmxvYXQ6cmlnaHR9LmQyaC1jb2RlLWxpbmVudW1iZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWJnLWNvbG9yKTtib3JkZXI6c29saWQgI2VlZTtib3JkZXI6c29saWQgdmFyKC0tZDJoLWxpbmUtYm9yZGVyLWNvbG9yKTtib3JkZXItd2lkdGg6MCAxcHg7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2NvbG9yOnJnYmEoMCwwLDAsLjMpO2NvbG9yOnZhcigtLWQyaC1kaW0tY29sb3IpO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246cmlnaHQ7d2lkdGg6Ny41ZW19LmQyaC1jb2RlLWxpbmVudW1iZXI6YWZ0ZXJ7Y29udGVudDpcIlxcMjAwYlwifS5kMmgtY29kZS1zaWRlLWxpbmVudW1iZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWJnLWNvbG9yKTtib3JkZXI6c29saWQgI2VlZTtib3JkZXI6c29saWQgdmFyKC0tZDJoLWxpbmUtYm9yZGVyLWNvbG9yKTtib3JkZXItd2lkdGg6MCAxcHg7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2NvbG9yOnJnYmEoMCwwLDAsLjMpO2NvbG9yOnZhcigtLWQyaC1kaW0tY29sb3IpO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjAgLjVlbTtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOnJpZ2h0O3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2lkdGg6NGVtfS5kMmgtY29kZS1zaWRlLWxpbmVudW1iZXI6YWZ0ZXJ7Y29udGVudDpcIlxcMjAwYlwifS5kMmgtY29kZS1zaWRlLWVtcHR5cGxhY2Vob2xkZXIsLmQyaC1lbXB0eXBsYWNlaG9sZGVye2JhY2tncm91bmQtY29sb3I6I2YxZjFmMTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWQyaC1lbXB0eS1wbGFjZWhvbGRlci1iZy1jb2xvcik7Ym9yZGVyLWNvbG9yOiNlMWUxZTE7Ym9yZGVyLWNvbG9yOnZhcigtLWQyaC1lbXB0eS1wbGFjZWhvbGRlci1ib3JkZXItY29sb3IpfS5kMmgtY29kZS1saW5lLXByZWZpeCwuZDJoLWNvZGUtbGluZW51bWJlciwuZDJoLWNvZGUtc2lkZS1saW5lbnVtYmVyLC5kMmgtZW1wdHlwbGFjZWhvbGRlcnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LmQyaC1jb2RlLWxpbmVudW1iZXIsLmQyaC1jb2RlLXNpZGUtbGluZW51bWJlcntkaXJlY3Rpb246cnRsfS5kMmgtZGVse2JhY2tncm91bmQtY29sb3I6I2ZlZThlOTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWQyaC1kZWwtYmctY29sb3IpO2JvcmRlci1jb2xvcjojZTlhZWFlO2JvcmRlci1jb2xvcjp2YXIoLS1kMmgtZGVsLWJvcmRlci1jb2xvcil9LmQyaC1pbnN7YmFja2dyb3VuZC1jb2xvcjojZGZkO2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWlucy1iZy1jb2xvcik7Ym9yZGVyLWNvbG9yOiNiNGUyYjQ7Ym9yZGVyLWNvbG9yOnZhcigtLWQyaC1pbnMtYm9yZGVyLWNvbG9yKX0uZDJoLWluZm97YmFja2dyb3VuZC1jb2xvcjojZjhmYWZkO2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWluZm8tYmctY29sb3IpO2JvcmRlci1jb2xvcjojZDVlNGYyO2JvcmRlci1jb2xvcjp2YXIoLS1kMmgtaW5mby1ib3JkZXItY29sb3IpO2NvbG9yOnJnYmEoMCwwLDAsLjMpO2NvbG9yOnZhcigtLWQyaC1kaW0tY29sb3IpfS5kMmgtZmlsZS1kaWZmIC5kMmgtZGVsLmQyaC1jaGFuZ2V7YmFja2dyb3VuZC1jb2xvcjojZmRmMmQwO2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWNoYW5nZS1kZWwtY29sb3IpfS5kMmgtZmlsZS1kaWZmIC5kMmgtaW5zLmQyaC1jaGFuZ2V7YmFja2dyb3VuZC1jb2xvcjojZGVkO2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWNoYW5nZS1pbnMtY29sb3IpfS5kMmgtZmlsZS1saXN0LXdyYXBwZXJ7bWFyZ2luLWJvdHRvbToxMHB4fS5kMmgtZmlsZS1saXN0LXdyYXBwZXIgYXstd2Via2l0LXRleHQtZGVjb3JhdGlvbjpub25lO3RleHQtZGVjb3JhdGlvbjpub25lfS5kMmgtZmlsZS1saXN0LXdyYXBwZXIgYSwuZDJoLWZpbGUtbGlzdC13cmFwcGVyIGE6dmlzaXRlZHtjb2xvcjojMzU3MmIwO2NvbG9yOnZhcigtLWQyaC1tb3ZlZC1sYWJlbC1jb2xvcil9LmQyaC1maWxlLWxpc3QtaGVhZGVye3RleHQtYWxpZ246bGVmdH0uZDJoLWZpbGUtbGlzdC10aXRsZXtmb250LXdlaWdodDo3MDB9LmQyaC1maWxlLWxpc3QtbGluZXtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4O3RleHQtYWxpZ246bGVmdH0uZDJoLWZpbGUtbGlzdHtkaXNwbGF5OmJsb2NrO2xpc3Qtc3R5bGU6bm9uZTttYXJnaW46MDtwYWRkaW5nOjB9LmQyaC1maWxlLWxpc3Q+bGl7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1kMmgtYm9yZGVyLWNvbG9yKTttYXJnaW46MDtwYWRkaW5nOjVweCAxMHB4fS5kMmgtZmlsZS1saXN0PmxpOmxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbTpub25lfS5kMmgtZmlsZS1zd2l0Y2h7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpub25lO2ZvbnQtc2l6ZToxMHB4fS5kMmgtaWNvbnttYXJnaW4tcmlnaHQ6MTBweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7ZmlsbDpjdXJyZW50Q29sb3J9LmQyaC1kZWxldGVke2NvbG9yOiNjMzM7Y29sb3I6dmFyKC0tZDJoLWRlbC1sYWJlbC1jb2xvcil9LmQyaC1hZGRlZHtjb2xvcjojMzk5ODM5O2NvbG9yOnZhcigtLWQyaC1pbnMtbGFiZWwtY29sb3IpfS5kMmgtY2hhbmdlZHtjb2xvcjojZDBiNDRjO2NvbG9yOnZhcigtLWQyaC1jaGFuZ2UtbGFiZWwtY29sb3IpfS5kMmgtbW92ZWR7Y29sb3I6IzM1NzJiMDtjb2xvcjp2YXIoLS1kMmgtbW92ZWQtbGFiZWwtY29sb3IpfS5kMmgtdGFne2JhY2tncm91bmQtY29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWQyaC1iZy1jb2xvcik7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDtmb250LXNpemU6MTBweDttYXJnaW4tbGVmdDo1cHg7cGFkZGluZzowIDJweH0uZDJoLWRlbGV0ZWQtdGFne2JvcmRlcjoxcHggc29saWQgI2MzMztib3JkZXI6MXB4IHNvbGlkIHZhcigtLWQyaC1kZWwtbGFiZWwtY29sb3IpfS5kMmgtYWRkZWQtdGFne2JvcmRlcjoxcHggc29saWQgIzM5OTgzOTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWQyaC1pbnMtbGFiZWwtY29sb3IpfS5kMmgtY2hhbmdlZC10YWd7Ym9yZGVyOjFweCBzb2xpZCAjZDBiNDRjO2JvcmRlcjoxcHggc29saWQgdmFyKC0tZDJoLWNoYW5nZS1sYWJlbC1jb2xvcil9LmQyaC1tb3ZlZC10YWd7Ym9yZGVyOjFweCBzb2xpZCAjMzU3MmIwO2JvcmRlcjoxcHggc29saWQgdmFyKC0tZDJoLW1vdmVkLWxhYmVsLWNvbG9yKX0uZDJoLWRhcmstY29sb3Itc2NoZW1le2JhY2tncm91bmQtY29sb3I6IzBkMTExNztiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWQyaC1kYXJrLWJnLWNvbG9yKTtjb2xvcjojZTZlZGYzO2NvbG9yOnZhcigtLWQyaC1kYXJrLWNvbG9yKX0uZDJoLWRhcmstY29sb3Itc2NoZW1lIC5kMmgtZmlsZS1oZWFkZXJ7YmFja2dyb3VuZC1jb2xvcjojMTYxYjIyO2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWRhcmstZmlsZS1oZWFkZXItYmctY29sb3IpO2JvcmRlci1ib3R0b206IzMwMzYzZDtib3JkZXItYm90dG9tOnZhcigtLWQyaC1kYXJrLWZpbGUtaGVhZGVyLWJvcmRlci1jb2xvcil9LmQyaC1kYXJrLWNvbG9yLXNjaGVtZSAuZDJoLWxpbmVzLWFkZGVke2JvcmRlcjoxcHggc29saWQgcmdiYSg0NiwxNjAsNjcsLjQpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tZDJoLWRhcmstaW5zLWJvcmRlci1jb2xvcik7Y29sb3I6IzNmYjk1MDtjb2xvcjp2YXIoLS1kMmgtZGFyay1pbnMtbGFiZWwtY29sb3IpfS5kMmgtZGFyay1jb2xvci1zY2hlbWUgLmQyaC1saW5lcy1kZWxldGVke2JvcmRlcjoxcHggc29saWQgcmdiYSgyNDgsODEsNzMsLjQpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tZDJoLWRhcmstZGVsLWJvcmRlci1jb2xvcik7Y29sb3I6I2Y4NTE0OTtjb2xvcjp2YXIoLS1kMmgtZGFyay1kZWwtbGFiZWwtY29sb3IpfS5kMmgtZGFyay1jb2xvci1zY2hlbWUgLmQyaC1jb2RlLWxpbmUgZGVsLC5kMmgtZGFyay1jb2xvci1zY2hlbWUgLmQyaC1jb2RlLXNpZGUtbGluZSBkZWx7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0OCw4MSw3MywuNCk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kMmgtZGFyay1kZWwtaGlnaGxpZ2h0LWJnLWNvbG9yKX0uZDJoLWRhcmstY29sb3Itc2NoZW1lIC5kMmgtY29kZS1saW5lIGlucywuZDJoLWRhcmstY29sb3Itc2NoZW1lIC5kMmgtY29kZS1zaWRlLWxpbmUgaW5ze2JhY2tncm91bmQtY29sb3I6cmdiYSg0NiwxNjAsNjcsLjQpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWRhcmstaW5zLWhpZ2hsaWdodC1iZy1jb2xvcil9LmQyaC1kYXJrLWNvbG9yLXNjaGVtZSAuZDJoLWRpZmYtdGJvZHl7Ym9yZGVyLWNvbG9yOiMzMDM2M2Q7Ym9yZGVyLWNvbG9yOnZhcigtLWQyaC1kYXJrLWJvcmRlci1jb2xvcil9LmQyaC1kYXJrLWNvbG9yLXNjaGVtZSAuZDJoLWNvZGUtc2lkZS1saW5lbnVtYmVye2JhY2tncm91bmQtY29sb3I6IzBkMTExNztiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWQyaC1kYXJrLWJnLWNvbG9yKTtib3JkZXItY29sb3I6IzIxMjYyZDtib3JkZXItY29sb3I6dmFyKC0tZDJoLWRhcmstbGluZS1ib3JkZXItY29sb3IpO2NvbG9yOiM2ZTc2ODE7Y29sb3I6dmFyKC0tZDJoLWRhcmstZGltLWNvbG9yKX0uZDJoLWRhcmstY29sb3Itc2NoZW1lIC5kMmgtZmlsZXMtZGlmZiAuZDJoLWNvZGUtc2lkZS1lbXB0eXBsYWNlaG9sZGVyLC5kMmgtZGFyay1jb2xvci1zY2hlbWUgLmQyaC1maWxlcy1kaWZmIC5kMmgtZW1wdHlwbGFjZWhvbGRlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbGEoMjE1LDglLDQ3JSwuMSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kMmgtZGFyay1lbXB0eS1wbGFjZWhvbGRlci1iZy1jb2xvcik7Ym9yZGVyLWNvbG9yOiMzMDM2M2Q7Ym9yZGVyLWNvbG9yOnZhcigtLWQyaC1kYXJrLWVtcHR5LXBsYWNlaG9sZGVyLWJvcmRlci1jb2xvcil9LmQyaC1kYXJrLWNvbG9yLXNjaGVtZSAuZDJoLWNvZGUtbGluZW51bWJlcntiYWNrZ3JvdW5kLWNvbG9yOiMwZDExMTc7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kMmgtZGFyay1iZy1jb2xvcik7Ym9yZGVyLWNvbG9yOiMyMTI2MmQ7Ym9yZGVyLWNvbG9yOnZhcigtLWQyaC1kYXJrLWxpbmUtYm9yZGVyLWNvbG9yKTtjb2xvcjojNmU3NjgxO2NvbG9yOnZhcigtLWQyaC1kYXJrLWRpbS1jb2xvcil9LmQyaC1kYXJrLWNvbG9yLXNjaGVtZSAuZDJoLWRlbHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ4LDgxLDczLC4xKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWQyaC1kYXJrLWRlbC1iZy1jb2xvcik7Ym9yZGVyLWNvbG9yOnJnYmEoMjQ4LDgxLDczLC40KTtib3JkZXItY29sb3I6dmFyKC0tZDJoLWRhcmstZGVsLWJvcmRlci1jb2xvcil9LmQyaC1kYXJrLWNvbG9yLXNjaGVtZSAuZDJoLWluc3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoNDYsMTYwLDY3LC4xNSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kMmgtZGFyay1pbnMtYmctY29sb3IpO2JvcmRlci1jb2xvcjpyZ2JhKDQ2LDE2MCw2NywuNCk7Ym9yZGVyLWNvbG9yOnZhcigtLWQyaC1kYXJrLWlucy1ib3JkZXItY29sb3IpfS5kMmgtZGFyay1jb2xvci1zY2hlbWUgLmQyaC1pbmZve2JhY2tncm91bmQtY29sb3I6cmdiYSg1NiwxMzksMjUzLC4xKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWQyaC1kYXJrLWluZm8tYmctY29sb3IpO2JvcmRlci1jb2xvcjpyZ2JhKDU2LDEzOSwyNTMsLjQpO2JvcmRlci1jb2xvcjp2YXIoLS1kMmgtZGFyay1pbmZvLWJvcmRlci1jb2xvcik7Y29sb3I6IzZlNzY4MTtjb2xvcjp2YXIoLS1kMmgtZGFyay1kaW0tY29sb3IpfS5kMmgtZGFyay1jb2xvci1zY2hlbWUgLmQyaC1maWxlLWRpZmYgLmQyaC1kZWwuZDJoLWNoYW5nZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjEwLDE1MywzNCwuMik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kMmgtZGFyay1jaGFuZ2UtZGVsLWNvbG9yKX0uZDJoLWRhcmstY29sb3Itc2NoZW1lIC5kMmgtZmlsZS1kaWZmIC5kMmgtaW5zLmQyaC1jaGFuZ2V7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDQ2LDE2MCw2NywuMjUpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWRhcmstY2hhbmdlLWlucy1jb2xvcil9LmQyaC1kYXJrLWNvbG9yLXNjaGVtZSAuZDJoLWZpbGUtd3JhcHBlcntib3JkZXI6MXB4IHNvbGlkICMzMDM2M2Q7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1kMmgtZGFyay1ib3JkZXItY29sb3IpfS5kMmgtZGFyay1jb2xvci1zY2hlbWUgLmQyaC1maWxlLWNvbGxhcHNle2JvcmRlcjoxcHggc29saWQgIzBkMTExNztib3JkZXI6MXB4IHNvbGlkIHZhcigtLWQyaC1kYXJrLWJnLWNvbG9yKX0uZDJoLWRhcmstY29sb3Itc2NoZW1lIC5kMmgtZmlsZS1jb2xsYXBzZS5kMmgtc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDU2LDEzOSwyNTMsLjEpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWRhcmstc2VsZWN0ZWQtY29sb3IpfS5kMmgtZGFyay1jb2xvci1zY2hlbWUgLmQyaC1maWxlLWxpc3Qtd3JhcHBlciBhLC5kMmgtZGFyay1jb2xvci1zY2hlbWUgLmQyaC1maWxlLWxpc3Qtd3JhcHBlciBhOnZpc2l0ZWR7Y29sb3I6IzM1NzJiMDtjb2xvcjp2YXIoLS1kMmgtZGFyay1tb3ZlZC1sYWJlbC1jb2xvcil9LmQyaC1kYXJrLWNvbG9yLXNjaGVtZSAuZDJoLWZpbGUtbGlzdD5saXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjMGQxMTE3O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWQyaC1kYXJrLWJnLWNvbG9yKX0uZDJoLWRhcmstY29sb3Itc2NoZW1lIC5kMmgtZGVsZXRlZHtjb2xvcjojZjg1MTQ5O2NvbG9yOnZhcigtLWQyaC1kYXJrLWRlbC1sYWJlbC1jb2xvcil9LmQyaC1kYXJrLWNvbG9yLXNjaGVtZSAuZDJoLWFkZGVke2NvbG9yOiMzZmI5NTA7Y29sb3I6dmFyKC0tZDJoLWRhcmstaW5zLWxhYmVsLWNvbG9yKX0uZDJoLWRhcmstY29sb3Itc2NoZW1lIC5kMmgtY2hhbmdlZHtjb2xvcjojZDI5OTIyO2NvbG9yOnZhcigtLWQyaC1kYXJrLWNoYW5nZS1sYWJlbC1jb2xvcil9LmQyaC1kYXJrLWNvbG9yLXNjaGVtZSAuZDJoLW1vdmVke2NvbG9yOiMzNTcyYjA7Y29sb3I6dmFyKC0tZDJoLWRhcmstbW92ZWQtbGFiZWwtY29sb3IpfS5kMmgtZGFyay1jb2xvci1zY2hlbWUgLmQyaC10YWd7YmFja2dyb3VuZC1jb2xvcjojMGQxMTE3O2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWRhcmstYmctY29sb3IpfS5kMmgtZGFyay1jb2xvci1zY2hlbWUgLmQyaC1kZWxldGVkLXRhZ3tib3JkZXI6MXB4IHNvbGlkICNmODUxNDk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1kMmgtZGFyay1kZWwtbGFiZWwtY29sb3IpfS5kMmgtZGFyay1jb2xvci1zY2hlbWUgLmQyaC1hZGRlZC10YWd7Ym9yZGVyOjFweCBzb2xpZCAjM2ZiOTUwO2JvcmRlcjoxcHggc29saWQgdmFyKC0tZDJoLWRhcmstaW5zLWxhYmVsLWNvbG9yKX0uZDJoLWRhcmstY29sb3Itc2NoZW1lIC5kMmgtY2hhbmdlZC10YWd7Ym9yZGVyOjFweCBzb2xpZCAjZDI5OTIyO2JvcmRlcjoxcHggc29saWQgdmFyKC0tZDJoLWRhcmstY2hhbmdlLWxhYmVsLWNvbG9yKX0uZDJoLWRhcmstY29sb3Itc2NoZW1lIC5kMmgtbW92ZWQtdGFne2JvcmRlcjoxcHggc29saWQgIzM1NzJiMDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWQyaC1kYXJrLW1vdmVkLWxhYmVsLWNvbG9yKX1AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOmRhcmspey5kMmgtYXV0by1jb2xvci1zY2hlbWV7YmFja2dyb3VuZC1jb2xvcjojMGQxMTE3O2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWRhcmstYmctY29sb3IpO2NvbG9yOiNlNmVkZjM7Y29sb3I6dmFyKC0tZDJoLWRhcmstY29sb3IpfS5kMmgtYXV0by1jb2xvci1zY2hlbWUgLmQyaC1maWxlLWhlYWRlcntiYWNrZ3JvdW5kLWNvbG9yOiMxNjFiMjI7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kMmgtZGFyay1maWxlLWhlYWRlci1iZy1jb2xvcik7Ym9yZGVyLWJvdHRvbTojMzAzNjNkO2JvcmRlci1ib3R0b206dmFyKC0tZDJoLWRhcmstZmlsZS1oZWFkZXItYm9yZGVyLWNvbG9yKX0uZDJoLWF1dG8tY29sb3Itc2NoZW1lIC5kMmgtbGluZXMtYWRkZWR7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDQ2LDE2MCw2NywuNCk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1kMmgtZGFyay1pbnMtYm9yZGVyLWNvbG9yKTtjb2xvcjojM2ZiOTUwO2NvbG9yOnZhcigtLWQyaC1kYXJrLWlucy1sYWJlbC1jb2xvcil9LmQyaC1hdXRvLWNvbG9yLXNjaGVtZSAuZDJoLWxpbmVzLWRlbGV0ZWR7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDI0OCw4MSw3MywuNCk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1kMmgtZGFyay1kZWwtYm9yZGVyLWNvbG9yKTtjb2xvcjojZjg1MTQ5O2NvbG9yOnZhcigtLWQyaC1kYXJrLWRlbC1sYWJlbC1jb2xvcil9LmQyaC1hdXRvLWNvbG9yLXNjaGVtZSAuZDJoLWNvZGUtbGluZSBkZWwsLmQyaC1hdXRvLWNvbG9yLXNjaGVtZSAuZDJoLWNvZGUtc2lkZS1saW5lIGRlbHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ4LDgxLDczLC40KTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWQyaC1kYXJrLWRlbC1oaWdobGlnaHQtYmctY29sb3IpfS5kMmgtYXV0by1jb2xvci1zY2hlbWUgLmQyaC1jb2RlLWxpbmUgaW5zLC5kMmgtYXV0by1jb2xvci1zY2hlbWUgLmQyaC1jb2RlLXNpZGUtbGluZSBpbnN7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDQ2LDE2MCw2NywuNCk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kMmgtZGFyay1pbnMtaGlnaGxpZ2h0LWJnLWNvbG9yKX0uZDJoLWF1dG8tY29sb3Itc2NoZW1lIC5kMmgtZGlmZi10Ym9keXtib3JkZXItY29sb3I6IzMwMzYzZDtib3JkZXItY29sb3I6dmFyKC0tZDJoLWRhcmstYm9yZGVyLWNvbG9yKX0uZDJoLWF1dG8tY29sb3Itc2NoZW1lIC5kMmgtY29kZS1zaWRlLWxpbmVudW1iZXJ7YmFja2dyb3VuZC1jb2xvcjojMGQxMTE3O2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWRhcmstYmctY29sb3IpO2JvcmRlci1jb2xvcjojMjEyNjJkO2JvcmRlci1jb2xvcjp2YXIoLS1kMmgtZGFyay1saW5lLWJvcmRlci1jb2xvcik7Y29sb3I6IzZlNzY4MTtjb2xvcjp2YXIoLS1kMmgtZGFyay1kaW0tY29sb3IpfS5kMmgtYXV0by1jb2xvci1zY2hlbWUgLmQyaC1maWxlcy1kaWZmIC5kMmgtY29kZS1zaWRlLWVtcHR5cGxhY2Vob2xkZXIsLmQyaC1hdXRvLWNvbG9yLXNjaGVtZSAuZDJoLWZpbGVzLWRpZmYgLmQyaC1lbXB0eXBsYWNlaG9sZGVye2JhY2tncm91bmQtY29sb3I6aHNsYSgyMTUsOCUsNDclLC4xKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWQyaC1kYXJrLWVtcHR5LXBsYWNlaG9sZGVyLWJnLWNvbG9yKTtib3JkZXItY29sb3I6IzMwMzYzZDtib3JkZXItY29sb3I6dmFyKC0tZDJoLWRhcmstZW1wdHktcGxhY2Vob2xkZXItYm9yZGVyLWNvbG9yKX0uZDJoLWF1dG8tY29sb3Itc2NoZW1lIC5kMmgtY29kZS1saW5lbnVtYmVye2JhY2tncm91bmQtY29sb3I6IzBkMTExNztiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWQyaC1kYXJrLWJnLWNvbG9yKTtib3JkZXItY29sb3I6IzIxMjYyZDtib3JkZXItY29sb3I6dmFyKC0tZDJoLWRhcmstbGluZS1ib3JkZXItY29sb3IpO2NvbG9yOiM2ZTc2ODE7Y29sb3I6dmFyKC0tZDJoLWRhcmstZGltLWNvbG9yKX0uZDJoLWF1dG8tY29sb3Itc2NoZW1lIC5kMmgtZGVse2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDgsODEsNzMsLjEpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWRhcmstZGVsLWJnLWNvbG9yKTtib3JkZXItY29sb3I6cmdiYSgyNDgsODEsNzMsLjQpO2JvcmRlci1jb2xvcjp2YXIoLS1kMmgtZGFyay1kZWwtYm9yZGVyLWNvbG9yKX0uZDJoLWF1dG8tY29sb3Itc2NoZW1lIC5kMmgtaW5ze2JhY2tncm91bmQtY29sb3I6cmdiYSg0NiwxNjAsNjcsLjE1KTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWQyaC1kYXJrLWlucy1iZy1jb2xvcik7Ym9yZGVyLWNvbG9yOnJnYmEoNDYsMTYwLDY3LC40KTtib3JkZXItY29sb3I6dmFyKC0tZDJoLWRhcmstaW5zLWJvcmRlci1jb2xvcil9LmQyaC1hdXRvLWNvbG9yLXNjaGVtZSAuZDJoLWluZm97YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDU2LDEzOSwyNTMsLjEpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tZDJoLWRhcmstaW5mby1iZy1jb2xvcik7Ym9yZGVyLWNvbG9yOnJnYmEoNTYsMTM5LDI1MywuNCk7Ym9yZGVyLWNvbG9yOnZhcigtLWQyaC1kYXJrLWluZm8tYm9yZGVyLWNvbG9yKTtjb2xvcjojNmU3NjgxO2NvbG9yOnZhcigtLWQyaC1kYXJrLWRpbS1jb2xvcil9LmQyaC1hdXRvLWNvbG9yLXNjaGVtZSAuZDJoLWZpbGUtZGlmZiAuZDJoLWRlbC5kMmgtY2hhbmdle2JhY2tncm91bmQtY29sb3I6cmdiYSgyMTAsMTUzLDM0LC4yKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWQyaC1kYXJrLWNoYW5nZS1kZWwtY29sb3IpfS5kMmgtYXV0by1jb2xvci1zY2hlbWUgLmQyaC1maWxlLWRpZmYgLmQyaC1pbnMuZDJoLWNoYW5nZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoNDYsMTYwLDY3LC4yNSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kMmgtZGFyay1jaGFuZ2UtaW5zLWNvbG9yKX0uZDJoLWF1dG8tY29sb3Itc2NoZW1lIC5kMmgtZmlsZS13cmFwcGVye2JvcmRlcjoxcHggc29saWQgIzMwMzYzZDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWQyaC1kYXJrLWJvcmRlci1jb2xvcil9LmQyaC1hdXRvLWNvbG9yLXNjaGVtZSAuZDJoLWZpbGUtY29sbGFwc2V7Ym9yZGVyOjFweCBzb2xpZCAjMGQxMTE3O2JvcmRlcjoxcHggc29saWQgdmFyKC0tZDJoLWRhcmstYmctY29sb3IpfS5kMmgtYXV0by1jb2xvci1zY2hlbWUgLmQyaC1maWxlLWNvbGxhcHNlLmQyaC1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoNTYsMTM5LDI1MywuMSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kMmgtZGFyay1zZWxlY3RlZC1jb2xvcil9LmQyaC1hdXRvLWNvbG9yLXNjaGVtZSAuZDJoLWZpbGUtbGlzdC13cmFwcGVyIGEsLmQyaC1hdXRvLWNvbG9yLXNjaGVtZSAuZDJoLWZpbGUtbGlzdC13cmFwcGVyIGE6dmlzaXRlZHtjb2xvcjojMzU3MmIwO2NvbG9yOnZhcigtLWQyaC1kYXJrLW1vdmVkLWxhYmVsLWNvbG9yKX0uZDJoLWF1dG8tY29sb3Itc2NoZW1lIC5kMmgtZmlsZS1saXN0Pmxpe2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMwZDExMTc7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tZDJoLWRhcmstYmctY29sb3IpfS5kMmgtZGFyay1jb2xvci1zY2hlbWUgLmQyaC1kZWxldGVke2NvbG9yOiNmODUxNDk7Y29sb3I6dmFyKC0tZDJoLWRhcmstZGVsLWxhYmVsLWNvbG9yKX0uZDJoLWF1dG8tY29sb3Itc2NoZW1lIC5kMmgtYWRkZWR7Y29sb3I6IzNmYjk1MDtjb2xvcjp2YXIoLS1kMmgtZGFyay1pbnMtbGFiZWwtY29sb3IpfS5kMmgtYXV0by1jb2xvci1zY2hlbWUgLmQyaC1jaGFuZ2Vke2NvbG9yOiNkMjk5MjI7Y29sb3I6dmFyKC0tZDJoLWRhcmstY2hhbmdlLWxhYmVsLWNvbG9yKX0uZDJoLWF1dG8tY29sb3Itc2NoZW1lIC5kMmgtbW92ZWR7Y29sb3I6IzM1NzJiMDtjb2xvcjp2YXIoLS1kMmgtZGFyay1tb3ZlZC1sYWJlbC1jb2xvcil9LmQyaC1hdXRvLWNvbG9yLXNjaGVtZSAuZDJoLXRhZ3tiYWNrZ3JvdW5kLWNvbG9yOiMwZDExMTc7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1kMmgtZGFyay1iZy1jb2xvcil9LmQyaC1hdXRvLWNvbG9yLXNjaGVtZSAuZDJoLWRlbGV0ZWQtdGFne2JvcmRlcjoxcHggc29saWQgI2Y4NTE0OTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWQyaC1kYXJrLWRlbC1sYWJlbC1jb2xvcil9LmQyaC1hdXRvLWNvbG9yLXNjaGVtZSAuZDJoLWFkZGVkLXRhZ3tib3JkZXI6MXB4IHNvbGlkICMzZmI5NTA7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1kMmgtZGFyay1pbnMtbGFiZWwtY29sb3IpfS5kMmgtYXV0by1jb2xvci1zY2hlbWUgLmQyaC1jaGFuZ2VkLXRhZ3tib3JkZXI6MXB4IHNvbGlkICNkMjk5MjI7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1kMmgtZGFyay1jaGFuZ2UtbGFiZWwtY29sb3IpfS5kMmgtYXV0by1jb2xvci1zY2hlbWUgLmQyaC1tb3ZlZC10YWd7Ym9yZGVyOjFweCBzb2xpZCAjMzU3MmIwO2JvcmRlcjoxcHggc29saWQgdmFyKC0tZDJoLWRhcmstbW92ZWQtbGFiZWwtY29sb3IpfX0iXSwKICAibWFwcGluZ3MiOiAiO0FBQUE7QUFBVyxnQkFBYTtBQUFNLGVBQVk7QUFBVSxjQUFXO0FBQU8sZUFBWTtBQUFJO0FBQUEsSUFBSSwwQ0FBbUMsT0FBTyxRQUFRO0FBQUEsSUFBQyx5Q0FBa0MsT0FBTyxPQUFPO0FBQUEsSUFBQyx3Q0FBaUMsT0FBTztBQUFXO0FBQUM7QUFBVyxnQkFBYTtBQUFNLGVBQVk7QUFBa0IsY0FBVztBQUFPLGVBQVk7QUFBSTtBQUFBLElBQUksK0NBQXdDLE9BQU8sUUFBUTtBQUFBLElBQUMsOENBQXVDLE9BQU8sT0FBTztBQUFBLElBQUMsNkNBQXNDLE9BQU87QUFBVztBQUFDO0FBQVcsZ0JBQWE7QUFBTSxlQUFZO0FBQWtCLGNBQVc7QUFBTyxlQUFZO0FBQUk7QUFBQSxJQUFJLGtEQUEyQyxPQUFPLFFBQVE7QUFBQSxJQUFDLGlEQUEwQyxPQUFPLE9BQU87QUFBQSxJQUFDLGdEQUF5QyxPQUFPO0FBQVc7QUFBQztBQUFXLGdCQUFhO0FBQU0sZUFBWTtBQUFjLGNBQVc7QUFBTyxlQUFZ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 */ + + +/* Custom Styles */ + /* ============================== */ /* Main View Customization */ /* ============================== */ @@ -160,156 +2144,6 @@ body { ); } -/* ============================== */ -/* Syntax Highlighting Styles */ -/* GitHub Dark Theme for highlight.js */ -/* ============================== */ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - color: var(--code-normal); - background: var(--code-background); -} - -/* Language indicator */ -.hljs.language-js::before, -.hljs.language-javascript::before, -.hljs.language-python::before, -.hljs.language-css::before, -.hljs.language-html::before, -.hljs.language-typescript::before, -.hljs.language-jsx::before, -.hljs.language-tsx::before { - content: attr(class); - position: absolute; - top: 0; - right: 0; - padding: 0.25em 0.5em; - font-size: 0.75em; - color: var(--text-faint); - background: var(--background-modifier-cover); - border-radius: 0 0 0 0.25em; -} - -.hljs-doctag, -.hljs-keyword, -.hljs-meta .hljs-keyword, -.hljs-template-tag, -.hljs-template-variable, -.hljs-type, -.hljs-variable.language_ { - color: var(--code-keyword); -} - -.hljs-title, -.hljs-title.class_, -.hljs-title.class_.inherited__, -.hljs-title.function_ { - color: var(--code-function); -} - -.hljs-attr, -.hljs-attribute, -.hljs-literal, -.hljs-meta, -.hljs-number, -.hljs-operator, -.hljs-selector-attr, -.hljs-selector-class, -.hljs-selector-id, -.hljs-variable { - color: var(--code-property); -} - -.hljs-meta .hljs-string, -.hljs-regexp, -.hljs-string { - color: var(--code-string); -} - -.hljs-built_in, -.hljs-symbol { - color: var(--code-important); -} - -.hljs-code, -.hljs-comment, -.hljs-formula { - color: var(--code-comment); -} - -.hljs-name, -.hljs-quote, -.hljs-selector-pseudo, -.hljs-selector-tag { - color: var(--code-tag); -} - -.hljs-subst { - color: var(--code-normal); -} - -.hljs-section { - color: var(--code-property); - font-weight: bold; -} - -.hljs-bullet { - color: var(--code-important); -} - -.hljs-emphasis { - color: var(--code-normal); - font-style: italic; -} - -.hljs-strong { - color: var(--code-normal); - font-weight: bold; -} - -.hljs-addition { - color: var(--code-tag); - background-color: color-mix(in srgb, var(--color-green) 20%, transparent); -} - -.hljs-deletion { - color: var(--text-error); - background-color: color-mix(in srgb, var(--color-red) 20%, transparent); -} - -.hljs-char.escape_, -.hljs-link, -.hljs-params, -.hljs-property, -.hljs-punctuation, -.hljs-tag { - color: var(--code-normal); -} - -/* Additional highlight.js classes for better coverage */ -.hljs-selector-pseudo { - color: var(--code-property); -} - -.hljs-selector-tag { - color: var(--code-tag); -} - -.hljs-template-comment { - color: var(--code-comment); -} - -.hljs-meta-keyword { - color: var(--code-keyword); -} - -.hljs-meta-string { - color: var(--code-string); -} - /* ============================== */ /* GFM Task Lists */ /* ============================== */ @@ -1426,4 +3260,406 @@ body { background: #fff; color: #000; } -} \ No newline at end of file +} + +/** + * Diff2html Obsidian Theme Override + * + * This stylesheet overrides diff2html's default styling to use Obsidian's CSS variables + * + */ + +/* ======================================== + ROOT VARIABLE OVERRIDES - LIGHT THEME + ======================================== */ + +:root { + /* Background colors */ + --d2h-bg-color: var(--background-primary); + --d2h-file-header-bg-color: var(--background-secondary); + --d2h-file-diff-wrapper-bg-color: var(--background-primary); + --d2h-file-list-wrapper-bg-color: var(--background-secondary); + --d2h-file-list-header-bg-color: var(--background-secondary-alt); + + /* Border colors */ + --d2h-border-color: var(--background-modifier-border); + --d2h-file-border-color: var(--background-modifier-border); + --d2h-line-border-color: var(--background-modifier-border); + + /* Text colors */ + --d2h-text-color: var(--text-normal); + --d2h-muted-text-color: var(--text-muted); + --d2h-file-name-color: var(--text-normal); + --d2h-file-stats-color: var(--text-muted); + --d2h-line-number-color: var(--text-muted); + + /* Insertion colors (additions) */ + --d2h-ins-bg-color: color-mix(in srgb, var(--color-green) 15%, var(--background-primary)); + --d2h-ins-label-color: var(--color-green); + --d2h-ins-highlight-bg-color: color-mix(in srgb, var(--color-green) 30%, var(--background-primary)); + --d2h-ins-border-color: color-mix(in srgb, var(--color-green) 40%, var(--background-modifier-border)); + + /* Deletion colors (removals) */ + --d2h-del-bg-color: color-mix(in srgb, var(--color-red) 15%, var(--background-primary)); + --d2h-del-label-color: var(--color-red); + --d2h-del-highlight-bg-color: color-mix(in srgb, var(--color-red) 30%, var(--background-primary)); + --d2h-del-border-color: color-mix(in srgb, var(--color-red) 40%, var(--background-modifier-border)); + + /* Change/modification colors */ + --d2h-change-bg-color: color-mix(in srgb, var(--color-yellow) 15%, var(--background-primary)); + --d2h-change-label-color: var(--color-yellow); + + /* Info colors */ + --d2h-info-bg-color: color-mix(in srgb, var(--color-cyan) 10%, var(--background-secondary)); + --d2h-info-text-color: var(--text-muted); + + /* Link colors */ + --d2h-link-color: var(--interactive-accent); + --d2h-link-hover-color: var(--interactive-accent-hover); + + /* Code colors */ + --d2h-code-bg-color: var(--background-primary-alt); + --d2h-code-text-color: var(--text-normal); + + /* Selection and hover */ + --d2h-hover-bg-color: var(--background-modifier-hover); + --d2h-selected-bg-color: var(--background-modifier-active-hover); +} + +/* ======================================== + DARK THEME OVERRIDES + ======================================== */ + +/* Dark theme with explicit class */ +.d2h-dark-color-scheme, +.theme-dark { + /* Background colors */ + --d2h-dark-bg-color: var(--background-primary); + --d2h-dark-file-header-bg-color: var(--background-secondary); + --d2h-dark-file-diff-wrapper-bg-color: var(--background-primary); + --d2h-dark-file-list-wrapper-bg-color: var(--background-secondary); + --d2h-dark-file-list-header-bg-color: var(--background-secondary-alt); + + /* Border colors */ + --d2h-dark-border-color: var(--background-modifier-border); + --d2h-dark-file-border-color: var(--background-modifier-border); + --d2h-dark-line-border-color: var(--background-modifier-border); + + /* Text colors */ + --d2h-dark-text-color: var(--text-normal); + --d2h-dark-muted-text-color: var(--text-muted); + --d2h-dark-file-name-color: var(--text-normal); + --d2h-dark-file-stats-color: var(--text-muted); + --d2h-dark-line-number-color: var(--text-muted); + + /* Insertion colors (additions) */ + --d2h-dark-ins-bg-color: color-mix(in srgb, var(--color-green) 15%, var(--background-primary)); + --d2h-dark-ins-label-color: color-mix(in srgb, var(--color-green) 120%, white); + --d2h-dark-ins-highlight-bg-color: color-mix(in srgb, var(--color-green) 30%, var(--background-primary)); + --d2h-dark-ins-border-color: color-mix(in srgb, var(--color-green) 50%, var(--background-modifier-border)); + + /* Deletion colors (removals) */ + --d2h-dark-del-bg-color: color-mix(in srgb, var(--color-red) 20%, var(--background-primary)); + --d2h-dark-del-label-color: color-mix(in srgb, var(--color-red) 120%, white); + --d2h-dark-del-highlight-bg-color: color-mix(in srgb, var(--color-red) 35%, var(--background-primary)); + --d2h-dark-del-border-color: color-mix(in srgb, var(--color-red) 50%, var(--background-modifier-border)); + + /* Change/modification colors */ + --d2h-dark-change-bg-color: color-mix(in srgb, var(--color-yellow) 20%, var(--background-primary)); + --d2h-dark-change-label-color: color-mix(in srgb, var(--color-yellow) 120%, white); + + /* Info colors */ + --d2h-dark-info-bg-color: color-mix(in srgb, var(--color-cyan) 15%, var(--background-secondary)); + --d2h-dark-info-text-color: var(--text-muted); + + /* Link colors */ + --d2h-dark-link-color: var(--interactive-accent); + --d2h-dark-link-hover-color: var(--interactive-accent-hover); + + /* Code colors */ + --d2h-dark-code-bg-color: var(--background-primary-alt); + --d2h-dark-code-text-color: var(--text-normal); + + /* Selection and hover */ + --d2h-dark-hover-bg-color: var(--background-modifier-hover); + --d2h-dark-selected-bg-color: var(--background-modifier-active-hover); +} + +/* Auto theme - follows system preference */ +@media (prefers-color-scheme: dark) { + .d2h-auto-color-scheme { + /* Apply dark theme variables */ + --d2h-bg-color: var(--d2h-dark-bg-color); + --d2h-file-header-bg-color: var(--d2h-dark-file-header-bg-color); + --d2h-border-color: var(--d2h-dark-border-color); + --d2h-text-color: var(--d2h-dark-text-color); + --d2h-ins-bg-color: var(--d2h-dark-ins-bg-color); + --d2h-ins-label-color: var(--d2h-dark-ins-label-color); + --d2h-ins-highlight-bg-color: var(--d2h-dark-ins-highlight-bg-color); + --d2h-del-bg-color: var(--d2h-dark-del-bg-color); + --d2h-del-label-color: var(--d2h-dark-del-label-color); + --d2h-del-highlight-bg-color: var(--d2h-dark-del-highlight-bg-color); + } +} + +/* ======================================== + COMPONENT-SPECIFIC OVERRIDES + ======================================== */ + +/* File wrapper */ +.d2h-wrapper { + background-color: var(--background-primary); + color: var(--text-normal); + font-family: var(--font-interface); + font-size: var(--font-ui-small); +} + +/* File header */ +.d2h-file-header { + background-color: var(--background-secondary); + border-color: var(--background-modifier-border); + color: var(--text-normal); +} + +.d2h-file-name { + color: var(--text-normal); + font-family: var(--font-monospace); +} + +.d2h-file-stats { + color: var(--text-muted); + font-size: var(--font-ui-smaller); +} + +/* Code lines */ +.d2h-code-line { + color: var(--text-normal); + font-family: var(--font-monospace); + font-size: var(--font-ui-small); +} + +.d2h-code-line-ctn { + color: var(--text-normal); +} + +.d2h-code-line-prefix { + color: var(--text-muted); +} + +/* Line numbers */ +.d2h-code-linenumber { + background-color: var(--background-secondary-alt); + color: var(--text-muted); + border-color: var(--background-modifier-border); +} + +/* Insertion (added) lines */ +.d2h-ins { + background-color: var(--d2h-ins-bg-color); +} + +.d2h-ins .d2h-code-line-prefix { + color: var(--d2h-ins-label-color); +} + +.d2h-ins .d2h-code-line-ctn { + background-color: transparent; +} + +.d2h-ins.d2h-change { + background-color: var(--d2h-change-bg-color); +} + +/* Deletion (removed) lines */ +.d2h-del { + background-color: var(--d2h-del-bg-color); +} + +.d2h-del .d2h-code-line-prefix { + color: var(--d2h-del-label-color); +} + +.d2h-del .d2h-code-line-ctn { + background-color: transparent; +} + +.d2h-del.d2h-change { + background-color: var(--d2h-change-bg-color); +} + +/* Word-level highlighting */ +.d2h-ins .d2h-change-highlight { + background-color: var(--d2h-ins-highlight-bg-color); + border-radius: 2px; + padding: 0 2px; +} + +.d2h-del .d2h-change-highlight { + background-color: var(--d2h-del-highlight-bg-color); + border-radius: 2px; + padding: 0 2px; +} + +/* Context (unchanged) lines */ +.d2h-cxt { + background-color: var(--background-primary); + color: var(--text-normal); +} + +/* Info lines */ +.d2h-info { + background-color: var(--d2h-info-bg-color); + color: var(--d2h-info-text-color); + border-color: var(--background-modifier-border); +} + +/* File list */ +.d2h-file-list-wrapper { + background-color: var(--background-secondary); + border-color: var(--background-modifier-border); +} + +.d2h-file-list-header { + background-color: var(--background-secondary-alt); + border-color: var(--background-modifier-border); + color: var(--text-normal); +} + +.d2h-file-list-line { + border-color: var(--background-modifier-border); +} + +.d2h-file-list-line:hover { + background-color: var(--background-modifier-hover); +} + +/* Links */ +.d2h-file-name-link, +.d2h-file-link { + color: var(--interactive-accent); + text-decoration: none; +} + +.d2h-file-name-link:hover, +.d2h-file-link:hover { + color: var(--interactive-accent-hover); + text-decoration: underline; +} + +/* Tag/label styling */ +.d2h-tag { + background-color: var(--background-modifier-border); + color: var(--text-normal); + border-radius: var(--radius-s); + padding: 2px 6px; + font-size: var(--font-ui-smaller); +} + +/* Diff table */ +.d2h-diff-table { + border-color: var(--background-modifier-border); + background-color: var(--background-primary); +} + +/* Empty placeholder */ +.d2h-empty-placeholder { + color: var(--text-faint); + background-color: var(--background-secondary); +} + +/* ======================================== + OBSIDIAN-SPECIFIC ENHANCEMENTS + ======================================== */ + +/* Integrate with Obsidian's scrollbar styling */ +.d2h-wrapper::-webkit-scrollbar { + width: var(--scrollbar-width); +} + +.d2h-wrapper::-webkit-scrollbar-track { + background: var(--background-primary); +} + +.d2h-wrapper::-webkit-scrollbar-thumb { + background: var(--scrollbar-thumb-bg); + border-radius: var(--radius-s); +} + +.d2h-wrapper::-webkit-scrollbar-thumb:hover { + background: var(--scrollbar-active-thumb-bg); +} + +/* Match Obsidian's border radius */ +.d2h-file-wrapper { + border-radius: var(--radius-m); +} + +.d2h-file-header { + border-top-left-radius: var(--radius-m); + border-top-right-radius: var(--radius-m); +} + +/* Ensure proper contrast in Obsidian's theme */ +.theme-light .d2h-code-line, +.theme-light .d2h-code-linenumber { + border-color: var(--background-modifier-border); +} + +.theme-dark .d2h-code-line, +.theme-dark .d2h-code-linenumber { + border-color: var(--background-modifier-border); +} + +/* Responsive adjustments for mobile */ +.is-mobile .d2h-wrapper { + font-size: var(--font-ui-smaller); +} + +.is-mobile .d2h-code-line { + font-size: var(--font-ui-smaller); + padding: var(--size-2-1) var(--size-2-2); +} + +/* ======================================== + ACCESSIBILITY IMPROVEMENTS + ======================================== */ + +/* Ensure focus states are visible */ +.d2h-file-list-line:focus, +.d2h-file-name-link:focus { + outline: 2px solid var(--interactive-accent); + outline-offset: 2px; +} + +/* Improve contrast for line numbers */ +.d2h-code-linenumber { + opacity: 0.7; +} + +.d2h-code-line:hover .d2h-code-linenumber { + opacity: 1; +} + +/* ======================================== + PRINT STYLES + ======================================== */ + +@media print { + .d2h-wrapper { + background: white; + color: black; + } + + .d2h-ins { + background-color: #d4ffd4 !important; + } + + .d2h-del { + background-color: #ffd4d4 !important; + } + + .d2h-code-linenumber { + background-color: #f5f5f5 !important; + } +} +