Home প্রিমিয়াম পোস্ট APPS STORE NEW WEBSITE TO APP কোর্স

প্রম্পট এবং কোড দেখুন

AI Test Lab

Test your prompts directly on official platforms.

সবচেয়ে জনপ্রিয় ভিডিও প্লাটফর্ম মোস্ট কোয়ালিটিফুল রেডি কোড (প্যাকেজ ভিডিও পেইড অপশন)

Pinnedpopular

 






✦ CODE SNIPPET
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>
<html b:version='2' class='v2' expr:dir='data:blog.languageDirection' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'>
<head>
<meta content='width=device-width, initial-scale=1, viewport-fit=cover' name='viewport'/>
<meta content='notranslate' name='google'/>
<title><data:blog.pageTitle/></title>
<b:include data='blog' name='all-head-content'/>

<!-- SEO / Social Preview / Mobile meta -->
<meta content='yes' name='mobile-web-app-capable'/>
<meta content='yes' name='apple-mobile-web-app-capable'/>
<meta content='black' name='apple-mobile-web-app-status-bar-style'/>
<meta expr:content='data:blog.title' name='apple-mobile-web-app-title'/>
<meta content='#0a0a0c' name='theme-color'/>
<link href='https://fonts.googleapis.com' rel='preconnect'/>
<link crossorigin='crossorigin' href='https://fonts.gstatic.com' rel='preconnect'/>
<link href='https://fonts.googleapis.com/css2?family=Hind+Siliguri:wght@400;500;600;700&amp;family=Playfair+Display:wght@600;700;800&amp;display=swap' rel='stylesheet'/>
<meta content='telephone=no' name='format-detection'/>
<meta expr:content='data:blog.title' property='og:site_name'/>
<meta content='bn_BD' property='og:locale'/>
<meta content='summary_large_image' name='twitter:card'/>
<meta expr:content='data:blog.pageTitle' name='twitter:title'/>
<b:if cond='data:blog.metaDescription'>
  <meta expr:content='data:blog.metaDescription' name='twitter:description'/>
</b:if>
<b:if cond='data:blog.postImageUrl'>
  <meta expr:content='data:blog.postImageUrl' name='twitter:image'/>
<b:else/>
  <!-- নিচের লিংক বদলে নিজের ১২০০x৬৩০ ছবির URL দিন (হোমপেজ শেয়ার প্রিভিউর জন্য) -->
  <meta content='https://via.placeholder.com/1200x630.png?text=VIDORA' property='og:image'/>
  <meta content='https://via.placeholder.com/1200x630.png?text=VIDORA' name='twitter:image'/>
</b:if>
<link expr:href='data:blog.homepageUrl + &quot;sitemap.xml&quot;' rel='sitemap' type='application/xml'/>

<script>
//<![CDATA[
/* =====================================================================
   WEBSITE CONFIGURATION - শুধু এই অংশ পরিবর্তন করলেই হবে
   ===================================================================== */
var VCONFIG = {
  siteName : 'VIDORA',
  logo     : '',                       // লোগো ইমেজের URL (ফাঁকা রাখলে নাম দেখাবে)
  favicon  : '',                       // Favicon URL (৫১২x৫১২ PNG ভালো)। ফাঁকা রাখলে সোনালি ▶ আইকন অটো তৈরি হবে

  whatsapp : '8801927661298',          // WhatsApp নম্বর (দেশের কোড সহ, + ছাড়া)
  bkash    : '01927661298',
  nagad    : '01927661298',
  price    : '৳100',                   // ডিফল্ট Premium ভিডিও প্রাইস (পোস্টে PRICE দিলে সেটা কাজ করবে)

  /* ===== PIN আনলক =====
     প্রতিটি পোস্টে আলাদা PIN: vcfg-তে  PIN: 4821
     পোস্টে PIN না দিলে masterPin চলবে (ফাঁকা থাকলে চলবে না)
     PIN বানাতে যেকোনো পেজের লিংকের শেষে #pinsetup দিন (যেমন yourblog.com/#pinsetup) */
  masterPin: '',

  facebook : 'https://facebook.com/yourpage',      // ফাঁকা রাখলে বাটন দেখাবে না
  telegram : 'https://t.me/yourchannel',
  youtube  : 'https://youtube.com/@yourchannel',

  colors : {
    accent : '#e8c26a',
    accent2: '#b98a2e',
    darkBg : '#0a0a0c',
    darkCard: '#141418',
    lightBg: '#f6f3ec',
    lightCard:'#ffffff'
  },

  // ক্যাটাগরি = Blogger Label (নাম হুবহু এক হতে হবে)
  categories : [['Viral','🔥'],['Entertainment','🎬'],['Funny','😂'],['Music','🎵'],
                ['Trending','🎥'],['Emotional','❤️'],['Latest','⚡'],['Premium','🔒']],

  nav : [['Home','/'],['Viral Videos','/search/label/Viral'],['Trending','/search/label/Trending'],
         ['Latest Videos','/search'],['Premium Videos','/search/label/Premium']],

  // মোবাইলের নিচের বার [আইকন, নাম, লিংক] ('#pkg' = প্যাকেজ পপআপ)
  bottomNav : [['🏠','Home','/'],['🔥','Trending','/search/label/Trending'],
               ['📦','Packages','#pkg'],['🔒','Premium','/search/label/Premium']],

  shorts : true,                       // true = Shorts (৯:১৬), false = সাধারণ ১৬:৯

  /* ===== অফার ব্যানার (টাইমার সহ) =====
     discount: একক Premium ভিডিওর দামে কত % ছাড় (0 = শুধু ব্যানার)
     endDate : 'YYYY-MM-DDTHH:MM:SS+06:00' (সময় পার হলে নিজে বন্ধ হবে) */
  offer : {
    enabled : true,
    text    : '🔥 বিশেষ অফার! সব Premium ভিডিওতে ছাড়',
    discount: 20,
    endDate : '2026-12-31T23:59:59+06:00',
    button  : '📦 প্যাকেজ দেখুন'
  },

  /* ===== Premium প্যাকেজ =====
     name  : প্যাকেজের নাম
     videos: কয়টি ভিডিও আনলক করা যাবে (ক্রেতা নিজে বেছে নেবে)
             0 = সব Premium ভিডিও (একবার PIN দিলেই সব একসাথে আনলক)
     price : প্যাকেজের দাম (এখানে সরাসরি লিখুন)   old: আগের দাম (ফাঁকা রাখা যায়)
     tag   : ব্যাজ (ফাঁকা রাখা যায়)   note: ছোট লেখা (ফাঁকা রাখা যায়)
     pin   : এই প্যাকেজের PIN। ফাঁকা থাকলে প্যাকেজ কাজ করবে না!
             #pinsetup দিয়ে বানান। ক্রেতাকে পেমেন্টের পর WhatsApp-এ দিন। */
  packages : [
    {id:'p3',  name:'স্টার্টার প্যাক',  videos:3,  price:'৳200', old:'৳300',  pin:'', tag:'',            note:''},
    {id:'p5',  name:'৫টা ভিডিও প্যাক',   videos:5,  price:'৳300', old:'৳500',  pin:'', tag:'🔥 জনপ্রিয়',  note:''},
    {id:'p10', name:'ভিআইপি প্যাক',    videos:10, price:'৳500', old:'৳1000', pin:'', tag:'💎 সেরা অফার', note:''}
    /* সব Premium ভিডিও একবারে খুলে দিতে চাইলে এই লাইন (আগের লাইনের শেষে কমা দিয়ে) যোগ করুন:
    ,{id:'all', name:'সব ভিডিও পাস', videos:0, price:'৳1500', old:'', pin:'', tag:'👑 অল অ্যাক্সেস', note:'একবার PIN দিলেই সব Premium ভিডিও'} */
  ],
  pkgOnHome : true,

  /* ===== Google Analytics 4 (G-XXXXXXXXXX), ফাঁকা = বন্ধ ===== */
  ga : '',

  /* ===== PWA (icon: ৫১২x৫১২ PNG URL, ফাঁকা = অটো আইকন) ===== */
  pwa : { enabled:true, name:'', shortName:'', icon:'', themeColor:'' },

  /* ===== ADS =====
     সবচেয়ে সহজ: Layout -> "Ad: ..." গ্যাজেটে কোড পেস্ট করুন
     জায়গা: top, feed, vtop, player, after, mid, bottom, sticky */
  ads : {
    enabled : false,
    adsenseClient : 'ca-pub-XXXXXXXXXXXXXXXX',
    slots  : { top:'', feed:'', vtop:'', player:'', after:'', mid:'', bottom:'', sticky:'' },
    custom : { top:'', feed:'', vtop:'', player:'', after:'', mid:'', bottom:'', sticky:'' },
    feedEvery : 6
  },
  defaultCategory : 'Viral'
};

(function(){
  var c = VCONFIG.colors, s = document.createElement('style');
  s.textContent = ':root{--ac:'+c.accent+';--ac2:'+c.accent2+';--bg:'+c.darkBg+';--card:'+c.darkCard+'}' +
                  '[data-theme=light]{--bg:'+c.lightBg+';--card:'+c.lightCard+'}' +
                  ':root{--ratio:'+(VCONFIG.shorts?'9/16':'16/9')+';--pw:'+(VCONFIG.shorts?'420px':'100%')+'}';
  document.documentElement.className += VCONFIG.shorts ? ' shorts' : ' wide';
  document.head.appendChild(s);
  var t = 'dark';
  try { t = localStorage.getItem('vtheme') || 'dark'; } catch(e) {}
  document.documentElement.setAttribute('data-theme', t);
})();
//]]>
</script>

