Ë
    0kjÙS  ã                  ó,  — d Z ddlmZ ddlZddlmZ g d¢Zdddd	d
ddœZd(d)d„Zddj                  d„  e
d«      D «       «      z   dz   ZdZdZddediZdhZdZ ee«      j$                  dz  Zedz  Zddddddd œZd!Zd*d"„Zd+d#„Zd,d$„Zd-d%„Zd.d&„Zd.d'„Zy)/uM  Risk-of-Rain-flavoured pixel theme for the Streamlit screener.

Injects a chunky, CRT-ish pixel skin (dark night-sky palette, pixel fonts,
loot-card metrics, health-bar progress) and renders a pixel-art Gup â€” the
friendly blue blob â€” as a bouncing mascot in the header.

Kept out of app.py so the dashboard logic stays readable.
é    )ÚannotationsN)ÚPath)z
       ###ú
     #####z
    #oooooz
   #oo****z
   #o*****z
  #oo*****z
  #oow@oooz
  #oo@@oooz
  #oooooooz
###oooooooz
#oooooooooz
###xxoooooz
   #xxxxooz
    #xxxxxr   z#4a1f07z#ff8f33z#cf6a1cz#ffe0b0z#1a0f08z#ffffff)ú#ÚoÚxÚ*ú@Úwc                ó€  — t         D �cg c]  }||ddd…   z   ‘Œ }}t        |d   «      }t        |«      }g }t        |«      D ]K  \  }}t        |«      D ]8  \  }}	t        j	                  |	«      }
|
sŒ|j                  d|› d|› d|
› d�«       Œ: ŒM d|› d	|› d
|| z  › d|| z  › d�	dj                  |«      z   dz   S c c}w )zHReturn the Gup as crisp pixel-art SVG, each source pixel `scale`px wide.Néÿÿÿÿr   z	<rect x="z" y="z" width="1" height="1" fill="z"/>z<svg class="gup" viewBox="0 0 ú z	" width="z
" height="zB" shape-rendering="crispEdges" xmlns="http://www.w3.org/2000/svg">Ú z</svg>)Ú	_GUP_LEFTÚlenÚ	enumerateÚ_GUP_PALETTEÚgetÚappendÚjoin)ÚscaleÚleftÚrowsr   ÚhÚrectsÚyÚrowr   ÚchÚfills              útheme.pyÚgup_svgr!   -   s   € ä*3Ö4 $ˆD�4™˜"˜‘:ÓÐ4€DÐ4ÜˆD�‰G‹€AÜˆD‹	€AØ€EÜ˜D“/ò \‰ˆˆ3Ü˜s“^ò 	\‰EˆAˆrÜ×#Ñ# BÓ'ˆDÚØ—‘˜y¨¨¨5°°Ð3PÐQUÐPVÐVYÐZÕ[ñ	\ð\ð )¨¨¨1¨Q¨Cð 0Ø�e‘)�˜J q¨5¡y kð 2Kð	Lð �'‰'�%‹.ñ	ð ñ		ðùò 5s   ‰B;z<div class="cash-rain">r   c           
   #  ór   K  — | ]/  }d |dz  d›dd|dz  dz  z   › dd|dz  dz  z   › d	|d
z  dz  › d�	–— Œ1 y­w)z<span style="left:g      @z.1fz%;font-size:é   é   zpx;animation-duration:é   é   zs;animation-delay:-é   é	   zs">&#128181;</span>N© )Ú.0Úis     r    ú	<genexpr>r,   G   sh   è ø€ ò 0ð 	
ð ˜˜S™ ˜ \°"¸¸A¹À±|Ñ2CÐ1Dð EØ˜q 1™u¨™k™/Ð*Ð*=¸qÀ2¹vÈ¹l¸^ÐK^ô`ñ0ùs   ‚57é(   ú</div>aÒ'  
<style>
@import url('https://fonts.googleapis.com/css2?family=Press+Start+2P&family=VT323&display=swap');

