/* ── Responsiveness & animation polish ─────────────────────────────────────── */

/* Idle cylinder + kiwi breath. Previously a JS rAF loop (`_composerLoop`)
   wrote `cylinderWrap.style.transform` ~30 times/sec just to drive a slow
   sine. Now CSS animates the `scale` property (separate from `transform`,
   so it composes with the JS-written translateX(-50%) scale() during drag
   without conflict — total visible scale is transform.scale × scale-prop).
   JS `_getBreathCyl/_getBreathKiwi` return 1.0 so the breath comes solely
   from these keyframes — composited by the browser, zero main-thread cost. */
@keyframes cylBreathScale{
  0%,100% { scale: 1; }
  50%     { scale: 1.075; }
}
@keyframes kiwiBreathScale{
  0%,100% { scale: 1; }
  50%     { scale: 1.06; }
}
#cylinder-wrap { animation: cylBreathScale 2.2s ease-in-out infinite; }
#kiwi-wrap     { animation: kiwiBreathScale 2.2s ease-in-out infinite; }


/* Passive-upgrade fire toast: "+N 💧" floats up above the upgrade card */
.upg-fire-toast {
  position: fixed;
  z-index: 9999;
  pointer-events: none;
  font-size: 25px;
  font-weight: 700;
  font-family: Calibri, "Calibri", sans-serif;
  color: #ffffff;
  text-shadow: 0 1px 4px rgba(0,0,0,0.85);
  transform: translateX(-50%);
  white-space: nowrap;
  animation: upgFireToastAnim 1.2s ease-out forwards;
}
@keyframes upgFireToastAnim {
  0%   { opacity: 0;    transform: translateX(-50%) translateY(0px);   }
  15%  { opacity: 0.9;                                                   }
  75%  { opacity: 0.77; transform: translateX(-50%) translateY(-26px);  }
  100% { opacity: 0;    transform: translateX(-50%) translateY(-34px);  }
}

/* Upgrade-button emoji pulse on purchase */
@keyframes upgIconPulse{
  0%   { transform: scale(1); }
  30%  { transform: scale(1.45); }
  60%  { transform: scale(0.92); }
  100% { transform: scale(1); }
}
.upg-icon.upg-icon-pulse{animation:upgIconPulse 0.55s cubic-bezier(0.34,1.56,0.64,1) both;}

/* Per-upgrade icon styling: static slight glow + pulsing glow variants */
.upg-emoji-glow-slight{display:inline-block;filter:drop-shadow(0 0 4px rgba(255,220,120,0.7));}
.upg-emoji-glow-pulse{display:inline-block;animation:upgEmojiGlowPulse 1.4s ease-in-out infinite;}
.upg-emoji-glow-pulse-strong{display:inline-block;animation:upgEmojiGlowPulseStrong 1.1s ease-in-out infinite;}
@keyframes upgEmojiGlowPulse{
  0%,100%{filter:drop-shadow(0 0 3px rgba(255,220,120,0.55)) brightness(1);transform:scale(1);}
  50%{filter:drop-shadow(0 0 11px rgba(255,230,140,1)) brightness(1.25);transform:scale(1.08);}
}
@keyframes upgEmojiGlowPulseStrong{
  0%,100%{filter:drop-shadow(0 0 5px rgba(255,200,255,0.75)) brightness(1.05);transform:scale(1);}
  50%{filter:drop-shadow(0 0 16px rgba(255,220,255,1)) drop-shadow(0 0 24px rgba(200,140,255,0.9)) brightness(1.35);transform:scale(1.12);}
}


/* ── Special Effects gates (body.fx-no-*) ───────────────────────────────────
   Each visual-effect option in the Options panel adds its own body class when
   disabled (presence of `fx-no-<name>` means "this effect is OFF"). The
   ambient sunburst rotation is the only one wired into animations.css; the
   others live in ui_polish.css or are gated in JS. */
body.fx-no-sunburst-ambient .col-sunburst { display: none !important; }

/* ── Shimmer sweep: passes over an element once on hover ── */
@keyframes shimmerSweep{0%{background-position:-200% 0;}100%{background-position:200% 0;}}

