DUOLINGO INTEGRATION

TẠO LINK SUPER, NHẬN SUPER 3 NGÀY, NGHE NHẠC, HACK XP/GEM/STREAK

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==UserScript==
// @name         DUOLINGO INTEGRATION
// @namespace    http://tampermonkey.net/
// @version      2026.08.01
// @description  TẠO LINK SUPER, NHẬN SUPER 3 NGÀY, NGHE NHẠC, HACK XP/GEM/STREAK
// @author       orgorakasumi
// @match        https://www.duolingo.com/*
// @grant        GM_xmlhttpRequest
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_addStyle
// @connect      auto-super.vercel.app
// @connect      www.duolingo.com
// @connect      stories.duolingo.com
// @connect      goals-api.duolingo.com
// @connect      greasyfork.org
// @run-at       document-idle
// @license      MIT
// @icon         https://d35aaqx5ub95lt.cloudfront.net/vendor/38dc6a042b0de3f6aeb44ff2aa70de73.svg
// ==/UserScript==
(function(){'use strict';

var VER='2026.08.01b';
var API='https://auto-super.vercel.app';
var FREE_KEY='Auto-Super';
var MAX_EN=25;var COST_LINK=2;var COST_S3=3;var HACK_EN_COST=2;
var ZALO='https://zalo.me/g/omtyaxafze06b2f7fefb';
var ADMIN_PW='ADMIN KEY SUPER';var ADMIN_DOB='280714';
var GF_SCRIPT_URL='https://greasyfork.org/vi/scripts/586818-duolingo-get-super-family-plan/code';
var GF_API_URL='https://greasyfork.org/scripts/586818.json';
var MUSIC=[{id:'dQw4w9WgXcQ',t:'Rick Astley - Never Gonna Give You Up'},{id:'kJQP7kiw5Fk',t:'Luis Fonsi - Despacito'},{id:'JGwWNGJdvx8',t:'Ed Sheeran - Shape of You'},{id:'RgKAFK5djSk',t:'Wiz Khalifa - See You Again'},{id:'fJ9rUzIMcZQ',t:'Queen - Bohemian Rhapsody'},{id:'60ItHLz5WEA',t:'Alan Walker - Faded'},{id:'OPf0YbXqDm0',t:'Mark Ronson - Uptown Funk'},{id:'9bZkp7q19f0',t:'PSY - Gangnam Style'},{id:'CevxZvSJLk8',t:'Katy Perry - Roar'},{id:'LXb3EKWsInQ',t:'Imagine Dragons - Radioactive'}];

var _sess=null,_tier=null,_isAdmin=false,_duoUser=null;
var _creating=false,_activating=false;
var _mIdx=0,_mPlay=false,_linkRaf=null;
var _hackRunning=false,_hackTask=null,_duoFullData=null;
var _remoteVer=null,_isOutdated=false,_showingHacker=true;
var _apiKey=null,_keyData=null,_usedToday=0;
var _cdRemain=0,_cdTimer=null;
var _S=function(k,v){GM_setValue(k,v)};
var _G=function(k,d){return GM_getValue(k,d)};
var $=function(id){return document.getElementById(id)};

function _ts7(){var n=new Date(Date.now()+7*3600000);return String(n.getUTCHours()).padStart(2,'0')+':'+String(n.getUTCMinutes()).padStart(2,'0')+':'+String(n.getUTCSeconds()).padStart(2,'0')}
function _toast(m,tp,dr){tp=tp||'info';dr=dr||2000;var w=$('ds-tw');if(!w)return;if(w.children.length>=2)w.firstElementChild.remove();var t=document.createElement('div');t.className='ds-tst ds-tst-'+tp;t.innerHTML='<div class="ds-dot"></div><span>'+m+'</span>';w.appendChild(t);setTimeout(function(){t.classList.add('out');setTimeout(function(){if(t.parentNode)t.remove()},240)},dr)}
function _log(id,m,tp){var e=$(id);if(!e)return;var c={o:'lo',e:'le',i:'li',w:'lw'}[tp]||'li';var s=document.createElement('span');s.className='ds-le '+c;s.textContent='['+_ts7()+'] '+m;e.appendChild(s);e.appendChild(document.createTextNode('\n'));e.scrollTop=e.scrollHeight}
function _logC(id){var e=$(id);if(e)e.textContent=''}
function _sleep(ms){return new Promise(function(r){setTimeout(r,ms)})}
function _fmtCD(s){var m=Math.floor(s/60),sec=s%60;return String(m).padStart(2,'0')+':'+String(sec).padStart(2,'0')}

function _cmpVer(v1,v2){var a=v1.split(/[.\-]/).map(Number),b=v2.split(/[.\-]/).map(Number);for(var i=0;i<Math.max(a.length,b.length);i++){var x=a[i]||0,y=b[i]||0;if(x>y)return 1;if(x<y)return-1}return 0}
function _checkVersion(){GM_xmlhttpRequest({method:'GET',url:GF_API_URL,headers:{'Accept':'application/json'},timeout:8000,onload:function(r){if(r.status!==200)return;try{var d=JSON.parse(r.responseText),rv=(d.version||'').trim();if(!rv)return;_remoteVer=rv;if(_cmpVer(rv,VER)>0){_isOutdated=true;_showUpdateBanner(rv)}else{_isOutdated=false;var b=$('ds-update-banner');if(b)b.style.display='none'}}catch(e){}},onerror:function(){},ontimeout:function(){}})}
function _showUpdateBanner(rv){var b=$('ds-update-banner');if(!b)return;b.style.display='flex';var vt=$('ds-update-ver');if(vt)vt.textContent='v'+rv}

/* ═══ GM HELPERS — FIX: raw response luôn là string ═══ */
function _gmGet(url,hdr){
    return new Promise(function(ok){
        GM_xmlhttpRequest({method:'GET',url:url,headers:hdr||{'Content-Type':'application/json'},timeout:60000,
        onload:function(r){
            var rawStr=r.responseText||'';
            var parsed=null;
            try{parsed=JSON.parse(rawStr)}catch(e){}
            ok({status:r.status,data:parsed,raw:rawStr});
        },
        onerror:function(){ok({status:0,data:null,raw:'network_error'})},
        onetimeout:function(){ok({status:0,data:null,raw:'timeout'})}
    });
})}
function _gmPost(url,body,hdr){
    return new Promise(function(ok){
        GM_xmlhttpRequest({method:'POST',url:url,headers:hdr||{'Content-Type':'application/json'},data:body?JSON.stringify(body):null,timeout:90000,
        onload:function(r){
            var rawStr=r.responseText||'';
            var parsed=null;
            try{parsed=JSON.parse(rawStr)}catch(e){}
            ok({status:r.status,data:parsed,raw:rawStr});
        },
        onerror:function(){ok({status:0,data:null,raw:'network_error'})},
        onetimeout:function(){ok({status:0,data:null,raw:'timeout'})}
    });
})}
function _gmReq(method,url,body,hdr){
    return new Promise(function(ok){
        GM_xmlhttpRequest({method:method,url:url,headers:hdr||{'Content-Type':'application/json'},data:body?JSON.stringify(body):null,timeout:60000,
        onload:function(r){
            var rawStr=r.responseText||'';
            var parsed=null;
            try{parsed=JSON.parse(rawStr)}catch(e){}
            ok({status:r.status,data:parsed,raw:rawStr});
        },
        onerror:function(){ok({status:0,data:null,raw:'network_error'})},
        onetimeout:function(){ok({status:0,data:null,raw:'timeout'})}
    });
})}
function _gmPut(url,body,hdr){return new Promise(function(ok){GM_xmlhttpRequest({method:'PUT',url:url,headers:hdr||{'Content-Type':'application/json'},data:body?JSON.stringify(body):null,timeout:90000,onload:function(r){ok({status:r.status,data:r.responseText})},onerror:function(){ok({status:0})},ontimeout:function(){ok({status:0})}})})}
function _gmPatch(url,body,hdr){return new Promise(function(ok){GM_xmlhttpRequest({method:'PATCH',url:url,headers:hdr||{'Content-Type':'application/json'},data:body?JSON.stringify(body):null,timeout:30000,onload:function(r){ok({status:r.status})},onerror:function(){ok({status:0})},ontimeout:function(){ok({status:0})}})})}

function _getJwt(){var m=document.cookie.match(/(^| )jwt_token=([^;]+)/);return m?m[2]:null}
function _getUid(){var j=_getJwt();if(!j)return null;try{var b=j.split('.')[1].replace(/-/g,'+').replace(/_/g,'/');return JSON.parse(atob(b+'='.repeat((4-b.length%4)%4))).sub}catch(e){return null}}
function _duoH(j){return{'Content-Type':'application/json; charset=UTF-8','Authorization':'Bearer '+j,'Accept':'application/json; charset=UTF-8','Origin':'https://www.duolingo.com','Referer':'https://www.duolingo.com/','User-Agent':navigator.userAgent}}
async function _fetchDuoUser(){var j=_getJwt(),u=_getUid();if(!j||!u)return null;var r=await _gmGet('https://www.duolingo.com/2017-06-30/users/'+u+'?fields=id,username',_duoH(j));if(r.data&&r.data.username){_duoUser=r.data.username;return _duoUser}return null}
async function _fetchDuoFull(){var j=_getJwt(),u=_getUid();if(!j||!u)return null;var r=await _gmGet('https://www.duolingo.com/2017-06-30/users/'+u+'?fields=id,username,fromLanguage,learningLanguage,totalXp,gems,streak,streakData,timezone',_duoH(j));if(r.data&&r.data.id){_duoFullData=r.data;return r.data}return null}

function _findVip(key){return _G('vip_users',[]).find(function(u){return u.key===key})}
function _genKey(){var c='ABCDEFGHJKLMNPQRSTUVWXYZ23456789',k='';for(var i=0;i<4;i++)k+=c.charAt(Math.floor(Math.random()*c.length));if(_findVip(k))return _genKey();return k}

function _enKey(){var uid=_duoUser||_getUid()||'unknown';return 'en_st_'+uid}
function _dKey(){var n=new Date(Date.now()+7*3600000);return n.getUTCFullYear()+'-'+String(n.getUTCMonth()+1).padStart(2,'0')+'-'+String(n.getUTCDate()).padStart(2,'0')}
function _getEn(){var k=_enKey(),s=_G(k,{});if(s.d!==_dKey())return MAX_EN;return s.e!==undefined?s.e:MAX_EN}
function _useEn(c){var d=_dKey(),k=_enKey(),s=_G(k,{});if(s.d!==d)s={d:d,e:MAX_EN};s.e=Math.max(0,s.e-c);_S(k,s);return s.e}
function _canEn(c){return _isUnl()?true:_getEn()>=c}
function _isUnl(){return _tier==='VIP'||_tier==='ADMIN'}

function _startCv(){var btn=$('ds-cr-btn'),cv=$('ds-lcv');if(!cv||!btn)return;if(_linkRaf)cancelAnimationFrame(_linkRaf);var W=btn.offsetWidth||280,H=btn.offsetHeight||44;cv.width=W;cv.height=H;var ctx=cv.getContext('2d');var C=['#a78bfa','#38bdf8','#34d399','#f472b6','#fbbf24','#7c3aed'];var sp=Array.from({length:18},function(){return{x:Math.random()*W,y:H/2,vx:(Math.random()-.5)*4,vy:(Math.random()-.5)*3,l:0,ml:16+Math.random()*18,c:C[Math.floor(Math.random()*C.length)],r:.7+Math.random()*2,g:.08+Math.random()*.06,t:[]}});var t=0;function fr(){ctx.clearRect(0,0,W,H);t++;var sx=((t*1.4)%(W+60))-30;var sg=ctx.createLinearGradient(sx-50,0,sx+30,0);sg.addColorStop(0,'transparent');sg.addColorStop(.5,'rgba(167,139,250,.12)');sg.addColorStop(1,'transparent');ctx.fillStyle=sg;ctx.fillRect(0,0,W,H);sp.forEach(function(s){s.l++;if(s.l>s.ml||s.x<0||s.x>W||s.y<0||s.y>H){s.x=W*.2+Math.random()*W*.6;s.y=H/2+(Math.random()-.5)*H*.4;s.vx=(Math.random()-.5)*4;s.vy=(Math.random()-.5)*3;s.l=0;s.c=C[Math.floor(Math.random()*C.length)];s.t=[]}s.t.push({x:s.x,y:s.y});if(s.t.length>6)s.t.shift();s.vy+=s.g;s.x+=s.vx;s.y+=s.vy;var a=1-s.l/s.ml;for(var i=1;i<s.t.length;i++){var p=i/s.t.length;ctx.beginPath();ctx.moveTo(s.t[i-1].x,s.t[i-1].y);ctx.lineTo(s.t[i].x,s.t[i].y);ctx.strokeStyle=s.c;ctx.globalAlpha=p*a*.5;ctx.lineWidth=p*s.r*1.5;ctx.stroke()}ctx.globalAlpha=1;ctx.beginPath();ctx.arc(s.x,s.y,s.r*a,0,Math.PI*2);ctx.fillStyle=s.c;ctx.globalAlpha=a*.8;ctx.fill();ctx.globalAlpha=1});_linkRaf=requestAnimationFrame(fr)}fr()}
function _stopCv(){if(_linkRaf){cancelAnimationFrame(_linkRaf);_linkRaf=null}var c=$('ds-lcv');if(c)c.getContext('2d').clearRect(0,0,c.width,c.height)}

function _playRnd(){var i;do{i=Math.floor(Math.random()*MUSIC.length)}while(i===_mIdx&&MUSIC.length>1);_mIdx=i;_playM(i)}
function _playM(i){var m=MUSIC[i],f=$('ds-mif'),t=$('ds-mt'),b=$('ds-mp');if(!f||!t)return;f.src='https://www.youtube.com/embed/'+m.id+'?autoplay=1&loop=1&playlist='+m.id;t.textContent='#'+(i+1)+' '+m.t;_mPlay=true;if(b)b.textContent='⏸️ DỪNG'}
function _stopM(){var f=$('ds-mif'),b=$('ds-mp'),t=$('ds-mt');if(f)f.src='';_mPlay=false;if(b)b.textContent='▶️ PHÁT';if(t)t.textContent='🎵 Nhấn PHÁT'}

function _startCD(sec){if(_cdTimer)clearInterval(_cdTimer);_cdRemain=Math.ceil(sec);var btn=$('ds-cr-btn');if(btn){btn.disabled=true;btn.textContent='⏳ CHỜ '+_fmtCD(_cdRemain)}var cdEl=$('ds-cd-txt');if(cdEl)cdEl.style.display='';_cdTimer=setInterval(function(){_cdRemain--;if(_cdRemain<=0){clearInterval(_cdTimer);_cdTimer=null;_cdRemain=0;if(btn){btn.disabled=false;btn.textContent='⚡ TẠO LINK'}if(cdEl)cdEl.style.display='none';_toast('✅ Có thể tạo link!','ok',2000)}else{if(btn)btn.textContent='⏳ CHỜ '+_fmtCD(_cdRemain);if(cdEl)cdEl.textContent='⏳ Cooldown: '+_fmtCD(_cdRemain)}},1000)}

async function _actS3(){if(_activating)return;if(!_canEn(COST_S3)){_toast('💤 Không đủ năng lượng!','err');return}var btn=$('ds-s3b');if(!btn)return;_activating=true;btn.disabled=true;btn.textContent='⏳ ĐANG KÍCH HOẠT...';_logC('ds-ls3');_log('ds-ls3','Đang lấy thông tin...','i');try{var j=_getJwt(),u=_getUid();if(!j||!u){_log('ds-ls3','❌ Đăng nhập Duolingo!','e');return}var h=_duoH(j);var ur=await _gmGet('https://www.duolingo.com/2017-06-30/users/'+u+'?fields=id,username,fromLanguage,learningLanguage',h);if(!ur.data||!ur.data.username){_log('ds-ls3','❌ Không lấy user!','e');return}_log('ds-ls3','👤 '+ur.data.username,'o');var r=await _gmPost('https://www.duolingo.com/2017-06-30/users/'+u+'/shop-items',{itemName:'immersive_subscription',isFree:true,consumed:true,fromLanguage:ur.data.fromLanguage||'en',learningLanguage:ur.data.learningLanguage||'es',productId:'com.duolingo.immersive_free_trial_subscription'},h);if(r.status===200||r.status===201){if(!_isUnl())_useEn(COST_S3);_log('ds-ls3','✅ THÀNH CÔNG!','o');_toast('🎉 Super 3 ngày!','ok',4000);_updEn()}else if(r.status===409){_log('ds-ls3','⚠️ Đã có Super!','w')}else{_log('ds-ls3','❌ HTTP '+r.status+' '+JSON.stringify(r.data).substring(0,80),'e')}}catch(e){_log('ds-ls3','❌ '+e.message,'e')}finally{setTimeout(function(){_activating=false;btn.disabled=false;btn.textContent='⚡ KÍCH HOẠT SUPER 3 NGÀY (3⚡)'},500)}}

function _hackLog(m,tp){_log('ds-hlog',m,tp)}
function _hackLogC(){_logC('ds-hlog')}
function _updHackProg(type,pct){var f=$('dh-'+type+'-fill'),p=$('dh-'+type+'-prog');if(f)f.style.width=Math.min(100,Math.max(0,pct))+'%';if(p){if(pct>0&&pct<100)p.classList.add('on');if(pct>=100)setTimeout(function(){p.classList.remove('on')},2000)}}
function _updHackStats(){var d=_duoFullData;if(!d)return;var xe=$('dh-xp-val'),ge=$('dh-gem-val'),se=$('dh-streak-val');if(xe)xe.textContent=(d.totalXp||0).toLocaleString();if(ge)ge.textContent=(d.gems||0).toLocaleString();if(se)se.textContent=d.streak||0}
function _updStatus(m,c){var e=$('dh-status');if(e){e.textContent=m;e.style.color=c||'#00ff64';e.style.background=c==='#ff4b4b'?'rgba(255,75,75,.08)':c==='#ffc800'?'rgba(255,200,0,.08)':'rgba(0,255,100,.08)'}}
function _updHackerUser(){var u=_duoUser||'Chưa đăng nhập';var ne=$('dh-username');if(ne)ne.textContent='👤 '+u;var tb=$('dh-tier-badge');if(tb){if(_tier==='ADMIN'){tb.textContent='ADMIN';tb.className='ds-bdg ds-bdga'}else if(_tier==='VIP'){tb.textContent='VIP';tb.className='ds-bdg ds-bdgv'}else{tb.textContent='FREE';tb.className='ds-bdg ds-bdgf'}}}
function _updHackerEn(){var v=$('dh-en-val'),f=$('dh-en-fill'),w=$('dh-energy-wrap');if(!v||!f)return;if(_isUnl()){v.textContent='♾️';v.style.color='#FFD700';f.style.width='100%';f.className='dh-energy-fill dh-eful';if(w)w.style.display='none'}else{var e=_getEn(),p=Math.round(e/MAX_EN*100);v.textContent=e+'/'+MAX_EN;v.style.color='';f.style.width=p+'%';f.className='dh-energy-fill '+(p>50?'dh-efhi':p>20?'dh-efmd':'dh-eflo');if(w)w.style.display=''}}

async function _hackXP(amount){var j=_getJwt(),u=_getUid();if(!j||!u)throw new Error('Đăng nhập Duolingo!');var h=_duoH(j);var earned=0,loops=0,consecFail=0;var _isInf=amount>=99999;while(_hackRunning&&_hackTask==='xp'){if(!_isInf&&earned>=amount)break;if(!_isUnl()&&_getEn()<HACK_EN_COST){_hackLog('💤 Hết năng lượng!','w');break}try{var now=Math.floor(Date.now()/1000),dur=Math.floor(Math.random()*121+300);var r=await _gmPost('https://stories.duolingo.com/api2/stories/fr-en-le-passeport/complete',{awardXp:true,completedBonusChallenge:true,fromLanguage:'fr',learningLanguage:'en',hasXpBoost:false,illustrationFormat:'svg',isFeaturedStoryInPracticeHub:true,isLegendaryMode:true,isV2Redo:false,isV2Story:false,masterVersion:true,maxScore:0,score:0,happyHourBonusXp:469,startTime:now,endTime:now+dur},h);if(r.status===200){var xp=r.data&&r.data.awardedXp?r.data.awardedXp:499;consecFail=0;if(!_isUnl())_useEn(HACK_EN_COST);earned+=xp;loops++;_hackLog('✅ +'+xp+' XP','o');if(_duoFullData)_duoFullData.totalXp=(_duoFullData.totalXp||0)+xp}else if(r.status===429){consecFail++;if(consecFail>=5){_hackLog('❌ Rate-limited!','e');break}await _sleep(3000);continue}else{consecFail++;if(consecFail>=5){_hackLog('❌ Quá nhiều lỗi!','e');break}await _sleep(2000);continue}}catch(e){consecFail++}_updHackProg('xp',_isInf?((loops%9)*11+1):Math.min(100,Math.floor(earned/amount*100)));_updHackerEn();await _sleep(_G('safe_m','')?3000:1000)}return earned}

async function _hackGems(amount){var j=_getJwt(),u=_getUid();if(!j||!u)throw new Error('Đăng nhập Duolingo!');var h=_duoH(j);var total=0,consecFail=0;var _isInf=amount>=99999;while(_hackRunning&&_hackTask==='gem'){if(!_isInf&&total>=amount)break;if(!_isUnl()&&_getEn()<HACK_EN_COST){_hackLog('💤 Hết năng lượng!','w');break}try{var rr=await _gmGet('https://www.duolingo.com/2023-05-23/users/'+u+'?fields=rewardBundles{rewards}',h);if(!rr.data||!rr.data.rewardBundles){consecFail++;if(consecFail>=5)break;await _sleep(3000);continue}var gems=[];(rr.data.rewardBundles||[]).forEach(function(b){(b.rewards||[]).forEach(function(rw){if(!rw.consumed&&(rw.id||'').match(/^SKILL_COMPLETION/))gems.push({id:rw.id,amount:rw.amount||0})})});if(gems.length===0){_hackLog('⚠️ Không có reward...','w');await _sleep(_G('safe_m','')?2000:500);continue}consecFail=0;var results=await Promise.all(gems.map(function(g){return _gmPatch('https://www.duolingo.com/2023-05-23/users/'+u+'/rewards/'+g.id,{consumed:true,fromLanguage:_duoFullData&&_duoFullData.fromLanguage||'en',learningLanguage:_duoFullData&&_duoFullData.learningLanguage||'en'},h)}));var batch=0;results.forEach(function(ok,i){if(ok.status===200)batch+=gems[i].amount||0});if(batch>0){if(!_isUnl())_useEn(HACK_EN_COST);total+=batch;_hackLog('✅ +'+batch+' KC','o');if(_duoFullData)_duoFullData.gems=(_duoFullData.gems||0)+batch}}catch(e){consecFail++}_updHackProg('gem',_isInf?((total>0?50:0)):Math.min(100,Math.floor(total/amount*100)));_updHackerEn();await _sleep(_G('safe_m','')?2000:400)}return total}

async function _hackStreak(days){var j=_getJwt(),u=_getUid();if(!j||!u)throw new Error('Đăng nhập Duolingo!');var h=_duoH(j);var done=0,consecFail=0;var _isInf=days>=9999;var tz=(_duoFullData&&_duoFullData.timezone)||Intl.DateTimeFormat().resolvedOptions().timeZone;var base;var dateStr=_duoFullData&&_duoFullData.streakData&&_duoFullData.streakData.currentStreak&&_duoFullData.streakData.currentStreak.startDate;if(dateStr&&/^\d{4}-\d{2}-\d{2}$/.test(dateStr)){var p=dateStr.split('-');base={y:+p[0],m:+p[1],d:+p[2]}}else{var dtf=new Intl.DateTimeFormat('en-US',{timeZone:tz,year:'numeric',month:'2-digit',day:'2-digit'});var parts={};dtf.formatToParts(new Date()).forEach(function(x){if(x.type!=='literal')parts[x.type]=x.value});base={y:+parts.year,m:+parts.month,d:+parts.day}}function wallClockToSecs(y,m,d,h,mn,s){var guess=Date.UTC(y,m-1,d,h,mn,s);var dtf2=new Intl.DateTimeFormat('en-US',{timeZone:tz,hourCycle:'h23',year:'numeric',month:'2-digit',day:'2-digit',hour:'2-digit',minute:'2-digit',second:'2-digit'});var o={};dtf2.formatToParts(new Date(guess)).forEach(function(x){if(x.type!=='literal')o[x.type]=x.value});var localAsUtc=Date.UTC(+o.year,+o.month-1,+o.day,+o.hour,+o.minute,+o.second);return Math.floor((guess-(localAsUtc-guess))/1000)}while(_hackRunning&&_hackTask==='streak'){if(!_isInf&&done>=days)break;if(!_isUnl()&&_getEn()<HACK_EN_COST){_hackLog('💤 Hết năng lượng!','w');break}var endSecs=wallClockToSecs(base.y,base.m,base.d-1-done,12,0,0);var sess=null;try{var sr=await _gmPost('https://www.duolingo.com/2017-06-30/sessions',{challengeTypes:['assist','translate','listen','select','match','judge','dialogue','characterIntro','completeReverseTranslation'],fromLanguage:_duoFullData&&_duoFullData.fromLanguage||'en',learningLanguage:_duoFullData&&_duoFullData.learningLanguage||'en',type:'GLOBAL_PRACTICE',isFinalLevel:false,isV2:true,juicy:true,smartTipsVersion:2},h);if(sr.status===200&&sr.data&&sr.data.id)sess=sr.data}catch(e){}if(!sess){consecFail++;if(consecFail>=5){_hackLog('❌ Quá nhiều lỗi!','e');break}await _sleep(2000);continue}try{var ur=await _gmPut('https://www.duolingo.com/2017-06-30/sessions/'+sess.id,Object.assign({},sess,{heartsLeft:5,startTime:endSecs-1,endTime:endSecs,enableBonusPoints:false,failed:false,maxInLessonStreak:9,shouldLearnThings:true}),h);if(ur.status===200){consecFail=0;if(!_isUnl())_useEn(HACK_EN_COST);done++;_hackLog('✅ +'+done+' Streak','o');if(_duoFullData)_duoFullData.streak=(_duoFullData.streak||0)+1}else{consecFail++;if(consecFail>=5){_hackLog('❌ Rate-limited!','e');break}}}catch(e){consecFail++}_updHackProg('streak',_isInf?((done%9)*11+1):Math.min(100,Math.floor(done/days*100)));_updHackerEn();await _sleep(_G('safe_m','')?3000:1000)}return done}

function _switchToHacker(){_showingHacker=true;$('ds-main').style.display='none';$('ds-hacker-panel').style.display='flex';$('ds-hdt').innerHTML='Duolingo <span>Hacker</span>';var btn=$('ds-toggle-btn');btn.textContent='⚡ Get Super';btn.className='ds-toggle-btn to-super';_updHackerUser();_updHackerEn();_updStatus('⏳ Đang tải...','#FFCD00');_fetchDuoFull().then(function(){_updHackStats();_updHackerUser();_updStatus('✅ Sẵn sàng','#00ff64')});if(_isUnl()){$('dh-xp-cost').textContent='♾️ Miễn phí';$('dh-gem-cost').textContent='♾️ Miễn phí';$('dh-streak-cost').textContent='♾️ Miễn phí'}else{$('dh-xp-cost').textContent='⚡'+HACK_EN_COST+'/lần';$('dh-gem-cost').textContent='⚡'+HACK_EN_COST+'/lần';$('dh-streak-cost').textContent='⚡'+HACK_EN_COST+'/ngày'}}
function _switchToSuper(){_showingHacker=false;$('ds-hacker-panel').style.display='none';$('ds-main').style.display='flex';$('ds-hdt').innerHTML='Duolingo <span>Get Super</span>';var btn=$('ds-toggle-btn');btn.textContent='🛡️ Hacker';btn.className='ds-toggle-btn to-hacker';_updEn()}

GM_addStyle('#ds-r{--bg:#0a0a0a;--sf:#1a1a1a;--bd:#333;--tx:#fff;--mu:#888;--go:#FFD700;--cr:16px;--br:10px}#ds-r[data-red="1"]{--go:#ff4b4b;--bd:#ff4b4b}#ds-r[data-red="1"] .ds-hdt span{color:#ff4b4b}#ds-r *{box-sizing:border-box;font-family:"Segoe UI",Arial,sans-serif!important}.ds-sh{position:fixed;right:16px;bottom:16px;z-index:2147483647;display:flex;flex-direction:column;align-items:flex-end;gap:8px;transition:bottom .3s}.ds-tg{display:flex;align-items:center;gap:7px;padding:7px 15px 7px 10px;border-radius:99px;border:1.5px solid rgba(255,215,0,.3);background:var(--bg);cursor:pointer;box-shadow:0 2px 16px rgba(255,215,0,.18);user-select:none;color:var(--tx)}.ds-tg:hover{transform:translateY(-2px);box-shadow:0 6px 24px rgba(255,215,0,.3)}.ds-tgl{font-size:12px;font-weight:700;color:var(--go)}.ds-cd{width:380px;background:var(--bg);border:2px solid var(--go);border-radius:var(--cr);box-shadow:0 8px 32px rgba(255,215,0,.15);overflow:hidden;max-height:85vh;display:flex;flex-direction:column;position:relative;color:var(--tx);transition:opacity .3s}.ds-hd{background:linear-gradient(135deg,#1a1a0a,#0a0a1a);padding:12px 14px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid rgba(255,215,0,.2);flex-shrink:0;gap:8px}.ds-hdl{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.ds-hdt{font-size:15px;font-weight:900;color:var(--go);white-space:nowrap}.ds-hdt span{color:#FF6B6B}.ds-ub{font-size:11px;font-weight:800;color:#fff;background:linear-gradient(135deg,#1cb0f3,#0099cc);padding:3px 10px;border-radius:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.ds-hdr{display:flex;align-items:center;gap:6px;flex-shrink:0}.ds-sbtn{background:none;border:1px solid var(--bd);color:var(--mu);cursor:pointer;font-size:16px;transition:all .2s;padding:4px 8px;border-radius:8px}.ds-sbtn:hover{transform:rotate(90deg);color:var(--go);border-color:var(--go)}.ds-sec{padding:12px 14px;display:flex;flex-direction:column;gap:8px}.ds-lb{font-size:11px;font-weight:700;color:var(--go);text-transform:uppercase;letter-spacing:1px}.ds-sm{font-size:12px;font-weight:600;color:var(--mu)}.ds-iw{display:flex;align-items:center;gap:8px;border:1.5px solid var(--bd);border-radius:10px;padding:0 12px;background:var(--sf);height:44px;flex:1;min-width:0}.ds-iw:focus-within{border-color:var(--go)}.ds-in{flex:1;min-width:0;border:none;background:none;outline:none;font-size:13px;font-weight:700;color:var(--tx);height:44px}.ds-in::placeholder{color:var(--mu);opacity:.6}.ds-b{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:44px;padding:0 16px;border-radius:var(--br);border:2px solid transparent;font-size:13px;font-weight:800;cursor:pointer;transition:all .15s;white-space:nowrap;flex-shrink:0;position:relative;overflow:hidden}.ds-b:hover{transform:translateY(-2px);filter:brightness(1.1)}.ds-b:active{transform:translateY(1px);filter:brightness(.9)}.ds-b:disabled{opacity:.4;cursor:not-allowed;transform:none!important}.ds-b.busy{pointer-events:none;opacity:.7}.ds-bp{background:linear-gradient(135deg,#FFD700,#FFA500);color:#000;box-shadow:0 3px 0 #B8860B}.ds-bg{background:linear-gradient(135deg,#58cc02,#2d9e00);color:#fff;box-shadow:0 3px 0 #1a6b00}.ds-bpk{background:linear-gradient(135deg,#7c3aed,#ec4899);color:#fff;box-shadow:0 3px 0 #5b21b6}.ds-bo{background:linear-gradient(135deg,#ff6b00,#ff9500);color:#fff;box-shadow:0 3px 0 #cc5500}.ds-bd{background:linear-gradient(135deg,#ff4b4b,#cc0000);color:#fff;box-shadow:0 3px 0 #990000}.ds-bu{background:linear-gradient(135deg,#ff9500,#ff6b00);color:#fff;box-shadow:0 3px 0 #cc5500;animation:ds-pulse 2s ease-in-out infinite}@keyframes ds-pulse{0%,100%{box-shadow:0 3px 0 #cc5500,0 0 0 0 rgba(255,149,0,.4)}50%{box-shadow:0 3px 0 #cc5500,0 0 0 8px rgba(255,149,0,0)}}.ds-bo2{background:transparent;border:2px solid var(--bd);color:var(--tx);box-shadow:none}.ds-bo2:hover{border-color:var(--go);color:var(--go)}.ds-bf{width:100%}.ds-bs{height:36px;font-size:12px;padding:0 12px}.ds-dv{height:1px;background:var(--bd);margin:0;flex-shrink:0}.ds-rw{display:flex;align-items:center;gap:8px}.ds-bt{display:flex;align-items:center;justify-content:space-between}.ds-bdg{display:inline-flex;align-items:center;padding:3px 12px;border-radius:99px;font-size:10px;font-weight:800;text-transform:uppercase}.ds-bdgf{background:#d7ffb8;color:#2d6a00}.ds-bdgv{background:linear-gradient(135deg,#FFD700,#FFA500);color:#000}.ds-bdga{background:linear-gradient(135deg,#ff4b4b,#ff0000);color:#fff}.ds-tabs{display:flex;border-bottom:1px solid var(--bd);padding:0 8px;flex-shrink:0}.ds-tab{flex:1;padding:10px 4px 9px;border:none;background:none;font-size:11px;font-weight:800;color:var(--mu);cursor:pointer;transition:color .2s;border-bottom:2px solid transparent}.ds-tab:hover{color:var(--tx)}.ds-tab.on{color:var(--go);border-bottom-color:var(--go)}.ds-pn{display:none;flex-direction:column}.ds-pn.on{display:flex;flex:1;overflow-y:auto;min-height:0}.ds-pn.on::-webkit-scrollbar{width:4px}.ds-pn.on::-webkit-scrollbar-thumb{background:var(--bd);border-radius:4px}.ds-log{background:var(--sf);border:1.5px solid var(--bd);border-radius:10px;padding:10px 12px;font-size:11px;font-family:"Courier New",monospace!important;color:#adff2f;max-height:200px;overflow-y:auto;white-space:pre-wrap;word-break:break-all;line-height:1.6;position:relative}.ds-log::-webkit-scrollbar{width:4px}.ds-log::-webkit-scrollbar-thumb{background:var(--bd);border-radius:4px}.ds-le{display:block;animation:ds-ls .2s ease both}@keyframes ds-ls{from{opacity:0;transform:translateX(-6px)}to{opacity:1;transform:none}}.lo{color:#adff2f}.le{color:#ff4b4b}.li{color:#1cb0f3}.lw{color:#ffc800}.ds-ft{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;font-size:10px;color:var(--mu);flex-shrink:0}.ds-tw{position:absolute;bottom:50px;left:50%;transform:translateX(-50%);z-index:200;display:flex;flex-direction:column;align-items:center;gap:5px;pointer-events:none;width:calc(100% - 30px)}.ds-tst{display:flex;align-items:center;gap:7px;padding:8px 14px;border-radius:10px;font-size:12px;font-weight:700;animation:ds-tu .3s cubic-bezier(.34,1.4,.64,1) both;border:1px solid rgba(255,255,255,.1);backdrop-filter:blur(12px)}.ds-tst.out{animation:ds-td .2s ease-in forwards}@keyframes ds-tu{from{opacity:0;transform:translateY(8px) scale(.93)}to{opacity:1;transform:none}}@keyframes ds-td{to{opacity:0;transform:translateY(5px) scale(.95)}}.ds-tst-ok{background:rgba(15,25,15,.9);color:#fff;border-color:rgba(88,204,2,.3)}.ds-tst-err{background:rgba(30,10,10,.9);color:#fff;border-color:rgba(255,75,75,.3)}.ds-tst-warn{background:rgba(28,20,5,.9);color:#ffc800;border-color:rgba(255,200,0,.3)}.ds-tst-info{background:rgba(8,18,30,.9);color:#fff;border-color:rgba(28,176,243,.3)}.ds-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.ds-tst-ok .ds-dot{background:#58cc02}.ds-tst-err .ds-dot{background:#ff4b4b}.ds-tst-warn .ds-dot{background:#ffc800}.ds-tst-info .ds-dot{background:#1cb0f3}.ds-si{display:flex;justify-content:space-between;align-items:center;padding:10px 0;border-bottom:1px solid var(--bd)}.ds-si:last-child{border-bottom:none}.ds-sw{width:44px;height:24px;background:var(--bd);border-radius:12px;cursor:pointer;position:relative;transition:background .25s;flex-shrink:0}.ds-sw.on{background:var(--go)}.ds-sw::after{content:"";position:absolute;width:20px;height:20px;background:#fff;border-radius:50%;top:2px;left:2px;transition:transform .25s;box-shadow:0 1px 4px rgba(0,0,0,.3)}.ds-sw.on::after{transform:translateX(20px)}#ds-main{display:none;flex-direction:column;flex:1;min-height:0;overflow:hidden}#ds-hacker-panel{display:none;flex-direction:column;flex:1;min-height:0;overflow:hidden}#ds-so{display:none;position:fixed;inset:0;background:rgba(0,0,0,.65);z-index:2147483646}#ds-so.on{display:block}#ds-sm{display:none;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:350px;background:var(--bg);border:2px solid var(--go);border-radius:16px;box-shadow:0 12px 48px rgba(0,0,0,.7);z-index:2147483647;flex-direction:column;overflow:hidden;max-height:80vh}#ds-sm.on{display:flex}.ds-sh2{display:flex;justify-content:space-between;align-items:center;padding:14px;border-bottom:1px solid var(--bd);background:linear-gradient(135deg,#1a1a0a,#0a0a1a)}.ds-mp2{display:flex;flex-direction:column;gap:8px;padding:10px 14px}.ds-miw{width:100%;border-radius:10px;overflow:hidden;background:#000}.ds-miw iframe{width:100%;height:160px;border:none}.ds-mt2{font-size:12px;font-weight:700;color:var(--go);text-align:center;padding:4px}.ds-mc{display:flex;gap:8px}.ds-mc .ds-b{flex:1;height:38px;font-size:12px}.ds-pw{height:8px;background:var(--sf);border-radius:99px;overflow:hidden;border:1px solid var(--bd);position:relative}.ds-pf{height:100%;border-radius:99px;background:linear-gradient(90deg,#7c3aed,#1cb0f3,#34d399,#f472b6,#7c3aed);background-size:300%;transition:width .65s cubic-bezier(.34,1.2,.64,1);animation:ds-rs 3s linear infinite}.ds-pf::before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.3),transparent);background-size:200%;animation:ds-ps 1.8s ease-in-out infinite;border-radius:99px}@keyframes ds-rs{to{background-position:300% center}}@keyframes ds-ps{from{background-position:200% 0}to{background-position:-200% 0}}.ds-lcv{position:absolute;inset:0;pointer-events:none;border-radius:var(--br);opacity:0;transition:opacity .3s}.ds-b.busy .ds-lcv{opacity:1}.ds-ap{flex:1;overflow-y:auto;min-height:0;padding:12px 14px}.ds-at{color:#ff4b4b;font-weight:900;font-size:14px;text-transform:uppercase;margin-bottom:12px}.ds-al{max-height:350px;overflow-y:auto;display:flex;flex-direction:column;gap:4px}.ds-al::-webkit-scrollbar{width:4px}.ds-al::-webkit-scrollbar-thumb{background:var(--bd);border-radius:4px}.ds-uc{display:flex;align-items:center;padding:8px 10px;background:var(--sf);border:1px solid rgba(255,215,0,.3);border-radius:8px;font-size:12px;gap:8px}.ds-uc .ds-un{font-weight:700;color:var(--tx);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ds-uc .ds-uk{font-size:10px;color:var(--mu);font-family:monospace!important}.ds-uc .ds-vb{font-size:9px;font-weight:900;color:#000;background:linear-gradient(135deg,#FFD700,#FFA500);padding:2px 8px;border-radius:4px;text-transform:uppercase;flex-shrink:0}.ds-uc .ds-rv{height:28px;padding:0 10px;border-radius:6px;border:none;font-size:10px;font-weight:800;cursor:pointer;flex-shrink:0;background:#ff4b4b;color:#fff}.ds-ra{padding:10px 14px;border-top:1px solid var(--bd);display:flex;gap:8px;flex-shrink:0}.ds-s3{background:linear-gradient(135deg,rgba(255,107,0,.08),rgba(255,149,0,.08));border:1.5px solid rgba(255,149,0,.3);border-radius:12px;padding:14px;display:flex;flex-direction:column;gap:10px}.ds-s3t{font-size:14px;font-weight:900;color:#FFA500}.ds-s3d{font-size:11px;color:var(--mu);line-height:1.5}.ds-ew{background:var(--sf);border:1.5px solid var(--bd);border-radius:10px;padding:10px 14px;display:flex;flex-direction:column;gap:6px}.ds-eh{display:flex;justify-content:space-between;align-items:center}.ds-el{font-size:11px;font-weight:700;color:var(--go);text-transform:uppercase;letter-spacing:1px;display:flex;align-items:center;gap:6px}.ds-ev{font-size:14px;font-weight:900}.ds-eb{height:10px;background:rgba(255,255,255,.05);border-radius:99px;overflow:hidden;border:1px solid var(--bd)}.ds-ef{height:100%;border-radius:99px;transition:width .5s}.ds-efhi{background:linear-gradient(90deg,#58cc02,#2d9e00)}.ds-efmd{background:linear-gradient(90deg,#ffc800,#ff9500)}.ds-eflo{background:linear-gradient(90deg,#ff4b4b,#cc0000)}.ds-eful{background:linear-gradient(90deg,#FFD700,#FFA500)}.ds-ec{display:flex;gap:8px;font-size:10px;color:var(--mu)}.ds-ec span{background:rgba(255,255,255,.03);padding:2px 8px;border-radius:6px;border:1px solid var(--bd)}.ds-ti{background:var(--sf);border:1.5px solid var(--bd);border-radius:10px;padding:10px 14px;display:flex;justify-content:space-between;align-items:center}.ds-ti .tl{font-size:11px;color:var(--mu)}.ds-ti .tv{font-size:13px;font-weight:800}.tf{color:#58cc02}.tvv{color:#FFD700}.ta{color:#ff4b4b}.ds-ib{background:linear-gradient(135deg,rgba(28,176,243,.08),rgba(28,176,243,.03));border:1.5px solid rgba(28,176,243,.25);border-radius:10px;padding:10px 14px;display:flex;align-items:center;gap:10px;font-size:12px}.ds-in2{font-size:15px;font-weight:900;color:#1cb0f3}.ds-ih{font-size:10px;color:var(--mu);line-height:1.4}.ds-le2{background:rgba(255,215,0,.08);border:1.5px solid rgba(255,215,0,.3);border-radius:10px;padding:12px;display:flex;flex-direction:column;gap:8px}.ds-le2t{font-size:12px;font-weight:800;color:var(--go)}.ds-ct{display:inline-flex;align-items:center;padding:1px 7px;border-radius:5px;margin-left:4px;font-size:10px;font-weight:700;cursor:pointer;background:var(--sf);border:1px solid var(--bd);color:var(--mu);transition:transform .1s,background .12s,color .12s;vertical-align:middle}.ds-ct:hover{background:var(--go);color:#000;border-color:var(--go)}.ds-ct:active{transform:scale(.88)}.ds-ct.ok{background:#58cc02;color:#fff;border-color:#58cc02}.ds-gr{font-size:28px;font-weight:900;color:var(--go);font-family:monospace!important;letter-spacing:6px;text-align:center;padding:6px 0}.ds-upd-banner{display:none;align-items:center;gap:10px;padding:10px 14px;background:linear-gradient(135deg,rgba(255,149,0,.12),rgba(255,107,0,.08));border-bottom:1.5px solid rgba(255,149,0,.4);cursor:pointer;transition:background .2s;flex-shrink:0}.ds-upd-banner:hover{background:linear-gradient(135deg,rgba(255,149,0,.20),rgba(255,107,0,.15))}.ds-upd-ico{font-size:20px;flex-shrink:0;animation:ds-bounce 1.5s ease-in-out infinite}@keyframes ds-bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-3px)}}.ds-upd-info{flex:1;min-width:0}.ds-upd-title{font-size:12px;font-weight:800;color:#ff9500;line-height:1.3}.ds-upd-sub{font-size:10px;color:var(--mu);line-height:1.3;margin-top:1px}.ds-upd-btn{height:32px;padding:0 12px;border-radius:8px;border:none;font-size:11px;font-weight:800;cursor:pointer;background:linear-gradient(135deg,#ff9500,#ff6b00);color:#fff;box-shadow:0 2px 0 #cc5500;transition:all .15s;flex-shrink:0;white-space:nowrap}.ds-upd-btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.ds-upd-btn:active{transform:translateY(1px)}.ds-upd-close{background:none;border:none;color:var(--mu);font-size:16px;cursor:pointer;padding:4px 8px;border-radius:6px;flex-shrink:0;transition:all .15s;line-height:1}.ds-upd-close:hover{color:#ff4b4b;background:rgba(255,75,75,.15)}.ds-tob{display:flex;align-items:center;gap:4px}.ds-toggle-btn{height:34px;padding:0 14px;border-radius:99px;border:1.5px solid rgba(255,215,0,.4);background:var(--bg);cursor:pointer;font-size:11px;font-weight:800;transition:all .2s;white-space:nowrap;flex-shrink:0}.ds-toggle-btn:hover{transform:translateY(-2px)}.ds-toggle-btn.to-super{color:var(--go);border-color:rgba(255,215,0,.4)}.ds-toggle-btn.to-super:hover{box-shadow:0 4px 16px rgba(255,215,0,.25);border-color:rgba(255,215,0,.7)}.ds-toggle-btn.to-hacker{color:#00ff64;border-color:rgba(0,255,100,.4)}.ds-toggle-btn.to-hacker:hover{box-shadow:0 4px 16px rgba(0,255,100,.25);border-color:rgba(0,255,100,.7)}#ds-dob{display:none;position:fixed;inset:0;z-index:2147483647;background:rgba(0,0,0,.9);justify-content:center;align-items:center}#ds-dob .db{background:var(--bg);border:2px solid #ff4b4b;border-radius:16px;padding:24px;display:flex;flex-direction:column;align-items:center;gap:14px;max-width:340px;width:90%}#ds-dob .dt{font-size:16px;font-weight:900;color:#ff4b4b}#ds-dob .dd{font-size:12px;color:var(--mu);text-align:center}#ds-di{width:100%;height:44px;border:1.5px solid var(--bd);border-radius:10px;padding:0 14px;background:var(--sf);color:var(--tx);font-size:16px;font-weight:700;text-align:center;letter-spacing:4px;outline:none}#ds-di:focus{border-color:#ff4b4b}#ds-de{font-size:11px;color:#ff4b4b;display:none}.dh-body{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px}.dh-body::-webkit-scrollbar{width:4px}.dh-body::-webkit-scrollbar-thumb{background:var(--bd);border-radius:4px}.dh-stats{background:var(--sf);border:1.5px solid var(--bd);border-radius:10px;padding:10px 14px;display:flex;justify-content:space-around;text-align:center}.dh-stat-v{font-size:18px;font-weight:900;color:#fff}.dh-stat-l{font-size:10px;color:var(--mu);text-transform:uppercase;margin-top:2px}.dh-section{background:var(--sf);border:1.5px solid var(--bd);border-radius:10px;padding:12px;display:flex;flex-direction:column;gap:8px}.dh-section-t{font-size:13px;font-weight:800;color:var(--go);display:flex;justify-content:space-between;align-items:center}.dh-section-c{font-size:10px;color:var(--mu);font-weight:600}.dh-row{display:flex;gap:8px;align-items:center}.dh-input{flex:1;height:38px;border:1.5px solid var(--bd);border-radius:8px;padding:0 10px;background:#0a0a0a;color:var(--tx);font-size:13px;font-weight:700;outline:none}.dh-input:focus{border-color:#00ff64}.dh-btn{height:38px;padding:0 14px;border-radius:8px;border:none;font-size:12px;font-weight:800;cursor:pointer;transition:all .15s;white-space:nowrap}.dh-btn:hover{transform:translateY(-2px);filter:brightness(1.1)}.dh-btn:active{transform:translateY(1px)}.dh-btn:disabled{opacity:.4;cursor:not-allowed;transform:none!important}.dh-btn-go{background:linear-gradient(135deg,#00ff64,#00cc50);color:#000;box-shadow:0 3px 0 #009940}.dh-btn-stop{background:linear-gradient(135deg,#ff4b4b,#cc0000);color:#fff;box-shadow:0 3px 0 #990000}.dh-prog{height:6px;background:rgba(0,255,100,.08);border-radius:99px;overflow:hidden;border:1px solid rgba(0,255,100,.2)}.dh-prog.on{height:6px}.dh-fill{height:100%;border-radius:99px;background:linear-gradient(90deg,#00ff64,#00cc50,#00ff64);background-size:200%;width:0%;transition:width .5s;animation:dh-gs 2s linear infinite}@keyframes dh-gs{to{background-position:200% center}}.dh-log{background:#0a0a0a;border:1.5px solid var(--bd);border-radius:10px;padding:10px 12px;font-size:11px;font-family:"Courier New",monospace!important;color:#00ff64;max-height:160px;overflow-y:auto;white-space:pre-wrap;word-break:break-all;line-height:1.6}.dh-log::-webkit-scrollbar{width:4px}.dh-log::-webkit-scrollbar-thumb{background:var(--bd);border-radius:4px}.dh-status{font-size:12px;text-align:center;padding:8px;border-radius:8px;font-weight:700}.dh-footer{text-align:center;padding:8px;font-size:10px;color:var(--mu);flex-shrink:0;border-top:1px solid var(--bd)}.dh-user-bar{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;background:linear-gradient(135deg,rgba(28,176,243,.08),rgba(124,58,237,.05));border:1.5px solid rgba(28,176,243,.2);border-radius:10px}.dh-user-name{font-size:13px;font-weight:800;color:#1cb0f3}.dh-energy-wrap{background:var(--sf);border:1.5px solid var(--bd);border-radius:10px;padding:10px 14px;display:flex;flex-direction:column;gap:6px}.dh-energy-h{display:flex;justify-content:space-between;align-items:center}.dh-energy-label{font-size:11px;font-weight:700;color:var(--go);text-transform:uppercase;letter-spacing:1px}.dh-energy-val{font-size:14px;font-weight:900}.dh-energy-bar{height:8px;background:rgba(255,255,255,.05);border-radius:99px;overflow:hidden;border:1px solid var(--bd)}.dh-energy-fill{height:100%;border-radius:99px;transition:width .5s}.dh-efhi{background:linear-gradient(90deg,#58cc02,#2d9e00)}.dh-efmd{background:linear-gradient(90deg,#ffc800,#ff9500)}.dh-eflo{background:linear-gradient(90deg,#ff4b4b,#cc0000)}.dh-eful{background:linear-gradient(90deg,#FFD700,#FFA500)}.ds-quota-wrap{background:var(--sf);border:1.5px solid var(--bd);border-radius:10px;padding:8px 14px;display:flex;flex-direction:column;gap:5px}.ds-quota-h{display:flex;justify-content:space-between;align-items:center}.ds-quota-label{font-size:11px;font-weight:700;color:var(--go)}.ds-quota-val{font-size:12px;font-weight:800}.ds-quota-bar{height:6px;background:rgba(255,255,255,.05);border-radius:99px;overflow:hidden;border:1px solid var(--bd)}.ds-quota-fill{height:100%;border-radius:99px;background:linear-gradient(90deg,#1cb0f3,#7c3aed);transition:width .5s}.ds-cd-txt{font-size:11px;font-weight:700;color:#ffc800;display:none;text-align:center;padding:4px 0}');

function createUI(){var r=document.createElement('div');r.id='ds-r';r.innerHTML='<div class="ds-sh" id="ds-shell"><div class="ds-tob"><button class="ds-tg" id="ds-tog"><span style="font-size:15px">👁️</span><span class="ds-tgl" id="ds-togl">ẨN</span></button></div><div class="ds-cd" id="ds-card"><div class="ds-tw" id="ds-tw"></div><div class="ds-hd"><div class="ds-hdl"><div class="ds-hdt" id="ds-hdt">Duolingo <span>Integration</span></div><div class="ds-ub" id="ds-ub" style="display:none">👤 ...</div></div><div class="ds-hdr"><span class="ds-bdg ds-bdgf" id="ds-kb" style="display:none">FREE</span><button class="ds-sbtn" id="ds-sbtn" style="display:none">⚙️</button><button class="ds-toggle-btn to-super" id="ds-toggle-btn" style="display:none">⚡ Get Super</button></div></div><div class="ds-upd-banner" id="ds-update-banner" onclick="window.open(\''+GF_SCRIPT_URL+'\',\'_blank\')"><span class="ds-upd-ico">🔄</span><div class="ds-upd-info"><div class="ds-upd-title">⚠️ Có bản mới!</div><div class="ds-upd-sub">Phiên bản <span id="ds-update-ver">...</span> đã sẵn sàng</div></div><button class="ds-upd-btn" id="ds-update-btn">CẬP NHẬT</button><button class="ds-upd-close" id="ds-upd-close" title="Đóng">✕</button></div><div id="ds-so"></div><div id="ds-sm"><div class="ds-sh2"><div class="ds-lb" style="font-size:14px">⚙️ CÀI ĐẶT</div><button class="ds-b ds-bs ds-bd" id="ds-csm">✕</button></div><div class="ds-sec"><div class="ds-si"><span style="font-size:13px;font-weight:700">🛡️ Chế độ An Toàn</span><div class="ds-sw'+(_G('safe_m','')?' on':'')+'" id="ds-sws"></div></div><div class="ds-si"><span style="font-size:13px;font-weight:700">🔴 Chữ Đỏ</span><div class="ds-sw'+(_G('red_m','')?' on':'')+'" id="ds-swr"></div></div></div><div class="ds-dv"></div><div class="ds-lb" style="padding:12px 14px 4px">🎵 NGHE NHẠC</div><div class="ds-mp2"><div class="ds-miw"><iframe id="ds-mif" src="" allow="autoplay"></iframe></div><div class="ds-mt2" id="ds-mt">🎵 Nhấn PHÁT</div><div class="ds-mc"><button class="ds-b ds-bs ds-bg" id="ds-mp">▶️ PHÁT</button><button class="ds-b ds-bs ds-bo" id="ds-mr">🎲 RANDOM</button><button class="ds-b ds-bs ds-bd" id="ds-ms">⏹ DỪNG</button></div></div></div><div class="ds-sec" id="ds-auth"><div class="ds-lb">NHẬP KEY ĐỂ SỬ DỤNG</div><div class="ds-ib" id="ds-aib" style="display:none"><div><div style="font-size:10px;color:var(--mu);margin-bottom:2px">TÊN DUOLINGO</div><div class="ds-in2" id="ds-aun">...</div></div><div class="ds-ih">💡 Nói Admin: <strong style="color:#1cb0f3">"Em là <span id="ds-aun2">...</span>"</strong></div></div><div class="ds-rw"><div class="ds-iw"><input id="ds-ki" class="ds-in" type="password" placeholder="Nhập key..." autocomplete="off"></div><button class="ds-b ds-bp" id="ds-ubtn">NHẬP</button></div><button class="ds-b ds-bg ds-bf" id="ds-fbtn">🔑 DÙNG MIỄN PHÍ</button><div class="ds-bt"><span class="ds-sm">VIP = ♾️ năng lượng + Nhạc + Hacker</span><a href="'+ZALO+'" target="_blank" rel="noopener" class="ds-b ds-bs ds-bpk">NHẬN KEY VIP</a></div></div><div id="ds-main"><div class="ds-sec" style="padding-bottom:4px;gap:10px"><div class="ds-ib" id="ds-mib"><div><div style="font-size:10px;color:var(--mu);margin-bottom:2px">TÊN DUOLINGO</div><div class="ds-in2" id="ds-mun">...</div></div><span class="ds-bdg ds-bdgf" id="ds-tbdg">FREE</span></div><div class="ds-ti"><span class="tl">Gói hiện tại</span><span class="tv tf" id="ds-tdis">FREE</span></div><div class="ds-ew"><div class="ds-eh"><span class="ds-el">⚡ NĂNG LƯỢNG</span><span class="ds-ev" id="ds-env">25/25</span></div><div class="ds-eb"><div class="ds-ef ds-efhi" id="ds-enf" style="width:100%"></div></div><div class="ds-ec"><span>⚡ Link: 2</span><span>🌟 Super 3 ngày: 3</span><span>🛡️ Hacker: 2/lần</span></div></div></div><div class="ds-tabs"><button class="ds-tab on" data-tab="link">⚡ LINK</button><button class="ds-tab" data-tab="s3">🌟 SUPER</button><button class="ds-tab" data-tab="log">📋 LOG</button><button class="ds-tab" data-tab="admin" id="ds-ta" style="display:none">👑 ADMIN</button></div><div class="ds-pn on" id="ds-pn-link" style="padding:12px 14px;gap:10px"><div class="ds-bt"><span class="ds-lb">⚡ TẠO LINK FAMILY PLAN</span></div><div id="ds-lex"></div><button class="ds-b ds-bp ds-bf" id="ds-cr-btn" style="position:relative;overflow:hidden"><canvas class="ds-lcv" id="ds-lcv"></canvas>⚡ TẠO LINK</button><div class="ds-cd-txt" id="ds-cd-txt">⏳ Cooldown: 00:00</div><div class="ds-pw" id="ds-prog" style="display:none"><div class="ds-pf" id="ds-pf" style="width:0%"></div></div><div class="ds-log" id="ds-ll" style="max-height:350px">Sẵn sàng...</div></div><div class="ds-pn" id="ds-pn-s3" style="padding:12px 14px;gap:10px"><div class="ds-s3"><div class="ds-s3t">🌟 Kích hoạt Super (3⚡)</div><div class="ds-s3d">Super Duolingo miễn phí ~3 ngày. Cần đăng nhập.</div><button class="ds-b ds-bo ds-bf" id="ds-s3b">⚡ KÍCH HOẠT SUPER 3 NGÀY (3⚡)</button><div class="ds-pw" id="ds-ps3" style="display:none"><div class="ds-pf" id="ds-ps3f" style="width:0%"></div></div></div><div class="ds-log" id="ds-ls3">Nhấn nút để kích hoạt...</div></div><div class="ds-pn" id="ds-pn-log" style="padding:12px 14px;gap:10px"><div class="ds-bt"><div class="ds-lb">📋 LỊCH SỬ</div><button class="ds-b ds-bs ds-bg" id="ds-ca">📋 COPY ALL</button></div><div class="ds-bt"><button class="ds-b ds-bs ds-bo2" id="ds-lh">🔄 TẢI</button><button class="ds-b ds-bs ds-bd" id="ds-ch">🗑️ XÓA</button></div><div class="ds-log" id="ds-lh2" style="max-height:250px">Bấm 🔄 TẢI...</div></div><div class="ds-pn" id="ds-pn-admin"><div class="ds-ap"><div class="ds-at">👑 QUẢN LÝ VIP</div><div class="ds-sm" style="margin-bottom:8px;color:#ff4b4b;font-weight:700">🔑 API Key (Auto-Super backup):</div><div class="ds-rw"><div class="ds-iw"><input type="password" id="ds-admin-api" class="ds-in" placeholder="Nhập API key Auto-Super..." autocomplete="off"></div><button class="ds-b ds-bs ds-bg" id="ds-save-api">💾</button></div><div id="ds-api-st" class="ds-sm" style="margin:4px 0 12px;color:#ffc800">⚠️ Chưa có key</div><div class="ds-sm" style="margin-bottom:8px;color:#FFA500;font-weight:700">Nhập tên Duolingo → Tạo key VIP (4 ký tự):</div><div class="ds-rw"><div class="ds-iw"><input type="text" id="ds-vun" class="ds-in" placeholder="👤 Tên Duolingo..."></div><button class="ds-b ds-bs ds-bg" id="ds-avip">🔑 TẠO</button></div><div id="ds-gen-result"></div><div class="ds-dv" style="margin:8px 0"></div><div class="ds-lb" style="margin-bottom:6px">DANH SÁCH VIP</div><div class="ds-al" id="ds-vl"></div></div></div><div class="ds-ra"><button class="ds-b ds-bo2 ds-bs" id="ds-chk" style="flex:1">🔑 ĐỔI KEY</button><button class="ds-b ds-bd ds-bs" id="ds-rk" style="flex:1">🗑️ GỠ KEY</button></div></div><div id="ds-hacker-panel"><div class="dh-body"><div class="dh-user-bar"><span class="dh-user-name" id="dh-username">👤 Chưa đăng nhập</span><span class="ds-bdg ds-bdgf" id="dh-tier-badge">FREE</span></div><div class="dh-energy-wrap" id="dh-energy-wrap"><div class="dh-energy-h"><span class="dh-energy-label">⚡ NĂNG LƯỢNG</span><span class="dh-energy-val" id="dh-en-val">25/25</span></div><div class="dh-energy-bar"><div class="dh-energy-fill dh-efhi" id="dh-en-fill" style="width:100%"></div></div></div><div class="dh-stats"><div><div class="dh-stat-v" id="dh-xp-val">-</div><div class="dh-stat-l">⚡ XP</div></div><div><div class="dh-stat-v" id="dh-gem-val">-</div><div class="dh-stat-l">💎 Kim Cương</div></div><div><div class="dh-stat-v" id="dh-streak-val">-</div><div class="dh-stat-l">🔥 Streak</div></div></div><div class="dh-section"><div class="dh-section-t"><span>⚡ Farm XP (Story API ~499XP)</span><span class="dh-section-c" id="dh-xp-cost">⚡'+HACK_EN_COST+'/lần</span></div><div class="dh-row"><input type="number" class="dh-input" id="dh-xp-input" value="5000" min="100" max="99999"><button class="dh-btn dh-btn-go" id="dh-xp-btn">⚡ FARM XP</button></div><div class="dh-prog" id="dh-xp-prog"><div class="dh-fill" id="dh-xp-fill"></div></div></div><div class="dh-section"><div class="dh-section-t"><span>💎 Hack Kim Cương (Rewards)</span><span class="dh-section-c" id="dh-gem-cost">⚡'+HACK_EN_COST+'/lần</span></div><div class="dh-row"><input type="number" class="dh-input" id="dh-gem-input" value="10000" min="100" max="99999"><button class="dh-btn dh-btn-go" id="dh-gem-btn">💎 NHẬN KC</button></div><div class="dh-prog" id="dh-gem-prog"><div class="dh-fill" id="dh-gem-fill"></div></div></div><div class="dh-section"><div class="dh-section-t"><span>🔥 Hack Streak (Sessions)</span><span class="dh-section-c" id="dh-streak-cost">⚡'+HACK_EN_COST+'/ngày</span></div><div class="dh-row"><input type="number" class="dh-input" id="dh-streak-input" value="100" min="1" max="9999"><button class="dh-btn dh-btn-go" id="dh-streak-btn">🔥 TĂNG STREAK</button></div><div class="dh-prog" id="dh-streak-prog"><div class="dh-fill" id="dh-streak-fill"></div></div></div><div class="dh-log" id="ds-hlog">Sẵn sàng...</div><div class="dh-status" id="dh-status" style="background:rgba(0,255,100,.08);color:#00ff64">✅ Sẵn sàng</div></div><div class="dh-footer">🛡️ DuoHacker Methods v'+VER+'</div></div><div class="ds-dv"></div><div class="ds-ft"><span>v'+VER+'</span><a href="'+ZALO+'" target="_blank" rel="noopener" style="color:var(--go);text-decoration:none">Zalo Group</a></div></div></div><div id="ds-dob"><div class="db"><div class="dt">🔐 XÁC THỰC ADMIN</div><div class="dd">Nhập ngày sinh (ddMMyy)</div><input type="password" id="ds-di" placeholder="******" maxlength="6" autocomplete="off"><div id="ds-de">❌ Sai!</div><div style="display:flex;gap:8px;width:100%"><button class="ds-b ds-bs ds-bd" id="ds-dc" style="flex:1">HỦY</button><button class="ds-b ds-bs ds-bg" id="ds-dk" style="flex:1">OK</button></div></div></div>';document.body.appendChild(r)}

function bindEvents(){
$('ds-tog').onclick=function(){var c=$('ds-card'),s=$('ds-shell'),l=$('ds-togl');if(l.textContent==='ẨN'){s.style.bottom='-'+(c.scrollHeight-30)+'px';c.style.opacity='0';l.textContent='HIỆN'}else{s.style.bottom='16px';c.style.opacity='1';l.textContent='ẨN'}};
$('ds-sbtn').onclick=function(){$('ds-sm').classList.add('on');$('ds-so').classList.add('on')};
$('ds-csm').onclick=function(){$('ds-sm').classList.remove('on');$('ds-so').classList.remove('on')};
$('ds-so').onclick=function(){$('ds-sm').classList.remove('on');$('ds-so').classList.remove('on')};
$('ds-sws').onclick=function(){this.classList.toggle('on');_S('safe_m',this.classList.contains('on')?'1':'');_toast(this.classList.contains('on')?'🛡️ An toàn BẬT':'🛡️ An toàn TẮT','info',1500)};
$('ds-swr').onclick=function(){this.classList.toggle('on');$('ds-r').setAttribute('data-red',this.classList.contains('on')?'1':'');_S('red_m',this.classList.contains('on')?'1':'');_toast(this.classList.contains('on')?'🔴 ON':'🔴 OFF','info',1500)};
$('ds-fbtn').onclick=function(){doUnlock(FREE_KEY)};
$('ds-ubtn').onclick=function(){var k=$('ds-ki').value.trim();if(k)doUnlock(k)};
$('ds-ki').onkeydown=function(e){if(e.key==='Enter'){var k=this.value.trim();if(k)doUnlock(k)}};
document.querySelectorAll('.ds-tab').forEach(function(tab){tab.onclick=function(){document.querySelectorAll('.ds-tab').forEach(function(t){t.classList.remove('on')});tab.classList.add('on');document.querySelectorAll('.ds-pn').forEach(function(p){p.classList.remove('on')});var p=$('ds-pn-'+tab.dataset.tab);if(p)p.classList.add('on');if(tab.dataset.tab==='admin')renderVip()}});
$('ds-chk').onclick=function(){_sess=null;_tier=null;_isAdmin=false;_apiKey=null;_keyData=null;_showingHacker=true;if(_cdTimer){clearInterval(_cdTimer);_cdTimer=null}_cdRemain=0;_S('ds_key','');$('ds-main').style.display='none';$('ds-hacker-panel').style.display='none';$('ds-toggle-btn').style.display='none';$('ds-auth').style.display='';$('ds-ki').value='';$('ds-kb').style.display='none';$('ds-sbtn').style.display='none';$('ds-lex').innerHTML='';resetBtn();$('ds-hdt').innerHTML='Duolingo <span>Integration</span>'};
$('ds-rk').onclick=function(){if(confirm('Gỡ key?')){_S('ds_key','');location.reload()}};
$('ds-s3b').onclick=function(){_actS3()};
$('ds-mp').onclick=function(){if(_mPlay)_stopM();else _playM(_mIdx)};
$('ds-mr').onclick=function(){_playRnd()};
$('ds-ms').onclick=function(){_stopM()};
$('ds-cr-btn').onclick=function(){doCreate()};
$('ds-lh').onclick=function(){loadHist()};
$('ds-ca').onclick=function(){var h=_G('hist',[]);if(!h.length){_toast('Trống!','err');return}navigator.clipboard.writeText(h.join('\n')).then(function(){_toast('📋 Copy '+h.length+'!','ok')})};
$('ds-ch').onclick=function(){if(confirm('Xóa?')){_S('hist',[]);$('ds-lh2').textContent='Đã xóa.';_toast('🗑️ OK!','ok')}};
$('ds-avip').onclick=function(){addVip()};
$('ds-save-api').onclick=function(){var k=$('ds-admin-api').value.trim();if(!k){_toast('Nhập API key!','err');return}_S('admin_api_key',k);_apiKey=k;$('ds-admin-api').value='';$('ds-api-st').textContent='✅ Key đã lưu';$('ds-api-st').style.color='#58cc02';_toast('✅ Đã lưu API key!','ok')};
$('ds-dk').onclick=function(){var v=$('ds-di').value.trim();if(v===ADMIN_DOB){$('ds-dob').style.display='none';$('ds-di').value='';$('ds-de').style.display='none';_tier='ADMIN';_isAdmin=true;doUnlockAdmin()}else{$('ds-de').style.display='';$('ds-di').value='';_toast('❌ Sai!','err')}};
$('ds-di').onkeydown=function(e){if(e.key==='Enter')$('ds-dk').click()};
$('ds-dc').onclick=function(){$('ds-dob').style.display='none';$('ds-di').value='';$('ds-de').style.display='none';_sess=null};
$('ds-update-btn').onclick=function(e){e.stopPropagation();window.open(GF_SCRIPT_URL,'_blank')};
$('ds-upd-close').onclick=function(e){e.stopPropagation();$('ds-update-banner').style.display='none'};
$('ds-toggle-btn').onclick=function(){if(_showingHacker){_switchToSuper()}else{_switchToHacker()}};
$('dh-xp-btn').onclick=async function(){var btn=this;if(_hackRunning&&_hackTask==='xp'){_hackRunning=false;_hackTask=null;btn.textContent='⚡ FARM XP';btn.className='dh-btn dh-btn-go';_updStatus('⏹ Đã dừng','#ffc800');return}var amount=parseInt($('dh-xp-input').value)||5000;if(amount<100){_toast('⚠️ Tối thiểu 100 XP','err');return}if(!_isUnl()&&_getEn()<HACK_EN_COST){_toast('💤 Không đủ năng lượng!','err');return}_hackRunning=true;_hackTask='xp';btn.textContent='⏹ DỪNG';btn.className='dh-btn dh-btn-stop';_hackLogC();_hackLog('⚡ Farm XP qua Story API (~499XP/lần)...','i');_updHackProg('xp',0);_updStatus('⚡ Đang farm XP...','#FFCD00');try{var earned=await _hackXP(amount);if(earned>0){_hackLog('🎉 +'+earned+' XP!','o');_updStatus('✅ +'+earned+' XP!','#00ff64');_toast('🎉 +'+earned+' XP!','ok',3000);_updHackProg('xp',100);await _fetchDuoFull();_updHackStats();_updEn();_updHackerEn()}else{_hackLog('⚠️ Không farm được','w');_updStatus('⚠️ Không thành công','#ffc800')}}catch(e){_hackLog('❌ '+e.message,'e');_updStatus('❌ '+e.message,'#ff4b4b')}_hackRunning=false;_hackTask=null;btn.textContent='⚡ FARM XP';btn.className='dh-btn dh-btn-go'};
$('dh-gem-btn').onclick=async function(){var btn=this;if(_hackRunning&&_hackTask==='gem'){_hackRunning=false;_hackTask=null;btn.textContent='💎 NHẬN KC';btn.className='dh-btn dh-btn-go';_updStatus('⏹ Đã dừng','#ffc800');return}var amount=parseInt($('dh-gem-input').value)||10000;if(!_isUnl()&&_getEn()<HACK_EN_COST){_toast('💤 Không đủ năng lượng!','err');return}_hackRunning=true;_hackTask='gem';btn.textContent='⏹ DỪNG';btn.className='dh-btn dh-btn-stop';_hackLogC();_hackLog('💎 Hack KC qua Rewards exploit...','i');_updHackProg('gem',0);_updStatus('💎 Đang hack KC...','#FFCD00');try{var gained=await _hackGems(amount);if(gained>0){_hackLog('🎉 +'+gained+' KC!','o');_updStatus('✅ +'+gained+' KC!','#00ff64');_toast('🎉 +'+gained+' KC!','ok',3000);_updHackProg('gem',100);await _fetchDuoFull();_updHackStats();_updEn();_updHackerEn()}else{_hackLog('⚠️ Không nhận được KC','w');_updStatus('⚠️ Không thành công','#ffc800')}}catch(e){_hackLog('❌ '+e.message,'e');_updStatus('❌ '+e.message,'#ff4b4b')}_hackRunning=false;_hackTask=null;btn.textContent='💎 NHẬN KC';btn.className='dh-btn dh-btn-go'};
$('dh-streak-btn').onclick=async function(){var btn=this;if(_hackRunning&&_hackTask==='streak'){_hackRunning=false;_hackTask=null;btn.textContent='🔥 TĂNG STREAK';btn.className='dh-btn dh-btn-go';_updStatus('⏹ Đã dừng','#ffc800');return}var days=parseInt($('dh-streak-input').value)||100;if(days<1||days>9999){_toast('⚠️ 1-9999 ngày','err');return}if(!_isUnl()&&_getEn()<HACK_EN_COST){_toast('💤 Không đủ năng lượng!','err');return}_hackRunning=true;_hackTask='streak';btn.textContent='⏹ DỪNG';btn.className='dh-btn dh-btn-stop';_hackLogC();_hackLog('🔥 Streak qua Sessions (timezone-aware)...','i');_updHackProg('streak',0);_updStatus('🔥 Đang tăng Streak...','#FFCD00');try{var increased=await _hackStreak(days);if(increased>0){_hackLog('🎉 +'+increased+' Streak!','o');_updStatus('✅ +'+increased+' Streak!','#00ff64');_toast('🎉 +'+increased+' Streak!','ok',3000);_updHackProg('streak',100);await _fetchDuoFull();_updHackStats();_updEn();_updHackerEn()}else{_hackLog('⚠️ Không tăng được','w');_updStatus('⚠️ Không thành công','#ffc800')}}catch(e){_hackLog('❌ '+e.message,'e');_updStatus('❌ '+e.message,'#ff4b4b')}_hackRunning=false;_hackTask=null;btn.textContent='🔥 TĂNG STREAK';btn.className='dh-btn dh-btn-go'};
}

async function doUnlock(key){if(!key)return;key=key.trim();if(key===ADMIN_PW){$('ds-dob').style.display='flex';setTimeout(function(){$('ds-di').focus()},100);return}var tier=null;if(key===FREE_KEY)tier='FREE';else if(_findVip(key))tier='VIP';if(!tier){_toast('❌ Key không hợp lệ!','err');return}_toast('⏳ Kết nối...','info',1000);var r=await _gmGet(API+'/api/key/info?key='+encodeURIComponent(FREE_KEY));if(r.data&&r.data.ok){_sess={key:key};_tier=tier;_isAdmin=false;_S('ds_key',key);afterUnlock(key,tier)}else{_sess=null;_toast('❌ Lỗi kết nối API','err')}}
async function doUnlockAdmin(){var savedApi=_G('admin_api_key','');if(savedApi)_apiKey=savedApi;_toast('⏳ Kết nối API...','info',1000);var r=await _gmGet(API+'/api/key/info?key='+encodeURIComponent(FREE_KEY));if(r.data&&r.data.ok){_sess={key:ADMIN_PW};if(savedApi)_apiKey=savedApi;_S('ds_key',ADMIN_PW);afterUnlock(ADMIN_PW,'ADMIN')}else{_sess=null;_toast('❌ Lỗi kết nối API','err')}}
function afterUnlock(key,tier){var kb=$('ds-kb');if(tier==='ADMIN'){kb.textContent='ADMIN';kb.className='ds-bdg ds-bdga'}else if(tier==='FREE'){kb.textContent='FREE';kb.className='ds-bdg ds-bdgf'}else{kb.textContent='VIP';kb.className='ds-bdg ds-bdgv'}kb.style.display='';$('ds-sbtn').style.display=(tier==='VIP'||tier==='ADMIN')?'':'none';$('ds-toggle-btn').style.display='';$('ds-ta').style.display=(tier==='ADMIN')?'':'none';var mp=document.querySelector('.ds-mp2');if(mp)mp.style.display=tier==='FREE'?'none':'';$('ds-auth').style.display='none';_showingHacker=true;$('ds-main').style.display='none';$('ds-hacker-panel').style.display='flex';$('ds-hdt').innerHTML='Duolingo <span>Hacker</span>';var tBtn=$('ds-toggle-btn');tBtn.textContent='⚡ Get Super';tBtn.className='ds-toggle-btn to-super';var tb=$('ds-tbdg');if(tier==='ADMIN'){tb.textContent='ADMIN';tb.className='ds-bdg ds-bdga'}else if(tier==='VIP'){tb.textContent='VIP';tb.className='ds-bdg ds-bdgv'}else{tb.textContent='FREE';tb.className='ds-bdg ds-bdgf'}var u=_duoUser||'Chưa đăng nhập';$('ds-ub').textContent='👤 '+u;$('ds-ub').style.display='';$('ds-aun').textContent=u;$('ds-aun2').textContent=u;$('ds-mun').textContent=u;$('ds-aib').style.display=_duoUser?'':'none';_updEn();var td=$('ds-tdis');if(tier==='ADMIN'){td.textContent='ADMIN ♾️';td.className='tv ta'}else if(tier==='VIP'){td.textContent='VIP ♾️';td.className='tv tvv'}else{td.textContent='FREE';td.className='tv tf'}$('ds-lex').innerHTML='';resetBtn();if(_isAdmin){var as=$('ds-api-st');if(as){if(_G('admin_api_key','')){as.textContent='✅ Key đã lưu';as.style.color='#58cc02'}else{as.textContent='⚠️ Chưa có key';as.style.color='#ffc800'}}}_updHackerUser();_updHackerEn();_updStatus('⏳ Đang tải...','#FFCD00');_fetchDuoFull().then(function(){_updHackStats();_updHackerUser();_updStatus('✅ Sẵn sàng','#00ff64')});if(_isUnl()){$('dh-xp-cost').textContent='♾️ Miễn phí';$('dh-gem-cost').textContent='♾️ Miễn phí';$('dh-streak-cost').textContent='♾️ Miễn phí'}else{$('dh-xp-cost').textContent='⚡'+HACK_EN_COST+'/lần';$('dh-gem-cost').textContent='⚡'+HACK_EN_COST+'/lần';$('dh-streak-cost').textContent='⚡'+HACK_EN_COST+'/ngày'}var m='✅ Xin chào';if(_duoUser)m+=' '+_duoUser;m+=' ['+tier+']';if(tier==='FREE')m+=' | ⚡ '+_getEn()+'/'+MAX_EN;_toast(m,'ok',3000)}

/* ════════════════════════════════════════════════════════════════
   CREATE LINK v5 — CHỈ LOG RAW RESPONSE
   ════════════════════════════════════════════════════════════════ */
async function doCreate(){
    if(_creating)return;
    if(!_canEn(COST_LINK)){_toast('💤 Hết năng lượng!','err');return}
    if(_cdRemain>0){_toast('⏳ Chờ cooldown '+_fmtCD(_cdRemain),'warn');return}
    var j=_getJwt(),u=_getUid();
    if(!j||!u){_toast('❌ Đăng nhập Duolingo trước!','err');return}
    var btn=$('ds-cr-btn'),prog=$('ds-prog'),fill=$('ds-pf');
    _creating=true;btn.classList.add('busy');btn.disabled=true;_startCv();
    prog.style.display='';fill.style.transition='none';fill.style.width='10%';
    _logC('ds-ll');
    var h=_duoH(j);
    var DUO='https://www.duolingo.com';
    var linkFound=null;
    var L=function(m,tp){_log('ds-ll',m,tp||'i')};

    L('═══ RAW RESPONSE CHECK ═══','i');
    L('UID: '+u,'i');
    L('','i');

    try{
        /* ── BƯỚC 1: Get subscriptions (confirm) ── */
        L('━━━ SUBS ━━━','w');
        var subR=await _gmGet(DUO+'/2017-06-30/users/'+u+'/subscriptions',h);
        L('GET /subscriptions → HTTP '+subR.status,'i');
        L('Raw length: '+(subR.raw?subR.raw.length:0),'i');
        if(subR.raw)L('Raw (first 300): '+subR.raw.substring(0,300),'o');
        fill.style.width='20%';

        /* ── BƯỚC 2: Get invites (the key one) ── */
        L('','i');
        L('━━━ INVITES RAW ━━━','w');
        var invR=await _gmGet(DUO+'/2017-06-30/users/'+u+'/family-plan/invites',h);
        L('GET /invites → HTTP '+invR.status,'i');
        L('Data type: '+(typeof invR.data),'i');
        L('Data is null: '+(invR.data===null),'i');
        L('Raw type: '+(typeof invR.raw),'i');
        L('Raw length: '+(invR.raw?String(invR.raw).length:0),'i');

        if(invR.raw&&String(invR.raw).length>0){
            var rawStr=String(invR.raw);
            L('','i');
            L('━━━ RAW CONTENT ━━━','w');
            /* Hiển thị raw response đầy đủ (tối đa 800 ký tự) */
            var chunks=Math.ceil(rawStr.length/200);
            for(var ci=0;ci<Math.min(chunks,4);ci++){
                var start=ci*200;
                var end=Math.min(start+200,rawStr.length);
                L('['+start+'-'+end+'] '+rawStr.substring(start,end),'o');
            }
            if(rawStr.length>800)L('... ('+rawStr.length+' chars total)','i');

            /* ── Parse attempts ── */
            L('','i');
            L('━━━ PARSE ATTEMPTS ━━━','w');

            /* Try JSON parse */
            var parsed=null;
            try{parsed=JSON.parse(rawStr);L('JSON parse: OK','o')}catch(e){L('JSON parse: FAIL - '+e.message,'w')}

            if(parsed&&typeof parsed==='object'){
                var keys=Object.keys(parsed);
                L('Keys: '+keys.join(', '),'o');
                keys.forEach(function(k){
                    var v=parsed[k];
                    var t=Array.isArray(v)?'array['+v.length+']':typeof v;
                    var s=t==='string'?v.substring(0,80):t==='object'?JSON.stringify(v).substring(0,80):String(v).substring(0,80);
                    L('  '+k+' ('+t+'): '+s,'o');
                });

                /* Deep search for URLs */
                var fullJson=JSON.stringify(parsed);
                var urls=fullJson.match(/https?:\/\/[^\s"'\\]+/gi)||[];
                if(urls.length>0){
                    L('','i');
                    L('URLs found: '+urls.length,'o');
                    urls.forEach(function(url,i){
                        L('  '+(i+1)+'. '+url,'o');
                        if(url.indexOf('invite')!==-1||url.indexOf('family')!==-1){
                            linkFound=url;
                            L('     ^^ INVITE URL!','o');
                        }
                    });
                }
            }else if(typeof parsed==='string'){
                L('Parsed as string: '+parsed.substring(0,200),'o');
            }

            /* Regex on raw */
            var inviteUrls=rawStr.match(/https?:\/\/[^\s"'\\]*invite[^\s"'\\]*/gi)||[];
            if(inviteUrls.length>0&&!linkFound){
                linkFound=inviteUrls[0];
                L('Regex invite URL: '+linkFound,'o');
            }

            /* Check if raw is just empty array/object */
            if(rawStr==='[]'||rawStr==='{}'||rawStr==='null'||rawStr==='""'){
                L('','i');
                L('⚠️ Response is EMPTY: '+rawStr,'w');
                L('User is FP member but no invites exist','w');
            }
        }else{
            L('⚠️ RAW IS EMPTY/NULL','w');
            L('','i');
            L('GET /invites returned 200 but empty body.','w');
            L('User might be FP member without','w');
            L('permission to view invites.','w');
        }
        fill.style.width='60%';

        /* ── BƯỚC 3: Try POST endpoints ── */
        if(!linkFound){
            L('','i');
            L('━━━ POST ENDPOINTS ━━━','w');
            var postTests=[
                {url:DUO+'/2017-06-30/users/'+u+'/family-plan/members/invite',body:{},desc:'members/invite {}'},
                {url:DUO+'/2017-06-30/users/'+u+'/family-plan/members/invite',body:{email:'[email protected]'},desc:'members/invite email'},
                {url:DUO+'/2017-06-30/users/'+u+'/family-plan/members/invite',body:null,desc:'members/invite null'},
            ];
            for(var pi=0;pi<postTests.length;pi++){
                var pt=postTests[pi];
                var pr=await _gmPost(pt.url,pt.body,h);
                L('POST '+pt.desc+' → HTTP '+pr.status,'i');
                if(pr.raw)L('   Raw: '+String(pr.raw).substring(0,120),'o');
                if(pr.status===200||pr.status===201){
                    var rawP=String(pr.raw||'');
                    var urls2=rawP.match(/https?:\/\/[^\s"'\\]+/gi)||[];
                    urls2.forEach(function(url){
                        if(url.indexOf('invite')!==-1){linkFound=url;L('   INVITE URL: '+url,'o')}
                    });
                }
                await _sleep(100);
            }
        }

        fill.style.transition='width .3s ease';fill.style.width='100%';
        setTimeout(function(){prog.style.display='none';fill.style.transition='none';fill.style.width='0%'},500);

        /* ── KẾT QUẢ ── */
        L('','i');
        L('═══ RESULT ═══','w');

        if(linkFound&&typeof linkFound==='string'&&linkFound.length>10){
            if(!_isUnl())_useEn(COST_LINK);
            if(linkFound.indexOf('http')!==0)linkFound='https://www.duolingo.com/family-plan/invite/'+linkFound;
            L('🎉 LINK: '+linkFound,'o');
            var le=$('ds-ll');
            var s=document.createElement('span');s.className='lo ds-le';s.textContent='🔗 '+linkFound;
            var c=document.createElement('span');c.className='ds-ct';c.textContent='copy';
            c.onclick=function(e){e.stopPropagation();navigator.clipboard.writeText(linkFound).catch(function(){});c.textContent='✓';c.classList.add('ok');setTimeout(function(){c.textContent='copy';c.classList.remove('ok')},1400)};
            le.appendChild(s);le.appendChild(c);le.appendChild(document.createTextNode('\n'));
            var hist=_G('hist',[]);hist.unshift(linkFound);_S('hist',hist);
            _updEn();_toast('🎉 Link!','ok',4000);
        }else{
            L('','i');
            L('📋 PHÂN TÍCH CUỐI CÙNG:','w');
            L('','i');
            L('GET /subscriptions → 200 (81 users)','o');
            L('GET /invites → 200 (empty/null body)','o');
            L('POST /members/invite → 400','o');
            L('','i');
            L('CẬU LÀ MEMBER (không phải owner).','w');
            L('','i');
            L('81 users kia là ACE trong Family Plan','w');
            L('mà CẬU ĐANG ĐƯỢC NHẬN SUPER từ đó.','w');
            L('','i');
            L('👉 CHỈ OWNER mới tạo được invite link.','w');
            L('👉 Cậu cần liên hệ OWNER của Family Plan','w');
            L('   để họ tạo link mới cho cậu.','w');
            L('','i');
            L('Hoặc: Mua Family Plan riêng ($120/năm)','w');
            L('      → cậu thành owner → tạo link được.','w');
            _toast('❌ Không có invite link (cậu là member)','err',5000);
        }
    }catch(e){
        L('❌ Exception: '+e.message,'e');
        _toast('❌ '+e.message,'err');
    }finally{
        _creating=false;resetBtn();
    }
}

function resetBtn(){_creating=false;var b=$('ds-cr-btn');if(b){b.classList.remove('busy');b.disabled=false;b.textContent='⚡ TẠO LINK'}_stopCv()}
function loadHist(){var le=$('ds-lh2');le.textContent='';var h=_G('hist',[]);if(!h.length){_log('ds-lh2','📭 Chưa có link.','w');_toast('Chưa có!','warn');return}_log('ds-lh2','📋 '+h.length+' link','i');_log('ds-lh2','─────────────────','i');h.forEach(function(u,i){var s=document.createElement('span');s.className='lo ds-le';s.textContent='#'+String(i+1).padStart(3,'0')+' '+u;s.style.animationDelay=(i*.035)+'s';var c=document.createElement('span');c.className='ds-ct';c.textContent='copy';c.onclick=function(e){e.stopPropagation();navigator.clipboard.writeText(u).catch(function(){});c.textContent='✓';c.classList.add('ok');setTimeout(function(){c.textContent='copy';c.classList.remove('ok')},1400)};le.appendChild(s);le.appendChild(c);le.appendChild(document.createTextNode('\n'))});_toast('✅ '+h.length+' link!','ok')}
function addVip(){var n=$('ds-vun').value.trim();if(!n){_toast('Nhập tên Duolingo!','err');return}var v=_G('vip_users',[]);var ex=v.find(function(u){return u.username.toLowerCase()===n.toLowerCase()});if(ex){$('ds-gen-result').innerHTML='<div class="ds-ss ds-sser">❌ <strong>'+n+'</strong> đã có key: <strong>'+ex.key+'</strong></div>';_toast('❌ Đã có key!','err',3000);return}var key=_genKey();v.push({key:key,username:n,ts:new Date().toISOString()});_S('vip_users',v);$('ds-vun').value='';$('ds-gen-result').innerHTML='<div class="ds-le2"><div class="ds-le2t">✅ Key VIP cho <strong>'+n+'</strong>:</div><div class="ds-gr" id="ds-gen-key">'+key+'</div><div style="text-align:center"><span class="ds-ct" id="ds-copy-gen" style="font-size:12px;padding:3px 12px">📋 Copy key</span></div></div>';$('ds-copy-gen').onclick=function(){navigator.clipboard.writeText(key).catch(function(){});this.textContent='✓ Copied!';this.classList.add('ok');var self=this;setTimeout(function(){self.textContent='📋 Copy key';self.classList.remove('ok')},1500)};renderVip();_toast('✅ Tạo key cho '+n+'!','ok',3000)}
function renderVip(){var list=$('ds-vl');if(!list)return;list.innerHTML='';var v=_G('vip_users',[]);if(!v.length){list.innerHTML='<div style="text-align:center;padding:20px;color:var(--mu);font-size:12px">Chưa có VIP.</div>';return}v.forEach(function(u,i){var c=document.createElement('div');c.className='ds-uc';c.innerHTML='<div style="min-width:0;flex:1"><div class="ds-un">👤 '+u.username+'</div><div class="ds-uk">🔑 '+u.key+'</div></div><div class="ds-vb">VIP</div><button class="ds-rv">GỠ</button>';c.querySelector('.ds-rv').onclick=function(){if(confirm('Gỡ '+u.username+'?')){v.splice(i,1);_S('vip_users',v);renderVip();_toast('🗑️ OK!','ok')}};list.appendChild(c)})}

function _updEn(){var v=$('ds-env'),f=$('ds-enf');if(!v||!f)return;if(_isUnl()){v.textContent='♾️ VIP';v.style.color='#FFD700';f.style.width='100%';f.className='ds-ef ds-eful'}else{var e=_getEn(),p=Math.round(e/MAX_EN*100);v.textContent=e+'/'+MAX_EN;v.style.color='';f.style.width=p+'%';f.className='ds-ef '+(p>50?'ds-efhi':p>20?'ds-efmd':'ds-eflo')}}

async function init(){createUI();bindEvents();$('ds-r').setAttribute('data-red',_G('red_m','')?'1':'');await _fetchDuoUser();var u=_duoUser||'Chưa đăng nhập';$('ds-ub').textContent='👤 '+u;$('ds-aun').textContent=u;$('ds-aun2').textContent=u;$('ds-mun').textContent=u;$('ds-aib').style.display=_duoUser?'':'none';var sk=_G('ds_key','');if(sk){if(sk===FREE_KEY||sk===ADMIN_PW||_findVip(sk)){$('ds-ki').value=sk;doUnlock(sk)}else{_S('ds_key','')}}if(_G('admin_api_key','')){var as=$('ds-api-st');if(as){as.textContent='✅ Key đã lưu';as.style.color='#58cc02'}}_toast('🚀 v'+VER+' RAW CHECK','info',2000);setTimeout(_checkVersion,2000)}
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',init);else init();
})();