:root {
  --ror-bg:      #0a0e1a;
  --ror-panel:   #161f38;
  --ror-panel2:  #1e2a47;
  --ror-line:    #33456e;
  --ror-text:    #e7ecfb;
  --ror-muted:   #8ea0c6;
  --ror-gold:    #ffb638;   /* loot / money */
  --ror-cyan:    #5fe0ff;   /* gup / ui */
  --ror-green:   #77dd77;   /* uncommon */
  --ror-red:     #ff5d5d;   /* legendary / danger */
  --ror-purple:  #b78bff;
  --pix: 'Press Start 2P', monospace;
  --term: 'VT323', 'Courier New', monospace;
}

/* ---- base canvas: deep night sky with a couple of glows ---- */
.stApp {
  background:
    radial-gradient(900px 500px at 15% -10%, rgba(95,224,255,0.10), transparent 60%),
    radial-gradient(900px 600px at 90% 0%, rgba(183,139,255,0.10), transparent 55%),
    linear-gradient(180deg, #0b1022 0%, var(--ror-bg) 55%, #06080f 100%);
  color: var(--ror-text);
  font-family: var(--term);
  font-size: 1.15rem;
}
/* faint CRT scanlines over everything */
.stApp::before {
  content: "";
  position: fixed; inset: 0; pointer-events: none; z-index: 9999;
  background: repeating-linear-gradient(0deg, rgba(0,0,0,0.16) 0 1px, transparent 1px 3px);
  mix-blend-mode: multiply;
}
[data-testid="stHeader"] { background: transparent; }
.block-container { padding-top: 2.2rem; }

/* ---- pixel typography ---- */
h1, h2, h3, h4 {
  font-family: var(--pix) !important;
  color: var(--ror-gold) !important;
  text-shadow: 3px 3px 0 #000, 0 0 14px rgba(255,182,56,0.35);
  letter-spacing: 1px;
  line-height: 1.5 !important;
}
h2, h3 { color: var(--ror-cyan) !important; text-shadow: 2px 2px 0 #000, 0 0 12px rgba(95,224,255,0.35); }
p, span, label, li, .stMarkdown, .stCaption, [data-testid="stCaptionContainer"] {
  font-family: var(--term);
}
code, .stCode, pre { font-family: var(--term) !important; color: var(--ror-green) !important; }

/* ---- hero banner + bouncing gup ---- */
.ror-hero {
  display: flex; align-items: center; gap: 22px;
  background: linear-gradient(180deg, var(--ror-panel2), var(--ror-panel));
  border: 4px solid var(--ror-line);
  box-shadow: 8px 8px 0 #000, inset 0 0 0 2px rgba(95,224,255,0.12);
  padding: 20px 26px; margin-bottom: 18px;
}
.ror-hero h1 { margin: 0; font-size: 1.7rem; }
.ror-hero .sub {
  font-family: var(--term); font-size: 1.35rem; color: var(--ror-muted);
  margin: 8px 0 0; line-height: 1.2;
}
.ror-hero .sub b { color: var(--ror-red); }
.gup-wrap { flex: 0 0 auto; filter: drop-shadow(5px 6px 0 rgba(0,0,0,0.55)); }
.gup { image-rendering: pixelated; display: block; animation: gup-hop 1.4s steps(2, jump-none) infinite; transform-origin: bottom center; }
@keyframes gup-hop {
  0%, 100% { transform: translateY(0) scaleY(1); }
  30%      { transform: translateY(-14px) scaleY(1.06); }
  55%      { transform: translateY(0) scaleY(0.92); }
  70%      { transform: translateY(0) scaleY(1); }
}

/* ---- free-roaming Gup that bounces around the whole screen ---- */
.gup-roam {
  position: fixed; top: 0; left: 0; z-index: 9998; pointer-events: none;
  filter: drop-shadow(4px 5px 0 rgba(0,0,0,0.5));
  animation: gup-roam 26s linear infinite;
}
.gup-roam .gup { animation: gup-hop 0.9s steps(2, jump-none) infinite; }
@keyframes gup-roam {
  0%   { transform: translate(2vw, 10vh)  scaleX( 1); }
  12%  { transform: translate(82vw, 26vh) scaleX( 1); }
  13%  { transform: translate(82vw, 26vh) scaleX(-1); }
  27%  { transform: translate(16vw, 74vh) scaleX(-1); }
  28%  { transform: translate(16vw, 74vh) scaleX( 1); }
  43%  { transform: translate(84vw, 58vh) scaleX( 1); }
  44%  { transform: translate(84vw, 58vh) scaleX(-1); }
  58%  { transform: translate(6vw, 20vh)  scaleX(-1); }
  59%  { transform: translate(6vw, 20vh)  scaleX( 1); }
  73%  { transform: translate(70vw, 82vh) scaleX( 1); }
  74%  { transform: translate(70vw, 82vh) scaleX(-1); }
  88%  { transform: translate(24vw, 40vh) scaleX(-1); }
  89%  { transform: translate(24vw, 40vh) scaleX( 1); }
  100% { transform: translate(2vw, 10vh)  scaleX( 1); }
}
@media (prefers-reduced-motion: reduce) { .gup-roam { display: none; } }

/* ---- money rain: only visible while a rain track is playing ----
   z-index 9997 keeps the bills under the roaming Gup (9998) and under the
   CRT scanline overlay (9999), so the theme still reads on top of them.
   The reduced-motion rule needs !important: `html.cash-on .cash-rain` is
   specificity (0,2,1) and would otherwise outrank a plain `.cash-rain`. */
.cash-rain {
  position: fixed; inset: 0; z-index: 9997; pointer-events: none;
  overflow: hidden; display: none;
}
html.cash-on .cash-rain { display: block; }
.cash-rain span {
  position: absolute; top: -12vh;
  animation-name: cash-fall; animation-timing-function: linear;
  animation-iteration-count: infinite;
}
@keyframes cash-fall {
  0%   { transform: translateY(0) rotate(-12deg); opacity: 0; }
  10%  { opacity: 1; }
  100% { transform: translateY(118vh) rotate(14deg); }
}
@media (prefers-reduced-motion: reduce) { .cash-rain { display: none !important; } }
.ror-tag {
  display:inline-block; font-family: var(--pix); font-size:0.6rem; color:#04121b;
  background: var(--ror-cyan); padding:6px 9px; margin-top:12px;
  box-shadow: 3px 3px 0 #000;
}

/* ---- sidebar as a HUD panel ---- */
[data-testid="stSidebar"] {
  background: linear-gradient(180deg, #10192f, #0b1223);
  border-right: 4px solid var(--ror-line);
}
[data-testid="stSidebar"] .stHeadingContainer h2,
[data-testid="stSidebar"] h1, [data-testid="stSidebar"] h2, [data-testid="stSidebar"] h3 {
  font-size: 1rem;
}

/* ---- chunky pixel buttons ---- */
.stButton > button, .stDownloadButton > button {
  font-family: var(--pix) !important; font-size: 0.72rem !important;
  color: #1a0f00 !important;
  background: var(--ror-gold) !important;
  border: 3px solid #000 !important; border-radius: 0 !important;
  box-shadow: 5px 5px 0 #000 !important;
  padding: 12px 16px !important;
  transition: transform .05s steps(1), box-shadow .05s steps(1);
}
.stButton > button:hover, .stDownloadButton > button:hover {
  background: #ffcf6b !important; transform: translate(2px,2px);
  box-shadow: 3px 3px 0 #000 !important;
}
.stButton > button:active, .stDownloadButton > button:active {
  transform: translate(5px,5px); box-shadow: 0 0 0 #000 !important;
}

/* ---- inputs / selects ---- */
[data-baseweb="select"] > div, .stTextInput input, .stNumberInput input {
  background: #0c1426 !important; border: 2px solid var(--ror-line) !important;
  border-radius: 0 !important; color: var(--ror-text) !important;
  font-family: var(--term) !important; font-size: 1.15rem !important;
}
.stSlider [data-baseweb="slider"] div[role="slider"] {
  background: var(--ror-gold) !important; border-radius: 0 !important;
  box-shadow: 2px 2px 0 #000;
}

/* ---- metrics as loot cards ---- */
[data-testid="stMetric"] {
  background: linear-gradient(180deg, var(--ror-panel2), var(--ror-panel));
  border: 3px solid var(--ror-gold);
  box-shadow: 5px 5px 0 #000;
  padding: 14px 16px;
}
[data-testid="stMetricLabel"] { font-family: var(--pix) !important; font-size: 0.6rem !important; color: var(--ror-muted) !important; }
[data-testid="stMetricValue"] { font-family: var(--pix) !important; font-size: 1.25rem !important; color: var(--ror-gold) !important; text-shadow: 2px 2px 0 #000; }
[data-testid="stMetricDelta"] { font-family: var(--term) !important; font-size: 1.2rem !important; }
/* rarity-coloured loot cards across a 4-metric row */
[data-testid="stHorizontalBlock"] > div:nth-child(1) [data-testid="stMetric"] { border-color: var(--ror-gold);  }
[data-testid="stHorizontalBlock"] > div:nth-child(2) [data-testid="stMetric"] { border-color: var(--ror-red);   }
[data-testid="stHorizontalBlock"] > div:nth-child(2) [data-testid="stMetricValue"] { color: var(--ror-red);   }
[data-testid="stHorizontalBlock"] > div:nth-child(3) [data-testid="stMetric"] { border-color: var(--ror-green); }
[data-testid="stHorizontalBlock"] > div:nth-child(3) [data-testid="stMetricValue"] { color: var(--ror-green); }
[data-testid="stHorizontalBlock"] > div:nth-child(4) [data-testid="stMetric"] { border-color: var(--ror-cyan);  }
[data-testid="stHorizontalBlock"] > div:nth-child(4) [data-testid="stMetricValue"] { color: var(--ror-cyan);  }

/* ---- progress = teleporter charge / health bar ---- */
.stProgress > div > div > div > div {
  background: linear-gradient(90deg, var(--ror-gold), var(--ror-red)) !important;
  border-radius: 0 !important;
}
.stProgress > div > div > div {
  background: #0c1426 !important; border: 2px solid #000 !important; border-radius: 0 !important;
}

/* ---- expander / alerts as panels ---- */
[data-testid="stExpander"] details {
  background: var(--ror-panel); border: 3px solid var(--ror-line); border-radius: 0;
  box-shadow: 5px 5px 0 #000;
}
[data-testid="stExpander"] summary { font-family: var(--pix) !important; font-size: 0.7rem !important; color: var(--ror-cyan) !important; }
[data-testid="stAlert"] {
  border-radius: 0 !important; border: 3px solid var(--ror-line) !important;
  box-shadow: 5px 5px 0 #000; font-family: var(--term); font-size: 1.15rem;
}
hr { border-color: var(--ror-line) !important; }

/* dataframe frame */
[data-testid="stDataFrame"] { border: 3px solid var(--ror-line); box-shadow: 6px 6px 0 #000; }

/* ---- soundtrack player ---- */
.ost-hdr { font-family: var(--pix); font-size: 0.72rem; color: var(--ror-cyan);
           text-shadow: 2px 2px 0 #000; margin: 4px 0 10px; }
.ost-now { font-family: var(--term); font-size: 1.15rem; color: var(--ror-muted);
           line-height: 1.15; margin-bottom: 8px; }
.ost-now b { color: var(--ror-gold); }
[data-testid="stAudio"] {
  background: #0c1426; border: 2px solid var(--ror-line);
  box-shadow: 3px 3px 0 #000; padding: 6px; border-radius: 0;
}
[data-testid="stAudio"] audio { width: 100%; }
[data-testid="stVideo"] {
  border: 2px solid var(--ror-line); box-shadow: 3px 3px 0 #000; background: #000;
}
[data-testid="stFileUploaderDropzone"] {
  background: #0c1426 !important; border: 2px dashed var(--ror-line) !important;
  border-radius: 0 !important;
}
[data-testid="stFileUploader"] section { padding: 10px !important; }
</style>
z!The Rain Formerly Known as Purplez
Money SongÚHMuYfScGpbEÚIo_yUfZQ2v4z+https://www.youtube.com/watch?v=Io_yUfZQ2v4Úassetszsoundtrack_url.txtz
audio/mpegz	audio/oggz	audio/mp4z	audio/wavz
audio/flac)z.mp3z.oggz.opusz.m4az.wavz.flacuÈ	  
<style>
  html, body { margin: 0; overflow: hidden; background: transparent; }
  #yt { position: absolute; left: -9999px; top: -9999px; width: 1px; height: 1px; }
  #bar {
    display: inline-flex; align-items: center; gap: 9px; cursor: pointer;
    font-family: 'VT323', 'Courier New', monospace; font-size: 18px; color: #8ea0c6;
    background: #0c1426; border: 2px solid #33456e; box-shadow: 3px 3px 0 #000;
    padding: 6px 11px; user-select: none;
  }
  #bar .eq { color: #5fe0ff; text-shadow: 0 0 8px rgba(95,224,255,0.6); }
  #bar.paused .eq { color: #8ea0c6; text-shadow: none; }
  #bar b { color: #ffb638; }
</style>
<div id="yt"></div>
<div id="bar" class="paused" title="Play / pause soundtrack">
  <span class="eq">&#9835;</span><span id="label">LOADING&hellip;</span>
</div>
<script>
  var player, ready = false;
  var bar = document.getElementById('bar'), label = document.getElementById('label');
  function paint() {
    var playing = ready && player.getPlayerState && player.getPlayerState() === 1;
    bar.classList.toggle('paused', !playing);
    label.innerHTML = (playing ? 'NOW PLAYING &mdash; ' : 'PAUSED &mdash; ') + '<b>__TITLE__</b>';
    // Make it rain on the real page: this component lives in a srcdoc iframe
    // that inherits the parent origin, so reaching out is allowed.
    try {
      window.parent.document.documentElement.classList.toggle('cash-on', playing && __RAIN__);
    } catch (e) { /* cross-origin frame â€” no rain, music still fine */ }
  }
  bar.addEventListener('click', function () {
    if (!ready) return;
    if (player.getPlayerState() === 1) player.pauseVideo(); else player.playVideo();
  });
  // Best-effort: start on the first interaction anywhere in the app.
  try {
    window.parent.document.addEventListener('pointerdown',
      function () { if (ready) player.playVideo(); }, { once: true, capture: true });
  } catch (e) { /* cross-origin frame â€” the â™ª pill still starts it */ }

  var tag = document.createElement('script');
  tag.src = 'https://www.youtube.com/iframe_api';
  document.head.appendChild(tag);
  window.onYouTubeIframeAPIReady = function () {
    player = new YT.Player('yt', {
      videoId: '__ID__',
      playerVars: { autoplay: 1, loop: 1, playlist: '__ID__', controls: 0,
                    modestbranding: 1, playsinline: 1 },
      events: {
        onReady: function (e) { ready = true; e.target.setVolume(35); e.target.playVideo(); paint(); },
        onStateChange: paint
      }
    });
  };
</script>
c                óˆ   — t        j                  d| «      }|r|j                  d«      S t        j                  d| «      r| S dS )zIExtract an 11-char YouTube video id from common URL forms (or a bare id).z3(?:v=|youtu\.be/|embed/|shorts/)([A-Za-z0-9_-]{11})é   z[A-Za-z0-9_-]{11}N)ÚreÚsearchÚgroupÚ	fullmatch)ÚurlÚms     r    Ú_yt_idr:   Ž  s=   € ä
�	‰	ÐHÈ#ÓN€AÙØ�w‰w�q‹zÐÜ—,‘,Ð3°SÔ9ˆ3ÐC¸tÐCó    c                 ó‚   — t         j                  «       r&t         j                  «       j                  «       } | r| S t        S )z6The persisted soundtrack URL, or the official default.)Ú	_URL_FILEÚis_fileÚ	read_textÚstripÚDEFAULT_YT_URL)Úsaveds    r    Ú
_saved_urlrC   –  s3   € ä×ÑÔÜ×#Ñ#Ó%×+Ñ+Ó-ˆÙØˆLÜÐr;   c                 ób  — t         j                  «       syt        t         j                  «       «      D � cg c]%  } | j                  j                  «       t        v sŒ$| ‘Œ' }} |sy|D ]>  } d| j                  j                  «       v sd| j                  j                  «       v sŒ<| c S  |d   S c c} w )zEThe audio file to play, or None. Prefers a name hinting at the track.NÚrainÚpurpler   )Ú_ASSETSÚis_dirÚsortedÚiterdirÚsuffixÚlowerÚ_AUDIO_MIMEÚstem)ÚpÚaudios     r    Ú_find_trackrQ   Ÿ  sŽ   € ä�>‰>ÔØÜœwŸ™Ó0Ó1ÖU�1°Q·X±X·^±^Ó5EÌÒ5TŠQÐU€EÐUÙØØò ˆØ�Q—V‘V—\‘\“^Ñ# x°1·6±6·<±<³>Ò'AØŠHðð �‰8€Oùò Vs   µ%B,ÁB,c                óâ   — | j                   j                  «       }d|v sd|v rt        S | j                   j                  dd«      j                  dd«      j	                  «       j                  «       S )zAShow the OST title for a matching file, else the file's own name.rE   rF   Ú_r   ú-)rN   rL   ÚTRACK_TITLEÚreplacer@   Útitle)ÚtrackÚns     r    Ú_display_titlerZ   ¬  s]   € à�
‰
×ÑÓ€AØ��{�h !‘mÜÐØ�:‰:×Ñ˜c 3Ó'×/Ñ/°°SÓ9×?Ñ?ÓA×GÑGÓIÐIr;   c                 óè  — ddl } | j                  dd¬«       t        «       }|�t| j                  dt        |«      › d�d¬«       | j	                  |j                  «       t        |j                  j                  «          dd¬«       | j                  d	«       y| j                  d
t        t        «      d¬«      }| j                  ddd¬«      j                  «       }|xs dt        |   › �}|rt        n|}|r<t         j#                  d¬«       t%        «       |k7  r	 t&        j)                  |dz   «       t-        |«      }|€%| j/                  |d¬«       | j                  d«       yddlmc m} |j7                  t8        j;                  d|«      j;                  d|«      j;                  d|t<        v rdnd«      d¬«       | j                  d|t<        v r	dz   «       ydz   «       y# t*        $ r Y Œ½w xY w)ay  Themed OST player that plays in the background, on loop.

    A YouTube link (the official upload by default, editable + persisted) is
    played via a hidden, auto-playing IFrame player. A local audio file dropped
    into assets/ still takes priority if present. Browsers block audio autoplay
    until the first user gesture, so playback also starts on the first click.
    r   Nu)   <div class="ost-hdr">â™ª SOUNDTRACK</div>T©Úunsafe_allow_htmlz'<div class="ost-now">NOW PLAYING<br><b>z