/* ── Glow pulse: affordable upgrade cards constantly draw attention.
   Late-game the player can have 40-60+ affordable cards pulsing at once, so
   this keyframe is intentionally cheap — inset glow only (paints inside the
   card's own rect, no outside-area repaints), no transform:scale (would
   trigger layout on a transformed stacking context). Previously this also
   animated an outer 14px box-shadow + scale(1.018), both of which forced
   per-frame paints on a wide area around every affordable card. ── */
@keyframes affordableGlow{
  0%,100%{box-shadow:inset 0 0 6px 1px rgba(192,60,220,0.28);}
  50%    {box-shadow:inset 0 0 14px 2px rgba(224,96,255,0.55);}
}

/* (The buy-wrap-scoped white inset pulse used to live here; it has been
   promoted to .upg-card.affordable::before below so the glow spans the
   entire purple ability area instead of just the buy-x1 / cost region.) */
.upg-buy-wrap.buy-pulse.can-buy,.upg-buy-wrap.buy-pulse.ghost-can{
  animation:buyPulse 0.35s ease-out;
}

/* ── Button press: all interactive buttons scale down on click ── */
/* PERF: removed `filter` + `box-shadow` from the transition list so hover snaps
   instead of fading (one paint per hover instead of 12+ over 200ms). Removed
   `filter:brightness(1.2)` from :hover — it toggled layer promotion on every
   hover; the background-gradient swap in core.css already gives a visible
   lighten. */
.b-btn{transition:background 0.15s;}
.b-btn:active{transform:scale(0.93);transition:transform 0.06s;}

.modal-btn:active,.modal-close:active{transform:scale(0.94);transition:transform 0.06s;}
.claim-btn:active:not(:disabled){transform:scale(0.94);transition:transform 0.06s;}
.vip-buy-btn:active{transform:scale(0.94);transition:transform 0.06s;}
#options-btn:active,#stats-btn:active,#achievements-btn:active,#graph-btn:active{transform:scale(0.94);transition:transform 0.06s;}
#cosmetics-btn:active,#themes-btn:active{transform:scale(0.94);transition:transform 0.06s;}
.scratch-close:active,.scratch-done-btn:active{transform:scale(0.94);transition:transform 0.06s;}
.cosm-buy-btn:active,.cosm-equip-btn:active{transform:scale(0.94);transition:transform 0.06s;}
.theme-equip-btn:active,.theme-buy-btn:active{transform:scale(0.94);transition:transform 0.06s;}

/* ── Upgrade cards: affordable ones pulse; hover adds shimmer sweep ──
   The pulse used to animate box-shadow directly (→ per-frame repaint on every
   affordable card, 40-60 of them inside #right-col). Now a ::before pseudo
   carries a static inset shadow and we animate opacity only — that's a cheap
   GPU alpha blend, and the card's paint region stays cached. */
/* Affordable-card pulse. Opacity is a compositor property in modern engines
   so animating it on each card is essentially free — the earlier attempts to
   "save work" by driving a shared CSS variable from JS or animating a
   `@property` on `:root` were optimizing a non-problem AND triggered a
   document-wide style/commit pipeline every frame. Per-card opacity
   animation is the right answer. */
@keyframes upgAffordPulse{
  0%,100%{opacity:0.2;}
  50%    {opacity:1;}
}
/* box-shadow dropped from the transition list + from hover: sweeping the
   cursor across ~30-60 cards used to kick off 30-60 overlapping animated
   box-shadow repaints, which competed with star parallax for paint budget.
   Hover feedback is now border-color (+ the translateY lift in ui_polish).
   contain:layout paint keeps any remaining paint work confined to the card rect. */
.upg-card{transition:background 0.15s,border-color 0.15s;overflow:hidden;position:relative;contain:layout paint;}
/* Inset affordable glow lives on the BODY row (.upg-card-ghost-row) — the
   pink/purple ability area — NOT the whole card. Two reasons:
   1) it keeps the glow off the top perk-row (the "perk stuff"); and
   2) ghost / "upper" ability cards use the card's own ::before for their
      rainbow border MASK, which was clipping this glow away so it never
      appeared on those cards. A pseudo on the body row sidesteps that. */