<b:skin><![CDATA[
/* ===== Base ===== */
:root{--tx:#f2f3f7;--mut:#9aa0b4;--bd:rgba(255,255,255,.09);--sh:0 10px 28px rgba(0,0,0,.45)}
[data-theme=light]{--tx:#14161f;--mut:#667085;--bd:rgba(0,0,0,.09);--sh:0 10px 28px rgba(20,22,31,.13)}
*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}
html{-webkit-text-size-adjust:100%}
body{background:var(--bg);color:var(--tx);font-family:'Hind Siliguri','Noto Sans Bengali',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;line-height:1.55;transition:background .25s,color .25s;overflow-x:hidden}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}
button,input,select{font:inherit;color:inherit}
input,select{font-size:16px}
#navbar,#navbar-iframe,.Navbar{display:none!important;height:0!important}
.wrap{max-width:1280px;margin:0 auto;padding:0 16px}
.mut{color:var(--mut)} .sm{font-size:.82rem}
@media(max-width:899px){body{padding-bottom:calc(66px + env(safe-area-inset-bottom,0px))}}

/* ===== Header ===== */
.vhead{position:sticky;top:0;z-index:50;background:color-mix(in srgb,var(--bg) 90%,transparent);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-bottom:1px solid var(--bd)}
.vh{display:flex;align-items:center;gap:10px;height:58px}
.ib{width:40px;height:40px;border-radius:50%;border:1px solid var(--bd);background:var(--card);cursor:pointer;font-size:1.05rem;flex:none;display:inline-flex;align-items:center;justify-content:center}
#vmenu{display:inline-flex}
#vsbtn{display:none;margin-left:auto}
.brand{font-weight:800;font-size:1.3rem;letter-spacing:.5px;display:flex;align-items:center;gap:6px;white-space:nowrap}
.brand span{color:var(--ac)} .brand img{height:32px}
#vnav{display:none;gap:4px;margin-left:8px}
#vnav a{padding:7px 12px;border-radius:99px;font-size:.92rem;color:var(--mut);transition:.2s}
#vnav a:hover,#vnav a.on{background:var(--card);color:var(--tx)}
.vsearch{margin-left:auto;display:flex;background:var(--card);border:1px solid var(--bd);border-radius:99px;overflow:hidden;min-width:0;flex:1;max-width:340px}
.vsearch input{background:none;border:0;outline:0;padding:9px 14px;min-width:0;width:100%}
.vsearch button{background:none;border:0;padding:0 14px;cursor:pointer}
.chips{display:flex;gap:8px;overflow-x:auto;padding:0 0 12px;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.chips::-webkit-scrollbar{display:none}
.chip{flex:none;padding:7px 14px;border-radius:99px;background:var(--card);border:1px solid var(--bd);font-size:.88rem;transition:.2s}
.chip:hover,.chip.on{background:linear-gradient(135deg,var(--ac),var(--ac2));border-color:transparent;color:#fff}
@media(max-width:699px){
  .brand{margin-right:auto}
  #vsbtn{display:inline-flex;margin-left:0}
  .vsearch{display:none;position:absolute;left:12px;right:12px;top:100%;margin:8px 0 0;max-width:none;z-index:60;box-shadow:var(--sh)}
  .vhead.ss .vsearch{display:flex}
}
@media(min-width:900px){#vnav{display:flex}#vmenu{display:none}}

/* ===== Drawer ===== */
.vdr{position:fixed;inset:0;z-index:120;display:none}
.vdr.on{display:block}
.vdr .ov{position:absolute;inset:0;background:rgba(0,0,0,.6)}
.vdr .pn{position:absolute;left:0;top:0;bottom:0;width:min(84vw,330px);background:var(--card);padding:16px 14px calc(18px + env(safe-area-inset-bottom,0px));overflow-y:auto;animation:slide .22s;border-right:1px solid var(--bd)}
@keyframes slide{from{transform:translateX(-100%)}to{transform:none}}
.vdr .dh{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;font-size:1.2rem}
.vdr .vx2{width:36px;height:36px;border-radius:50%;border:0;background:var(--bg);cursor:pointer}
.vdr a.dl{display:block;padding:12px 10px;border-radius:12px;font-size:1rem}
.vdr a.dl:hover,.vdr a.dl.on{background:var(--bg)}
.vdr h4{margin:14px 10px 6px;font-size:.78rem;color:var(--mut);font-weight:600}
.vdr .soc2{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}
.vdr .soc2 a{padding:7px 14px;border-radius:99px;background:var(--bg);border:1px solid var(--bd);font-size:.85rem}

/* ===== Bottom Nav ===== */
.vbn{position:fixed;left:0;right:0;bottom:0;z-index:55;display:flex;background:color-mix(in srgb,var(--bg) 94%,transparent);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-top:1px solid var(--bd);padding-bottom:env(safe-area-inset-bottom,0px)}
.vbn a,.vbn button{flex:1;display:flex;flex-direction:column;align-items:center;gap:1px;padding:7px 2px 6px;font-size:.68rem;color:var(--mut);background:none;border:0;cursor:pointer;min-width:0}
.vbn span{font-size:1.25rem;line-height:1.2}
.vbn a.on{color:var(--ac);font-weight:700}
@media(min-width:900px){.vbn{display:none}}

/* ===== Offer Banner ===== */
.voff{background:linear-gradient(135deg,var(--ac),var(--ac2));color:#fff;font-size:.9rem}
.voff .wrap{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:6px 12px;padding:8px 44px 8px 16px;position:relative;text-align:center}
.voff .ot{font-weight:700}
.voff .vt{display:inline-flex;gap:4px;align-items:center}
.voff .vt b{background:rgba(0,0,0,.3);border-radius:6px;padding:1px 7px;font-variant-numeric:tabular-nums}
.voff .vt i{font-style:normal;font-size:.72rem;margin-right:4px;opacity:.9}
.voff .obtn{background:#fff;color:#c2185b;padding:4px 14px;border-radius:99px;font-weight:700;font-size:.82rem}
.voff .ox{position:absolute;right:10px;top:50%;margin-top:-16px;width:32px;height:32px;border-radius:50%;border:0;background:rgba(0,0,0,.25);color:#fff;cursor:pointer;z-index:2}

/* ===== Sections & Grid ===== */
main{padding:18px 0 40px;min-height:60vh}
.vsec{margin-bottom:30px}
.vsec h2{font-size:1.2rem;margin-bottom:12px;font-weight:700}
.vgrid{display:grid;gap:12px;grid-template-columns:repeat(2,1fr)}
@media(min-width:640px){.vgrid{grid-template-columns:repeat(3,1fr);gap:14px}}
@media(min-width:900px){.vgrid{grid-template-columns:repeat(4,1fr)}}
@media(min-width:1200px){.vgrid{grid-template-columns:repeat(5,1fr)}}
.wide .vgrid{grid-template-columns:1fr}
@media(min-width:560px){.wide .vgrid{grid-template-columns:repeat(2,1fr)}}
@media(min-width:900px){.wide .vgrid{grid-template-columns:repeat(3,1fr)}}
@media(min-width:1200px){.wide .vgrid{grid-template-columns:repeat(4,1fr)}}
.vraw{display:block}
.vempty{padding:40px 0;text-align:center;color:var(--mut)}

/* ===== Video Card ===== */
.vc{display:block;transition:transform .25s}
@media(hover:hover){.vc:hover{transform:translateY(-4px)}}
.vth{position:relative;display:block;aspect-ratio:var(--ratio);border-radius:14px;overflow:hidden;background:linear-gradient(135deg,#23232e,#12121a);box-shadow:var(--sh)}
.vth img{width:100%;height:100%;object-fit:cover;transition:transform .4s}
@media(hover:hover){.vc:hover .vth img{transform:scale(1.06)}}
.vplay{position:absolute;left:50%;top:50%;width:54px;height:54px;margin:-27px 0 0 -27px;border-radius:50%;background:rgba(0,0,0,.55);backdrop-filter:blur(4px);border:2px solid rgba(255,255,255,.85);display:flex;align-items:center;justify-content:center;color:#fff;font-size:1.2rem;padding-left:4px;transition:.25s}
.vplay::after{content:'';position:absolute;inset:-2px;border-radius:50%;border:2px solid var(--ac);opacity:0;animation:ring 2s infinite}
@media(hover:hover){.vc:hover .vplay{background:var(--ac);transform:scale(1.12)}}
@keyframes ring{0%{transform:scale(1);opacity:.7}100%{transform:scale(1.6);opacity:0}}
.vbadge{position:absolute;top:10px;left:10px;font-size:.72rem;font-weight:700;padding:3px 10px;border-radius:99px;color:#fff;letter-spacing:.4px}
.vbadge.free{background:#16a34a}
.vbadge.lock{background:linear-gradient(135deg,#f59e0b,#ef4444)}
.vbadge.lock i{display:inline-block;font-style:normal;animation:shake 2.4s infinite}
.vdur{position:absolute;top:10px;right:10px;font-size:.7rem;font-weight:600;padding:2px 8px;border-radius:6px;color:#fff;background:rgba(0,0,0,.65)}
@keyframes shake{0%,80%,100%{transform:rotate(0)}85%{transform:rotate(-14deg)}90%{transform:rotate(12deg)}95%{transform:rotate(-8deg)}}
.vcap{position:absolute;left:0;right:0;bottom:0;padding:38px 10px 10px;background:linear-gradient(transparent,rgba(0,0,0,.88));color:#fff}
.vcap h3{font-size:.9rem;font-weight:600;line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.vcap .vm{color:rgba(255,255,255,.85);font-size:.72rem;margin-top:3px;display:flex;flex-wrap:wrap;gap:2px 8px}
.vcap .vprc b{color:#ffd166}
.vcap .vprc s{opacity:.7}
.vm{margin-top:4px;font-size:.8rem;color:var(--mut);display:flex;flex-wrap:wrap;gap:4px 10px}

/* ===== Pager ===== */
.vpager{display:flex;justify-content:space-between;gap:10px;margin-top:12px}
.vpager a{padding:11px 20px;border-radius:99px;background:var(--card);border:1px solid var(--bd)}
.vpager a:hover{background:var(--ac);color:#fff;border-color:transparent}

/* ===== Package Cards ===== */
.vpk{display:grid;gap:14px;grid-template-columns:1fr}
@media(min-width:640px){.vpk{grid-template-columns:repeat(3,1fr)}.vpk.one{grid-template-columns:1fr}}
.pk{position:relative;display:flex;flex-direction:column;gap:6px;background:var(--card);border:1px solid var(--bd);border-radius:16px;padding:18px 16px 16px;box-shadow:var(--sh)}
.pk.hot{border-color:var(--ac)}
.pk .tag{position:absolute;top:-11px;right:14px;background:linear-gradient(135deg,var(--ac),var(--ac2));color:#fff;font-size:.72rem;font-weight:700;padding:3px 10px;border-radius:99px}
.pk h3{font-size:1.02rem}
.pk .cnt{font-size:1.5rem;font-weight:800;line-height:1.2}
.pk .pr{font-size:1.15rem;display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px}
.pk .pr s{color:var(--mut);font-size:.9rem}
.pk .save{font-style:normal;font-size:.72rem;font-weight:700;background:#16a34a;color:#fff;padding:2px 8px;border-radius:99px}
.pk .vbtn{margin-top:6px}

/* ===== Video Page ===== */
.vpost{max-width:980px;margin:0 auto}
.vtitle{font-size:1.5rem;line-height:1.35;margin:4px 0 14px}
@media(max-width:560px){.vtitle{font-size:1.2rem}}
#vplayer{max-width:var(--pw);margin:0 auto}
.shorts #vplayer{max-width:max(260px,min(420px,calc((100svh - 150px) * .5625)))}
.vstage{position:relative;aspect-ratio:var(--ratio);background:#000;border-radius:16px;overflow:hidden;box-shadow:var(--sh)}
.vstage>img{width:100%;height:100%;object-fit:cover}
.vstage iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.vbig{position:absolute;left:50%;top:50%;width:84px;height:84px;margin:-42px 0 0 -42px;border-radius:50%;border:0;cursor:pointer;background:linear-gradient(135deg,var(--ac),var(--ac2));color:#fff;font-size:2rem;padding-left:6px;box-shadow:0 0 0 0 var(--ac);animation:pulse 2s infinite}
@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(255,46,99,.55)}100%{box-shadow:0 0 0 26px rgba(255,46,99,0)}}
.vspin{position:absolute;left:50%;top:50%;width:42px;height:42px;margin:-21px 0 0 -21px;border:4px solid rgba(255,255,255,.25);border-top-color:var(--ac);border-radius:50%;animation:spin .8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.vlock{position:absolute;inset:0;background:rgba(8,8,12,.8);backdrop-filter:blur(7px);display:flex;flex-direction:column;align-items:center;justify-content:flex-start;text-align:center;gap:6px;padding:16px;color:#fff;overflow-y:auto}
.vlock>:first-child{margin-top:auto}
.vlock>:last-child{margin-bottom:auto}
.vlock .ic{font-size:2.6rem;animation:shake 2.4s infinite}
.vlock b{font-size:1.15rem;letter-spacing:1.5px}
.vlock p{opacity:.85;margin-bottom:6px}
.vlock s{opacity:.7;font-size:.85em}
.vbtn{border:0;cursor:pointer;padding:12px 24px;border-radius:99px;font-weight:700;color:#fff;background:linear-gradient(135deg,var(--ac),var(--ac2));transition:.2s}
.vbtn:hover{filter:brightness(1.1)}
.vbtn.wa{background:#25d366;width:100%;margin-top:6px}
.vlink{background:none;border:0;color:#fff;opacity:.9;text-decoration:underline;cursor:pointer;font-size:.88rem;margin-top:4px;padding:6px}

.vpinbox{width:100%;max-width:300px;margin-top:10px;padding-top:10px;border-top:1px solid rgba(255,255,255,.2)}
.vpinbox small{display:block;opacity:.85;margin-bottom:8px;font-size:.82rem}
.vpinrow{display:flex;gap:6px}
.vpinrow input{flex:1;min-width:0;padding:10px 12px;border-radius:99px;border:1px solid rgba(255,255,255,.3);background:rgba(255,255,255,.12);color:#fff;outline:0;text-align:center;letter-spacing:4px;font-weight:700}
.vpinrow input:focus{border-color:var(--ac)}
.vpinrow input::placeholder{letter-spacing:0;font-weight:400;color:rgba(255,255,255,.6)}
.vpinrow .vbtn{padding:10px 18px}
.vpinrow.bad input{border-color:#ef4444;animation:nope .35s}
@keyframes nope{0%,100%{transform:translateX(0)}25%{transform:translateX(-6px)}75%{transform:translateX(6px)}}
.vout{margin-top:10px;padding:10px 12px;border-radius:10px;background:var(--bg);border:1px dashed var(--bd);word-break:break-all;font-weight:700}

.vtools{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0}
.vtools button,.vtools a{padding:9px 14px;border-radius:99px;background:var(--card);border:1px solid var(--bd);cursor:pointer;font-size:.86rem}
.vtools button:hover,.vtools a:hover{border-color:var(--ac)}
.vmeta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;color:var(--mut);font-size:.9rem;margin-bottom:14px}
.pill{padding:3px 12px;border-radius:99px;font-size:.78rem;font-weight:700;color:#fff}
.pill.free{background:#16a34a} .pill.lock{background:linear-gradient(135deg,#f59e0b,#ef4444)}
.vdesc{background:var(--card);border:1px solid var(--bd);border-radius:14px;padding:16px;overflow-wrap:anywhere}
.vdesc:empty{display:none}
.vdesc img{border-radius:10px;margin:8px 0}
.vshare{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:16px 0}
.vshare a,.vshare button{padding:9px 16px;border-radius:99px;border:0;cursor:pointer;color:#fff;font-size:.86rem;font-weight:600}
.vshare .fb{background:#1877f2}.vshare .wa{background:#25d366}.vshare .tg{background:#229ed9}.vshare .x{background:#000;border:1px solid #444}.vshare .cp{background:var(--card);color:var(--tx);border:1px solid var(--bd)}
.vrel{margin-top:30px}

/* ===== Modal ===== */
.vmodal{position:fixed;inset:0;z-index:130;background:rgba(0,0,0,.72);display:flex;padding:16px;overflow-y:auto;overscroll-behavior:contain}
.vbox{position:relative;margin:auto;width:100%;max-width:420px;background:var(--card);border:1px solid var(--bd);border-radius:18px;padding:22px;box-shadow:var(--sh);animation:pop .25s}
.vbox.big{max-width:520px}
@keyframes pop{from{transform:scale(.92);opacity:0}to{transform:none;opacity:1}}
.vbox h3{margin-bottom:2px;padding-right:44px}
.vx{position:absolute;right:10px;top:10px;width:38px;height:38px;border-radius:50%;border:0;background:var(--bg);cursor:pointer;z-index:5;touch-action:manipulation;font-size:1rem;line-height:1}
.vx *{pointer-events:none}
.vnum{display:flex;align-items:center;gap:8px;margin-top:10px;padding:10px 12px;border-radius:12px;background:var(--bg);border:1px dashed var(--bd)}
.vnum span{flex:1;font-weight:700;letter-spacing:.5px}
.vnum button{border:0;background:var(--ac);color:#fff;border-radius:8px;padding:5px 12px;cursor:pointer;font-size:.8rem}
.vprice{margin:12px 0 4px;font-size:1.1rem}
.vprice s{color:var(--mut);font-size:.9rem}
.vbox label{display:block;margin-top:10px;font-size:.82rem;color:var(--mut)}
.vbox input,.vbox select{width:100%;margin-top:4px;padding:11px 12px;border-radius:10px;border:1px solid var(--bd);background:var(--bg);outline:0}
.vbox input:focus,.vbox select:focus{border-color:var(--ac)}
.vbox .vpk{margin-top:16px}
.vbox ol{margin:10px 0 0 18px;line-height:1.9}

/* ===== Install banner / Sticky ad ===== */
.vins{position:fixed;left:12px;right:12px;bottom:calc(72px + env(safe-area-inset-bottom,0px));z-index:90;display:flex;align-items:center;gap:10px;background:var(--card);border:1px solid var(--bd);border-radius:16px;padding:10px 12px;box-shadow:var(--sh)}
.vins>span{flex:1;font-size:.88rem}
.vins .vbtn{padding:8px 16px;font-size:.85rem}
.vins .ox2{border:0;background:none;cursor:pointer;color:var(--mut);padding:8px 10px}
@media(min-width:900px){.vins{left:auto;right:20px;bottom:20px;max-width:380px}}
.vsticky{position:fixed;left:0;right:0;bottom:calc(58px + env(safe-area-inset-bottom,0px));z-index:54;background:var(--card);border-top:1px solid var(--bd);text-align:center;padding:2px 0;max-height:110px;overflow:hidden}
.vsticky .vad{margin:0}
.vsticky .vsx{position:absolute;right:4px;top:2px;width:26px;height:26px;border-radius:50%;border:0;background:rgba(0,0,0,.45);color:#fff;font-size:.75rem;cursor:pointer;z-index:2}
@media(min-width:900px){.vsticky{bottom:0}}

/* ===== Ads, Footer & Toast ===== */
.vad{margin:16px 0;text-align:center;overflow:hidden;max-width:100%}
.vad small{display:block;color:var(--mut);font-size:.68rem;margin-bottom:4px}
.vad.feed{grid-column:1/-1;margin:4px 0}
.vad.bot{max-width:1280px;margin:18px auto;padding:0 16px}
.vfoot{border-top:1px solid var(--bd);padding:22px 0 30px;text-align:center;color:var(--mut);font-size:.88rem}
.vfoot .soc{display:flex;justify-content:center;gap:10px;margin-bottom:10px;flex-wrap:wrap}
.vfoot .soc a,.vfoot .soc button{padding:7px 14px;border-radius:99px;background:var(--card);border:1px solid var(--bd);color:var(--tx);cursor:pointer}
.vtoast{position:fixed;left:50%;bottom:calc(90px + env(safe-area-inset-bottom,0px));transform:translateX(-50%);background:#111;color:#fff;padding:10px 20px;border-radius:99px;z-index:300;font-size:.9rem;box-shadow:var(--sh);max-width:92vw;text-align:center}
@media(min-width:900px){.vtoast{bottom:26px}}
@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
/* ===== VIDORA Premium Classic Overlay ===== */
:root{--gold:#e8c26a;--gold2:#b98a2e;--ln:rgba(232,194,106,.24);--ink:#1b1406}
::selection{background:var(--gold);color:var(--ink)}
.brand,.vsec h2,.vtitle,.vbox h3,.pk h3,.pk .cnt,.vdr .dh b{font-family:'Playfair Display','Hind Siliguri',Georgia,serif}
.brand{font-weight:800;letter-spacing:2.5px;background:linear-gradient(135deg,#f8e9b0,var(--gold),var(--gold2));-webkit-background-clip:text;background-clip:text;color:transparent}
.brand span{color:var(--gold);-webkit-text-fill-color:var(--gold)}
.brand img{filter:drop-shadow(0 2px 6px rgba(0,0,0,.4))}
.vhead{border-bottom:1px solid var(--ln);box-shadow:0 8px 24px rgba(0,0,0,.25)}
#vnav a.on,#vnav a:hover{color:var(--gold);background:rgba(232,194,106,.1)}
[data-theme=light] #vnav a.on,[data-theme=light] #vnav a:hover{color:#8a5f0f}
.ib{border-color:var(--ln)}
.ib:hover{border-color:var(--gold)}
.vsearch{border-color:var(--ln)}
.vsearch:focus-within{border-color:var(--gold);box-shadow:0 0 0 3px rgba(232,194,106,.15)}
.chip{border-color:var(--ln)}
.chip:hover,.chip.on{background:linear-gradient(135deg,#f6e3a1,var(--gold),var(--gold2));color:var(--ink);font-weight:600}
.vbtn{color:var(--ink);background:linear-gradient(135deg,#f6e3a1,var(--gold),var(--gold2));box-shadow:0 6px 18px rgba(185,138,46,.35);letter-spacing:.3px}
.vbtn:hover{filter:brightness(1.08);transform:translateY(-1px)}
.vbtn.wa{background:#25d366;color:#fff;box-shadow:0 6px 18px rgba(37,211,102,.3)}
.vpager a:hover{background:var(--gold);color:var(--ink)}
.voff{background:linear-gradient(135deg,#f8e9b0,#d9aa4e 55%,#b98a2e);color:#2a1d05}
.voff .vt b{background:#1a1205;color:var(--gold)}
.voff .obtn{background:#1a1205;color:var(--gold)}
.voff .ox{background:rgba(0,0,0,.2);color:#2a1d05}
.vsec h2{font-size:1.3rem;letter-spacing:.3px}
.vsec h2::after{content:'';display:block;width:46px;height:2px;margin-top:7px;background:linear-gradient(90deg,var(--gold),transparent)}
.vth{border-radius:12px;border:1px solid var(--ln);box-shadow:0 12px 30px rgba(0,0,0,.5)}
@media(hover:hover){.vc:hover .vth{border-color:var(--gold);box-shadow:0 14px 34px rgba(0,0,0,.55),0 0 0 1px rgba(232,194,106,.35)}}
.vplay{border-color:var(--gold);color:var(--gold)}
@media(hover:hover){.vc:hover .vplay{background:var(--gold);color:var(--ink)}}
.vplay::after{border-color:var(--gold)}
.vbadge.lock{background:linear-gradient(135deg,#f6e3a1,var(--gold2));color:var(--ink)}
.vbadge.free{background:rgba(22,163,74,.92)}
.vcap .vprc b{color:var(--gold)}
.vstage{border:1px solid var(--ln);border-radius:14px}
.vbig{color:var(--ink);background:linear-gradient(135deg,#f6e3a1,var(--gold),var(--gold2));animation:pulseg 2s infinite}
@keyframes pulseg{0%{box-shadow:0 0 0 0 rgba(232,194,106,.55)}100%{box-shadow:0 0 0 26px rgba(232,194,106,0)}}
.vspin{border-top-color:var(--gold)}
.vlock{background:rgba(8,8,10,.84)}
.vlock b{color:var(--gold);font-family:'Playfair Display',serif}
.vpinrow input:focus{border-color:var(--gold)}
.pill.lock{background:linear-gradient(135deg,#f6e3a1,var(--gold2));color:var(--ink)}
.vtools button:hover,.vtools a:hover{border-color:var(--gold);color:var(--gold)}
.vdesc{border-color:var(--ln)}
.pk{border-color:var(--ln);background:linear-gradient(180deg,var(--card),color-mix(in srgb,var(--card) 92%,#000))}
.pk.hot{border-color:var(--gold);box-shadow:0 12px 34px rgba(185,138,46,.28)}
.pk .tag{background:linear-gradient(135deg,#f6e3a1,var(--gold2));color:var(--ink)}
.pk .cnt{color:var(--gold)}
[data-theme=light] .pk .cnt{color:#8a5f0f}
.vbox{border:1px solid var(--ln)}
.vbox input:focus,.vbox select:focus{border-color:var(--gold)}
.vnum button{background:var(--gold);color:var(--ink);font-weight:700}
.vdr .pn{border-right:1px solid var(--ln)}
.vdr a.dl.on{color:var(--gold)}
.vbn{border-top:1px solid var(--ln)}
.vbn a.on{color:var(--gold)}
[data-theme=light] .vbn a.on,[data-theme=light] .vdr a.dl.on{color:#8a5f0f}
.vfoot{border-top:1px solid var(--ln)}
.vfoot .soc a,.vfoot .soc button{border-color:var(--ln)}
.vfoot .soc a:hover,.vfoot .soc button:hover{border-color:var(--gold);color:var(--gold)}
.vtoast{background:#141418;color:var(--gold);border:1px solid var(--ln)}

]]></b:skin>
</head>

<body expr:data-label='data:blog.searchLabel' expr:data-pt='data:blog.pageType' expr:data-q='data:blog.searchQuery'>

<header class='vhead' id='vhead'>
  <div class='wrap vh'>
    <button aria-label='Menu' class='ib' id='vmenu' type='button'>&#9776;</button>
    <a class='brand' expr:href='data:blog.homepageUrl' id='brand'><data:blog.title/></a>
    <nav id='vnav'/>
    <form action='/search' class='vsearch' method='get'>
      <input name='q' placeholder='ভিডিও খুঁজুন...' required='required' type='search'/>
      <button aria-label='Search' type='submit'>🔍</button>
    </form>
    <button aria-label='Search' class='ib' id='vsbtn' type='button'>🔍</button>
    <button aria-label='Dark/Light' class='ib' id='vtheme' type='button'>&#9728;&#65039;</button>
  </div>
  <div class='wrap'><div class='chips' id='vchips'/></div>
</header>
<div id='voffer'/>
<div class='vdr' id='vdrawer'/>

<main>
<div class='wrap'>
<b:section class='main' id='main' showaddelement='yes'>
  <b:widget id='Blog1' locked='true' title='Blog Posts' type='Blog' version='2' visible='true'>
    <b:widget-settings>
      <b:widget-setting name='showDateHeader'>false</b:widget-setting>
      <b:widget-setting name='style.textcolor'>#ffffff</b:widget-setting>
      <b:widget-setting name='showShareButtons'>true</b:widget-setting>
      <b:widget-setting name='showCommentLink'>true</b:widget-setting>
      <b:widget-setting name='style.urlcolor'>#ffffff</b:widget-setting>
      <b:widget-setting name='showAuthor'>false</b:widget-setting>
      <b:widget-setting name='style.linkcolor'>#ffffff</b:widget-setting>
      <b:widget-setting name='style.unittype'>TextAndImage</b:widget-setting>
      <b:widget-setting name='style.bgcolor'>#ffffff</b:widget-setting>
      <b:widget-setting name='timestampLabel'/>
      <b:widget-setting name='reactionsLabel'/>
      <b:widget-setting name='showAuthorProfile'>false</b:widget-setting>
      <b:widget-setting name='style.layout'>1x1</b:widget-setting>
      <b:widget-setting name='showLabels'>true</b:widget-setting>
      <b:widget-setting name='showLocation'>true</b:widget-setting>
      <b:widget-setting name='postLabelsLabel'/>
      <b:widget-setting name='showTimestamp'>true</b:widget-setting>
      <b:widget-setting name='postsPerAd'>3</b:widget-setting>
      <b:widget-setting name='showBacklinks'>false</b:widget-setting>
      <b:widget-setting name='style.bordercolor'>#ffffff</b:widget-setting>
      <b:widget-setting name='showInlineAds'>true</b:widget-setting>
      <b:widget-setting name='showReactions'>false</b:widget-setting>
    </b:widget-settings>
    <b:includable id='main' var='top'>

<b:if cond='data:blog.pageType == &quot;item&quot;'>
  <!-- ভিডিও ডিটেইলস পেজ -->
  <b:loop values='data:posts' var='post'>
    <article class='vpost' expr:data-date='data:post.date' expr:data-id='data:post.id' expr:data-title='data:post.title'>
      <h1 class='vtitle'><data:post.title/></h1>
      <div id='vplayer'/>
      <div class='vmeta' id='vmeta'/>
      <span class='vlabels' style='display:none'><b:loop values='data:post.labels' var='label'><i><data:label.name/></i></b:loop></span>
      <div class='vdesc' id='vdesc'><data:post.body/></div>
      <div class='vshare' id='vshare'/>
      <section class='vrel' id='vrel'/>
    </article>
  </b:loop>

<b:elseif cond='data:blog.pageType == &quot;static_page&quot;'/>
  <b:loop values='data:posts' var='post'>
    <article class='vpost'>
      <h1 class='vtitle'><data:post.title/></h1>
      <div class='vdesc' style='display:block'><data:post.body/></div>
    </article>
  </b:loop>

<b:else/>
  <!-- হোমপেজ / লেবেল / সার্চ -->
  <section class='vsec' id='vpkgs' style='display:none'/>
  <section class='vsec'>
    <h2 id='vh2'>🆕 Latest Videos</h2>
    <div class='vgrid' id='vmain'>
      <b:loop values='data:posts' var='post'>
        <article class='vraw' expr:data-date='data:post.date' expr:data-title='data:post.title' expr:data-url='data:post.url'>
          <a class='vc' expr:href='data:post.url'>
            <div class='vth'>
              <b:if cond='data:post.firstImageUrl'><img expr:src='data:post.firstImageUrl' loading='lazy'/></b:if>
              <span class='vplay'>&#9654;</span>
              <div class='vcap'><h3><data:post.title/></h3><div class='vm'><span><data:post.date/></span></div></div>
            </div>
          </a>
          <span class='vlabels' style='display:none'><b:loop values='data:post.labels' var='label'><i><data:label.name/></i></b:loop></span>
          <template><data:post.body/></template>
        </article>
      </b:loop>
    </div>
    <div class='vpager'>
      <span><b:if cond='data:newerPageUrl'><a expr:href='data:newerPageUrl'>&#8592; নতুন ভিডিও</a></b:if></span>
      <span><b:if cond='data:olderPageUrl'><a expr:href='data:olderPageUrl'>আরও ভিডিও &#8594;</a></b:if></span>
    </div>
  </section>
  <section class='vsec' id='sec-trending' style='display:none'><h2>🔥 Trending Videos</h2><div class='vgrid'/></section>
  <section class='vsec' id='sec-most' style='display:none'><h2>🔥 Most Viewed</h2><div class='vgrid'/></section>
</b:if>

</b:includable>
  </b:widget>
</b:section>
</div>
</main>

<!-- AD GADGETS: Layout থেকে এডিট করা যাবে -->
<b:section class='adpool' id='adpool' showaddelement='no'>
  <b:widget id='HTML1' locked='false' title='Ad: Top (সব পেজের উপরে)' type='HTML' version='2' visible='true'>
    <b:widget-settings><b:widget-setting name='content'/></b:widget-settings>
    <b:includable id='main'><template class='vadtpl' data-pos='top'><data:content/></template></b:includable>
  </b:widget>
  <b:widget id='HTML2' locked='false' title='Ad: Feed (হোমপেজে ভিডিওর মাঝে)' type='HTML' version='2' visible='true'>
    <b:widget-settings><b:widget-setting name='content'/></b:widget-settings>
    <b:includable id='main'><template class='vadtpl' data-pos='feed'><data:content/></template></b:includable>
  </b:widget>
  <b:widget id='HTML3' locked='false' title='Ad: Video Top (ভিডিও প্লেয়ারের উপরে)' type='HTML' version='2' visible='true'>
    <b:widget-settings><b:widget-setting name='content'/></b:widget-settings>
    <b:includable id='main'><template class='vadtpl' data-pos='vtop'><data:content/></template></b:includable>
  </b:widget>
  <b:widget id='HTML4' locked='false' title='Ad: Player (প্লেয়ারের নিচে)' type='HTML' version='2' visible='true'>
    <b:widget-settings><b:widget-setting name='content'/></b:widget-settings>
    <b:includable id='main'><template class='vadtpl' data-pos='player'><data:content/></template></b:includable>
  </b:widget>
  <b:widget id='HTML5' locked='false' title='Ad: After (বর্ণনার নিচে)' type='HTML' version='2' visible='true'>
    <b:widget-settings><b:widget-setting name='content'/></b:widget-settings>
    <b:includable id='main'><template class='vadtpl' data-pos='after'><data:content/></template></b:includable>
  </b:widget>
  <b:widget id='HTML6' locked='false' title='Ad: Mid (শেয়ার বাটনের নিচে)' type='HTML' version='2' visible='true'>
    <b:widget-settings><b:widget-setting name='content'/></b:widget-settings>
    <b:includable id='main'><template class='vadtpl' data-pos='mid'><data:content/></template></b:includable>
  </b:widget>
  <b:widget id='HTML7' locked='false' title='Ad: Bottom (ফুটারের উপরে)' type='HTML' version='2' visible='true'>
    <b:widget-settings><b:widget-setting name='content'/></b:widget-settings>
    <b:includable id='main'><template class='vadtpl' data-pos='bottom'><data:content/></template></b:includable>
  </b:widget>
  <b:widget id='HTML8' locked='false' title='Ad: Sticky (মোবাইলে নিচে ভাসমান ব্যানার)' type='HTML' version='2' visible='true'>
    <b:widget-settings><b:widget-setting name='content'/></b:widget-settings>
    <b:includable id='main'><template class='vadtpl' data-pos='sticky'><data:content/></template></b:includable>
  </b:widget>
</b:section>

<footer class='vfoot'><div class='wrap' id='vfoot'/></footer>
<nav class='vbn' id='vbn'/>

<script>
//<![CDATA[
(function(){
'use strict';
var C = window.VCONFIG, D = document, B = D.body, S = !!C.shorts;
var PT = B.getAttribute('data-pt'), LBL = B.getAttribute('data-label') || '', Q = B.getAttribute('data-q') || '';
var $ = function(s, r){ return (r || D).querySelector(s); };
var $$ = function(s, r){ return Array.prototype.slice.call((r || D).querySelectorAll(s)); };
var esc = function(s){ return String(s == null ? '' : s).replace(/[&<>"']/g, function(c){ return {'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]; }); };

/* ---------- Helpers ---------- */
var BND = '০১২৩৪৫৬৭৮৯';
function en(s){ return String(s == null ? '' : s).replace(/[০-৯]/g, function(d){ return BND.indexOf(d); }); }
function bnum(s){ return String(s).replace(/\d/g, function(d){ return BND.charAt(+d); }); }
function numOf(s){ var m = en(s).match(/\d[\d,]*(?:\.\d+)?/); return m ? parseFloat(m[0].replace(/,/g,'')) : 0; }
function toast(m){ var t = D.createElement('div'); t.className = 'vtoast'; t.textContent = m; B.appendChild(t); setTimeout(function(){ t.remove(); }, 2800); }
function copy(txt){
  if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(txt).then(function(){ toast('কপি হয়েছে ✓'); }, function(){ toast('কপি করা যায়নি'); }); return; }
  var i = D.createElement('textarea'); i.value = txt; B.appendChild(i); i.select();
  try { D.execCommand('copy'); toast('কপি হয়েছে ✓'); } catch(e) {} i.remove();
}
function toNum(s){ if(!s) return 0; var m = en(s).replace(/,/g,'').match(/([\d.]+)\s*([kKmM]?)/); if(!m) return 0; var n = parseFloat(m[1]); if(/k/i.test(m[2])) n *= 1e3; if(/m/i.test(m[2])) n *= 1e6; return n; }
function fmt(n){ return n >= 1e6 ? (n/1e6).toFixed(1).replace('.0','')+'M' : n >= 1e3 ? (n/1e3).toFixed(1).replace('.0','')+'K' : String(n); }
function thumb(u, w, h){
  if(!u) return '';
  return u.replace(/\/(?:s\d+|w\d+-h\d+)(?:-[a-z]+)*\//, '/w'+w+'-h'+h+'-c/').replace(/=(?:s|w)\d+[^?&"']*$/, '=w'+w+'-h'+h+'-c');
}
var CFG_KEYS = /^\s*(VIDEO\s*URL|VIDEO\s*STATUS|STATUS|VIDEO\s*CATEGORY|CATEGORY|OLD\s*PRICE|PRICE|VIEWS|DURATION|PACKAGE|PIN)\s*:/i;

/* ---------- Google Analytics ---------- */
function initGA(){
  var id = C.ga; if (!id) return;
  var s = D.createElement('script'); s.async = true; s.src = 'https://www.googletagmanager.com/gtag/js?id=' + encodeURIComponent(id); D.head.appendChild(s);
  window.dataLayer = window.dataLayer || [];
  window.gtag = function(){ window.dataLayer.push(arguments); };
  window.gtag('js', new Date()); window.gtag('config', id);
}
function track(n, o){ try { if (window.gtag) window.gtag('event', n, o || {}); } catch(e) {} }
initGA();

/* ---------- Modal helpers (✕ সবসময় কাজ করবে) ---------- */
function closeModal(m){
  if (!m) return;
  if (m.id === 'vpkm' || m.id === 'vpay') m.style.display = 'none'; else m.remove();
}
function closeAllModals(){ $$('.vmodal').forEach(closeModal); }

/* ---------- Offer, Price, Packages ---------- */
var O = C.offer || {}, offEnd = O.endDate ? Date.parse(O.endDate) : 0;
function offerOn(){ return !!O.enabled && (!O.endDate || offEnd > Date.now()); }
function priceInfo(price, oldp){
  var raw = String(price || ''), d = offerOn() ? (+O.discount || 0) : 0;
  if (d > 0) {
    var e = en(raw), m = e.match(/\d[\d,]*(?:\.\d+)?/);
    if (m) {
      var v = String(Math.round(parseFloat(m[0].replace(/,/g,'')) * (100 - d) / 100));
      if (/[০-৯]/.test(raw)) v = bnum(v);
      return { now: raw.slice(0, m.index) + v + raw.slice(m.index + m[0].length), old: raw, pct: d };
    }
  }
  return { now: raw, old: oldp || '', pct: 0 };
}
var PK = (C.packages || []).filter(function(k){ return k && k.name; }).map(function(k, i){ k.id = k.id || ('pk' + i); return k; });
var hasPk = PK.length > 0;
function pkById(id){ return PK.filter(function(k){ return k.id === id; })[0]; }
function vcount(k){ return k.videos > 0 ? bnum(k.videos) + 'টি ভিডিও' : 'সব Premium ভিডিও'; }
function pkCard(k){
  var n = numOf(k.price), o = numOf(k.old), pct = (o > n && n > 0) ? Math.round((1 - n / o) * 100) : 0;
  var cur = (String(k.price).match(/^[^\d০-৯]*/) || [''])[0];
  var per = (k.videos > 0 && n > 0) ? 'প্রতি ভিডিও ≈ ' + esc(cur) + bnum(Math.round(n / k.videos)) : '';
  var all = k.videos > 0 ? '' : '<div class="mut sm">একবার PIN দিলেই সব Premium ভিডিও আনলক</div>';
  return '<div class="pk'+(k.tag ? ' hot' : '')+'">' + (k.tag ? '<span class="tag">'+esc(k.tag)+'</span>' : '') +
    '<h3>'+esc(k.name)+'</h3><div class="cnt">'+vcount(k)+'</div>' + (per ? '<div class="mut sm">'+per+'</div>' : '') + all +
    '<div class="pr"><b>'+esc(k.price)+'</b>' + (k.old ? '<s>'+esc(k.old)+'</s>' : '') + (pct ? '<em class="save">'+bnum(pct)+'% ছাড়</em>' : '') + '</div>' +
    (k.note ? '<p class="mut sm">'+esc(k.note)+'</p>' : '') +
    '<button class="vbtn" data-pk="'+esc(k.id)+'" type="button">🛒 কিনুন</button></div>';
}
function pkgModal(){
  if (!hasPk) { toast('এখন কোনো প্যাকেজ নেই'); return; }
  var m = $('#vpkm');
  if (!m) { m = D.createElement('div'); m.id = 'vpkm'; m.className = 'vmodal'; B.appendChild(m); }
  m.style.display = 'flex';
  m.innerHTML = '<div class="vbox big"><button class="vx" aria-label="Close" type="button">✕</button><h3>📦 Premium Packages</h3>' +
    '<p class="mut sm">একসাথে কিনলে বেশি সাশ্রয়। কেনার পর WhatsApp-এ PIN পাবেন, সেই PIN Premium ভিডিওতে দিলে ভিডিও আনলক হবে।</p>' +
    '<div class="vpk one">' + PK.map(pkCard).join('') + '</div></div>';
  track('view_packages');
}
/* প্যাকেজের ব্যবহার ও পাস (এই ব্রাউজারে) */
function pkUsed(id){ try { return (JSON.parse(localStorage.getItem('vpk') || '{}')[id]) || []; } catch(e) { return []; } }
function pkSave(id, list){ try { var o = JSON.parse(localStorage.getItem('vpk') || '{}'); o[id] = list; localStorage.setItem('vpk', JSON.stringify(o)); } catch(e) {} }
function hasPass(){ try { return localStorage.getItem('vpass') === '1'; } catch(e) { return false; } }
function setPass(){ try { localStorage.setItem('vpass', '1'); } catch(e) {} }

/* ---------- Config parse / Video Card ---------- */
function parseCfg(html){
  var t = html.replace(/<br\s*\/?>|<\/(div|p|li)>/gi, '\n').replace(/<[^>]+>/g, '').replace(/&nbsp;/g,' ').replace(/&amp;/g,'&');
  var o = {}, m, re = /^\s*(VIDEO\s*URL|VIDEO\s*STATUS|STATUS|VIDEO\s*CATEGORY|CATEGORY|OLD\s*PRICE|PRICE|VIEWS|DURATION|PACKAGE|PIN)\s*:[ \t]*\n?\s*(.+?)\s*$/gim;
  while ((m = re.exec(t))) o[m[1].toUpperCase().replace(/\s+/g,' ')] = m[2];
  var st = (o['VIDEO STATUS'] || o['STATUS'] || '').toUpperCase();
  return { url: o['VIDEO URL'] || '', status: /LOCK|PREMIUM/.test(st) ? 'LOCKED' : 'FREE',
           cat: o['VIDEO CATEGORY'] || o['CATEGORY'] || '', price: o['PRICE'] || '', old: o['OLD PRICE'] || '',
           views: o['VIEWS'] || '', dur: o['DURATION'] || '', pkg: o['PACKAGE'] || '', pin: o['PIN'] || '' };
}
function build(html, o){
  var c = parseCfg(html), m = html.match(/<img[^>]+src=["']([^"']+)/i), L = o.labels || [];
  var skip = ['Premium','Trending','Latest'];
  var cat = c.cat || L.filter(function(l){ return skip.indexOf(l) < 0; })[0] || L[0] || C.defaultCategory;
  return { title:o.title || 'ভিডিও', url:o.url, date:o.date, labels:L, img: m ? m[1] : (o.img || ''), cat:cat,
           status:c.status, price:c.price || C.price, old:c.old, dur:c.dur, views:toNum(c.views), drive:c.url, pin:c.pin,
           pkgOk: !/^(NO|N|0|FALSE)$/i.test(c.pkg || '') };
}
function fromRaw(el){
  var tpl = $('template', el), html = tpl ? tpl.innerHTML : '';
  var labels = $$('.vlabels i', el).map(function(i){ return i.textContent; });
  return build(html, { title: el.getAttribute('data-title'), url: el.getAttribute('data-url'), date: el.getAttribute('data-date'), labels: labels });
}
function fromEntry(e){
  var link = (e.link || []).filter(function(l){ return l.rel === 'alternate'; })[0];
  var html = (e.content || e.summary || {}).$t || '';
  var d = new Date(e.published.$t);
  return build(html, { title: e.title.$t, url: link ? link.href : '#', date: d.toLocaleDateString('bn-BD', {day:'numeric', month:'short', year:'numeric'}),
                       labels: (e.category || []).map(function(c){ return c.term; }), img: e.media$thumbnail ? e.media$thumbnail.url : '' });
}
var feedP;
function feed(){
  return feedP || (feedP = fetch('/feeds/posts/default?alt=json&max-results=150').then(function(r){ return r.json(); })
    .then(function(j){ return (j.feed.entry || []).map(fromEntry); }).catch(function(){ return []; }));
}
function card(p){
  var lock = p.status === 'LOCKED', img = thumb(p.img, S ? 360 : 640, S ? 640 : 360), pi = lock ? priceInfo(p.price, p.old) : null;
  return '<a class="vc" href="'+esc(p.url)+(lock ? '' : '#play')+'">' +
    '<div class="vth">' + (img ? '<img loading="lazy" decoding="async" src="'+esc(img)+'" alt="'+esc(p.title)+'">' : '') +
    '<span class="vplay">▶</span>' +
    (lock ? '<span class="vbadge lock"><i>🔒</i> PREMIUM</span>' : '<span class="vbadge free">FREE</span>') +
    (p.dur ? '<span class="vdur">'+esc(p.dur)+'</span>' : '') +
    '<div class="vcap"><h3>'+esc(p.title)+'</h3><div class="vm"><span>'+esc(p.cat)+'</span>' +
    (p.views ? '<span>👁 '+fmt(p.views)+'</span>' : '') +
    (lock ? '<span class="vprc">' + (pi.old ? '<s>'+esc(pi.old)+'</s> ' : '') + '<b>'+esc(pi.now)+'</b></span>' : '') +
    '<span>'+esc(p.date)+'</span></div></div></div></a>';
}
function fill(id, list){
  var s = $('#'+id); if(!s) return;
  if(!list.length){ return; }
  $('.vgrid', s).innerHTML = list.map(card).join(''); s.style.display = '';
}

/* ---------- Ads ---------- */
var adsLoaded = false;
function loadAdsense(){
  if (adsLoaded) return; adsLoaded = true;
  var s = D.createElement('script'); s.async = true; s.crossOrigin = 'anonymous';
  s.src = 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=' + C.ads.adsenseClient;
  D.head.appendChild(s);
}
var seenSrc = {};
function adEl(pos){
  var A = C.ads || {}, h = '', fromCfg = false;
  var t = $('.vadtpl[data-pos="'+pos+'"]');
  if (t) h = t.innerHTML.trim();
  if (!h && A.enabled) {
    fromCfg = true;
    h = (A.custom && A.custom[pos]) || '';
    if (!h && A.adsenseClient && A.slots && A.slots[pos])
      h = '<ins class="adsbygoogle" style="display:block" data-ad-client="'+A.adsenseClient+'" data-ad-slot="'+A.slots[pos]+'" data-ad-format="auto" data-full-width-responsive="true"></ins>';
  }
  if (!h) return null;
  var d = D.createElement('div'); d.className = 'vad'; d.innerHTML = '<small>Advertisement</small><div class="vadin"></div>';
  var inn = $('.vadin', d); inn.innerHTML = h;
  $$('script', inn).forEach(function(o){
    if (o.src) { if (seenSrc[o.src]) { o.remove(); return; } seenSrc[o.src] = 1; }
    var n = D.createElement('script');
    Array.prototype.slice.call(o.attributes).forEach(function(a){ n.setAttribute(a.name, a.value); });
    n.text = o.text; o.parentNode.replaceChild(n, o);
  });
  if (fromCfg && $('.adsbygoogle', inn)) { loadAdsense(); try { (window.adsbygoogle = window.adsbygoogle || []).push({}); } catch(e) {} }
  return d;
}

/* ---------- Header / Drawer / Bottom nav / Footer ---------- */
var br = $('#brand');
br.innerHTML = C.logo ? '<img src="'+esc(C.logo)+'" alt="'+esc(C.siteName)+'">' : '<span>▶</span> '+esc(C.siteName);
function isOn(href){ return (href === '/' && location.pathname === '/') || (href !== '/' && decodeURI(location.pathname) === href); }
$('#vnav').innerHTML = C.nav.map(function(n){ return '<a class="'+(isOn(n[1])?'on':'')+'" href="'+esc(n[1])+'">'+esc(n[0])+'</a>'; }).join('');
$('#vchips').innerHTML = C.categories.map(function(c){
  return '<a class="chip'+(LBL === c[0] ? ' on' : '')+'" href="/search/label/'+encodeURIComponent(c[0])+'">'+c[1]+' '+esc(c[0])+'</a>';
}).join('');
var socL = [['Facebook',C.facebook],['Telegram',C.telegram],['YouTube',C.youtube]].filter(function(s){ return s[1]; });
var soc = socL.map(function(s){ return '<a href="'+esc(s[1])+'" target="_blank" rel="noopener">'+s[0]+'</a>'; }).join('');
var pwaOn = !!(C.pwa && C.pwa.enabled);
$('#vfoot').innerHTML = (soc || pwaOn ? '<div class="soc">'+soc+(pwaOn ? '<button type="button" id="vinst2" style="display:none">📲 অ্যাপ ইনস্টল</button>' : '')+'</div>' : '') + '© '+new Date().getFullYear()+' '+esc(C.siteName);

var dr = $('#vdrawer');
dr.innerHTML = '<div class="ov"></div><div class="pn"><div class="dh"><b>'+esc(C.siteName)+'</b><button class="vx2" type="button" aria-label="Close">✕</button></div>' +
  C.nav.map(function(n){ return '<a class="dl'+(isOn(n[1])?' on':'')+'" href="'+esc(n[1])+'">'+esc(n[0])+'</a>'; }).join('') +
  (hasPk ? '<a class="dl" href="#pkg">📦 Premium Packages</a>' : '') +
  '<h4>ক্যাটাগরি</h4>' + C.categories.map(function(c){ return '<a class="dl'+(LBL === c[0] ? ' on' : '')+'" href="/search/label/'+encodeURIComponent(c[0])+'">'+c[1]+' '+esc(c[0])+'</a>'; }).join('') +
  (pwaOn ? '<button class="vbtn" id="vinst" type="button" style="display:none;width:100%;margin-top:14px">📲 অ্যাপ ইনস্টল করুন</button>' : '') +
  (socL.length ? '<div class="soc2">'+soc+'</div>' : '') + '</div>';
function openDr(){ dr.classList.add('on'); }
function closeDr(){ dr.classList.remove('on'); }
$('#vmenu').onclick = openDr;

$('#vbn').innerHTML = (C.bottomNav || []).filter(function(n){ return n[2] !== '#pkg' || hasPk; }).map(function(n){
  return '<a class="'+(isOn(n[2])?'on':'')+'" href="'+esc(n[2])+'"><span>'+n[0]+'</span>'+esc(n[1])+'</a>';
}).join('') + '<button type="button" id="vbmenu"><span>☰</span>মেনু</button>';
$('#vbmenu').onclick = openDr;

var hd = $('#vhead');
$('#vsbtn').onclick = function(){ hd.classList.toggle('ss'); if (hd.classList.contains('ss')) $('.vsearch input').focus(); };

var mw = $('main .wrap'), topAd = adEl('top'); if (mw && topAd) mw.insertBefore(topAd, mw.firstChild);
var botAd = adEl('bottom'), ftEl = $('.vfoot'); if (botAd && ftEl) { botAd.className += ' bot'; ftEl.parentNode.insertBefore(botAd, ftEl); }
var stk = adEl('sticky');
if (stk) {
  var sw = D.createElement('div'); sw.className = 'vsticky'; sw.appendChild(stk);
  var sx = D.createElement('button'); sx.className = 'vsx'; sx.type = 'button'; sx.textContent = '✕'; sx.onclick = function(){ sw.remove(); };
  sw.appendChild(sx); B.appendChild(sw);
}

/* ---------- অফার ব্যানার ---------- */
var offerEl = $('#voffer'), offerIv = 0;
function removeOffer(save){
  if (offerEl) { offerEl.remove(); offerEl = null; }
  if (offerIv) { clearInterval(offerIv); offerIv = 0; }
  if (save) { try { sessionStorage.setItem('voff_x', '1'); } catch(e) {} }
}
(function(){
  if (!offerEl || !offerOn()) return;
  try { if (sessionStorage.getItem('voff_x') === '1') return; } catch(e) {}
  offerEl.className = 'voff';
  offerEl.innerHTML = '<div class="wrap"><span class="ot">'+esc(O.text || '')+'</span><span class="vt" id="vtm"></span>' +
    (O.button && hasPk ? '<a class="obtn" href="#pkg">'+esc(O.button)+'</a>' : '') +
    '<button class="ox" type="button" aria-label="Close">✕</button></div>';
  if (!O.endDate) return;
  function u(n, l){ return '<b>'+bnum(('0' + n).slice(-2))+'</b><i>'+l+'</i>'; }
  function tick(){
    var ms = offEnd - Date.now();
    if (ms <= 0) { removeOffer(false); return; }
    var s = Math.floor(ms / 1000), d = Math.floor(s / 86400), h = Math.floor(s % 86400 / 3600), m = Math.floor(s % 3600 / 60), sc = s % 60;
    var t = $('#vtm'); if (t) t.innerHTML = (d ? '<b>'+bnum(d)+'</b><i>দিন</i>' : '') + u(h,'ঘ') + u(m,'মি') + u(sc,'সে');
  }
  tick(); offerIv = setInterval(tick, 1000);
})();

/* ---------- Dark / Light ---------- */
var tb = $('#vtheme'), root = D.documentElement;
function sync(){ tb.textContent = root.getAttribute('data-theme') === 'light' ? '🌙' : '☀️'; }
tb.onclick = function(){
  var n = root.getAttribute('data-theme') === 'light' ? 'dark' : 'light';
  root.setAttribute('data-theme', n);
  try { localStorage.setItem('vtheme', n); } catch(e) {}
  sync();
};
sync();

/* ---------- PIN যাচাই ---------- */
function sha(s){
  if (!(window.crypto && crypto.subtle && window.TextEncoder)) return Promise.resolve('');
  return crypto.subtle.digest('SHA-256', new TextEncoder().encode(s)).then(function(b){
    return Array.prototype.map.call(new Uint8Array(b), function(x){ return ('0'+x.toString(16)).slice(-2); }).join('');
  });
}
function checkPin(inp, stored){
  stored = String(stored || C.masterPin || '').trim();
  if (!stored) return Promise.resolve(false);
  if (/^sha256:/i.test(stored)) return sha(inp).then(function(h){ return !!h && h === stored.slice(7).toLowerCase(); });
  return Promise.resolve(inp === stored);
}
function pkgMatch(v){
  var list = PK.filter(function(k){ return String(k.pin || '').trim(); });
  return Promise.all(list.map(function(k){ return checkPin(v, k.pin); })).then(function(r){
    for (var i = 0; i < list.length; i++) if (r[i]) return list[i];
    return null;
  });
}

/* ---------- PIN সেটআপ টুল (লিংকের শেষে #pinsetup) ---------- */
function pinTool(){
  if ($('#vpintool')) return;
  var m = D.createElement('div'); m.className = 'vmodal'; m.id = 'vpintool';
  m.innerHTML = '<div class="vbox"><button class="vx" aria-label="Close" type="button">✕</button><h3>🔑 PIN Setup</h3>' +
    '<p class="mut sm">PIN লিখুন বা Random বানান, তারপর নিচের লাইনটি কপি করে পোস্টের vcfg-তে (অথবা প্যাকেজের pin: এ) বসান।</p>' +
    '<label>PIN (সংখ্যা ব্যবহার করা ভালো)<input id="vsp" inputmode="numeric" maxlength="12" placeholder="যেমন: 4821" autocomplete="off"></label>' +
    '<label>ধরন<select id="vst"><option value="plain">সাধারণ (সহজ)</option><option value="hash">Hash (পোস্টে PIN সরাসরি দেখা যাবে না)</option></select></label>' +
    '<div style="display:flex;gap:8px;margin-top:12px"><button class="vbtn" id="vsr" type="button">🎲 Random</button><button class="vbtn" id="vsg" type="button">⚙ লাইন বানান</button></div>' +
    '<div class="vout" id="vso" style="display:none"></div>' +
    '<button class="vbtn wa" id="vsc" type="button" style="display:none">📋 কপি</button></div>';
  B.appendChild(m);
  $('#vsr', m).onclick = function(){ $('#vsp', m).value = String(Math.floor(1000 + Math.random() * 9000)); };
  $('#vsg', m).onclick = function(){
    var pin = $('#vsp', m).value.trim();
    if (!pin) { toast('PIN লিখুন'); return; }
    var show = function(line){ var o = $('#vso', m); o.textContent = line; o.style.display = ''; $('#vsc', m).style.display = ''; };
    if ($('#vst', m).value === 'hash') {
      sha(pin).then(function(h){
        if (!h) { toast('এই ব্রাউজারে Hash চলবে না, সাধারণ ধরন ব্যবহার করুন'); return; }
        show('PIN: sha256:' + h);
      });
    } else show('PIN: ' + pin);
  };
  $('#vsc', m).onclick = function(){ copy($('#vso', m).textContent); };
}
if (location.hash === '#pinsetup') pinTool();
window.addEventListener('hashchange', function(){ if (location.hash === '#pinsetup') pinTool(); });

/* ---------- Payment Box + WhatsApp ---------- */
function pay(o){
  var m = $('#vpay');
  if(!m){ m = D.createElement('div'); m.id = 'vpay'; m.className = 'vmodal'; B.appendChild(m); }
  m.style.display = 'flex';
  var isPk = o.kind === 'package';
  track('begin_checkout', { item_name: o.title, value: numOf(o.price) });
  m.innerHTML = '<div class="vbox"><button class="vx" aria-label="Close" type="button">✕</button><h3>💳 Payment</h3><p class="mut sm">'+(isPk ? '📦 ' : '🎬 ')+esc(o.title)+'</p>' +
    '<div class="vnum"><b>bKash:</b><span>'+esc(C.bkash)+'</span><button type="button" data-c="'+esc(C.bkash)+'">কপি</button></div>' +
    '<div class="vnum"><b>Nagad:</b><span>'+esc(C.nagad)+'</span><button type="button" data-c="'+esc(C.nagad)+'">কপি</button></div>' +
    '<div class="vprice">Price: <b>'+esc(o.price)+'</b>'+(o.old ? ' <s>'+esc(o.old)+'</s>' : '')+'</div>' +
    '<label>Payment Method<select id="vpm"><option>bKash</option><option>Nagad</option></select></label>' +
    '<label>Transaction ID<input id="vpt" placeholder="যেমন: 8N7A6D5E4C" autocomplete="off"></label>' +
    '<label>Amount<input id="vpa" value="'+esc(o.price)+'"></label>' +
    '<label>Gmail (ভিডিও Access পেতে)<input id="vpg" type="email" placeholder="you@gmail.com"></label>' +
    '<button class="vbtn wa" id="vpw" type="button">📱 WhatsApp-এ Payment Details পাঠান</button>' +
    '<p class="mut sm" style="margin-top:8px">Payment করার পর Transaction ID দিয়ে বাটনে ক্লিক করুন। Admin verify করে WhatsApp-এ আপনাকে একটি PIN পাঠাবেন। সেই PIN ভিডিওর উপরে দিলে ভিডিও Unlock হবে।</p></div>';
  $('#vpw').onclick = function(){
    var trx = $('#vpt').value.trim();
    if(!trx){ toast('Transaction ID লিখুন'); $('#vpt').focus(); return; }
    var gm = $('#vpg').value.trim();
    var msg = 'Hello,\n' + (isPk ? 'I want to buy this package.' : 'I want to unlock this video.') +
      '\n\n' + (isPk ? 'Package: ' : 'Video: ') + o.title + '\n\nPayment Method: '+$('#vpm').value+
      '\n\nTransaction ID: '+trx+'\n\nAmount: '+$('#vpa').value.trim()+(gm ? '\n\nGmail: '+gm : '')+
      '\n\nPlease send my PIN.';
    track('purchase_whatsapp', { item_name: o.title, value: numOf($('#vpa').value) });
    window.open('https://wa.me/'+C.whatsapp.replace(/\D/g,'')+'?text='+encodeURIComponent(msg), '_blank');
    closeModal(m);
    toast('WhatsApp-এ পাঠানো হয়েছে। PIN পেলে ভিডিওর উপরে দিন');
    var pi = $('#vpin'); if (pi) pi.focus();
  };
}

/* ---------- গ্লোবাল ক্লিক: সব ✕, বাইরে ক্লিক, প্যাকেজ, কপি ---------- */
D.addEventListener('click', function(e){
  var t = e.target; if (!t || !t.closest) return;

  /* অফার ব্যানারের ✕ */
  if (t.closest('.voff .ox')) { removeOffer(true); return; }
  /* ড্রয়ার বন্ধ */
  if (t.closest('.vdr .vx2') || t.closest('.vdr .ov')) { closeDr(); return; }
  if (t.closest('.vdr a')) { closeDr(); }

  /* পপআপের ✕ */
  var cx = t.closest('.vx');
  if (cx) { e.preventDefault(); closeModal(cx.closest('.vmodal')); return; }
  /* পপআপের বাইরে ক্লিক */
  if (t.classList && t.classList.contains('vmodal')) { closeModal(t); return; }

  /* নম্বর কপি */
  var cb = t.closest('[data-c]');
  if (cb) { copy(cb.getAttribute('data-c')); return; }

  /* প্যাকেজ পপআপ */
  if (t.closest('a[href="#pkg"]')) { e.preventDefault(); closeDr(); pkgModal(); return; }
  /* প্যাকেজ কেনা */
  var b = t.closest('[data-pk]');
  if (b) {
    e.preventDefault();
    var k = pkById(b.getAttribute('data-pk')); if (!k) return;
    closeModal($('#vpkm'));
    pay({ title: k.name + ' (' + vcount(k) + ')', price: k.price, old: k.old, kind: 'package' });
  }
});
D.addEventListener('keydown', function(e){
  if (e.key !== 'Escape') return;
  closeAllModals(); closeDr();
});

/* ---------- PWA ---------- */
var deferred = null;
function standalone(){ return (window.matchMedia && matchMedia('(display-mode: standalone)').matches) || window.navigator.standalone === true; }
var isIOS = /iphone|ipad|ipod/i.test(navigator.userAgent) && !window.MSStream;
function mkIcon(){
  try {
    var cv = D.createElement('canvas'); cv.width = cv.height = 512; var x = cv.getContext('2d');
    var g = x.createLinearGradient(0, 0, 512, 512); g.addColorStop(0, C.colors.accent); g.addColorStop(1, C.colors.accent2);
    x.fillStyle = g; x.fillRect(0, 0, 512, 512); x.fillStyle = '#fff';
    x.beginPath(); x.moveTo(200, 150); x.lineTo(200, 362); x.lineTo(372, 256); x.closePath(); x.fill();
    return cv.toDataURL('image/png');
  } catch(e) { return ''; }
}
function installNow(){
  if (deferred) { deferred.prompt(); deferred.userChoice.then(function(r){ track('pwa_install', { outcome: r && r.outcome }); deferred = null; showInstallBtns(false); }); return; }
  if (isIOS) {
    var m = D.createElement('div'); m.className = 'vmodal';
    m.innerHTML = '<div class="vbox"><button class="vx" aria-label="Close" type="button">✕</button><h3>📲 iPhone-এ ইনস্টল</h3><ol><li>Safari-তে নিচের <b>Share</b> বাটনে চাপুন</li><li><b>Add to Home Screen</b> বেছে নিন</li><li><b>Add</b> চাপুন</li></ol></div>';
    B.appendChild(m);
    return;
  }
  toast('ব্রাউজারের মেনু (⋮) থেকে "Install app" বা "Add to Home screen" চাপুন');
}
function showInstallBtns(on){
  ['vinst','vinst2'].forEach(function(id){ var b = $('#'+id); if (b) b.style.display = on ? '' : 'none'; });
}
function installBanner(){
  var seen = false; try { seen = localStorage.getItem('vins_x') === '1'; } catch(e) {}
  if (seen || standalone() || $('.vins')) return;
  var b = D.createElement('div'); b.className = 'vins';
  b.innerHTML = '<span>📲 <b>'+esc(C.siteName)+'</b> অ্যাপের মতো ইনস্টল করুন</span><button class="vbtn" type="button">ইনস্টল</button><button class="ox2" type="button" aria-label="Close">✕</button>';
  B.appendChild(b);
  $('.vbtn', b).onclick = function(){ b.remove(); installNow(); };
  $('.ox2', b).onclick = function(){ b.remove(); try { localStorage.setItem('vins_x', '1'); } catch(e) {} };
}
if (pwaOn && !standalone()) {
  var P = C.pwa, icon = P.icon || C.favicon || mkIcon(), orig = location.origin;
  var man = { name: P.name || C.siteName, short_name: P.shortName || C.siteName, start_url: orig + '/', scope: orig + '/', display: 'standalone',
              orientation: 'portrait', background_color: C.colors.darkBg, theme_color: P.themeColor || C.colors.accent, lang: 'bn',
              icons: icon ? [{ src: icon, sizes: '512x512', type: 'image/png', purpose: 'any maskable' }] : [] };
  try {
    $$('link[rel="manifest"]').forEach(function(l){ l.remove(); });
    var ml = D.createElement('link'); ml.rel = 'manifest';
    ml.href = URL.createObjectURL(new Blob([JSON.stringify(man)], { type: 'application/manifest+json' })); D.head.appendChild(ml);
    if (icon) { var ai = D.createElement('link'); ai.rel = 'apple-touch-icon'; ai.href = icon; D.head.appendChild(ai); }
    var tc = $('meta[name="theme-color"]'); if (tc) tc.setAttribute('content', P.themeColor || C.colors.accent);
  } catch(e) {}
  window.addEventListener('beforeinstallprompt', function(e){ e.preventDefault(); deferred = e; showInstallBtns(true); setTimeout(installBanner, 4000); });
  window.addEventListener('appinstalled', function(){ showInstallBtns(false); var b = $('.vins'); if (b) b.remove(); });
  if (isIOS) { showInstallBtns(true); setTimeout(installBanner, 6000); }
  ['vinst','vinst2'].forEach(function(id){ var b = $('#'+id); if (b) b.onclick = function(){ closeDr(); installNow(); }; });
}

/* ---------- Favicon ---------- */
function setFavicon(){
  var u = C.favicon || mkIcon(); if (!u) return;
  $$('link[rel~="icon"],link[rel="apple-touch-icon"]').forEach(function(l){ l.remove(); });
  [['icon','32x32'],['shortcut icon',''],['apple-touch-icon','180x180']].forEach(function(r){
    var l = D.createElement('link'); l.rel = r[0];
    if (r[1]) l.sizes = r[1];
    if (/\.png(\?|$)|^data:image\/png/i.test(u)) l.type = 'image/png';
    l.href = u; D.head.appendChild(l);
  });
}
setFavicon();

/* ---------- SEO: Structured Data ---------- */
function ld(o){ var s = D.createElement('script'); s.type = 'application/ld+json'; s.text = JSON.stringify(o); D.head.appendChild(s); }

/* ---------- হোমপেজ / লেবেল / সার্চ ---------- */
if (PT === 'index' || PT === 'archive') {
  var grid = $('#vmain'), h2 = $('#vh2');
  if (h2) { if (LBL) h2.textContent = '🎬 ' + LBL; else if (Q) h2.textContent = '🔍 ' + Q; }
  if (grid) {
    $$('.vraw', grid).forEach(function(el){ try { el.outerHTML = card(fromRaw(el)); } catch(e) {} });
    $$('.vc', grid).forEach(function(c, i){
      if ((i + 1) % ((C.ads && C.ads.feedEvery) || 6) === 0) { var fa = adEl('feed'); if (fa) { fa.className += ' feed'; c.parentNode.insertBefore(fa, c.nextSibling); } }
    });
    if (!$('.vc', grid)) grid.innerHTML = '<div class="vempty" style="grid-column:1/-1">😕 কোনো ভিডিও পাওয়া যায়নি</div>';
  }
  var home = (location.pathname === '/' || location.pathname === '') && !LBL && !Q;
  var pks = $('#vpkgs');
  if (pks && hasPk && C.pkgOnHome !== false && (home || LBL === 'Premium')) {
    pks.innerHTML = '<h2>📦 Premium Packages</h2><div class="vpk">' + PK.map(pkCard).join('') + '</div>'; pks.style.display = '';
  }
  if (home) {
    ld({ '@context':'https://schema.org', '@type':'WebSite', name: C.siteName, url: location.origin + '/',
         potentialAction: { '@type':'SearchAction', target: location.origin + '/search?q={search_term_string}', 'query-input':'required name=search_term_string' } });
  }
  if (home && ($('#sec-trending') || $('#sec-most'))) {
    feed().then(function(all){
      var byViews = all.slice().sort(function(a,b){ return b.views - a.views; });
      var tr = all.filter(function(p){ return p.labels.indexOf('Trending') > -1; }).slice(0, 4);
      if (tr.length < 4) byViews.forEach(function(p){ if (tr.length < 4 && tr.indexOf(p) < 0 && p.views) tr.push(p); });
      fill('sec-trending', tr);
      fill('sec-most', byViews.filter(function(p){ return p.views; }).slice(0, 8));
    });
  }
}

/* ---------- ভিডিও ডিটেইলস পেজ ---------- */
if (PT === 'item' && $('#vdesc')) {
  var art = $('.vpost'), d = $('#vdesc'), html = d.innerHTML;
  var labels = $$('.vlabels i', art).map(function(i){ return i.textContent; });
  var p = build(html, { title: art.getAttribute('data-title'), url: location.href.split('#')[0], date: art.getAttribute('data-date'), labels: labels });
  var vt = $('.vtitle'); if (vt && !vt.textContent.trim()) vt.textContent = p.title;

  var idm = p.drive.match(/\/d\/([\w-]+)/) || p.drive.match(/[?&]id=([\w-]+)/);
  var fid = idm ? idm[1] : '';
  var key = fid || p.url;
  var premium = p.status === 'LOCKED';
  var unl = false;
  try { unl = localStorage.getItem('vu_' + key) === '1'; } catch(e) {}
  /* "সব ভিডিও পাস" থাকলে (এবং ভিডিও প্যাকেজের আওতায় থাকলে) আনলক */
  if (premium && !unl && p.pkgOk && hasPass()) unl = true;
  var locked = premium && !unl;
  var th = thumb(p.img, S ? 720 : 1280, S ? 1280 : 720);

  $$('.vcfg', d).forEach(function(e){ e.remove(); });
  $$('div,p,span,b', d).forEach(function(e){
    if (!e.querySelector('div,p') && e.textContent.length < 400 && CFG_KEYS.test(e.textContent)) e.remove();
  });
  var fi = $('img', d); if (fi) { var fa = fi.closest('a'); (fa || fi).remove(); }

  var pi0 = priceInfo(p.price, p.old);

  var box = $('#vplayer');
  box.innerHTML = '<div class="vstage" id="vstage">' + (th ? '<img src="'+esc(th)+'" alt="'+esc(p.title)+'">' : '') +
    (locked
      ? '<div class="vlock"><div class="ic">🔒</div><b>PREMIUM VIDEO</b><p>ভিডিও দেখতে Unlock করুন</p>' +
        '<button class="vbtn" id="vunlock" type="button">🔓 Unlock — '+esc(pi0.now)+(pi0.old ? ' <s>'+esc(pi0.old)+'</s>' : '')+'</button>' +
        (hasPk && p.pkgOk ? '<button class="vlink" id="vpkb" type="button">📦 প্যাকেজে কিনলে কম খরচ — অফার দেখুন</button>' : '') +
        '<div class="vpinbox"><small>Payment-এর পর WhatsApp-এ PIN পেয়েছেন?</small>' +
        '<div class="vpinrow" id="vpinrow"><input id="vpin" type="password" inputmode="numeric" maxlength="12" placeholder="PIN দিন" autocomplete="off">' +
        '<button class="vbtn" id="vpinok" type="button">Unlock</button></div></div></div>'
      : '<button class="vbig" id="vgo" aria-label="Play" type="button">▶</button>') + '</div>' +
    '<div class="vtools"><button id="vfs" type="button">⛶ Fullscreen</button>' +
    (!locked && fid ? '<a href="https://drive.google.com/file/d/'+fid+'/view" target="_blank" rel="noopener">↗ Google Drive-এ খুলুন</a>' : '') +
    '<button id="vcl" type="button">🔗 লিংক কপি</button></div>';

  var tad = adEl('vtop'); if (tad) box.parentNode.insertBefore(tad, box);
  var pad = adEl('player'); if (pad) box.appendChild(pad);
  var stage = $('#vstage');
  function load(){
    if (!fid) { toast('ভিডিও লিংক পাওয়া যায়নি'); return; }
    track('video_play', { video_title: p.title, premium: premium });
    stage.innerHTML = '<div class="vspin"></div><iframe src="https://drive.google.com/file/d/'+fid+'/preview" allow="autoplay; fullscreen" allowfullscreen></iframe>';
    $('iframe', stage).onload = function(){ var s = $('.vspin', stage); if (s) s.remove(); };
  }
  if ($('#vgo'))     $('#vgo').onclick = load;
  if ($('#vunlock')) $('#vunlock').onclick = function(){ var q = priceInfo(p.price, p.old); track('unlock_click', { video_title: p.title }); pay({ title: p.title, price: q.now, old: q.old, kind: 'video' }); };
  if ($('#vpkb'))    $('#vpkb').onclick = pkgModal;

  /* PIN: ভিডিওর নিজের PIN বা প্যাকেজ PIN (৫ বার ভুলে ৩০ সেকেন্ড অপেক্ষা) */
  var tries = 0, waitUntil = 0;
  function anyPin(){ return !!(String(p.pin || C.masterPin || '').trim() || PK.some(function(k){ return String(k.pin || '').trim(); })); }
  function unlockOk(msg){
    try { localStorage.setItem('vu_' + key, '1'); } catch(e) {}
    toast(msg || 'আনলক হয়েছে ✓ 🎉');
    var pl = $('.pill'); if (pl) pl.textContent = '🔓 PREMIUM';
    track('video_unlock', { video_title: p.title });
    load();
  }
  function tryPin(){
    var inp = $('#vpin'), row = $('#vpinrow'), v = inp.value.trim();
    if (Date.now() < waitUntil) { toast('একটু অপেক্ষা করে আবার চেষ্টা করুন'); return; }
    if (!v) { toast('PIN লিখুন'); inp.focus(); return; }
    if (!anyPin()) { toast('এই ভিডিওর জন্য PIN সেট করা নেই'); return; }
    function bad(){
      tries++; inp.value = '';
      row.classList.remove('bad'); void row.offsetWidth; row.classList.add('bad');
      if (tries >= 5) { tries = 0; waitUntil = Date.now() + 30000; toast('৫ বার ভুল! ৩০ সেকেন্ড অপেক্ষা করুন'); }
      else toast('ভুল PIN, আবার চেষ্টা করুন');
    }
    checkPin(v, p.pin).then(function(ok){
      if (ok) return unlockOk();
      return pkgMatch(v).then(function(k){
        if (!k) return bad();
        if (p.pkgOk === false) { toast('এই ভিডিও প্যাকেজের আওতায় নেই'); return; }
        if (k.videos === 0) { setPass(); return unlockOk('সব Premium ভিডিও আনলক হয়েছে ✓ 🎉'); }
        var u = pkUsed(k.id);
        if (u.indexOf(key) > -1) return unlockOk();
        if (u.length >= k.videos) { toast('এই প্যাকেজের সব ভিডিও ব্যবহার হয়ে গেছে'); return; }
        u.push(key); pkSave(k.id, u);
        unlockOk('আনলক হয়েছে ✓ প্যাকেজে আরও ' + bnum(k.videos - u.length) + 'টি ভিডিও বাকি');
      });
    });
  }
  if ($('#vpinok')) {
    $('#vpinok').onclick = tryPin;
    $('#vpin').onkeydown = function(e){ if (e.key === 'Enter') tryPin(); };
  }

  $('#vfs').onclick = function(){ (stage.requestFullscreen || stage.webkitRequestFullscreen || function(){ toast('Fullscreen সাপোর্ট নেই'); }).call(stage); };
  $('#vcl').onclick = function(){ copy(p.url); };
  if (!locked && location.hash === '#play') load();

  $('#vmeta').innerHTML = '<span class="pill '+(premium?'lock':'free')+'">'+(premium ? (locked ? '🔒 PREMIUM' : '🔓 PREMIUM') : 'FREE')+'</span>' +
    '<a href="/search/label/'+encodeURIComponent(p.cat)+'">📂 '+esc(p.cat)+'</a>' +
    (p.dur ? '<span>⏱ '+esc(p.dur)+'</span>' : '') +
    (p.views ? '<span>👁 '+fmt(p.views)+' views</span>' : '') + '<span>📅 '+esc(p.date)+'</span>';

  var aad = adEl('after'); if (aad) $('#vshare').parentNode.insertBefore(aad, $('#vshare'));

  var u = encodeURIComponent(p.url), t = encodeURIComponent(p.title);
  $('#vshare').innerHTML = '<b>Share:</b>' +
    '<a class="fb" target="_blank" rel="noopener" href="https://www.facebook.com/sharer/sharer.php?u='+u+'">Facebook</a>' +
    '<a class="wa" target="_blank" rel="noopener" href="https://wa.me/?text='+t+'%20'+u+'">WhatsApp</a>' +
    '<a class="tg" target="_blank" rel="noopener" href="https://t.me/share/url?url='+u+'&text='+t+'">Telegram</a>' +
    '<a class="x" target="_blank" rel="noopener" href="https://twitter.com/intent/tweet?url='+u+'&text='+t+'">X</a>' +
    '<button class="cp" type="button" id="vcp">Copy Link</button>';
  $('#vcp').onclick = function(){ copy(p.url); };

  var mad = adEl('mid'); if (mad) $('#vshare').parentNode.insertBefore(mad, $('#vrel'));

  (function(){
    var desc = (d.textContent || '').replace(/\s+/g, ' ').trim().slice(0, 200) || p.title;
    var dm = String(p.dur || '').match(/^(?:(\d+):)?(\d{1,2}):(\d{2})$/);
    var iso = dm ? 'PT' + (dm[1] ? dm[1] + 'H' : '') + dm[2] + 'M' + dm[3] + 'S' : '';
    function put(up){
      var o = { '@context':'https://schema.org', '@type':'VideoObject', name: p.title, description: desc, uploadDate: up,
                isAccessibleForFree: !premium, url: p.url };
      if (p.img) o.thumbnailUrl = [p.img];
      if (iso) o.duration = iso;
      if (!premium && fid) o.embedUrl = 'https://drive.google.com/file/d/' + fid + '/preview';
      ld(o);
    }
    var pid = art.getAttribute('data-id');
    if (pid) fetch('/feeds/posts/default/' + pid + '?alt=json').then(function(r){ return r.json(); })
      .then(function(j){ put(j.entry.published.$t); }).catch(function(){ put(new Date().toISOString()); });
    else put(new Date().toISOString());
  })();

  feed().then(function(all){
    var cur = p.url.replace(/^https?:/,'');
    var rest = all.filter(function(x){ return x.url.replace(/^https?:/,'') !== cur; });
    var rel = rest.filter(function(x){ return x.cat === p.cat; }).slice(0, 4);
    rest.forEach(function(x){ if (rel.length < 4 && rel.indexOf(x) < 0) rel.push(x); });
    if (rel.length) $('#vrel').innerHTML = '<div class="vsec"><h2>🎬 Related Videos</h2><div class="vgrid">'+rel.map(card).join('')+'</div></div>';
  });
}
})();
//]]>
</script>
</body>
</html>



✦ CODE SNIPPET
<div class="vcfg">
VIDEO URL: https://drive.google.com/file/d/XXXXXXXX/view<br>
VIDEO STATUS: LOCKED<br>
VIDEO CATEGORY: Premium<br>
PRICE: ৳100<br>
VIEWS: 12K<br>
PIN: 4821
</div>
PIN: 904821
বিজ্ঞাপন
পোস্ট করেছেন

Tanbin Farazi