</b></div>)ÚformatÚloopÚautoplayu*   Chris Christodoulou â€” *Risk of Rain* OSTÚTrackzSwap the soundtrack)Úhelpzor paste a YouTube linkr   u   https://youtu.be/â€¦)ÚvalueÚplaceholderz https://www.youtube.com/watch?v=)Úexist_okú
)r_   u?   Chris Christodoulou â€” *Risk of Rain* OST Â· press â–¶ to playÚ__ID__Ú	__TITLE__Ú__RAIN__ÚtrueÚfalseé:   )Úheightu6   Autoplays on loop; tap â™ª if your browser blocked it.u    Makes it rain ðŸ’µ)Ú	streamlitÚmarkdownrQ   rZ   rP   Ú
read_bytesrM   rK   rL   ÚcaptionÚ	selectboxÚlistÚTRACKSÚ
text_inputr@   rU   rG   ÚmkdirrC   r=   Ú
write_textÚOSErrorr:   ÚvideoÚstreamlit.components.v1Ú
componentsÚv1ÚhtmlÚ_PLAYER_HTMLrV   ÚRAIN_IDS)ÚstrX   ÚnameÚcustomr8   rW   Úvidr{   s           r    Ú
soundtrackr„   ´  så  € ó à‡K�KÐ;Èt€KÔTô ‹M€EØÐØ
�‰Ø5´nÀUÓ6KÐ5LÈJÐWØ"ð 	ô 	
ð 	�‰�×!Ñ!Ó#¬K¸¿¹×8JÑ8JÓ8LÑ,MØ Tð 	ô 	+à
�
‰
Ð?Ô@Øð �<‰<˜¤¤f£Ð4Iˆ<ÓJ€DØ�]‰]Ð4¸BØ'=ð ó ?ß?D¹u»wð à
Ò
EÐ6´v¸d±|°nÐE€CÙ!�K t€EáÜ�‰˜tˆÔ$Ü‹<˜3ÒðÜ×$Ñ$ S¨4¡ZÔ0ô �‹+€CØ
€{à
�‰�˜4ˆÔ Ø
�
‰
ÐTÔUØç0Ð0Ø‡O�OÜ×Ñ˜X sÓ+×3Ñ3°KÀÓGß‘W˜Z°3¼(±?©ÈÓPØð ô ð
 ‡J�JÐGØ+.´(©?Ð'ñDõ EØ@BñDõ Eøô! ò Ùðús   ÄG% Ç%	G1Ç0G1c                 óè   — ddl } | j                  t        d¬«       | j                  dt        d¬«      › d�d¬«       | j                  t        d¬«       | j                  d	t        «       › d
�d¬«       y)zEApply the pixel theme + render the hero banner with the bouncing Gup.r   NTr\   z<div class="gup-roam">r&   )r   r.   z@
        <div class="ror-hero">
          <div class="gup-wrap">uZ  </div>
          <div>
            <h1>STOCK SCREENER</h1>
            <p class="sub">Scan the market through Buffett Â· Burry Â· Roaring Kitty Â· Simons lenses.
            Free Yahoo data. <b>Educational tool â€” not investment advice.</b></p>
            <span class="ror-tag">DIFFICULTY: HAHAHA</span>
          </div>
        </div>
        )rn   ro   ÚCSSr!   Ú	RAIN_HTML)r€   s    r    Úinjectrˆ   ì  sr   € ãà‡K�K” t€KÔ,à‡K�KÐ(¬°qÔ)9Ð(:¸&ÐAÐUY€KÔZà‡K�K”	¨T€KÔ2Ø‡K�Kð!ä!(£ ð ,	ð
	ð ð õ r;   )é   )r   ÚintÚreturnÚstr)r8   rŒ   r‹   z
str | None)r‹   rŒ   )r‹   zPath | None)rX   r   r‹   rŒ   )r‹   ÚNone)Ú__doc__Ú
__future__r   r4   Úpathlibr   r   r   r!   r   Úranger‡   r†   rU   rt   r   rA   Ú__file__ÚparentrG   r=   rM   r~   r:   rC   rQ   rZ   r„   rˆ   r)   r;   r    ú<module>r”      sÿ   ðñõ #ã 	Ý ò€	ð$ 
Ø	Ø	Ø	Ø	Ø	ñ€ôð4 &¨¯©ñ 0ñ �2‹Yô0ó )ñ ð ñ	€	ðg€ðV 2€ð �-Ø�ð
€ð ˆ?€à>€Ù
ˆx‹.×
Ñ
 (Ñ
*€ØÐ*Ñ*€	à +¸Ø °|ñ€ð8€óvDóó
óJó5Eôpr;   