.upg-card.affordable .upg-card-ghost-row::before{
  content:'';position:absolute;inset:0;
  border-radius:inherit;
  pointer-events:none;
  /* White rim + softer purple inner — same pulse the buy-wrap used to carry. */
  box-shadow:
    inset 0 0 14px 2px rgba(255,255,255,0.55),
    inset 0 0 22px 4px rgba(224,96,255,0.45);
  animation:upgAffordPulse 1.5s ease-in-out infinite;
  will-change:opacity;
  z-index:1;
}
/* Evolution sibling cards (Circle Jerk, Hand Job, Stroke Streak, Ghost Army)
   are .upg-buy-evo wraps that use .ghost-can (not .affordable) when buyable.
   Give them the same inset glow on their pink/purple body (.upg-evo-main),
   skipping the perk-row above it. */
.upg-buy-wrap.upg-buy-evo.ghost-can .upg-evo-main{position:relative;}
.upg-buy-wrap.upg-buy-evo.ghost-can .upg-evo-main::before{
  content:'';position:absolute;inset:0;
  border-radius:inherit;
  pointer-events:none;
  box-shadow:
    inset 0 0 14px 2px rgba(255,255,255,0.55),
    inset 0 0 22px 4px rgba(224,96,255,0.45);
  animation:upgAffordPulse 1.5s ease-in-out infinite;
  will-change:opacity;
  z-index:1;
}
.upg-card.affordable::after{
  content:'';
  position:absolute;inset:0;
  background:linear-gradient(105deg,transparent 35%,rgba(255,255,255,0.07) 50%,transparent 65%);
  background-size:200% 100%;
  pointer-events:none;
  opacity:0;
  transition:opacity 0.2s;
}
.upg-card.affordable:hover::after{opacity:1;animation:shimmerSweep 0.55s ease forwards;}
.upg-card.affordable:hover{border-color:#e060ff;}

/* ── Cosmetic / theme / size cards: glow border on hover, no movement ──
   PERF: hover glow moved off `box-shadow` (paint-bound, animated for 180ms
   per hover across a grid of cards) and onto a ::before pseudo-element whose
   shadow is always painted but with opacity 0; hover transitions opacity
   only, which the compositor handles without re-painting. Transitions on the
   card itself are narrowed to border-color only (background no longer changes,
   transform was unused). */
.cosm-card,.theme-card,.size-card{transition:border-color .18s;}
.cosm-card::before,.theme-card::before,.size-card::before{
  content:'';position:absolute;inset:0;
  border-radius:inherit;pointer-events:none;
  /* Color sourced from --card-glow-color so rarity tiers (set in cosmetics.css)
     can recolor the glow without needing per-rarity hover rules of their own. */
  box-shadow:0 0 14px 3px var(--card-glow-color, rgba(112,64,192,0.4));
  opacity:0;transition:opacity .18s;
}
.cosm-card:hover:not(.cosm-locked),.theme-card:hover,.size-card:hover:not(.size-locked){border-color:#a080e0;}
.cosm-card:hover:not(.cosm-locked)::before,.theme-card:hover::before,.size-card:hover:not(.size-locked)::before{opacity:1;}

/* ── Skill nodes: glow border on hover ──
   PERF: dropped box-shadow + filter from transition (snap instead of 180ms
   animated paint) and dropped filter:brightness from hover (layer churn
   across ~30 visible nodes). Pseudo-element ::before is already claimed by
   the prereq-lock badge so we can't reuse it here; the shadow snaps to its
   hover state in one paint instead of 12+ over 180ms. */
.skill-node{transition:border-color .18s;}
.skill-node:hover:not(.locked-node){border-color:#b080f0;box-shadow:0 0 16px 4px rgba(144,80,240,0.45);}

/* ── Daily tabs: smoother transition ── */
.daily-tab{transition:background .2s,color .2s,border-color .2s;}

/* ── Stat rows: subtle highlight on hover ── */
.stat-row{transition:background 0.12s,border-color 0.12s;}
.stat-row:hover{background:#221018;border-color:#4a2035;}

/* ── Bookshelf emoji: pop on hover ── */
.shelf-item{display:inline-block;transition:transform 0.1s;}
.shelf-item:hover{transform:scale(1.3);}

/* ── Prestige label: brightens on hover ──
   PERF: filter:brightness on hover promoted+demoted a layer each time. Use a
   color change instead — paint-only, no compositor churn. */
#prestige-label{transition:color 0.2s;}
#prestige-label:hover{color:#fff0c0;}

/* ── VIP buy button: shimmer on hover ──
   PERF: box-shadow snapped (removed from transition) instead of fading; the
   shimmer pseudo already rides opacity so that part is already cheap. */
.vip-buy-btn{transition:background 0.15s;overflow:hidden;position:relative;}
.vip-buy-btn::after{
  content:'';position:absolute;inset:0;
  background:linear-gradient(105deg,transparent 35%,rgba(255,255,255,0.1) 50%,transparent 65%);
  background-size:200% 100%;pointer-events:none;opacity:0;
}
.vip-buy-btn:hover::after{opacity:1;animation:shimmerSweep 0.5s ease forwards;}
.vip-buy-btn:hover{box-shadow:0 0 22px 5px rgba(160,80,255,0.45);}

/* ── Banner currency: brief flash when updated (requires .currency-flash class toggled via JS) ── */
@keyframes currencyFlash{0%{filter:brightness(1);}40%{filter:brightness(1.9) saturate(1.4);}100%{filter:brightness(1);}}
.currency-flash{animation:currencyFlash 0.4s ease-out;}

/* ── Shop item cards: shimmer on hover (they already have translateY from before) ── */
.shop-item-card{overflow:hidden;position:relative;}
.shop-item-card::after{
  content:'';position:absolute;inset:0;
  background:linear-gradient(105deg,transparent 35%,rgba(255,255,255,0.07) 50%,transparent 65%);
  background-size:200% 100%;pointer-events:none;opacity:0;
}
/* ── Droplet count: brief scale+glow pop when value changes ── */
@keyframes dropCountPulse{0%{transform:scale(1);filter:brightness(1);}25%{transform:scale(1.15);filter:brightness(1.4);text-shadow:0 0 14px rgba(240,120,190,1),0 0 30px rgba(200,60,150,0.6);}100%{transform:scale(1);filter:brightness(1);text-shadow:none;}}
#droplet-count.dropcount-pulse{animation:dropCountPulse 0.5s ease-out;display:inline-block;}

/* ── Rate numbers ("x per squeeze", "x.y per second") ── */
/* The numeric portion is wrapped in .rate-num: slightly brighter than the   */
/* base text, and flashes a brief glow each time the value changes.          */
.rate-num{filter:brightness(1.5) saturate(1.1);display:inline-block;}
@keyframes rateNumGlow{
  0%  {filter:brightness(1.5) saturate(1.1);text-shadow:none;}
  25% {filter:brightness(1.9) saturate(1.15);text-shadow:0 0 10px currentColor,0 0 18px currentColor;}
  100%{filter:brightness(1.5) saturate(1.1);text-shadow:none;}
}
.rate-num.rate-glow{animation:rateNumGlow 0.55s ease-out;}

/* ─── UI LOCK / UNLOCK SYSTEM ────────────────────────────────────────────── */
.ui-locked{display:none!important;}

/* ─── BANNER SLIDE-DOWN (banner on first unlock) ─────────────────────────── */
/* Uses transform+clip-path+opacity only — no layout (height/width) animation  */
/* so the browser can composite this on the GPU instead of reflowing each frame.*/
@keyframes bannerSlideDown {
  from { transform: translateY(-100%); opacity: 0; }
  to   { transform: translateY(0);     opacity: 1; }
}
#banner.banner-slide-entering {
  animation: bannerSlideDown 0.55s cubic-bezier(0.25,0.46,0.45,0.94) forwards;
  will-change: transform, opacity;
  overflow: hidden;
}

/* ─── PANEL SLIDE-UP (virility panel on first unlock) ────────────────────── */
@keyframes panelSlideUp {
  from { transform: translateY(40px); opacity: 0; }
  to   { transform: translateY(0);    opacity: 1; }
}
#virility-panel.panel-slide-entering {
  animation: panelSlideUp 0.55s cubic-bezier(0.25,0.46,0.45,0.94) forwards;
  will-change: transform, opacity;
}

/* ─── COLUMN SLIDE-IN (right-col and mid-col on first unlock) ─────────────── */
/* Composited transform+opacity — avoids the flex-grow animation's per-frame   */
/* page reflow. will-change hints the compositor to promote these to layers    */
/* during the animation; without the class the hint is gone so it doesn't cost */
/* memory long-term.                                                           */
@keyframes colSlideInRight {
  from { transform: translateX(60%);  opacity: 0; }
  to   { transform: translateX(0);    opacity: 1; }
}
@keyframes colSlideInLeft {
  from { transform: translateX(-40%); opacity: 0; }
  to   { transform: translateX(0);    opacity: 1; }
}
#right-col.col-slide-entering {
  animation: colSlideInRight 0.5s cubic-bezier(0.25,0.46,0.45,0.94) forwards;
  will-change: transform, opacity;
}
#mid-col.col-slide-entering {
  animation: colSlideInLeft 0.65s cubic-bezier(0.25,0.46,0.45,0.94) forwards;
  will-change: transform, opacity;
}
#ui-unlock-stack{position:fixed;right:16px;bottom:16px;z-index:99999;display:flex;flex-direction:column-reverse;gap:10px;align-items:flex-end;pointer-events:none;}
#ui-unlock-stack > .ui-unlock-panel{pointer-events:auto;}
/* Fill alpha set to 0.75 (= 25% transparent). Panel-level opacity is moved to
   each child so text/border/glow/X keep their own visual opacity independent
   of the fill. */
