summaryrefslogtreecommitdiffstats
path: root/public/js
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-04-10 11:29:00 +0200
committerDanilo M. <danix@danix.xyz>2026-04-10 11:29:00 +0200
commitc42150058196f5affad5c6c590e99dd2fc7321c3 (patch)
treecb0a7ad297128a43d32111e403959491573b6ace /public/js
parentd51e4ef7dcd8609cd008a803f9d51674ac3d3ed2 (diff)
downloaddanixxyz-theme-c42150058196f5affad5c6c590e99dd2fc7321c3.tar.gz
danixxyz-theme-c42150058196f5affad5c6c590e99dd2fc7321c3.zip
feat: complete Hugo theme implementation from mockups
Transform all production-ready mockup files into a fully functional Hugo theme with all design patterns, components, and interactivity. Implements the complete plan: token alignment, global shell, homepage, articles section, single article views, photo gallery, static pages, and 404 page. Changes: - Phase 0: Token alignment (--color-* → --type-*, add spacing/z-index/timing scales) - Phase 1a: Global shell (baseof.html, hamburger menu, theme toggle, matrix rain) - Phase 1b: Homepage (hero layout, glitch/typing/scroll-reveal effects) - Phase 1c: Articles section (timeline layout, filter system, featured cards) - Phase 1d: Single article (meta bar, share sidebar, footer nav, progress bar) - Phase 1e: Photo gallery (lightbox, grid layout, shortcode updates) - Phase 1f: Static pages (about/contact page layout) - Phase 1g: 404 page (standalone HTML, quote randomization, recent articles) New files: - 6 CSS components: hamburger, article-hero, share-sidebar, timeline, lightbox, 404 - 8 JS modules: hamburger, glitch, typing, scroll-reveal, share-sidebar, lightbox, 404, photo-utils - 6 template partials: article-single, featured-card, photo-article, share-sidebar, static-page, timeline-item - 1 layout: 404.html (standalone) Updated: - All CSS variables with comprehensive token system - All JS modules integrated into main.js - All shortcodes (gallery, gal-img) for lightbox compatibility - All layout files (baseof, home, section, page) with new dispatching logic Verified: Hugo build succeeds with 21 pages, no errors. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Diffstat (limited to 'public/js')
-rw-r--r--public/js/filters.38212ecd54ff7f1fdebf2aebe32e8c248382e80f93dae0761ebbbd03ca28dc5b.js28
-rw-r--r--public/js/main.23cd0c7d837263b9eaeb96ee2d9ccfa2969daa3fa00fa1c1fe8701a9b87251a1.js1
-rw-r--r--public/js/main.55ed9b054bac537d7aab80112d090a8b88bbcaae5dec86c26009f393fd2d213d.js1
-rw-r--r--public/js/main.js175
-rw-r--r--public/js/main.js.map1
5 files changed, 0 insertions, 206 deletions
diff --git a/public/js/filters.38212ecd54ff7f1fdebf2aebe32e8c248382e80f93dae0761ebbbd03ca28dc5b.js b/public/js/filters.38212ecd54ff7f1fdebf2aebe32e8c248382e80f93dae0761ebbbd03ca28dc5b.js
deleted file mode 100644
index 64d9c57..0000000
--- a/public/js/filters.38212ecd54ff7f1fdebf2aebe32e8c248382e80f93dae0761ebbbd03ca28dc5b.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// filters.js
-(function() {
- const filterBtns = document.querySelectorAll('.filter-btn');
- const feedList = document.getElementById('articles-feed');
- const cards = feedList ? feedList.querySelectorAll('.post-card') : [];
-
- if (!filterBtns.length || !cards.length) return;
-
- filterBtns.forEach(btn => {
- btn.addEventListener('click', function() {
- const filter = this.dataset.filter;
-
- // Update active button
- filterBtns.forEach(b => b.classList.remove('active'));
- this.classList.add('active');
-
- // Filter cards
- cards.forEach(card => {
- const cardType = card.querySelector('.post-type-badge')?.classList[1];
- const matches = filter === 'all' || cardType === filter;
- card.style.display = matches ? '' : 'none';
- });
-
- // Scroll to top
- window.scrollTo({ top: 0, behavior: 'smooth' });
- });
- });
-})();
diff --git a/public/js/main.23cd0c7d837263b9eaeb96ee2d9ccfa2969daa3fa00fa1c1fe8701a9b87251a1.js b/public/js/main.23cd0c7d837263b9eaeb96ee2d9ccfa2969daa3fa00fa1c1fe8701a9b87251a1.js
deleted file mode 100644
index 4e24393..0000000
--- a/public/js/main.23cd0c7d837263b9eaeb96ee2d9ccfa2969daa3fa00fa1c1fe8701a9b87251a1.js
+++ /dev/null
@@ -1 +0,0 @@
-(()=>{console.log("This site was generated by Hugo.");})();
diff --git a/public/js/main.55ed9b054bac537d7aab80112d090a8b88bbcaae5dec86c26009f393fd2d213d.js b/public/js/main.55ed9b054bac537d7aab80112d090a8b88bbcaae5dec86c26009f393fd2d213d.js
deleted file mode 100644
index 0dadf45..0000000
--- a/public/js/main.55ed9b054bac537d7aab80112d090a8b88bbcaae5dec86c26009f393fd2d213d.js
+++ /dev/null
@@ -1 +0,0 @@
-(()=>{(function(){let e="danix-theme",o="theme-dark",t="theme-light";function r(){let c=localStorage.getItem(e),n=window.matchMedia("(prefers-color-scheme: dark)").matches;a((c===null?n:c==="dark")?"dark":"light")}function a(c){let n=document.documentElement;n.classList.remove(o,t),c==="dark"?(n.classList.remove(t),localStorage.setItem(e,"dark")):(n.classList.add(t),localStorage.setItem(e,"light"))}function i(){return document.documentElement.classList.contains(t)?"light":"dark"}function d(){let n=i()==="dark"?"light":"dark";a(n),window.dispatchEvent(new CustomEvent("theme-changed",{detail:{theme:n}}))}function l(){let c=document.getElementById("theme-toggle-btn");c&&(c.addEventListener("click",d),s(),window.addEventListener("theme-changed",s))}function s(){let c=document.getElementById("theme-toggle-btn");if(c){let n=i();c.textContent=n==="dark"?"\u2600\uFE0F light":"\u{1F319} dark"}}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){r(),l()}):(r(),l()),window.ThemeToggle={toggle:d,set:a,get:i}})();(function(){let e=document.getElementById("matrix-canvas");if(!e||window.matchMedia("(prefers-reduced-motion: reduce)").matches)return;let o=e.getContext("2d"),t="\u30A2\u30A4\u30A6\u30A8\u30AA\u30AB\u30AD\u30AF\u30B1\u30B3\u30B5\u30B7\u30B9\u30BB\u30BD\u30BF\u30C1\u30C4\u30C6\u30C8\u30CA\u30CB\u30CC\u30CD\u30CE\u30CF\u30D2\u30D5\u30D8\u30DB\u30DE\u30DF\u30E0\u30E1\u30E2\u30E4\u30E6\u30E8\u30E9\u30EA\u30EB\u30EC\u30ED\u30EF\u30F2\u30F30123456789ABCDEF<>/\\|{}[]$#@!",r=14,a,i,d;function l(){e.width=e.offsetWidth,e.height=e.offsetHeight,a=Math.floor(e.width/r)+1,i=Array.from({length:a},()=>Math.random()*-(e.height/r))}function s(){let c=document.documentElement.classList.contains("theme-light");o.fillStyle=c?"rgba(240,244,248,0.07)":"rgba(6,11,16,0.055)",o.fillRect(0,0,e.width,e.height),o.font=`${r}px "JetBrains Mono", monospace`;for(let n=0;n<a;n++){let m=t[Math.floor(Math.random()*t.length)];o.fillStyle=Math.random()>.96?c?"#008f5a":"#00ff88":c?"#7c3aed":"#a855f7",o.fillText(m,n*r,i[n]*r),i[n]*r>e.height&&Math.random()>.975&&(i[n]=Math.random()*-20),i[n]+=.5}d=requestAnimationFrame(s)}window.addEventListener("theme-changed",function(){},{passive:!0}),l(),window.addEventListener("resize",()=>{cancelAnimationFrame(d),l(),s()},{passive:!0}),document.addEventListener("visibilitychange",()=>{document.hidden?cancelAnimationFrame(d):s()}),s(),window.MatrixRain={init:l,tick:s}})();(function(){let e=document.querySelector(".reading-progress");if(!e)return;let o=document.querySelector("main");if(!o)return;function t(){let i=window.innerHeight,d=document.documentElement.scrollHeight-i,l=window.scrollY,s=d>0?l/d*100:0;e.style.width=s+"%"}o.offsetHeight>window.innerHeight*1.5&&document.body.classList.add("scrollable");let a=!1;window.addEventListener("scroll",function(){a||(requestAnimationFrame(t),a=!0,setTimeout(()=>{a=!1},100))},{passive:!0}),t()})();(function(){document.querySelectorAll("pre, .highlight").forEach(o=>{let t=document.createElement("button");t.className="code-copy-btn",t.textContent="copy",t.type="button",t.setAttribute("aria-label","Copy code");let r=o.querySelector("code"),a=r?r.textContent:o.textContent;t.addEventListener("click",async function(){try{await navigator.clipboard.writeText(a);let i=t.textContent;t.textContent="copied!",t.classList.add("copied"),setTimeout(()=>{t.textContent=i,t.classList.remove("copied")},2e3)}catch(i){console.error("Failed to copy:",i),t.textContent="error"}}),o.style.position="relative",o.appendChild(t)})})();})();
diff --git a/public/js/main.js b/public/js/main.js
deleted file mode 100644
index c47a5b8..0000000
--- a/public/js/main.js
+++ /dev/null
@@ -1,175 +0,0 @@
-(() => {
- // ns-hugo-imp:/home/danix/Programming/GIT/danix2-hugo-theme/assets/js/theme-toggle.js
- (function() {
- const STORAGE_KEY = "danix-theme";
- const DARK_CLASS = "theme-dark";
- const LIGHT_CLASS = "theme-light";
- function init() {
- const saved = localStorage.getItem(STORAGE_KEY);
- const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
- const isDark = saved === null ? prefersDark : saved === "dark";
- applyTheme(isDark ? "dark" : "light");
- }
- function applyTheme(theme) {
- const html = document.documentElement;
- html.classList.remove(DARK_CLASS, LIGHT_CLASS);
- if (theme === "dark") {
- html.classList.remove(LIGHT_CLASS);
- localStorage.setItem(STORAGE_KEY, "dark");
- } else {
- html.classList.add(LIGHT_CLASS);
- localStorage.setItem(STORAGE_KEY, "light");
- }
- }
- function getCurrentTheme() {
- return document.documentElement.classList.contains(LIGHT_CLASS) ? "light" : "dark";
- }
- function toggleTheme() {
- const current = getCurrentTheme();
- const next = current === "dark" ? "light" : "dark";
- applyTheme(next);
- window.dispatchEvent(new CustomEvent("theme-changed", { detail: { theme: next } }));
- }
- function setupToggleButton() {
- const btn = document.getElementById("theme-toggle-btn");
- if (btn) {
- btn.addEventListener("click", toggleTheme);
- updateToggleButtonLabel();
- window.addEventListener("theme-changed", updateToggleButtonLabel);
- }
- }
- function updateToggleButtonLabel() {
- const btn = document.getElementById("theme-toggle-btn");
- if (btn) {
- const current = getCurrentTheme();
- btn.textContent = current === "dark" ? "\u2600\uFE0F light" : "\u{1F319} dark";
- }
- }
- if (document.readyState === "loading") {
- document.addEventListener("DOMContentLoaded", function() {
- init();
- setupToggleButton();
- });
- } else {
- init();
- setupToggleButton();
- }
- window.ThemeToggle = {
- toggle: toggleTheme,
- set: applyTheme,
- get: getCurrentTheme
- };
- })();
-
- // ns-hugo-imp:/home/danix/Programming/GIT/danix2-hugo-theme/assets/js/matrix-rain.js
- (function() {
- const canvas = document.getElementById("matrix-canvas");
- if (!canvas) return;
- if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
- const ctx = canvas.getContext("2d");
- const CHARS = "\u30A2\u30A4\u30A6\u30A8\u30AA\u30AB\u30AD\u30AF\u30B1\u30B3\u30B5\u30B7\u30B9\u30BB\u30BD\u30BF\u30C1\u30C4\u30C6\u30C8\u30CA\u30CB\u30CC\u30CD\u30CE\u30CF\u30D2\u30D5\u30D8\u30DB\u30DE\u30DF\u30E0\u30E1\u30E2\u30E4\u30E6\u30E8\u30E9\u30EA\u30EB\u30EC\u30ED\u30EF\u30F2\u30F30123456789ABCDEF<>/\\|{}[]$#@!";
- const FS = 14;
- let cols, drops, raf;
- function init() {
- canvas.width = canvas.offsetWidth;
- canvas.height = canvas.offsetHeight;
- cols = Math.floor(canvas.width / FS) + 1;
- drops = Array.from({ length: cols }, () => Math.random() * -(canvas.height / FS));
- }
- function tick() {
- const light = document.documentElement.classList.contains("theme-light");
- ctx.fillStyle = light ? "rgba(240,244,248,0.07)" : "rgba(6,11,16,0.055)";
- ctx.fillRect(0, 0, canvas.width, canvas.height);
- ctx.font = `${FS}px "JetBrains Mono", monospace`;
- for (let i = 0; i < cols; i++) {
- const char = CHARS[Math.floor(Math.random() * CHARS.length)];
- ctx.fillStyle = Math.random() > 0.96 ? light ? "#008f5a" : "#00ff88" : light ? "#7c3aed" : "#a855f7";
- ctx.fillText(char, i * FS, drops[i] * FS);
- if (drops[i] * FS > canvas.height && Math.random() > 0.975) {
- drops[i] = Math.random() * -20;
- }
- drops[i] += 0.5;
- }
- raf = requestAnimationFrame(tick);
- }
- window.addEventListener("theme-changed", function() {
- }, { passive: true });
- init();
- window.addEventListener("resize", () => {
- cancelAnimationFrame(raf);
- init();
- tick();
- }, { passive: true });
- document.addEventListener("visibilitychange", () => {
- if (document.hidden) {
- cancelAnimationFrame(raf);
- } else {
- tick();
- }
- });
- tick();
- window.MatrixRain = { init, tick };
- })();
-
- // ns-hugo-imp:/home/danix/Programming/GIT/danix2-hugo-theme/assets/js/progress-bar.js
- (function() {
- const progressBar = document.querySelector(".reading-progress");
- if (!progressBar) return;
- const mainContent = document.querySelector("main");
- if (!mainContent) return;
- function updateProgress() {
- const windowHeight = window.innerHeight;
- const docHeight = document.documentElement.scrollHeight - windowHeight;
- const scrolled = window.scrollY;
- const percent = docHeight > 0 ? scrolled / docHeight * 100 : 0;
- progressBar.style.width = percent + "%";
- }
- const contentHeight = mainContent.offsetHeight;
- if (contentHeight > window.innerHeight * 1.5) {
- document.body.classList.add("scrollable");
- }
- let ticking = false;
- window.addEventListener("scroll", function() {
- if (!ticking) {
- requestAnimationFrame(updateProgress);
- ticking = true;
- setTimeout(() => {
- ticking = false;
- }, 100);
- }
- }, { passive: true });
- updateProgress();
- })();
-
- // ns-hugo-imp:/home/danix/Programming/GIT/danix2-hugo-theme/assets/js/copy-code.js
- (function() {
- const codeBlocks = document.querySelectorAll("pre, .highlight");
- codeBlocks.forEach((block) => {
- const btn = document.createElement("button");
- btn.className = "code-copy-btn";
- btn.textContent = "copy";
- btn.type = "button";
- btn.setAttribute("aria-label", "Copy code");
- const code = block.querySelector("code");
- const text = code ? code.textContent : block.textContent;
- btn.addEventListener("click", async function() {
- try {
- await navigator.clipboard.writeText(text);
- const originalText = btn.textContent;
- btn.textContent = "copied!";
- btn.classList.add("copied");
- setTimeout(() => {
- btn.textContent = originalText;
- btn.classList.remove("copied");
- }, 2e3);
- } catch (err) {
- console.error("Failed to copy:", err);
- btn.textContent = "error";
- }
- });
- block.style.position = "relative";
- block.appendChild(btn);
- });
- })();
-})();
-//# sourceMappingURL=main.js.map
diff --git a/public/js/main.js.map b/public/js/main.js.map
deleted file mode 100644
index 5e4682a..0000000
--- a/public/js/main.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/js/theme-toggle.js","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/js/matrix-rain.js","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/js/progress-bar.js","file:///home/danix/Programming/GIT/danix2-hugo-theme/assets/js/copy-code.js"],"sourcesContent":["// theme-toggle.js\n(function() {\n const STORAGE_KEY = 'danix-theme';\n const DARK_CLASS = 'theme-dark';\n const LIGHT_CLASS = 'theme-light';\n\n // Initialize theme on page load\n function init() {\n const saved = localStorage.getItem(STORAGE_KEY);\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n const isDark = saved === null ? prefersDark : saved === 'dark';\n\n applyTheme(isDark ? 'dark' : 'light');\n }\n\n // Apply theme to document\n function applyTheme(theme) {\n const html = document.documentElement;\n\n html.classList.remove(DARK_CLASS, LIGHT_CLASS);\n\n if (theme === 'dark') {\n html.classList.remove(LIGHT_CLASS);\n localStorage.setItem(STORAGE_KEY, 'dark');\n } else {\n html.classList.add(LIGHT_CLASS);\n localStorage.setItem(STORAGE_KEY, 'light');\n }\n }\n\n // Get current theme\n function getCurrentTheme() {\n return document.documentElement.classList.contains(LIGHT_CLASS) ? 'light' : 'dark';\n }\n\n // Toggle theme\n function toggleTheme() {\n const current = getCurrentTheme();\n const next = current === 'dark' ? 'light' : 'dark';\n applyTheme(next);\n\n // Dispatch custom event for other scripts to listen\n window.dispatchEvent(new CustomEvent('theme-changed', { detail: { theme: next } }));\n }\n\n // Setup toggle button\n function setupToggleButton() {\n const btn = document.getElementById('theme-toggle-btn');\n if (btn) {\n btn.addEventListener('click', toggleTheme);\n updateToggleButtonLabel();\n\n // Listen for theme changes to update button label\n window.addEventListener('theme-changed', updateToggleButtonLabel);\n }\n }\n\n function updateToggleButtonLabel() {\n const btn = document.getElementById('theme-toggle-btn');\n if (btn) {\n const current = getCurrentTheme();\n btn.textContent = current === 'dark' ? '☀️ light' : '🌙 dark';\n }\n }\n\n // Initialize on DOMContentLoaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', function() {\n init();\n setupToggleButton();\n });\n } else {\n init();\n setupToggleButton();\n }\n\n // Expose to global scope for testing\n window.ThemeToggle = {\n toggle: toggleTheme,\n set: applyTheme,\n get: getCurrentTheme,\n };\n})();\n","// matrix-rain.js\n(function () {\n const canvas = document.getElementById('matrix-canvas');\n if (!canvas) return;\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n\n const ctx = canvas.getContext('2d');\n const CHARS = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン0123456789ABCDEF\u003c\u003e/\\\\|{}[]$#@!';\n const FS = 14; // font size / column width in px\n let cols, drops, raf;\n\n function init() {\n canvas.width = canvas.offsetWidth;\n canvas.height = canvas.offsetHeight;\n cols = Math.floor(canvas.width / FS) + 1;\n drops = Array.from({ length: cols }, () =\u003e Math.random() * -(canvas.height / FS));\n }\n\n function tick() {\n const light = document.documentElement.classList.contains('theme-light');\n // Fade trail: near-transparent fill each frame\n ctx.fillStyle = light ? 'rgba(240,244,248,0.07)' : 'rgba(6,11,16,0.055)';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.font = `${FS}px \"JetBrains Mono\", monospace`;\n\n for (let i = 0; i \u003c cols; i++) {\n const char = CHARS[Math.floor(Math.random() * CHARS.length)];\n // 4% chance of bright \"head\" char, otherwise use accent color\n ctx.fillStyle = Math.random() \u003e 0.96\n ? (light ? '#008f5a' : '#00ff88') // bright green head\n : (light ? '#7c3aed' : '#a855f7'); // purple trail\n ctx.fillText(char, i * FS, drops[i] * FS);\n\n if (drops[i] * FS \u003e canvas.height \u0026\u0026 Math.random() \u003e 0.975) {\n drops[i] = Math.random() * -20; // reset column randomly\n }\n drops[i] += 0.5; // slow fall speed\n }\n raf = requestAnimationFrame(tick);\n }\n\n // Listen for theme changes and reinit\n window.addEventListener('theme-changed', function() {\n // Matrix rain auto-colors based on theme-light class\n }, { passive: true });\n\n init();\n window.addEventListener('resize', () =\u003e {\n cancelAnimationFrame(raf);\n init();\n tick();\n }, { passive: true });\n\n document.addEventListener('visibilitychange', () =\u003e {\n if (document.hidden) {\n cancelAnimationFrame(raf);\n } else {\n tick();\n }\n });\n\n tick();\n\n window.MatrixRain = { init, tick };\n})();\n","// progress-bar.js\n(function() {\n const progressBar = document.querySelector('.reading-progress');\n if (!progressBar) return;\n\n // Only enable on pages with substantial content\n const mainContent = document.querySelector('main');\n if (!mainContent) return;\n\n function updateProgress() {\n // Calculate scroll percentage\n const windowHeight = window.innerHeight;\n const docHeight = document.documentElement.scrollHeight - windowHeight;\n const scrolled = window.scrollY;\n const percent = docHeight \u003e 0 ? (scrolled / docHeight) * 100 : 0;\n\n progressBar.style.width = percent + '%';\n }\n\n // Mark body as scrollable if there's significant content\n const contentHeight = mainContent.offsetHeight;\n if (contentHeight \u003e window.innerHeight * 1.5) {\n document.body.classList.add('scrollable');\n }\n\n // Use requestAnimationFrame for smooth updates\n let ticking = false;\n window.addEventListener('scroll', function() {\n if (!ticking) {\n requestAnimationFrame(updateProgress);\n ticking = true;\n setTimeout(() =\u003e { ticking = false; }, 100);\n }\n }, { passive: true });\n\n // Initial update\n updateProgress();\n})();\n","// copy-code.js\n(function() {\n // Add copy button to all code blocks\n const codeBlocks = document.querySelectorAll('pre, .highlight');\n\n codeBlocks.forEach(block =\u003e {\n // Create copy button\n const btn = document.createElement('button');\n btn.className = 'code-copy-btn';\n btn.textContent = 'copy';\n btn.type = 'button';\n btn.setAttribute('aria-label', 'Copy code');\n\n // Get code text\n const code = block.querySelector('code');\n const text = code ? code.textContent : block.textContent;\n\n // Copy on click\n btn.addEventListener('click', async function() {\n try {\n await navigator.clipboard.writeText(text);\n\n // Show feedback\n const originalText = btn.textContent;\n btn.textContent = 'copied!';\n btn.classList.add('copied');\n\n setTimeout(() =\u003e {\n btn.textContent = originalText;\n btn.classList.remove('copied');\n }, 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n btn.textContent = 'error';\n }\n });\n\n // Add button to block\n block.style.position = 'relative';\n block.appendChild(btn);\n });\n})();\n"],"mappings":"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","names":[]} \ No newline at end of file