.ui-unlock-panel{position:relative;background:rgba(26,10,24,0.65);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:none;border-radius:14px;padding:20px 22px 18px;width:320px;max-width:calc(100vw - 32px);box-shadow:0 8px 32px #0008;text-align:center;animation:uiUnlockSlideIn 0.42s cubic-bezier(0.175,0.885,0.32,1.1);font-family:Calibri,sans-serif;font-weight:700;}
.ui-unlock-panel::before{content:'';position:absolute;inset:0;border-radius:14px;border:2.5px solid #b04070;box-shadow:0 0 20px 4px rgba(255,0,96,0.5),0 0 40px 10px rgba(255,0,96,0.25);pointer-events:none;animation:achHueCycle 2.4s linear infinite;box-sizing:border-box;opacity:0.8;}
.ui-unlock-panel.ui-unlock-closing{animation:uiUnlockSlideOut 0.25s ease-in forwards;}
@keyframes uiUnlockSlideOut{from{transform:translateY(0);opacity:1;}to{transform:translateY(16px);opacity:0;}}
@keyframes uiUnlockSlideIn{from{transform:translateY(calc(100% + 32px));opacity:0;}to{transform:translateY(0);opacity:1;}}
.ui-unlock-stars{font-size:26px;margin-bottom:8px;letter-spacing:8px;animation:unlockSparkle 0.8s ease-in-out infinite alternate;}
/* Sparkle keyframes scaled by 0.8 so stars match their previous visual
   brightness now that panel-level opacity is gone. */
@keyframes unlockSparkle{from{letter-spacing:4px;opacity:0.64;}to{letter-spacing:14px;opacity:0.8;}}
.ui-unlock-title{font-size:30px;font-weight:800;margin-bottom:8px;padding:0 24px;opacity:0.8;background-image:linear-gradient(90deg,#ffd56b 0%,#ffe999 40%,#ffffff 50%,#ffe999 60%,#ffd56b 100%);background-size:200% 100%;background-repeat:repeat-x;background-position:0 0;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent;text-shadow:0 0 12px rgba(255,200,80,0.5);animation:goldShineSweep 2.4s linear infinite;}
.ui-unlock-desc{font-size:19px;color:#c090c8;line-height:1.55;padding:0 6px;opacity:0.8;}
.ui-unlock-belgium{font-size:60%;opacity:0.7;}
.ui-unlock-rainbow-line{display:block;margin-top:4px;font-weight:800;font-size:1.2em;background:linear-gradient(90deg,#ff0080,#ff6600,#ffee00,#00dd00,#0088ff,#8800ff,#ff00cc,#ff0080);background-size:200% 100%;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent;animation:uiUnlockRainbowSlide 3s linear infinite;}
@keyframes uiUnlockRainbowSlide{from{background-position:0% 50%;}to{background-position:200% 50%;}}
/* Inline-block creates a new stacking context that breaks the parent's
   background-clip:text rainbow paint, so re-apply the same gradient here so
   "free" matches the surrounding rainbow color instead of going transparent. */
/* Default: matches the parent line's color (inherits), just bigger + pulsing
   + glowing. Used by Daily Rewards' "free" — line is solid #c090c8 desc text. */
.ui-unlock-wiggle-word{display:inline-block;font-size:1.2em;font-weight:800;transform-origin:50% 50%;-webkit-text-fill-color:currentColor;text-shadow:0 0 2px currentColor;animation:uiUnlockPulse 0.9s ease-in-out infinite;}
/* Inside the casino rainbow line the parent uses background-clip:text +
   transparent fill, so we paint our own copy of the same sliding rainbow on
   the child to match — plus pulse + drop-shadow glow (text-shadow can't
   render on transparent fill, drop-shadow filter can). */
.ui-unlock-rainbow-line .ui-unlock-wiggle-word{background:linear-gradient(90deg,#ff0080,#ff6600,#ffee00,#00dd00,#0088ff,#8800ff,#ff00cc,#ff0080);background-size:200% 100%;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent;text-shadow:none;filter:drop-shadow(0 0 2px rgba(255,255,255,0.7));animation:uiUnlockPulse 0.9s ease-in-out infinite,uiUnlockRainbowSlide 3s linear infinite;}
@keyframes uiUnlockPulse{0%,100%{transform:scale(1);}50%{transform:scale(1.153);}}
.ui-unlock-x{position:absolute;top:8px;right:10px;background:#3a0808;border:1px solid #7a1010;border-radius:6px;color:#ff6060;font-size:17px;font-weight:700;cursor:pointer;padding:3px 9px;line-height:1;transition:background 0.12s,border-color 0.12s;font-family:Calibri,sans-serif;opacity:0.8;}
.ui-unlock-x::after{content:'';position:absolute;left:0;right:0;top:100%;height:30px;}
.ui-unlock-x:hover{background:#5a0c0c;border-color:#cc2020;}

/* ── Upgrade Ascension ──────────────────────────────────────────────────────── */
.upg-card.upg-ascended {
  border-color: #e8b800 !important;
  background: linear-gradient(135deg, #1c1100 0%, #2a1c00 50%, #1c1100 100%) !important;
  animation: asc-pulse 3s ease-in-out infinite;
}
@keyframes asc-pulse {
  0%,100% { box-shadow: 0 0 14px #e8b80044, inset 0 0 6px #e8b80022; }
  50%      { box-shadow: 0 0 28px #e8b80099, inset 0 0 10px #e8b80055; }
}
.upg-card.upg-ascended .upg-stack { color: #e8c840 !important; font-weight: 700; }
.upg-ascended-badge {
  display: inline-block;
  font-size: 8px;
  color: #e8c840;
  font-weight: 700;
  letter-spacing: 0.06em;
  background: rgba(232,184,0,0.13);
  border: 0.5px solid rgba(232,184,0,0.35);
  border-radius: 3px;
  padding: 1px 4px;
  margin-left: 5px;
  vertical-align: middle;
}
/* Ascension fanfare overlay */
#asc-fanfare {
  position: fixed; inset: 0;
  background: rgba(0,0,0,0.72);
  z-index: 999998;
  display: flex; align-items: center; justify-content: center;
  animation: ascFadeIn 0.35s ease;
}
@keyframes ascFadeIn { from{opacity:0;} to{opacity:1;} }
#asc-fanfare-inner {
  background: linear-gradient(135deg,#1c1000,#2e1e00,#1c1000);
  border: 2px solid #e8b800;
  border-radius: 18px;
  padding: 32px 40px;
  text-align: center;
  box-shadow: 0 0 60px #e8b80066, 0 8px 32px #0009;
  animation: ascPopIn 0.4s cubic-bezier(0.175,0.885,0.32,1.275);
  max-width: 340px;
}
@keyframes ascPopIn { from{transform:scale(0.65);opacity:0;} to{transform:scale(1);opacity:1;} }

/* Offline earnings popup */
@keyframes offlinePopIn { from{transform:scale(0.72);opacity:0;} to{transform:scale(1);opacity:1;} }
.shop-item-card:hover::after{opacity:1;animation:shimmerSweep 0.55s ease forwards;}
