From 3bc290b3d4fa600c736bb200a717715e9d8f37bb Mon Sep 17 00:00:00 2001 From: j-hc Date: Sat, 16 Nov 2024 21:02:25 +0300 Subject: [PATCH] update --- .github/workflows/ci.yml | 25 + docs/assets/index-3ff0196f.js | 15 - docs/assets/index-924ae0f0.css | 1 + docs/assets/index-c16e5629.js | 13 + docs/assets/index-def2ac4e.css | 1 - docs/index.html | 4 +- docs/patches.json | 3947 ++++++++++++++++++++++++++++++++ src/App.svelte | 34 +- src/lib/RVApp.svelte | 151 +- 9 files changed, 4061 insertions(+), 130 deletions(-) create mode 100755 .github/workflows/ci.yml delete mode 100644 docs/assets/index-3ff0196f.js create mode 100644 docs/assets/index-924ae0f0.css create mode 100644 docs/assets/index-c16e5629.js delete mode 100644 docs/assets/index-def2ac4e.css create mode 100644 docs/patches.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100755 index 0000000..ffad293 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,25 @@ +name: CI +on: + workflow_dispatch: + schedule: + - cron: "0 16 * * *" + +jobs: + check: + permissions: write-all + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: + run: | + curl 'https://api.revanced.app/v4/patches/list' -H 'Accept: application/json' > docs/patches.json + + - name: patches + uses: stefanzweifel/git-auto-commit-action@v5 + with: + branch: master + file_pattern: docs/patches.json + commit_message: Update patches.json \ No newline at end of file diff --git a/docs/assets/index-3ff0196f.js b/docs/assets/index-3ff0196f.js deleted file mode 100644 index b8b7866..0000000 --- a/docs/assets/index-3ff0196f.js +++ /dev/null @@ -1,15 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const s of o)if(s.type==="childList")for(const n of s.addedNodes)n.tagName==="LINK"&&n.rel==="modulepreload"&&r(n)}).observe(document,{childList:!0,subtree:!0});function l(o){const s={};return o.integrity&&(s.integrity=o.integrity),o.referrerPolicy&&(s.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?s.credentials="include":o.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(o){if(o.ep)return;o.ep=!0;const s=l(o);fetch(o.href,s)}})();function J(){}function Et(e){return!!e&&(typeof e=="object"||typeof e=="function")&&typeof e.then=="function"}function Ot(e){return e()}function Xe(){return Object.create(null)}function ce(e){e.forEach(Ot)}function Ke(e){return typeof e=="function"}function ke(e,t){return e!=e?t==t:e!==t||e&&typeof e=="object"||typeof e=="function"}function Tt(e){return Object.keys(e).length===0}function a(e,t){e.appendChild(t)}function b(e,t,l){e.insertBefore(t,l||null)}function m(e){e.parentNode&&e.parentNode.removeChild(e)}function Ee(e,t){for(let l=0;le.removeEventListener(t,l,r)}function y(e,t,l){l==null?e.removeAttribute(t):e.getAttribute(t)!==l&&e.setAttribute(t,l)}function Lt(e,t,l){const r=new Set;for(let o=0;oe.push(r))},r(){t.forEach(l=>e.splice(e.indexOf(l),1))}}}function St(e){return Array.from(e.childNodes)}function F(e,t){t=""+t,e.data!==t&&(e.data=t)}function ne(e,t){e.value=t??""}let Ae;function ie(e){Ae=e}function Bt(){if(!Ae)throw new Error("Function called outside component initialization");return Ae}const he=[],ee=[];let ge=[];const Ve=[],Rt=Promise.resolve();let Fe=!1;function zt(){Fe||(Fe=!0,Rt.then(qe))}function Ie(e){ge.push(e)}function pe(e){Ve.push(e)}const Je=new Set;let be=0;function qe(){if(be!==0)return;const e=Ae;do{try{for(;bee.indexOf(r)===-1?t.push(r):l.push(r)),l.forEach(r=>r()),ge=t}const Be=new Set;let de;function ve(){de={r:0,c:[],p:de}}function ye(){de.r||ce(de.c),de=de.p}function V(e,t){e&&e.i&&(Be.delete(e),e.i(t))}function q(e,t,l,r){if(e&&e.o){if(Be.has(e))return;Be.add(e),de.c.push(()=>{Be.delete(e),r&&(l&&e.d(1),r())}),e.o(t)}else r&&r()}function Re(e,t){const l=t.token={};function r(o,s,n,u){if(t.token!==l)return;t.resolved=u;let i=t.ctx;n!==void 0&&(i=i.slice(),i[n]=u);const f=o&&(t.current=o)(i);let p=!1;t.block&&(t.blocks?t.blocks.forEach((_,g)=>{g!==s&&_&&(ve(),q(_,1,1,()=>{t.blocks[g]===_&&(t.blocks[g]=null)}),ye())}):t.block.d(1),f.c(),V(f,1),f.m(t.mount(),t.anchor),p=!0),t.block=f,t.blocks&&(t.blocks[s]=f),p&&qe()}if(Et(e)){const o=Bt();if(e.then(s=>{ie(o),r(t.then,1,t.value,s),ie(null)},s=>{if(ie(o),r(t.catch,2,t.error,s),ie(null),!t.hasCatch)throw s}),t.current!==t.pending)return r(t.pending,0),!0}else{if(t.current!==t.then)return r(t.then,1,t.value,e),!0;t.resolved=e}}function jt(e,t,l){const r=t.slice(),{resolved:o}=e;e.current===e.then&&(r[e.value]=o),e.current===e.catch&&(r[e.error]=o),e.block.p(r,l)}function _e(e,t,l){const r=e.$$.props[t];r!==void 0&&(e.$$.bound[r]=l,l(e.$$.ctx[r]))}function fe(e){e&&e.c()}function oe(e,t,l,r){const{fragment:o,after_update:s}=e.$$;o&&o.m(t,l),r||Ie(()=>{const n=e.$$.on_mount.map(Ot).filter(Ke);e.$$.on_destroy?e.$$.on_destroy.push(...n):ce(n),e.$$.on_mount=[]}),s.forEach(Ie)}function se(e,t){const l=e.$$;l.fragment!==null&&(Dt(l.after_update),ce(l.on_destroy),l.fragment&&l.fragment.d(t),l.on_destroy=l.fragment=null,l.ctx=[])}function Vt(e,t){e.$$.dirty[0]===-1&&(he.push(e),zt(),e.$$.dirty.fill(0)),e.$$.dirty[t/31|0]|=1<{const w=C.length?C[0]:g;return f.ctx&&o(f.ctx[_],f.ctx[_]=w)&&(!f.skip_bound&&f.bound[_]&&f.bound[_](w),p&&Vt(e,_)),g}):[],f.update(),p=!0,ce(f.before_update),f.fragment=r?r(f.ctx):!1,t.target){if(t.hydrate){const _=St(t.target);f.fragment&&f.fragment.l(_),_.forEach(m)}else f.fragment&&f.fragment.c();t.intro&&V(e.$$.fragment),oe(e,t.target,t.anchor,t.customElement),qe()}ie(i)}class Oe{$destroy(){se(this,1),this.$destroy=J}$on(t,l){if(!Ke(l))return J;const r=this.$$.callbacks[t]||(this.$$.callbacks[t]=[]);return r.push(l),()=>{const o=r.indexOf(l);o!==-1&&r.splice(o,1)}}$set(t){this.$$set&&!Tt(t)&&(this.$$.skip_bound=!0,this.$$set(t),this.$$.skip_bound=!1)}}function Ft(e){let t,l,r;return{c(){t=h("button"),t.textContent="Copy",y(t,"id","cbut"),y(t,"class","transition ease-in-out hover:-translate-y-0.5 rounded-lg border w-full p-3 mb-3 items-stretch bg-gray-300 border-gray-400 text-sm leading-5 font-medium text-gray-900 hover:text-gray-600 focus:outline-none")},m(o,s){b(o,t,s),e[2](t),l||(r=[W(t,"mouseleave",e[3]),W(t,"click",e[4])],l=!0)},p:J,i:J,o:J,d(o){o&&m(t),e[2](null),l=!1,ce(r)}}}function It(e,t,l){let r,{id:o}=t;function s(i){ee[i?"unshift":"push"](()=>{r=i,l(1,r)})}const n=()=>{r.textContent!=="Copy"&&l(1,r.textContent="Copy",r)},u=()=>{navigator.clipboard.writeText(document.getElementById(o).innerText),r.textContent!=="Copied ✔"&&l(1,r.textContent="Copied ✔",r)};return e.$$set=i=>{"id"in i&&l(0,o=i.id)},[o,r,s,n,u]}class Ze extends Oe{constructor(t){super(),we(this,t,It,Ft,ke,{id:0})}}function $e(e,t,l){const r=e.slice();return r[6]=t[l],r[7]=t,r[8]=l,r}function xe(e){let t,l,r,o=e[0].patchOptions,s=[];for(let n=0;nl(3,n=!n),i=(f,p,_,g)=>{l(0,p[_].value=g.target.value,r),l(0,p[_].is_selected=!0,r),s[r.name]===void 0&&l(1,s[r.name]={},s),s[r.name][f.key]===void 0&&l(1,s[r.name][f.key]=[],s),l(1,s[r.name][f.key]=f.value,s)};return e.$$set=f=>{"patch"in f&&l(0,r=f.patch),"optionName"in f&&l(2,o=f.optionName),"selectedOpts"in f&&l(1,s=f.selectedOpts)},[r,s,o,n,u,i]}class Gt extends Oe{constructor(t){super(),we(this,t,qt,Kt,ke,{patch:0,optionName:2,selectedOpts:1})}}function tt(e,t,l){const r=e.slice();return r[12]=t[l],r}function lt(e){let t,l,r,o,s,n,u,i,f,p,_=e[3],g=[];for(let w=0;w<_.length;w+=1)g[w]=it(tt(e,_,w));const C=w=>q(g[w],1,1,()=>{g[w]=null});return{c(){t=h("p"),l=h("button"),r=N(e[5]),o=P(),s=h("div"),n=h("div"),u=h("p");for(let w=0;w_e(l,"selectedOpts",s)),{c(){t=h("p"),fe(l.$$.fragment),y(t,"class","ml-6")},m(u,i){b(u,t,i),oe(l,t,null),o=!0},p(u,i){const f={};i&8&&(f.patch=u[12]),!r&&i&2&&(r=!0,f.selectedOpts=u[1],pe(()=>r=!1)),l.$set(f)},i(u){o||(V(l.$$.fragment,u),o=!0)},o(u){q(l.$$.fragment,u),o=!1},d(u){u&&m(t),se(l)}}}function it(e){let t,l,r,o=!1,s,n,u=e[12].name+"",i,f,p,_,g,C,w,v=e[12].description+"",c,j,S,B,R,M,k,T,A,E=e[12].warn!==void 0&&e[12].warn&&nt();function I(O,K){return O[12].pkg_versions.length>0?Wt:Ht}let z=I(e),D=z(e),d=e[12].patchOptions.length>0&&rt(e);return k=Ct(e[9][0]),{c(){t=h("label"),l=h("input"),s=P(),n=h("span"),i=N(u),f=P(),E&&E.c(),p=P(),_=h("p"),D.c(),g=P(),C=h("p"),w=N("- "),c=N(v),j=P(),d&&d.c(),S=P(),B=h("div"),R=P(),y(l,"type","checkbox"),l.__value=r=e[12],l.value=l.__value,y(_,"class","ml-6"),y(C,"class","font-bold font-mono ml-6"),y(B,"class","pb-2"),y(t,"class","items-center"),k.p(l)},m(O,K){b(O,t,K),a(t,l),l.checked=~(e[0]||[]).indexOf(l.__value),a(t,s),a(t,n),a(n,i),a(n,f),E&&E.m(n,null),a(n,p),a(n,_),D.m(_,null),a(t,g),a(t,C),a(C,w),a(C,c),a(t,j),d&&d.m(t,null),a(t,S),a(t,B),a(t,R),M=!0,T||(A=W(l,"change",e[8]),T=!0)},p(O,K){(!M||K&8&&r!==(r=O[12]))&&(l.__value=r,l.value=l.__value,o=!0),(o||K&9)&&(l.checked=~(O[0]||[]).indexOf(l.__value)),(!M||K&8)&&u!==(u=O[12].name+"")&&F(i,u),O[12].warn!==void 0&&O[12].warn?E||(E=nt(),E.c(),E.m(n,p)):E&&(E.d(1),E=null),z===(z=I(O))&&D?D.p(O,K):(D.d(1),D=z(O),D&&(D.c(),D.m(_,null))),(!M||K&8)&&v!==(v=O[12].description+"")&&F(c,v),O[12].patchOptions.length>0?d?(d.p(O,K),K&8&&V(d,1)):(d=rt(O),d.c(),V(d,1),d.m(t,S)):d&&(ve(),q(d,1,1,()=>{d=null}),ye())},i(O){M||(V(d),M=!0)},o(O){q(d),M=!1},d(O){O&&m(t),E&&E.d(),D.d(),d&&d.d(),k.r(),T=!1,A()}}}function Ut(e){let t,l,r,o,s,n,u,i,f=e[4]&<(e);return{c(){t=h("div"),l=h("button"),r=h("span"),o=N(e[2]),s=P(),f&&f.c(),y(l,"class","inline-flex justify-center items-center space-x-2 border border-gray-300 rounded-md py-2 px-4 bg-white text-sm leading-5 font-medium text-gray-900 hover:text-gray-600 focus:outline-none focus:border-gray-300 focus:ring-blue active:bg-gray-50 active:text-gray-800"),y(t,"class","relative inline-block text-left")},m(p,_){b(p,t,_),a(t,l),a(l,r),a(r,o),a(t,s),f&&f.m(t,null),n=!0,u||(i=W(l,"click",e[7]),u=!0)},p(p,[_]){(!n||_&4)&&F(o,p[2]),p[4]?f?(f.p(p,_),_&16&&V(f,1)):(f=lt(p),f.c(),V(f,1),f.m(t,null)):f&&(ve(),q(f,1,1,()=>{f=null}),ye())},i(p){n||(V(f),n=!0)},o(p){q(f),n=!1},d(p){p&&m(t),f&&f.d(),u=!1,i()}}}function Yt(e,t,l){let{optionName:r}=t,{options:o}=t,s=!1,{selected:n=[]}=t;const u=v=>{for(const c of v)c.use&&n.push(c)},i=()=>{f==="Deselect All"?(l(0,n.length=0,n),l(5,f="Select Default")):(l(0,n.length=0,n),u(o),l(5,f="Deselect All"))};let f="Deselect All",{selectedOpts:p}=t;const _=[[]],g=()=>l(4,s=!s);function C(){n=Lt(_[0],this.__value,this.checked),l(0,n)}function w(v){p=v,l(1,p)}return e.$$set=v=>{"optionName"in v&&l(2,r=v.optionName),"options"in v&&l(3,o=v.options),"selected"in v&&l(0,n=v.selected),"selectedOpts"in v&&l(1,p=v.selectedOpts)},e.$$.update=()=>{e.$$.dirty&8&&u(o)},[n,p,r,o,s,f,i,g,C,_,w]}class Qt extends Oe{constructor(t){super(),we(this,t,Yt,Ut,ke,{optionName:2,options:3,selected:0,selectedOpts:1})}}function ot(e,t,l){const r=e.slice();return r[7]=t[l],r}function st(e){let t,l,r,o=e[2],s=[];for(let n=0;nl(3,n=!n);function f(){s=this.__value,l(0,s)}return e.$$set=p=>{"optionName"in p&&l(1,r=p.optionName),"options"in p&&l(2,o=p.options),"selected"in p&&l(0,s=p.selected)},[s,r,o,n,i,f,u]}class De extends Oe{constructor(t){super(),we(this,t,Zt,Xt,ke,{optionName:1,options:2,selected:0})}}function $t(e){let t,l,r;return{c(){t=h("div"),l=N("Could not fetch patches from "),r=N(e[14]),y(t,"class","border border-t-0 border-red-200 rounded-b bg-red-100 text-red-400")},m(o,s){b(o,t,s),a(t,l),a(t,r)},p(o,s){s[0]&16384&&F(r,o[14])},i:J,o:J,d(o){o&&m(t)}}}function xt(e){let t,l,r,o,s,n;function u(p){e[29](p)}function i(p){e[30](p)}let f={optionName:"patches",options:e[13]};return e[5]!==void 0&&(f.selected=e[5]),e[12]!==void 0&&(f.selectedOpts=e[12]),r=new Qt({props:f}),ee.push(()=>_e(r,"selected",u)),ee.push(()=>_e(r,"selectedOpts",i)),{c(){t=h("hr"),l=P(),fe(r.$$.fragment),y(t,"class","my-3 border-t border-gray-300")},m(p,_){b(p,t,_),b(p,l,_),oe(r,p,_),n=!0},p(p,_){const g={};_[0]&8192&&(g.options=p[13]),!o&&_[0]&32&&(o=!0,g.selected=p[5],pe(()=>o=!1)),!s&&_[0]&4096&&(s=!0,g.selectedOpts=p[12],pe(()=>s=!1)),r.$set(g)},i(p){n||(V(r.$$.fragment,p),n=!0)},o(p){q(r.$$.fragment,p),n=!1},d(p){p&&m(t),p&&m(l),se(r,p)}}}function el(e){return{c:J,m:J,p:J,i:J,o:J,d:J}}function tl(e){let t,l,r=(e[6]?e[6]:e[3])+"",o,s,n,u,i,f,p,_,g,C,w,v,c,j,S,B,R,M,k,T,A,E,I,z,D,d,O,K,Ne,Te,Ce,Le,te,je,L,Y,Q,Z,ue,X,ae,U,le,$,Pe,Me,re,me,ze,Ge;function Pt(G){e[22](G)}let He={optionName:"version",options:["auto","latest","beta"]};e[7]!==void 0&&(He.selected=e[7]),k=new De({props:He}),ee.push(()=>_e(k,"selected",Pt));function Mt(G){e[24](G)}let We={optionName:"build-mode",options:["apk","both","module"]};e[4]!==void 0&&(We.selected=e[4]),K=new De({props:We}),ee.push(()=>_e(K,"selected",Mt));function At(G){e[25](G)}let Ue={optionName:"apkmirror arch",options:["universal","arm64-v8a","arm-v7a","both"]};e[1]!==void 0&&(Ue.selected=e[1]),te=new De({props:Ue}),ee.push(()=>_e(te,"selected",At));let x={ctx:e,current:null,token:null,hasCatch:!0,pending:el,then:xt,catch:$t,value:13,error:35,blocks:[,,,]};return Re(re=e[13],x),{c(){t=h("details"),l=h("summary"),o=N(r),s=P(),n=h("button"),n.textContent="-",u=P(),i=h("div"),f=h("label"),p=N(`app-name: - `),_=h("input"),C=P(),w=h("hr"),v=P(),c=h("label"),j=N(`apkmirror-dlurl: - `),S=h("input"),B=P(),R=h("hr"),M=P(),fe(k.$$.fragment),A=P(),E=h("label"),I=N(`custom: - `),z=h("input"),D=P(),d=h("hr"),O=P(),fe(K.$$.fragment),Te=P(),Ce=h("hr"),Le=P(),fe(te.$$.fragment),L=P(),Y=h("hr"),Q=P(),Z=h("label"),ue=N(`patches source: - `),X=h("input"),ae=P(),U=h("label"),le=N(`patches version: - `),$=h("input"),Pe=P(),Me=P(),x.block.c(),y(n,"class","float-right w-7 h-7 rounded-full border-2 border-gray-400 text-gray-400 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-50"),y(_,"id","app-name"),y(_,"type","text"),y(_,"class","border-2 rounded border-gray-300 p-0.5 w-full"),y(_,"placeholder",g=e[3]===e[2]?"Fill in app-name and apkmirror-dlurl":e[3]),y(w,"class","my-3 border-t border-gray-300"),y(S,"type","text"),y(S,"class","border-2 rounded border-gray-300 p-0.5 pl-1 w-full"),y(S,"size","60"),y(R,"class","my-3 border-t border-gray-300"),y(z,"type","text"),y(z,"class","border-2 rounded border-gray-300 p-0.5 w-20"),y(z,"placeholder","18.19.35"),y(d,"class","my-3 border-t border-gray-300"),y(Ce,"class","my-3 border-t border-gray-300"),y(Y,"class","my-3 border-t border-gray-300"),y(X,"id","patches-source"),y(X,"type","text"),y(X,"class","border-2 rounded border-gray-300 p-0.5 pl-1 w-full"),y(X,"size","60"),y($,"id","patches-version"),y($,"type","text"),y($,"class","border-2 rounded border-gray-300 p-0.5 pl-1 w-full"),y($,"size","60"),y(i,"class","select-none text-xs my-3 py-1 cursor-pointer hover:bg-gray-50 hover:border-gray-300"),y(t,"class","select-none m-3 group p-4 border-2 cursor-pointer rounded-md hover:bg-gray-50 hover:border-gray-300")},m(G,H){b(G,t,H),a(t,l),a(l,o),a(l,s),a(l,n),a(t,u),a(t,i),a(i,f),a(f,p),a(f,_),ne(_,e[6]),a(i,C),a(i,w),a(i,v),a(i,c),a(c,j),a(c,S),ne(S,e[0]),a(i,B),a(i,R),a(i,M),oe(k,i,null),a(i,A),a(i,E),a(E,I),a(E,z),ne(z,e[7]),a(i,D),a(i,d),a(i,O),oe(K,i,null),a(i,Te),a(i,Ce),a(i,Le),oe(te,i,null),a(i,L),a(i,Y),a(i,Q),a(i,Z),a(Z,ue),a(Z,X),ne(X,e[8]),a(i,ae),a(i,U),a(U,le),a(U,$),ne($,e[9]),a(i,Pe),a(i,Me),x.block.m(i,x.anchor=null),x.mount=()=>i,x.anchor=null,e[31](t),me=!0,ze||(Ge=[W(n,"click",e[19]),W(_,"input",e[20]),W(S,"input",e[21]),W(z,"input",e[23]),W(X,"input",e[26]),W($,"input",e[27]),W($,"blur",function(){Ke(e[28]())&&e[28]().apply(this,arguments)})],ze=!0)},p(G,H){e=G,(!me||H[0]&72)&&r!==(r=(e[6]?e[6]:e[3])+"")&&F(o,r),(!me||H[0]&12&&g!==(g=e[3]===e[2]?"Fill in app-name and apkmirror-dlurl":e[3]))&&y(_,"placeholder",g),H[0]&64&&_.value!==e[6]&&ne(_,e[6]),H[0]&1&&S.value!==e[0]&&ne(S,e[0]);const Se={};!T&&H[0]&128&&(T=!0,Se.selected=e[7],pe(()=>T=!1)),k.$set(Se),H[0]&128&&z.value!==e[7]&&ne(z,e[7]);const Ye={};!Ne&&H[0]&16&&(Ne=!0,Ye.selected=e[4],pe(()=>Ne=!1)),K.$set(Ye);const Qe={};!je&&H[0]&2&&(je=!0,Qe.selected=e[1],pe(()=>je=!1)),te.$set(Qe),H[0]&256&&X.value!==e[8]&&ne(X,e[8]),H[0]&512&&$.value!==e[9]&&ne($,e[9]),x.ctx=e,H[0]&8192&&re!==(re=e[13])&&Re(re,x)||jt(x,e,H)},i(G){me||(V(k.$$.fragment,G),V(K.$$.fragment,G),V(te.$$.fragment,G),V(x.block),me=!0)},o(G){q(k.$$.fragment,G),q(K.$$.fragment,G),q(te.$$.fragment,G);for(let H=0;H<3;H+=1){const Se=x.blocks[H];q(Se)}me=!1},d(G){G&&m(t),se(k),se(K),se(te),x.block.d(),x.token=null,x=null,e[31](null),ze=!1,ce(Ge)}}}function ll(e,t,l){let r,{pkgName:o}=t,{defaultPatchesJson:s}=t,{reprName:n}=t,{apkmirror_dlurl:u="https://apkmirror.com/apk/"}=t,{TOML:i}=t,{arch:f="universal"}=t,p,_=[],g,C="auto",w="revanced/revanced-patches",v="latest";function c(L,Y){const Q=[];for(const Z of Y)for(const ue of Z.compatiblePackages||[])if(ue.name===L){const X=new Set;ue.versions!==null&&ue.versions.forEach(U=>{X.add(U)});const ae=[...X];Q.push({name:Z.name,description:Z.description,pkg_versions:ae,use:Z.use,patchOptions:Z.options})}return Q}let j=!1,S;function B(L){return l(10,j=!1),l(14,S=`https://api.revanced.app/v2/patches/${v}`),(v!=="latest"?fetch(S).then(Q=>Q.json()).then(Q=>Q.patches||Q):s).then(Q=>c(o,Q))}async function R(L){for(const Y of await r)L==="auto"||L==="latest"||L==="beta"?Y.warn=!1:Y.warn=Y.pkg_versions.length!==0&&!Y.pkg_versions.includes(L)}let M="",k,T=!1,A=[];const E=()=>{k.parentNode.removeChild(k),l(11,T=!0)};function I(){g=this.value,l(6,g)}function z(){u=this.value,l(0,u)}function D(L){C=L,l(7,C)}function d(){C=this.value,l(7,C)}function O(L){p=L,l(4,p)}function K(L){f=L,l(1,f)}function Ne(){w=this.value,l(8,w)}function Te(){v=this.value,l(9,v)}const Ce=()=>l(10,j=!0);function Le(L){_=L,l(5,_)}function te(L){A=L,l(12,A)}function je(L){ee[L?"unshift":"push"](()=>{k=L,l(15,k)})}return e.$$set=L=>{"pkgName"in L&&l(2,o=L.pkgName),"defaultPatchesJson"in L&&l(17,s=L.defaultPatchesJson),"reprName"in L&&l(3,n=L.reprName),"apkmirror_dlurl"in L&&l(0,u=L.apkmirror_dlurl),"TOML"in L&&l(16,i=L.TOML),"arch"in L&&l(1,f=L.arch)},e.$$.update=()=>{e.$$.dirty[0]&1&&l(0,u=(L=>L.startsWith("https://apkmirror.com/apk/")||L.startsWith("https://www.apkmirror.com/apk/")||L.length===0?L:"https://apkmirror.com/apk/")(u)),e.$$.dirty[0]&1024&&l(13,r=B()),e.$$.dirty[0]&128&&R(C),e.$$.dirty[0]&277499&&r.then(L=>{const Y=[],Q=[];let Z;if(_.length>L.length/2){Z=!1;for(const U of L){const le=`'${U.name}'`;!U.use&&_.includes(U)?Y.push(le):U.use&&!_.includes(U)&&Q.push(le)}}else Z=!0,_.forEach(U=>{const le=`'${U.name}'`;Y.push(le)});const ue=Y.join(" "),X=Q.join(" ");g?l(18,M=g):l(18,M=n);const ae=[];for(const[U,le]of Object.entries(A)){let $=!0;for(const[Me,re]of Object.entries(le))re.length>0&&($=!1);if($)break;const Pe=[];for(const[Me,re]of Object.entries(le))re.length>0&&Pe.push({key:Me,value:re});ae.push({patchName:U,options:Pe})}l(16,i={app_name:M,apkmirror_dlurl:u,patches_source:w,patches_version:v,version:C,build_mode:p,arch:f,included_patches:ue,excluded_patches:X,exclusive_patches:Z,deleted:T,opts:ae})})},[u,f,o,n,p,_,g,C,w,v,j,T,A,r,S,k,i,s,M,E,I,z,D,d,O,K,Ne,Te,Ce,Le,te,je]}class nl extends Oe{constructor(t){super(),we(this,t,ll,tl,ke,{pkgName:2,defaultPatchesJson:17,reprName:3,apkmirror_dlurl:0,TOML:16,arch:1},null,[-1,-1])}}function ft(e,t,l){const r=e.slice();return r[14]=t[l],r[15]=t,r[16]=l,r}function ct(e,t,l){const r=e.slice();return r[17]=t[l],r}function at(e){let t,l,r,o,s,n,u,i,f,p,_,g,C,w,v,c=e[8]()+"",j,S,B;l=new Ze({props:{id:"config-toml-text"}});let R=e[0],M=[];for(let k=0;kq(o[n],1,1,()=>{o[n]=null});return{c(){for(let n=0;n_e(t,"TOML",o)),{c(){fe(t.$$.fragment)},m(n,u){oe(t,n,u),r=!0},p(n,u){e=n;const i={};u&4&&(i.pkgName=e[14]),u&4&&(i.defaultPatchesJson=e[2]),u&4&&(i.reprName=e[4](e[14])),u&4&&(i.apkmirror_dlurl=e[5](e[14])),!l&&u&1&&(l=!0,i.TOML=e[0][e[16]],pe(()=>l=!1)),t.$set(i)},i(n){r||(V(t.$$.fragment,n),r=!0)},o(n){q(t.$$.fragment,n),r=!1},d(n){se(t,n)}}}function ol(e){return{c:J,m:J,p:J,i:J,o:J,d:J}}function sl(e){let t,l,r,o,s,n,u,i,f,p=e[1]?"Hide Config":"Create Config",_,g,C,w,v,c,j,S,B,R,M,k=e[1]&&at(e),T={ctx:e,current:null,token:null,hasCatch:!1,pending:ol,then:il,catch:rl,value:13,blocks:[,,,]};return Re(S=e[2].then(e[9]),T),{c(){t=h("main"),l=h("p"),l.textContent="RVMM Config Generator",r=P(),o=h("div"),o.innerHTML=` - - `,s=P(),n=h("br"),u=P(),i=h("div"),f=h("button"),_=N(p),g=P(),C=h("label"),C.textContent="Upload patches.json",w=P(),v=h("input"),c=P(),k&&k.c(),j=P(),T.block.c(),y(l,"class","m-4"),y(o,"class","inline-flex"),y(f,"class","m-3 mb-5 justify-center items-center space-x-2 border border-gray-300 rounded-md py-2 px-4 bg-white text-sm leading-5 font-medium text-gray-900 hover:text-gray-600 focus:outline-none focus:border-gray-300 focus:ring-blue active:bg-gray-50 active:text-gray-800"),y(C,"for","files"),y(C,"class","m-3 mb-5 text-xs justify-center items-center space-x-2 border border-gray-300 rounded-md py-2 px-4 bg-white font-medium text-gray-900 hover:text-gray-600 focus:outline-none focus:border-gray-300 focus:ring-blue active:bg-gray-50 active:text-gray-800 ml-auto"),y(v,"id","files"),y(v,"class","hidden"),y(v,"type","file"),y(i,"class","flex justify-between")},m(A,E){b(A,t,E),a(t,l),a(t,r),a(t,o),a(t,s),a(t,n),a(t,u),a(t,i),a(i,f),a(f,_),a(i,g),a(i,C),a(i,w),a(i,v),a(t,c),k&&k.m(t,null),a(t,j),T.block.m(t,T.anchor=null),T.mount=()=>t,T.anchor=null,B=!0,R||(M=[W(f,"click",e[6]),W(v,"change",e[7])],R=!0)},p(A,[E]){e=A,(!B||E&2)&&p!==(p=e[1]?"Hide Config":"Create Config")&&F(_,p),e[1]?k?(k.p(e,E),E&2&&V(k,1)):(k=at(e),k.c(),V(k,1),k.m(t,j)):k&&(ve(),q(k,1,1,()=>{k=null}),ye()),T.ctx=e,E&4&&S!==(S=e[2].then(e[9]))&&Re(S,T)||jt(T,e,E)},i(A){B||(V(k),V(T.block),B=!0)},o(A){q(k);for(let E=0;E<3;E+=1){const I=T.blocks[E];q(I)}B=!1},d(A){A&&m(t),k&&k.d(),T.block.d(),T.token=null,T=null,R=!1,ce(M)}}}function ul(e,t,l){function r(c){const j=new Set;for(const B of c)B.compatiblePackages!==null&&B.compatiblePackages.map(R=>R.name).forEach(R=>{j.add(R)});const S=[...j];return S.sort((B,R)=>{const M=o[B]!==void 0,k=o[R]!==void 0;if(M&&k)return 0;if(M)return-1;if(k)return 1}),S}const o={"com.google.android.youtube":"YouTube","tv.twitch.android.app":"Twitch","com.twitter.android":"Twitter","com.laurencedawson.reddit_sync":"Sync","com.laurencedawson.reddit_sync.pro":"Sync Pro","com.google.android.apps.youtube.music":"Music","com.rubenmayayo.reddit":"Boost","com.zhiliaoapp.musically":"Tiktok","com.reddit.frontpage":"Reddit","com.facebook.orca":"Messenger","com.instagram.android":"Instagram"};function s(c){return o[c]!==void 0?o[c]:c}const n={"com.google.android.youtube":"https://apkmirror.com/apk/google-inc/youtube/","tv.twitch.android.app":"https://apkmirror.com/apk/twitch-interactive-inc/twitch/","com.twitter.android":"https://apkmirror.com/apk/twitter-inc/twitter/","com.google.android.apps.youtube.music":"https://apkmirror.com/apk/google-inc/youtube-music/","com.zhiliaoapp.musically":"https://apkmirror.com/apk/tiktok-pte-ltd/tik-tok-including-musical-ly/","com.reddit.frontpage":"https://apkmirror.com/apk/redditinc/reddit/","com.facebook.orca":"https://apkmirror.com/apk/facebook-2/messenger/","com.instagram.android":"https://apkmirror.com/apk/instagram/instagram-instagram/"};function u(c){if(n[c]!==void 0)return n[c]}let i=[],f=!1,p=fetch("https://api.revanced.app/v2/patches/latest").then(c=>c.json()).then(c=>c.patches||c);const _=()=>{l(1,f=!f)},g=c=>{var j=c.target.files[0],S=new FileReader;S.readAsText(j),S.onload=B=>{const R=JSON.parse(B.target.result);l(2,p=Promise.resolve(R.patches||R)),l(0,i=[])}},C=()=>{let c=[];return i.forEach(j=>{c=[...c,...j.opts]}),` -`+JSON.stringify(c,void 0,2)},w=c=>r(c);function v(c,j){e.$$.not_equal(i[j],c)&&(i[j]=c,l(0,i))}return[i,f,p,r,s,u,_,g,C,w,v]}class fl extends Oe{constructor(t){super(),we(this,t,ul,sl,ke,{})}}new fl({target:document.getElementById("app")}); diff --git a/docs/assets/index-924ae0f0.css b/docs/assets/index-924ae0f0.css new file mode 100644 index 0000000..af1115e --- /dev/null +++ b/docs/assets/index-924ae0f0.css @@ -0,0 +1 @@ +*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.\!visible{visibility:visible!important}.visible{visibility:visible}.relative{position:relative}.float-right{float:right}.m-3{margin:.75rem}.m-4{margin:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-0{margin-top:0;margin-bottom:0}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-5{margin-bottom:1.25rem}.ml-6{margin-left:1.5rem}.ml-auto{margin-left:auto}.mr-3{margin-right:.75rem}.mt-2{margin-top:.5rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.hidden{display:none}.h-7{height:1.75rem}.w-20{width:5rem}.w-7{width:1.75rem}.w-80{width:20rem}.w-full{width:100%}.w-screen{width:100vw}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(243 244 246 / var(--tw-divide-opacity))}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.border{border-width:1px}.border-2{border-width:2px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0px}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity))}.bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-3{padding:.75rem}.p-4{padding:1rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.pb-2{padding-bottom:.5rem}.pl-1{padding-left:.25rem}.pr-1{padding-right:.25rem}.text-left{text-align:left}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.leading-5{line-height:1.25rem}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity))}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-black{--tw-ring-opacity: 1;--tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity))}.ring-opacity-5{--tw-ring-opacity: .05}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.hover\:-translate-y-0:hover{--tw-translate-y: -0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:-translate-y-0\.5:hover{--tw-translate-y: -.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-gray-300:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity))}.hover\:text-gray-50:hover{--tw-text-opacity: 1;color:rgb(249 250 251 / var(--tw-text-opacity))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.focus\:border-gray-300:focus{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.active\:bg-gray-50:active{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity))}.active\:text-gray-800:active{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))} diff --git a/docs/assets/index-c16e5629.js b/docs/assets/index-c16e5629.js new file mode 100644 index 0000000..89a6782 --- /dev/null +++ b/docs/assets/index-c16e5629.js @@ -0,0 +1,13 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const s of o)if(s.type==="childList")for(const n of s.addedNodes)n.tagName==="LINK"&&n.rel==="modulepreload"&&r(n)}).observe(document,{childList:!0,subtree:!0});function l(o){const s={};return o.integrity&&(s.integrity=o.integrity),o.referrerPolicy&&(s.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?s.credentials="include":o.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(o){if(o.ep)return;o.ep=!0;const s=l(o);fetch(o.href,s)}})();function B(){}function Et(e){return!!e&&(typeof e=="object"||typeof e=="function")&&typeof e.then=="function"}function wt(e){return e()}function Qe(){return Object.create(null)}function ce(e){e.forEach(wt)}function Ot(e){return typeof e=="function"}function ve(e,t){return e!=e?t==t:e!==t||e&&typeof e=="object"||typeof e=="function"}function Tt(e){return Object.keys(e).length===0}function d(e,t){e.appendChild(t)}function g(e,t,l){e.insertBefore(t,l||null)}function b(e){e.parentNode&&e.parentNode.removeChild(e)}function je(e,t){for(let l=0;le.removeEventListener(t,l,r)}function v(e,t,l){l==null?e.removeAttribute(t):e.getAttribute(t)!==l&&e.setAttribute(t,l)}function Lt(e,t,l){const r=new Set;for(let o=0;oe.push(r))},r(){t.forEach(l=>e.splice(e.indexOf(l),1))}}}function St(e){return Array.from(e.childNodes)}function I(e,t){t=""+t,e.data!==t&&(e.data=t)}function ne(e,t){e.value=t??""}let Pe;function ie(e){Pe=e}function Bt(){if(!Pe)throw new Error("Function called outside component initialization");return Pe}const ge=[],te=[];let ke=[];const ze=[],Rt=Promise.resolve();let Je=!1;function zt(){Je||(Je=!0,Rt.then(Ve))}function De(e){ke.push(e)}function pe(e){ze.push(e)}const Be=new Set;let he=0;function Ve(){if(he!==0)return;const e=Pe;do{try{for(;hee.indexOf(r)===-1?t.push(r):l.push(r)),l.forEach(r=>r()),ke=t}const Te=new Set;let de;function ye(){de={r:0,c:[],p:de}}function we(){de.r||ce(de.c),de=de.p}function V(e,t){e&&e.i&&(Te.delete(e),e.i(t))}function H(e,t,l,r){if(e&&e.o){if(Te.has(e))return;Te.add(e),de.c.push(()=>{Te.delete(e),r&&(l&&e.d(1),r())}),e.o(t)}else r&&r()}function Le(e,t){const l=t.token={};function r(o,s,n,u){if(t.token!==l)return;t.resolved=u;let i=t.ctx;n!==void 0&&(i=i.slice(),i[n]=u);const f=o&&(t.current=o)(i);let c=!1;t.block&&(t.blocks?t.blocks.forEach((m,p)=>{p!==s&&m&&(ye(),H(m,1,1,()=>{t.blocks[p]===m&&(t.blocks[p]=null)}),we())}):t.block.d(1),f.c(),V(f,1),f.m(t.mount(),t.anchor),c=!0),t.block=f,t.blocks&&(t.blocks[s]=f),c&&Ve()}if(Et(e)){const o=Bt();if(e.then(s=>{ie(o),r(t.then,1,t.value,s),ie(null)},s=>{if(ie(o),r(t.catch,2,t.error,s),ie(null),!t.hasCatch)throw s}),t.current!==t.pending)return r(t.pending,0),!0}else{if(t.current!==t.then)return r(t.then,1,t.value,e),!0;t.resolved=e}}function Pt(e,t,l){const r=t.slice(),{resolved:o}=e;e.current===e.then&&(r[e.value]=o),e.current===e.catch&&(r[e.error]=o),e.block.p(r,l)}function _e(e,t,l){const r=e.$$.props[t];r!==void 0&&(e.$$.bound[r]=l,l(e.$$.ctx[r]))}function me(e){e&&e.c()}function ue(e,t,l,r){const{fragment:o,after_update:s}=e.$$;o&&o.m(t,l),r||De(()=>{const n=e.$$.on_mount.map(wt).filter(Ot);e.$$.on_destroy?e.$$.on_destroy.push(...n):ce(n),e.$$.on_mount=[]}),s.forEach(De)}function fe(e,t){const l=e.$$;l.fragment!==null&&(Dt(l.after_update),ce(l.on_destroy),l.fragment&&l.fragment.d(t),l.on_destroy=l.fragment=null,l.ctx=[])}function Vt(e,t){e.$$.dirty[0]===-1&&(ge.push(e),zt(),e.$$.dirty.fill(0)),e.$$.dirty[t/31|0]|=1<{const y=O.length?O[0]:p;return f.ctx&&o(f.ctx[m],f.ctx[m]=y)&&(!f.skip_bound&&f.bound[m]&&f.bound[m](y),c&&Vt(e,m)),p}):[],f.update(),c=!0,ce(f.before_update),f.fragment=r?r(f.ctx):!1,t.target){if(t.hydrate){const m=St(t.target);f.fragment&&f.fragment.l(m),m.forEach(b)}else f.fragment&&f.fragment.c();t.intro&&V(e.$$.fragment),ue(e,t.target,t.anchor,t.customElement),Ve()}ie(i)}class Ne{$destroy(){fe(this,1),this.$destroy=B}$on(t,l){if(!Ot(l))return B;const r=this.$$.callbacks[t]||(this.$$.callbacks[t]=[]);return r.push(l),()=>{const o=r.indexOf(l);o!==-1&&r.splice(o,1)}}$set(t){this.$$set&&!Tt(t)&&(this.$$.skip_bound=!0,this.$$set(t),this.$$.skip_bound=!1)}}function Ft(e){let t,l,r;return{c(){t=k("button"),t.textContent="Copy",v(t,"id","cbut"),v(t,"class","transition ease-in-out hover:-translate-y-0.5 rounded-lg border w-full p-3 mb-3 items-stretch bg-gray-300 border-gray-400 text-sm leading-5 font-medium text-gray-900 hover:text-gray-600 focus:outline-none")},m(o,s){g(o,t,s),e[2](t),l||(r=[U(t,"mouseleave",e[3]),U(t,"click",e[4])],l=!0)},p:B,i:B,o:B,d(o){o&&b(t),e[2](null),l=!1,ce(r)}}}function It(e,t,l){let r,{id:o}=t;function s(i){te[i?"unshift":"push"](()=>{r=i,l(1,r)})}const n=()=>{r.textContent!=="Copy"&&l(1,r.textContent="Copy",r)},u=()=>{navigator.clipboard.writeText(document.getElementById(o).innerText),r.textContent!=="Copied ✔"&&l(1,r.textContent="Copied ✔",r)};return e.$$set=i=>{"id"in i&&l(0,o=i.id)},[o,r,s,n,u]}class Kt extends Ne{constructor(t){super(),Oe(this,t,It,Ft,ve,{id:0})}}function Xe(e,t,l){const r=e.slice();return r[6]=t[l],r[7]=t,r[8]=l,r}function Ze(e){let t,l,r,o=e[0].patchOptions,s=[];for(let n=0;nl(3,n=!n),i=(f,c,m,p)=>{l(0,c[m].value=p.target.value,r),l(0,c[m].is_selected=!0,r),s[r.name]===void 0&&l(1,s[r.name]={},s),s[r.name][f.key]===void 0&&l(1,s[r.name][f.key]=[],s),l(1,s[r.name][f.key]=f.value,s)};return e.$$set=f=>{"patch"in f&&l(0,r=f.patch),"optionName"in f&&l(2,o=f.optionName),"selectedOpts"in f&&l(1,s=f.selectedOpts)},[r,s,o,n,u,i]}class qt extends Ne{constructor(t){super(),Oe(this,t,Ht,Gt,ve,{patch:0,optionName:2,selectedOpts:1})}}function xe(e,t,l){const r=e.slice();return r[12]=t[l],r}function et(e){let t,l,r,o,s,n,u,i,f,c,m=e[3],p=[];for(let y=0;yH(p[y],1,1,()=>{p[y]=null});return{c(){t=k("p"),l=k("button"),r=w(e[5]),o=N(),s=k("div"),n=k("div"),u=k("p");for(let y=0;y_e(l,"selectedOpts",s)),{c(){t=k("p"),me(l.$$.fragment),v(t,"class","ml-6")},m(u,i){g(u,t,i),ue(l,t,null),o=!0},p(u,i){const f={};i&8&&(f.patch=u[12]),!r&&i&2&&(r=!0,f.selectedOpts=u[1],pe(()=>r=!1)),l.$set(f)},i(u){o||(V(l.$$.fragment,u),o=!0)},o(u){H(l.$$.fragment,u),o=!1},d(u){u&&b(t),fe(l)}}}function nt(e){let t,l,r,o=!1,s,n,u=e[12].name+"",i,f,c,m,p,O,y,_=e[12].description+"",h,A,S,R,G,F,C,T,J,P=e[12].warn!==void 0&&e[12].warn&&tt();function K(E,a){return E[12].pkg_versions.length>0?Ut:Wt}let z=K(e),D=z(e),L=e[12].patchOptions.length>0&<(e);return C=Ct(e[9][0]),{c(){t=k("label"),l=k("input"),s=N(),n=k("span"),i=w(u),f=N(),P&&P.c(),c=N(),m=k("p"),D.c(),p=N(),O=k("p"),y=w("- "),h=w(_),A=N(),L&&L.c(),S=N(),R=k("div"),G=N(),v(l,"type","checkbox"),l.__value=r=e[12],l.value=l.__value,v(m,"class","ml-6"),v(O,"class","font-bold font-mono ml-6"),v(R,"class","pb-2"),v(t,"class","items-center"),C.p(l)},m(E,a){g(E,t,a),d(t,l),l.checked=~(e[0]||[]).indexOf(l.__value),d(t,s),d(t,n),d(n,i),d(n,f),P&&P.m(n,null),d(n,c),d(n,m),D.m(m,null),d(t,p),d(t,O),d(O,y),d(O,h),d(t,A),L&&L.m(t,null),d(t,S),d(t,R),d(t,G),F=!0,T||(J=U(l,"change",e[8]),T=!0)},p(E,a){(!F||a&8&&r!==(r=E[12]))&&(l.__value=r,l.value=l.__value,o=!0),(o||a&9)&&(l.checked=~(E[0]||[]).indexOf(l.__value)),(!F||a&8)&&u!==(u=E[12].name+"")&&I(i,u),E[12].warn!==void 0&&E[12].warn?P||(P=tt(),P.c(),P.m(n,c)):P&&(P.d(1),P=null),z===(z=K(E))&&D?D.p(E,a):(D.d(1),D=z(E),D&&(D.c(),D.m(m,null))),(!F||a&8)&&_!==(_=E[12].description+"")&&I(h,_),E[12].patchOptions.length>0?L?(L.p(E,a),a&8&&V(L,1)):(L=lt(E),L.c(),V(L,1),L.m(t,S)):L&&(ye(),H(L,1,1,()=>{L=null}),we())},i(E){F||(V(L),F=!0)},o(E){H(L),F=!1},d(E){E&&b(t),P&&P.d(),D.d(),L&&L.d(),C.r(),T=!1,J()}}}function Yt(e){let t,l,r,o,s,n,u,i,f=e[4]&&et(e);return{c(){t=k("div"),l=k("button"),r=k("span"),o=w(e[2]),s=N(),f&&f.c(),v(l,"class","inline-flex justify-center items-center space-x-2 border border-gray-300 rounded-md py-2 px-4 bg-white text-sm leading-5 font-medium text-gray-900 hover:text-gray-600 focus:outline-none focus:border-gray-300 focus:ring-blue active:bg-gray-50 active:text-gray-800"),v(t,"class","relative inline-block text-left")},m(c,m){g(c,t,m),d(t,l),d(l,r),d(r,o),d(t,s),f&&f.m(t,null),n=!0,u||(i=U(l,"click",e[7]),u=!0)},p(c,[m]){(!n||m&4)&&I(o,c[2]),c[4]?f?(f.p(c,m),m&16&&V(f,1)):(f=et(c),f.c(),V(f,1),f.m(t,null)):f&&(ye(),H(f,1,1,()=>{f=null}),we())},i(c){n||(V(f),n=!0)},o(c){H(f),n=!1},d(c){c&&b(t),f&&f.d(),u=!1,i()}}}function Qt(e,t,l){let{optionName:r}=t,{options:o}=t,s=!1,{selected:n=[]}=t;const u=_=>{for(const h of _)h.use&&n.push(h)},i=()=>{f==="Deselect All"?(l(0,n.length=0,n),l(5,f="Select Default")):(l(0,n.length=0,n),u(o),l(5,f="Deselect All"))};let f="Deselect All",{selectedOpts:c}=t;const m=[[]],p=()=>l(4,s=!s);function O(){n=Lt(m[0],this.__value,this.checked),l(0,n)}function y(_){c=_,l(1,c)}return e.$$set=_=>{"optionName"in _&&l(2,r=_.optionName),"options"in _&&l(3,o=_.options),"selected"in _&&l(0,n=_.selected),"selectedOpts"in _&&l(1,c=_.selectedOpts)},e.$$.update=()=>{e.$$.dirty&8&&u(o)},[n,c,r,o,s,f,i,p,O,m,y]}class Xt extends Ne{constructor(t){super(),Oe(this,t,Qt,Yt,ve,{optionName:2,options:3,selected:0,selectedOpts:1})}}function rt(e,t,l){const r=e.slice();return r[7]=t[l],r}function it(e){let t,l,r,o=e[2],s=[];for(let n=0;nl(3,n=!n);function f(){s=this.__value,l(0,s)}return e.$$set=c=>{"optionName"in c&&l(1,r=c.optionName),"options"in c&&l(2,o=c.options),"selected"in c&&l(0,s=c.selected)},[s,r,o,n,i,f,u]}class Re extends Ne{constructor(t){super(),Oe(this,t,$t,Zt,ve,{optionName:1,options:2,selected:0})}}function xt(e){let t;return{c(){t=k("div"),t.textContent="Could not fetch patches",v(t,"class","border border-t-0 border-red-200 rounded-b bg-red-100 text-red-400")},m(l,r){g(l,t,r)},p:B,i:B,o:B,d(l){l&&b(t)}}}function el(e){let t,l,r,o,s,n;function u(c){e[26](c)}function i(c){e[27](c)}let f={optionName:"patches",options:e[12]};return e[5]!==void 0&&(f.selected=e[5]),e[11]!==void 0&&(f.selectedOpts=e[11]),r=new Xt({props:f}),te.push(()=>_e(r,"selected",u)),te.push(()=>_e(r,"selectedOpts",i)),{c(){t=k("hr"),l=N(),me(r.$$.fragment),v(t,"class","my-3 border-t border-gray-300")},m(c,m){g(c,t,m),g(c,l,m),ue(r,c,m),n=!0},p(c,m){const p={};m[0]&4096&&(p.options=c[12]),!o&&m[0]&32&&(o=!0,p.selected=c[5],pe(()=>o=!1)),!s&&m[0]&2048&&(s=!0,p.selectedOpts=c[11],pe(()=>s=!1)),r.$set(p)},i(c){n||(V(r.$$.fragment,c),n=!0)},o(c){H(r.$$.fragment,c),n=!1},d(c){c&&b(t),c&&b(l),fe(r,c)}}}function tl(e){return{c:B,m:B,p:B,i:B,o:B,d:B}}function ll(e){let t,l,r=(e[6]?e[6]:e[3])+"",o,s,n,u,i,f,c,m,p,O,y,_,h,A,S,R,G,F,C,T,J,P,K,z,D,L,E,a,j,Me,M,$,Q,X,ae,oe,se,Y,ee,x,Ce,re,Fe,le,Ie,Ke,Ae,be,Se,Ge;function jt(q){e[20](q)}let He={optionName:"version",options:["auto","latest","beta"]};e[7]!==void 0&&(He.selected=e[7]),C=new Re({props:He}),te.push(()=>_e(C,"selected",jt));function Mt(q){e[22](q)}let qe={optionName:"build-mode",options:["apk","both","module"]};e[4]!==void 0&&(qe.selected=e[4]),a=new Re({props:qe}),te.push(()=>_e(a,"selected",Mt));function At(q){e[23](q)}let We={optionName:"apkmirror arch",options:["universal","arm64-v8a","arm-v7a","both"]};e[1]!==void 0&&(We.selected=e[1]),Q=new Re({props:We}),te.push(()=>_e(Q,"selected",At));let Z={ctx:e,current:null,token:null,hasCatch:!0,pending:tl,then:el,catch:xt,value:12,error:31,blocks:[,,,]};return Le(Ae=e[12],Z),{c(){t=k("details"),l=k("summary"),o=w(r),s=N(),n=k("button"),n.textContent="-",u=N(),i=k("div"),f=k("label"),c=w(`app-name: + `),m=k("input"),O=N(),y=k("hr"),_=N(),h=k("label"),A=w(`apkmirror-dlurl: + `),S=k("input"),R=N(),G=k("hr"),F=N(),me(C.$$.fragment),J=N(),P=k("label"),K=w(`custom: + `),z=k("input"),D=N(),L=k("hr"),E=N(),me(a.$$.fragment),Me=N(),M=k("hr"),$=N(),me(Q.$$.fragment),ae=N(),oe=k("hr"),se=N(),Y=k("label"),ee=w(`patches source: + `),x=k("input"),Ce=N(),re=k("label"),Fe=w(`patches version: + `),le=k("input"),Ie=N(),Ke=N(),Z.block.c(),v(n,"class","float-right w-7 h-7 rounded-full border-2 border-gray-400 text-gray-400 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-50"),v(m,"id","app-name"),v(m,"type","text"),v(m,"class","border-2 rounded border-gray-300 p-0.5 w-full"),v(m,"placeholder",p=e[3]===e[2]?"Fill in app-name and apkmirror-dlurl":e[3]),v(y,"class","my-3 border-t border-gray-300"),v(S,"type","text"),v(S,"class","border-2 rounded border-gray-300 p-0.5 pl-1 w-full"),v(S,"size","60"),v(G,"class","my-3 border-t border-gray-300"),v(z,"type","text"),v(z,"class","border-2 rounded border-gray-300 p-0.5 w-20"),v(z,"placeholder","18.19.35"),v(L,"class","my-3 border-t border-gray-300"),v(M,"class","my-3 border-t border-gray-300"),v(oe,"class","my-3 border-t border-gray-300"),v(x,"id","patches-source"),v(x,"type","text"),v(x,"class","border-2 rounded border-gray-300 p-0.5 pl-1 w-full"),v(x,"size","60"),v(le,"id","patches-version"),v(le,"type","text"),v(le,"class","border-2 rounded border-gray-300 p-0.5 pl-1 w-full"),v(le,"size","60"),v(i,"class","select-none text-xs my-3 py-1 cursor-pointer hover:bg-gray-50 hover:border-gray-300"),v(t,"class","select-none m-3 group p-4 border-2 cursor-pointer rounded-md hover:bg-gray-50 hover:border-gray-300")},m(q,W){g(q,t,W),d(t,l),d(l,o),d(l,s),d(l,n),d(t,u),d(t,i),d(i,f),d(f,c),d(f,m),ne(m,e[6]),d(i,O),d(i,y),d(i,_),d(i,h),d(h,A),d(h,S),ne(S,e[0]),d(i,R),d(i,G),d(i,F),ue(C,i,null),d(i,J),d(i,P),d(P,K),d(P,z),ne(z,e[7]),d(i,D),d(i,L),d(i,E),ue(a,i,null),d(i,Me),d(i,M),d(i,$),ue(Q,i,null),d(i,ae),d(i,oe),d(i,se),d(i,Y),d(Y,ee),d(Y,x),ne(x,e[8]),d(i,Ce),d(i,re),d(re,Fe),d(re,le),ne(le,e[9]),d(i,Ie),d(i,Ke),Z.block.m(i,Z.anchor=null),Z.mount=()=>i,Z.anchor=null,e[28](t),be=!0,Se||(Ge=[U(n,"click",e[17]),U(m,"input",e[18]),U(S,"input",e[19]),U(z,"input",e[21]),U(x,"input",e[24]),U(le,"input",e[25])],Se=!0)},p(q,W){e=q,(!be||W[0]&72)&&r!==(r=(e[6]?e[6]:e[3])+"")&&I(o,r),(!be||W[0]&12&&p!==(p=e[3]===e[2]?"Fill in app-name and apkmirror-dlurl":e[3]))&&v(m,"placeholder",p),W[0]&64&&m.value!==e[6]&&ne(m,e[6]),W[0]&1&&S.value!==e[0]&&ne(S,e[0]);const Ee={};!T&&W[0]&128&&(T=!0,Ee.selected=e[7],pe(()=>T=!1)),C.$set(Ee),W[0]&128&&z.value!==e[7]&&ne(z,e[7]);const Ue={};!j&&W[0]&16&&(j=!0,Ue.selected=e[4],pe(()=>j=!1)),a.$set(Ue);const Ye={};!X&&W[0]&2&&(X=!0,Ye.selected=e[1],pe(()=>X=!1)),Q.$set(Ye),W[0]&256&&x.value!==e[8]&&ne(x,e[8]),W[0]&512&&le.value!==e[9]&&ne(le,e[9]),Z.ctx=e,W[0]&4096&&Ae!==(Ae=e[12])&&Le(Ae,Z)||Pt(Z,e,W)},i(q){be||(V(C.$$.fragment,q),V(a.$$.fragment,q),V(Q.$$.fragment,q),V(Z.block),be=!0)},o(q){H(C.$$.fragment,q),H(a.$$.fragment,q),H(Q.$$.fragment,q);for(let W=0;W<3;W+=1){const Ee=Z.blocks[W];H(Ee)}be=!1},d(q){q&&b(t),fe(C),fe(a),fe(Q),Z.block.d(),Z.token=null,Z=null,e[28](null),Se=!1,ce(Ge)}}}function nl(e,t,l){let r,{pkgName:o}=t,{defaultPatchesJson:s}=t,{reprName:n}=t,{apkmirror_dlurl:u="https://apkmirror.com/apk/"}=t,{TOML:i}=t,{arch:f="universal"}=t,c,m=[],p,O="auto",y="revanced/revanced-patches",_="latest";function h(M,$){const Q=[];for(const X of $)for(const ae of Object.keys(X.compatiblePackages||{})){if(ae!==M)continue;const oe=new Set,se=X.compatiblePackages[ae];se!==null&&se.forEach(ee=>{oe.add(ee)});const Y=[...oe];Q.push({name:X.name,description:X.description,pkg_versions:Y,use:X.use,patchOptions:X.options})}return Q}async function A(M){for(const $ of await r)M==="auto"||M==="latest"||M==="beta"?$.warn=!1:$.warn=$.pkg_versions.length!==0&&!$.pkg_versions.includes(M)}let S="",R,G=!1,F=[];const C=()=>{R.parentNode.removeChild(R),l(10,G=!0)};function T(){p=this.value,l(6,p)}function J(){u=this.value,l(0,u)}function P(M){O=M,l(7,O)}function K(){O=this.value,l(7,O)}function z(M){c=M,l(4,c)}function D(M){f=M,l(1,f)}function L(){y=this.value,l(8,y)}function E(){_=this.value,l(9,_)}function a(M){m=M,l(5,m)}function j(M){F=M,l(11,F)}function Me(M){te[M?"unshift":"push"](()=>{R=M,l(13,R)})}return e.$$set=M=>{"pkgName"in M&&l(2,o=M.pkgName),"defaultPatchesJson"in M&&l(15,s=M.defaultPatchesJson),"reprName"in M&&l(3,n=M.reprName),"apkmirror_dlurl"in M&&l(0,u=M.apkmirror_dlurl),"TOML"in M&&l(14,i=M.TOML),"arch"in M&&l(1,f=M.arch)},e.$$.update=()=>{e.$$.dirty[0]&1&&l(0,u=(M=>M.startsWith("https://apkmirror.com/apk/")||M.startsWith("https://www.apkmirror.com/apk/")||M.length===0?M:"https://apkmirror.com/apk/")(u)),e.$$.dirty[0]&32772&&l(12,r=s.then(M=>h(o,M))),e.$$.dirty[0]&128&&A(O),e.$$.dirty[0]&73723&&r.then(M=>{const $=[],Q=[];let X;if(m.length>M.length/2){X=!1;for(const Y of M){const ee=`'${Y.name}'`;!Y.use&&m.includes(Y)?$.push(ee):Y.use&&!m.includes(Y)&&Q.push(ee)}}else X=!0,m.forEach(Y=>{const ee=`'${Y.name}'`;$.push(ee)});const ae=$.join(" "),oe=Q.join(" ");p?l(16,S=p):l(16,S=n);let se="";for(const[Y,ee]of Object.entries(F)){let x=!0;for(const[Ce,re]of Object.entries(ee))re.length>0&&(x=!1);if(x)break;for(const[Ce,re]of Object.entries(ee))re.length>0&&(se+=`-O${Ce}=${re} `)}l(14,i={app_name:S,apkmirror_dlurl:u,patches_source:y,patches_version:_,version:O,build_mode:c,arch:f,included_patches:ae,excluded_patches:oe,exclusive_patches:X,deleted:G,opts:se})})},[u,f,o,n,c,m,p,O,y,_,G,F,r,R,i,s,S,C,T,J,P,K,z,D,L,E,a,j,Me]}class rl extends Ne{constructor(t){super(),Oe(this,t,nl,ll,ve,{pkgName:2,defaultPatchesJson:15,reprName:3,apkmirror_dlurl:0,TOML:14,arch:1},null,[-1,-1])}}function st(e,t,l){const r=e.slice();return r[13]=t[l],r[14]=t,r[15]=l,r}function ut(e,t,l){const r=e.slice();return r[16]=t[l],r}function ft(e){let t,l,r,o,s,n,u;l=new Kt({props:{id:"config-toml-text"}});let i=e[0],f=[];for(let c=0;c0&&kt(e);return{c(){t=w("["),r=w(l),o=w("]"),s=k("br"),n=w(` + apkmirror-dlurl = "`),i=w(u),f=w('"'),c=k("br"),m=N(),C&&C.c(),p=N(),T&&T.c(),O=N(),J&&J.c(),y=N(),P&&P.c(),_=N(),K&&K.c(),h=N(),z&&z.c(),A=N(),D&&D.c(),S=N(),L&&L.c(),R=N(),E&&E.c(),G=N(),F=k("br")},m(a,j){g(a,t,j),g(a,r,j),g(a,o,j),g(a,s,j),g(a,n,j),g(a,i,j),g(a,f,j),g(a,c,j),g(a,m,j),C&&C.m(a,j),g(a,p,j),T&&T.m(a,j),g(a,O,j),J&&J.m(a,j),g(a,y,j),P&&P.m(a,j),g(a,_,j),K&&K.m(a,j),g(a,h,j),z&&z.m(a,j),g(a,A,j),D&&D.m(a,j),g(a,S,j),L&&L.m(a,j),g(a,R,j),E&&E.m(a,j),g(a,G,j),g(a,F,j)},p(a,j){j&1&&l!==(l=a[16].app_name+"")&&I(r,l),j&1&&u!==(u=a[16].apkmirror_dlurl+"")&&I(i,u),a[16].patches_source!=="revanced/revanced-patches"?C?C.p(a,j):(C=at(a),C.c(),C.m(p.parentNode,p)):C&&(C.d(1),C=null),a[16].patches_version!=="latest"?T?T.p(a,j):(T=dt(a),T.c(),T.m(O.parentNode,O)):T&&(T.d(1),T=null),a[16].arch!=="universal"?J?J.p(a,j):(J=pt(a),J.c(),J.m(y.parentNode,y)):J&&(J.d(1),J=null),a[16].build_mode!=="apk"?P?P.p(a,j):(P=_t(a),P.c(),P.m(_.parentNode,_)):P&&(P.d(1),P=null),a[16].version!=="auto"?K?K.p(a,j):(K=mt(a),K.c(),K.m(h.parentNode,h)):K&&(K.d(1),K=null),a[16].included_patches!==""?z?z.p(a,j):(z=bt(a),z.c(),z.m(A.parentNode,A)):z&&(z.d(1),z=null),a[16].excluded_patches!==""?D?D.p(a,j):(D=ht(a),D.c(),D.m(S.parentNode,S)):D&&(D.d(1),D=null),a[16].exclusive_patches?L?L.p(a,j):(L=gt(a),L.c(),L.m(R.parentNode,R)):L&&(L.d(1),L=null),a[16].opts.length>0?E?E.p(a,j):(E=kt(a),E.c(),E.m(G.parentNode,G)):E&&(E.d(1),E=null)},d(a){a&&b(t),a&&b(r),a&&b(o),a&&b(s),a&&b(n),a&&b(i),a&&b(f),a&&b(c),a&&b(m),C&&C.d(a),a&&b(p),T&&T.d(a),a&&b(O),J&&J.d(a),a&&b(y),P&&P.d(a),a&&b(_),K&&K.d(a),a&&b(h),z&&z.d(a),a&&b(A),D&&D.d(a),a&&b(S),L&&L.d(a),a&&b(R),E&&E.d(a),a&&b(G),a&&b(F)}}}function at(e){let t,l=e[16].patches_source+"",r,o,s,n,u=e[16].patches_source.split("/")[0]+"",i,f,c,m,p=e[16].patches_source.split("/")[0]+"",O,y,_;return{c(){t=w('patches-source = "'),r=w(l),o=w('"'),s=k("br"),n=w(` + integrations-source = "`),i=w(u),f=w('/revanced-integrations"'),c=k("br"),m=w(` + rv-brand = "`),O=w(p),y=w(' ReVanced"'),_=k("br")},m(h,A){g(h,t,A),g(h,r,A),g(h,o,A),g(h,s,A),g(h,n,A),g(h,i,A),g(h,f,A),g(h,c,A),g(h,m,A),g(h,O,A),g(h,y,A),g(h,_,A)},p(h,A){A&1&&l!==(l=h[16].patches_source+"")&&I(r,l),A&1&&u!==(u=h[16].patches_source.split("/")[0]+"")&&I(i,u),A&1&&p!==(p=h[16].patches_source.split("/")[0]+"")&&I(O,p)},d(h){h&&b(t),h&&b(r),h&&b(o),h&&b(s),h&&b(n),h&&b(i),h&&b(f),h&&b(c),h&&b(m),h&&b(O),h&&b(y),h&&b(_)}}}function dt(e){let t,l=e[16].patches_version+"",r,o,s;return{c(){t=w('patches-version = "'),r=w(l),o=w('"'),s=k("br")},m(n,u){g(n,t,u),g(n,r,u),g(n,o,u),g(n,s,u)},p(n,u){u&1&&l!==(l=n[16].patches_version+"")&&I(r,l)},d(n){n&&b(t),n&&b(r),n&&b(o),n&&b(s)}}}function pt(e){let t,l=e[16].arch+"",r,o,s;return{c(){t=w('arch = "'),r=w(l),o=w('"'),s=k("br")},m(n,u){g(n,t,u),g(n,r,u),g(n,o,u),g(n,s,u)},p(n,u){u&1&&l!==(l=n[16].arch+"")&&I(r,l)},d(n){n&&b(t),n&&b(r),n&&b(o),n&&b(s)}}}function _t(e){let t,l=e[16].build_mode+"",r,o,s;return{c(){t=w('build-mode = "'),r=w(l),o=w('"'),s=k("br")},m(n,u){g(n,t,u),g(n,r,u),g(n,o,u),g(n,s,u)},p(n,u){u&1&&l!==(l=n[16].build_mode+"")&&I(r,l)},d(n){n&&b(t),n&&b(r),n&&b(o),n&&b(s)}}}function mt(e){let t,l=e[16].version+"",r,o,s;return{c(){t=w('version = "'),r=w(l),o=w('"'),s=k("br")},m(n,u){g(n,t,u),g(n,r,u),g(n,o,u),g(n,s,u)},p(n,u){u&1&&l!==(l=n[16].version+"")&&I(r,l)},d(n){n&&b(t),n&&b(r),n&&b(o),n&&b(s)}}}function bt(e){let t,l=e[16].included_patches+"",r,o,s;return{c(){t=w('included-patches = "'),r=w(l),o=w('"'),s=k("br")},m(n,u){g(n,t,u),g(n,r,u),g(n,o,u),g(n,s,u)},p(n,u){u&1&&l!==(l=n[16].included_patches+"")&&I(r,l)},d(n){n&&b(t),n&&b(r),n&&b(o),n&&b(s)}}}function ht(e){let t,l=e[16].excluded_patches+"",r,o,s;return{c(){t=w('excluded-patches = "'),r=w(l),o=w('"'),s=k("br")},m(n,u){g(n,t,u),g(n,r,u),g(n,o,u),g(n,s,u)},p(n,u){u&1&&l!==(l=n[16].excluded_patches+"")&&I(r,l)},d(n){n&&b(t),n&&b(r),n&&b(o),n&&b(s)}}}function gt(e){let t,l=e[16].exclusive_patches+"",r,o;return{c(){t=w("exclusive-patches = "),r=w(l),o=k("br")},m(s,n){g(s,t,n),g(s,r,n),g(s,o,n)},p(s,n){n&1&&l!==(l=s[16].exclusive_patches+"")&&I(r,l)},d(s){s&&b(t),s&&b(r),s&&b(o)}}}function kt(e){let t,l=e[16].opts+"",r,o,s;return{c(){t=w('patcher-args = "'),r=w(l),o=w('"'),s=k("br")},m(n,u){g(n,t,u),g(n,r,u),g(n,o,u),g(n,s,u)},p(n,u){u&1&&l!==(l=n[16].opts+"")&&I(r,l)},d(n){n&&b(t),n&&b(r),n&&b(o),n&&b(s)}}}function vt(e){let t,l=!e[16].deleted&&e[16].apkmirror_dlurl!=="https://apkmirror.com/apk/"&&e[16].apkmirror_dlurl.length!==0&&ct(e);return{c(){l&&l.c(),t=Nt()},m(r,o){l&&l.m(r,o),g(r,t,o)},p(r,o){!r[16].deleted&&r[16].apkmirror_dlurl!=="https://apkmirror.com/apk/"&&r[16].apkmirror_dlurl.length!==0?l?l.p(r,o):(l=ct(r),l.c(),l.m(t.parentNode,t)):l&&(l.d(1),l=null)},d(r){l&&l.d(r),r&&b(t)}}}function il(e){return{c:B,m:B,p:B,i:B,o:B,d:B}}function ol(e){let t,l,r=e[12],o=[];for(let n=0;nH(o[n],1,1,()=>{o[n]=null});return{c(){for(let n=0;n_e(t,"TOML",o)),{c(){me(t.$$.fragment)},m(n,u){ue(t,n,u),r=!0},p(n,u){e=n;const i={};u&4&&(i.pkgName=e[13]),u&4&&(i.defaultPatchesJson=e[2]),u&4&&(i.reprName=e[4](e[13])),u&4&&(i.apkmirror_dlurl=e[5](e[13])),!l&&u&1&&(l=!0,i.TOML=e[0][e[15]],pe(()=>l=!1)),t.$set(i)},i(n){r||(V(t.$$.fragment,n),r=!0)},o(n){H(t.$$.fragment,n),r=!1},d(n){fe(t,n)}}}function sl(e){return{c:B,m:B,p:B,i:B,o:B,d:B}}function ul(e){let t,l,r,o,s,n,u,i,f,c=e[1]?"Hide Config":"Create Config",m,p,O,y,_,h,A,S,R,G,F,C=e[1]&&ft(e),T={ctx:e,current:null,token:null,hasCatch:!1,pending:sl,then:ol,catch:il,value:12,blocks:[,,,]};return Le(S=e[2].then(e[8]),T),{c(){t=k("main"),l=k("p"),l.textContent="RVMM Config Generator",r=N(),o=k("div"),o.innerHTML=` + + `,s=N(),n=k("br"),u=N(),i=k("div"),f=k("button"),m=w(c),p=N(),O=k("label"),O.textContent="Upload patches.json",y=N(),_=k("input"),h=N(),C&&C.c(),A=N(),T.block.c(),v(l,"class","m-4"),v(o,"class","inline-flex"),v(f,"class","m-3 mb-5 justify-center items-center space-x-2 border border-gray-300 rounded-md py-2 px-4 bg-white text-sm leading-5 font-medium text-gray-900 hover:text-gray-600 focus:outline-none focus:border-gray-300 focus:ring-blue active:bg-gray-50 active:text-gray-800"),v(O,"for","files"),v(O,"class","m-3 mb-5 text-xs justify-center items-center space-x-2 border border-gray-300 rounded-md py-2 px-4 bg-white font-medium text-gray-900 hover:text-gray-600 focus:outline-none focus:border-gray-300 focus:ring-blue active:bg-gray-50 active:text-gray-800 ml-auto"),v(_,"id","files"),v(_,"class","hidden"),v(_,"type","file"),v(i,"class","flex justify-between")},m(J,P){g(J,t,P),d(t,l),d(t,r),d(t,o),d(t,s),d(t,n),d(t,u),d(t,i),d(i,f),d(f,m),d(i,p),d(i,O),d(i,y),d(i,_),d(t,h),C&&C.m(t,null),d(t,A),T.block.m(t,T.anchor=null),T.mount=()=>t,T.anchor=null,R=!0,G||(F=[U(f,"click",e[6]),U(_,"change",e[7])],G=!0)},p(J,[P]){e=J,(!R||P&2)&&c!==(c=e[1]?"Hide Config":"Create Config")&&I(m,c),e[1]?C?(C.p(e,P),P&2&&V(C,1)):(C=ft(e),C.c(),V(C,1),C.m(t,A)):C&&(ye(),H(C,1,1,()=>{C=null}),we()),T.ctx=e,P&4&&S!==(S=e[2].then(e[8]))&&Le(S,T)||Pt(T,e,P)},i(J){R||(V(C),V(T.block),R=!0)},o(J){H(C);for(let P=0;P<3;P+=1){const K=T.blocks[P];H(K)}R=!1},d(J){J&&b(t),C&&C.d(),T.block.d(),T.token=null,T=null,G=!1,ce(F)}}}function fl(e,t,l){function r(_){const h=new Set;for(const S of _)S.compatiblePackages!==null&&Object.keys(S.compatiblePackages).forEach(R=>h.add(R));const A=[...h];return A.sort((S,R)=>{const G=o[S]!==void 0,F=o[R]!==void 0;if(G&&F)return 0;if(G)return-1;if(F)return 1}),A}const o={"com.google.android.youtube":"YouTube","tv.twitch.android.app":"Twitch","com.twitter.android":"Twitter","com.laurencedawson.reddit_sync":"Sync","com.laurencedawson.reddit_sync.pro":"Sync Pro","com.google.android.apps.youtube.music":"Music","com.rubenmayayo.reddit":"Boost","com.zhiliaoapp.musically":"Tiktok","com.reddit.frontpage":"Reddit","com.facebook.orca":"Messenger","com.instagram.android":"Instagram"};function s(_){return o[_]!==void 0?o[_]:_}const n={"com.google.android.youtube":"https://apkmirror.com/apk/google-inc/youtube/","tv.twitch.android.app":"https://apkmirror.com/apk/twitch-interactive-inc/twitch/","com.twitter.android":"https://apkmirror.com/apk/twitter-inc/twitter/","com.google.android.apps.youtube.music":"https://apkmirror.com/apk/google-inc/youtube-music/","com.zhiliaoapp.musically":"https://apkmirror.com/apk/tiktok-pte-ltd/tik-tok-including-musical-ly/","com.reddit.frontpage":"https://apkmirror.com/apk/redditinc/reddit/","com.facebook.orca":"https://apkmirror.com/apk/facebook-2/messenger/","com.instagram.android":"https://apkmirror.com/apk/instagram/instagram-instagram/"};function u(_){if(n[_]!==void 0)return n[_]}let i=[],f=!1,c=fetch("patches.json").then(_=>_.json()).then(_=>_.patches||_);const m=()=>{l(1,f=!f)},p=_=>{var h=_.target.files[0],A=new FileReader;A.readAsText(h),A.onload=S=>{const R=JSON.parse(S.target.result);l(2,c=Promise.resolve(R.patches||R)),l(0,i=[])}},O=_=>r(_);function y(_,h){e.$$.not_equal(i[h],_)&&(i[h]=_,l(0,i))}return[i,f,c,r,s,u,m,p,O,y]}class cl extends Ne{constructor(t){super(),Oe(this,t,fl,ul,ve,{})}}new cl({target:document.getElementById("app")}); diff --git a/docs/assets/index-def2ac4e.css b/docs/assets/index-def2ac4e.css deleted file mode 100644 index 40a59f6..0000000 --- a/docs/assets/index-def2ac4e.css +++ /dev/null @@ -1 +0,0 @@ -*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.\!visible{visibility:visible!important}.visible{visibility:visible}.relative{position:relative}.float-right{float:right}.m-3{margin:.75rem}.m-4{margin:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-0{margin-top:0;margin-bottom:0}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-5{margin-bottom:1.25rem}.ml-6{margin-left:1.5rem}.ml-auto{margin-left:auto}.mr-3{margin-right:.75rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.hidden{display:none}.h-7{height:1.75rem}.w-20{width:5rem}.w-7{width:1.75rem}.w-80{width:20rem}.w-full{width:100%}.w-screen{width:100vw}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(243 244 246 / var(--tw-divide-opacity))}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.border{border-width:1px}.border-2{border-width:2px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0px}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity))}.bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-3{padding:.75rem}.p-4{padding:1rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.pb-2{padding-bottom:.5rem}.pl-1{padding-left:.25rem}.pr-1{padding-right:.25rem}.text-left{text-align:left}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.leading-5{line-height:1.25rem}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity))}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-black{--tw-ring-opacity: 1;--tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity))}.ring-opacity-5{--tw-ring-opacity: .05}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.hover\:-translate-y-0:hover{--tw-translate-y: -0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:-translate-y-0\.5:hover{--tw-translate-y: -.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-gray-300:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity))}.hover\:text-gray-50:hover{--tw-text-opacity: 1;color:rgb(249 250 251 / var(--tw-text-opacity))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.focus\:border-gray-300:focus{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.active\:bg-gray-50:active{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity))}.active\:text-gray-800:active{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))} diff --git a/docs/index.html b/docs/index.html index 1d27303..a361d61 100644 --- a/docs/index.html +++ b/docs/index.html @@ -5,8 +5,8 @@ RVMM Config Generator - - + + diff --git a/docs/patches.json b/docs/patches.json new file mode 100644 index 0000000..d247d13 --- /dev/null +++ b/docs/patches.json @@ -0,0 +1,3947 @@ +[ + { + "name": "Export all activities", + "description": "Makes all app activities exportable.", + "use": false, + "dependencies": [], + "compatiblePackages": null, + "options": [] + }, + { + "name": "Spoof build info", + "description": "Spoof the information about the current build.", + "use": false, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": null, + "options": [ + { + "key": "board", + "title": "Board", + "description": "The name of the underlying board, like \"goldfish\".", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "bootloader", + "title": "Bootloader", + "description": "The system bootloader version number.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "brand", + "title": "Brand", + "description": "The consumer-visible brand with which the product/hardware will be associated, if any.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "cpu-abi", + "title": "CPU ABI", + "description": "This field was deprecated in API level 21. Use SUPPORTED_ABIS instead.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "cpu-abi-2", + "title": "CPU ABI 2", + "description": "This field was deprecated in API level 21. Use SUPPORTED_ABIS instead.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "device", + "title": "Device", + "description": "The name of the industrial design.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "display", + "title": "Display", + "description": "A build ID string meant for displaying to the user.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "fingerprint", + "title": "Fingerprint", + "description": "A string that uniquely identifies this build.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "hardware", + "title": "Hardware", + "description": "The name of the hardware (from the kernel command line or /proc).", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "host", + "title": "Host", + "description": "The host.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "id", + "title": "ID", + "description": "Either a changelist number, or a label like \"M4-rc20\".", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "manufacturer", + "title": "Manufacturer", + "description": "The manufacturer of the product/hardware.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "model", + "title": "Model", + "description": "The end-user-visible name for the end product.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "odm-sku", + "title": "ODM SKU", + "description": "The SKU of the device as set by the original design manufacturer (ODM).", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "product", + "title": "Product", + "description": "The name of the overall product.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "radio", + "title": "Radio", + "description": "This field was deprecated in API level 15. The radio firmware version is frequently not available when this class is initialized, leading to a blank or \"unknown\" value for this string. Use getRadioVersion() instead.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "serial", + "title": "Serial", + "description": "This field was deprecated in API level 26. Use getSerial() instead.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "sku", + "title": "SKU", + "description": "The SKU of the hardware (from the kernel command line).", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "soc-manufacturer", + "title": "SOC Manufacturer", + "description": "The manufacturer of the device's primary system-on-chip.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "soc-model", + "title": "SOC Model", + "description": "The model name of the device's primary system-on-chip.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "tags", + "title": "Tags", + "description": "Comma-separated tags describing the build, like \"unsigned,debug\".", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "time", + "title": "Time", + "description": "The time at which the build was produced, given in milliseconds since the UNIX epoch.", + "required": false, + "type": "kotlin.Long", + "default": null, + "values": null + }, + { + "key": "type", + "title": "Type", + "description": "The type of build, like \"user\" or \"eng\".", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + }, + { + "key": "user", + "title": "User", + "description": "The user.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": null + } + ] + }, + { + "name": "Hide mock location", + "description": "Prevents the app from knowing the device location is being mocked by a third party app.", + "use": false, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": null, + "options": [] + }, + { + "name": "Spoof SIM country", + "description": "Spoofs country information returned by the SIM card provider.", + "use": false, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": null, + "options": [ + { + "key": "networkCountryIso", + "title": "Network ISO Country Code", + "description": "ISO-3166-1 alpha-2 country code equivalent for the SIM provider's country code.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": { + "Andorra": "AD", + "United Arab Emirates": "AE", + "Afghanistan": "AF", + "Antigua & Barbuda": "AG", + "Anguilla": "AI", + "Albania": "AL", + "Armenia": "AM", + "Angola": "AO", + "Antarctica": "AQ", + "Argentina": "AR", + "American Samoa": "AS", + "Austria": "AT", + "Australia": "AU", + "Aruba": "AW", + "Åland Islands": "AX", + "Azerbaijan": "AZ", + "Bosnia & Herzegovina": "BA", + "Barbados": "BB", + "Bangladesh": "BD", + "Belgium": "BE", + "Burkina Faso": "BF", + "Bulgaria": "BG", + "Bahrain": "BH", + "Burundi": "BI", + "Benin": "BJ", + "St. Barthélemy": "BL", + "Bermuda": "BM", + "Brunei": "BN", + "Bolivia": "BO", + "Caribbean Netherlands": "BQ", + "Brazil": "BR", + "Bahamas": "BS", + "Bhutan": "BT", + "Bouvet Island": "BV", + "Botswana": "BW", + "Belarus": "BY", + "Belize": "BZ", + "Canada": "CA", + "Cocos (Keeling) Islands": "CC", + "Congo - Kinshasa": "CD", + "Central African Republic": "CF", + "Congo - Brazzaville": "CG", + "Switzerland": "CH", + "Côte d’Ivoire": "CI", + "Cook Islands": "CK", + "Chile": "CL", + "Cameroon": "CM", + "China": "CN", + "Colombia": "CO", + "Costa Rica": "CR", + "Cuba": "CU", + "Cape Verde": "CV", + "Curaçao": "CW", + "Christmas Island": "CX", + "Cyprus": "CY", + "Czechia": "CZ", + "Germany": "DE", + "Djibouti": "DJ", + "Denmark": "DK", + "Dominica": "DM", + "Dominican Republic": "DO", + "Algeria": "DZ", + "Ecuador": "EC", + "Estonia": "EE", + "Egypt": "EG", + "Western Sahara": "EH", + "Eritrea": "ER", + "Spain": "ES", + "Ethiopia": "ET", + "Finland": "FI", + "Fiji": "FJ", + "Falkland Islands": "FK", + "Micronesia": "FM", + "Faroe Islands": "FO", + "France": "FR", + "Gabon": "GA", + "United Kingdom": "GB", + "Grenada": "GD", + "Georgia": "GE", + "French Guiana": "GF", + "Guernsey": "GG", + "Ghana": "GH", + "Gibraltar": "GI", + "Greenland": "GL", + "Gambia": "GM", + "Guinea": "GN", + "Guadeloupe": "GP", + "Equatorial Guinea": "GQ", + "Greece": "GR", + "South Georgia & South Sandwich Islands": "GS", + "Guatemala": "GT", + "Guam": "GU", + "Guinea-Bissau": "GW", + "Guyana": "GY", + "Hong Kong SAR China": "HK", + "Heard & McDonald Islands": "HM", + "Honduras": "HN", + "Croatia": "HR", + "Haiti": "HT", + "Hungary": "HU", + "Indonesia": "ID", + "Ireland": "IE", + "Israel": "IL", + "Isle of Man": "IM", + "India": "IN", + "British Indian Ocean Territory": "IO", + "Iraq": "IQ", + "Iran": "IR", + "Iceland": "IS", + "Italy": "IT", + "Jersey": "JE", + "Jamaica": "JM", + "Jordan": "JO", + "Japan": "JP", + "Kenya": "KE", + "Kyrgyzstan": "KG", + "Cambodia": "KH", + "Kiribati": "KI", + "Comoros": "KM", + "St. Kitts & Nevis": "KN", + "North Korea": "KP", + "South Korea": "KR", + "Kuwait": "KW", + "Cayman Islands": "KY", + "Kazakhstan": "KZ", + "Laos": "LA", + "Lebanon": "LB", + "St. Lucia": "LC", + "Liechtenstein": "LI", + "Sri Lanka": "LK", + "Liberia": "LR", + "Lesotho": "LS", + "Lithuania": "LT", + "Luxembourg": "LU", + "Latvia": "LV", + "Libya": "LY", + "Morocco": "MA", + "Monaco": "MC", + "Moldova": "MD", + "Montenegro": "ME", + "St. Martin": "MF", + "Madagascar": "MG", + "Marshall Islands": "MH", + "North Macedonia": "MK", + "Mali": "ML", + "Myanmar (Burma)": "MM", + "Mongolia": "MN", + "Macao SAR China": "MO", + "Northern Mariana Islands": "MP", + "Martinique": "MQ", + "Mauritania": "MR", + "Montserrat": "MS", + "Malta": "MT", + "Mauritius": "MU", + "Maldives": "MV", + "Malawi": "MW", + "Mexico": "MX", + "Malaysia": "MY", + "Mozambique": "MZ", + "Namibia": "NA", + "New Caledonia": "NC", + "Niger": "NE", + "Norfolk Island": "NF", + "Nigeria": "NG", + "Nicaragua": "NI", + "Netherlands": "NL", + "Norway": "NO", + "Nepal": "NP", + "Nauru": "NR", + "Niue": "NU", + "New Zealand": "NZ", + "Oman": "OM", + "Panama": "PA", + "Peru": "PE", + "French Polynesia": "PF", + "Papua New Guinea": "PG", + "Philippines": "PH", + "Pakistan": "PK", + "Poland": "PL", + "St. Pierre & Miquelon": "PM", + "Pitcairn Islands": "PN", + "Puerto Rico": "PR", + "Palestinian Territories": "PS", + "Portugal": "PT", + "Palau": "PW", + "Paraguay": "PY", + "Qatar": "QA", + "Réunion": "RE", + "Romania": "RO", + "Serbia": "RS", + "Russia": "RU", + "Rwanda": "RW", + "Saudi Arabia": "SA", + "Solomon Islands": "SB", + "Seychelles": "SC", + "Sudan": "SD", + "Sweden": "SE", + "Singapore": "SG", + "St. Helena": "SH", + "Slovenia": "SI", + "Svalbard & Jan Mayen": "SJ", + "Slovakia": "SK", + "Sierra Leone": "SL", + "San Marino": "SM", + "Senegal": "SN", + "Somalia": "SO", + "Suriname": "SR", + "South Sudan": "SS", + "São Tomé & Príncipe": "ST", + "El Salvador": "SV", + "Sint Maarten": "SX", + "Syria": "SY", + "Eswatini": "SZ", + "Turks & Caicos Islands": "TC", + "Chad": "TD", + "French Southern Territories": "TF", + "Togo": "TG", + "Thailand": "TH", + "Tajikistan": "TJ", + "Tokelau": "TK", + "Timor-Leste": "TL", + "Turkmenistan": "TM", + "Tunisia": "TN", + "Tonga": "TO", + "Türkiye": "TR", + "Trinidad & Tobago": "TT", + "Tuvalu": "TV", + "Taiwan": "TW", + "Tanzania": "TZ", + "Ukraine": "UA", + "Uganda": "UG", + "U.S. Outlying Islands": "UM", + "United States": "US", + "Uruguay": "UY", + "Uzbekistan": "UZ", + "Vatican City": "VA", + "St. Vincent & Grenadines": "VC", + "Venezuela": "VE", + "British Virgin Islands": "VG", + "U.S. Virgin Islands": "VI", + "Vietnam": "VN", + "Vanuatu": "VU", + "Wallis & Futuna": "WF", + "Samoa": "WS", + "Yemen": "YE", + "Mayotte": "YT", + "South Africa": "ZA", + "Zambia": "ZM", + "Zimbabwe": "ZW" + } + }, + { + "key": "simCountryIso", + "title": "Sim ISO Country Code", + "description": "ISO-3166-1 alpha-2 country code equivalent for the SIM provider's country code.", + "required": false, + "type": "kotlin.String", + "default": null, + "values": { + "Andorra": "AD", + "United Arab Emirates": "AE", + "Afghanistan": "AF", + "Antigua & Barbuda": "AG", + "Anguilla": "AI", + "Albania": "AL", + "Armenia": "AM", + "Angola": "AO", + "Antarctica": "AQ", + "Argentina": "AR", + "American Samoa": "AS", + "Austria": "AT", + "Australia": "AU", + "Aruba": "AW", + "Åland Islands": "AX", + "Azerbaijan": "AZ", + "Bosnia & Herzegovina": "BA", + "Barbados": "BB", + "Bangladesh": "BD", + "Belgium": "BE", + "Burkina Faso": "BF", + "Bulgaria": "BG", + "Bahrain": "BH", + "Burundi": "BI", + "Benin": "BJ", + "St. Barthélemy": "BL", + "Bermuda": "BM", + "Brunei": "BN", + "Bolivia": "BO", + "Caribbean Netherlands": "BQ", + "Brazil": "BR", + "Bahamas": "BS", + "Bhutan": "BT", + "Bouvet Island": "BV", + "Botswana": "BW", + "Belarus": "BY", + "Belize": "BZ", + "Canada": "CA", + "Cocos (Keeling) Islands": "CC", + "Congo - Kinshasa": "CD", + "Central African Republic": "CF", + "Congo - Brazzaville": "CG", + "Switzerland": "CH", + "Côte d’Ivoire": "CI", + "Cook Islands": "CK", + "Chile": "CL", + "Cameroon": "CM", + "China": "CN", + "Colombia": "CO", + "Costa Rica": "CR", + "Cuba": "CU", + "Cape Verde": "CV", + "Curaçao": "CW", + "Christmas Island": "CX", + "Cyprus": "CY", + "Czechia": "CZ", + "Germany": "DE", + "Djibouti": "DJ", + "Denmark": "DK", + "Dominica": "DM", + "Dominican Republic": "DO", + "Algeria": "DZ", + "Ecuador": "EC", + "Estonia": "EE", + "Egypt": "EG", + "Western Sahara": "EH", + "Eritrea": "ER", + "Spain": "ES", + "Ethiopia": "ET", + "Finland": "FI", + "Fiji": "FJ", + "Falkland Islands": "FK", + "Micronesia": "FM", + "Faroe Islands": "FO", + "France": "FR", + "Gabon": "GA", + "United Kingdom": "GB", + "Grenada": "GD", + "Georgia": "GE", + "French Guiana": "GF", + "Guernsey": "GG", + "Ghana": "GH", + "Gibraltar": "GI", + "Greenland": "GL", + "Gambia": "GM", + "Guinea": "GN", + "Guadeloupe": "GP", + "Equatorial Guinea": "GQ", + "Greece": "GR", + "South Georgia & South Sandwich Islands": "GS", + "Guatemala": "GT", + "Guam": "GU", + "Guinea-Bissau": "GW", + "Guyana": "GY", + "Hong Kong SAR China": "HK", + "Heard & McDonald Islands": "HM", + "Honduras": "HN", + "Croatia": "HR", + "Haiti": "HT", + "Hungary": "HU", + "Indonesia": "ID", + "Ireland": "IE", + "Israel": "IL", + "Isle of Man": "IM", + "India": "IN", + "British Indian Ocean Territory": "IO", + "Iraq": "IQ", + "Iran": "IR", + "Iceland": "IS", + "Italy": "IT", + "Jersey": "JE", + "Jamaica": "JM", + "Jordan": "JO", + "Japan": "JP", + "Kenya": "KE", + "Kyrgyzstan": "KG", + "Cambodia": "KH", + "Kiribati": "KI", + "Comoros": "KM", + "St. Kitts & Nevis": "KN", + "North Korea": "KP", + "South Korea": "KR", + "Kuwait": "KW", + "Cayman Islands": "KY", + "Kazakhstan": "KZ", + "Laos": "LA", + "Lebanon": "LB", + "St. Lucia": "LC", + "Liechtenstein": "LI", + "Sri Lanka": "LK", + "Liberia": "LR", + "Lesotho": "LS", + "Lithuania": "LT", + "Luxembourg": "LU", + "Latvia": "LV", + "Libya": "LY", + "Morocco": "MA", + "Monaco": "MC", + "Moldova": "MD", + "Montenegro": "ME", + "St. Martin": "MF", + "Madagascar": "MG", + "Marshall Islands": "MH", + "North Macedonia": "MK", + "Mali": "ML", + "Myanmar (Burma)": "MM", + "Mongolia": "MN", + "Macao SAR China": "MO", + "Northern Mariana Islands": "MP", + "Martinique": "MQ", + "Mauritania": "MR", + "Montserrat": "MS", + "Malta": "MT", + "Mauritius": "MU", + "Maldives": "MV", + "Malawi": "MW", + "Mexico": "MX", + "Malaysia": "MY", + "Mozambique": "MZ", + "Namibia": "NA", + "New Caledonia": "NC", + "Niger": "NE", + "Norfolk Island": "NF", + "Nigeria": "NG", + "Nicaragua": "NI", + "Netherlands": "NL", + "Norway": "NO", + "Nepal": "NP", + "Nauru": "NR", + "Niue": "NU", + "New Zealand": "NZ", + "Oman": "OM", + "Panama": "PA", + "Peru": "PE", + "French Polynesia": "PF", + "Papua New Guinea": "PG", + "Philippines": "PH", + "Pakistan": "PK", + "Poland": "PL", + "St. Pierre & Miquelon": "PM", + "Pitcairn Islands": "PN", + "Puerto Rico": "PR", + "Palestinian Territories": "PS", + "Portugal": "PT", + "Palau": "PW", + "Paraguay": "PY", + "Qatar": "QA", + "Réunion": "RE", + "Romania": "RO", + "Serbia": "RS", + "Russia": "RU", + "Rwanda": "RW", + "Saudi Arabia": "SA", + "Solomon Islands": "SB", + "Seychelles": "SC", + "Sudan": "SD", + "Sweden": "SE", + "Singapore": "SG", + "St. Helena": "SH", + "Slovenia": "SI", + "Svalbard & Jan Mayen": "SJ", + "Slovakia": "SK", + "Sierra Leone": "SL", + "San Marino": "SM", + "Senegal": "SN", + "Somalia": "SO", + "Suriname": "SR", + "South Sudan": "SS", + "São Tomé & Príncipe": "ST", + "El Salvador": "SV", + "Sint Maarten": "SX", + "Syria": "SY", + "Eswatini": "SZ", + "Turks & Caicos Islands": "TC", + "Chad": "TD", + "French Southern Territories": "TF", + "Togo": "TG", + "Thailand": "TH", + "Tajikistan": "TJ", + "Tokelau": "TK", + "Timor-Leste": "TL", + "Turkmenistan": "TM", + "Tunisia": "TN", + "Tonga": "TO", + "Türkiye": "TR", + "Trinidad & Tobago": "TT", + "Tuvalu": "TV", + "Taiwan": "TW", + "Tanzania": "TZ", + "Ukraine": "UA", + "Uganda": "UG", + "U.S. Outlying Islands": "UM", + "United States": "US", + "Uruguay": "UY", + "Uzbekistan": "UZ", + "Vatican City": "VA", + "St. Vincent & Grenadines": "VC", + "Venezuela": "VE", + "British Virgin Islands": "VG", + "U.S. Virgin Islands": "VI", + "Vietnam": "VN", + "Vanuatu": "VU", + "Wallis & Futuna": "WF", + "Samoa": "WS", + "Yemen": "YE", + "Mayotte": "YT", + "South Africa": "ZA", + "Zambia": "ZM", + "Zimbabwe": "ZW" + } + } + ] + }, + { + "name": "Spoof Wi-Fi connection", + "description": "Spoofs an existing Wi-Fi connection.", + "use": false, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": null, + "options": [] + }, + { + "name": "Enable Android debugging", + "description": "Enables Android debugging capabilities. This can slow down the app.", + "use": false, + "dependencies": [], + "compatiblePackages": null, + "options": [] + }, + { + "name": "Change data directory location", + "description": "Changes the data directory in the application from the app internal storage directory to /sdcard/android/data accessible by root-less devices.Using this patch can cause unexpected issues with some apps.", + "use": false, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": null, + "options": [] + }, + { + "name": "Hex", + "description": "Replaces a hexadecimal patterns of bytes of files in an APK.", + "use": false, + "dependencies": [ + "RawResourcePatch" + ], + "compatiblePackages": null, + "options": [ + { + "key": "replacements", + "title": "Replacements", + "description": "Hexadecimal patterns to search for and replace with another in a target file.\n\nA pattern is a sequence of case insensitive strings, each representing hexadecimal bytes, separated by spaces.\nAn example pattern is 'aa 01 02 FF'.\n\nEvery pattern must be followed by a pipe ('|'), the replacement pattern,\nanother pipe ('|'), and the path to the file to make the changes in relative to the APK root. \nThe replacement pattern must have the same length as the original pattern.\n\nFull example of a valid input:\n'aa 01 02 FF|00 00 00 00|path/to/file'", + "required": true, + "type": "kotlin.collections.List", + "default": null, + "values": null + } + ] + }, + { + "name": "Predictive back gesture", + "description": "Enables the predictive back gesture introduced on Android 13.", + "use": false, + "dependencies": [], + "compatiblePackages": null, + "options": [] + }, + { + "name": "Override certificate pinning", + "description": "Overrides certificate pinning, allowing to inspect traffic via a proxy.", + "use": false, + "dependencies": [ + "Enable Android debugging" + ], + "compatiblePackages": null, + "options": [] + }, + { + "name": "Change package name", + "description": "Appends \".revanced\" to the package name by default. Changing the package name of the app can lead to unexpected issues.", + "use": false, + "dependencies": [], + "compatiblePackages": null, + "options": [ + { + "key": "packageName", + "title": "Package name", + "description": "The name of the package to rename the app to.", + "required": true, + "type": "kotlin.String", + "default": "Default", + "values": { + "Default": "Default" + } + } + ] + }, + { + "name": "Remove screen capture restriction", + "description": "Removes the restriction of capturing audio from apps that normally wouldn't allow it.", + "use": false, + "dependencies": [ + "ResourcePatch", + "BytecodePatch" + ], + "compatiblePackages": null, + "options": [] + }, + { + "name": "Remove screenshot restriction", + "description": "Removes the restriction of taking screenshots in apps that normally wouldn't allow it.", + "use": false, + "dependencies": [ + "BytecodePatch", + "BytecodePatch" + ], + "compatiblePackages": null, + "options": [] + }, + { + "name": "Remove share targets", + "description": "Removes share targets like directly sharing to a frequent contact.", + "use": false, + "dependencies": [], + "compatiblePackages": null, + "options": [] + }, + { + "name": "Change version code", + "description": "Changes the version code of the app. By default the highest version code is set. This allows older versions of an app to be installed if their version code is set to the same or a higher value and can stop app stores to update the app.", + "use": false, + "dependencies": [], + "compatiblePackages": null, + "options": [ + { + "key": "versionCode", + "title": "Version code", + "description": "The version code to use", + "required": true, + "type": "kotlin.Int", + "default": 2147483647, + "values": { + "Lowest": 1, + "Highest": 2147483647 + } + } + ] + }, + { + "name": "Always allow deep-linking", + "description": "Open Amazon links, even if the app is not set to handle Amazon links.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.amazon.mShop.android.shopping": null + }, + "options": [] + }, + { + "name": "Pro unlock", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.backdrops.wallpapers": null + }, + "options": [] + }, + { + "name": "Remove play limits", + "description": "Disables purchase nagging and playback limits of not purchased tracks.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.bandcamp.android": null + }, + "options": [] + }, + { + "name": "Bypass root checks", + "description": "Removes the restriction to use the app with root permissions or on a custom ROM.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "it.ipzs.cieid": null + }, + "options": [] + }, + { + "name": "Disable ads", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.duolingo": null + }, + "options": [] + }, + { + "name": "Enable debug menu", + "description": null, + "use": false, + "dependencies": [], + "compatiblePackages": { + "com.duolingo": [ + "5.158.4" + ] + }, + "options": [] + }, + { + "name": "Hide 'Sponsored Stories'", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.facebook.katana": null + }, + "options": [] + }, + { + "name": "Hide story ads", + "description": "Hides the ads in the Facebook app stories.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.facebook.katana": null + }, + "options": [] + }, + { + "name": "Remove bootloader detection", + "description": "Removes the check for an unlocked bootloader.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "at.gv.bmf.bmf2go": null + }, + "options": [] + }, + { + "name": "Remove root detection", + "description": "Removes the check for root permissions.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "at.gv.bmf.bmf2go": null + }, + "options": [] + }, + { + "name": "Enable CustomTabs", + "description": "Enables CustomTabs to open articles in your default browser.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.google.android.apps.magazines": null + }, + "options": [] + }, + { + "name": "GmsCore support", + "description": "Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.", + "use": true, + "dependencies": [ + "Change package name", + "ResourcePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.apps.magazines": [ + "5.108.0.644447823" + ] + }, + "options": [ + { + "key": "gmsCoreVendorGroupId", + "title": "GmsCore vendor group ID", + "description": "The vendor's group ID for GmsCore.", + "required": true, + "type": "kotlin.String", + "default": "app.revanced", + "values": { + "ReVanced": "app.revanced" + } + } + ] + }, + { + "name": "Spoof features", + "description": "Spoofs the device to enable Google Pixel exclusive features, including unlimited storage.", + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.apps.photos": null + }, + "options": [ + { + "key": "featuresToEnable", + "title": "Features to enable", + "description": "Google Pixel exclusive features to enable. Features up to Pixel XL enable the unlimited storage feature.", + "required": true, + "type": "kotlin.collections.List", + "default": [ + "com.google.android.apps.photos.NEXUS_PRELOAD", + "com.google.android.apps.photos.nexus_preload" + ], + "values": null + }, + { + "key": "featuresToDisable", + "title": "Features to disable", + "description": "Google Pixel exclusive features to disable.Features after Pixel XL may have to be disabled for unlimited storage depending on the device.", + "required": true, + "type": "kotlin.collections.List", + "default": [ + "com.google.android.apps.photos.PIXEL_2017_PRELOAD", + "com.google.android.apps.photos.PIXEL_2018_PRELOAD", + "com.google.android.apps.photos.PIXEL_2019_MIDYEAR_PRELOAD", + "com.google.android.apps.photos.PIXEL_2019_PRELOAD", + "com.google.android.feature.PIXEL_2020_MIDYEAR_EXPERIENCE", + "com.google.android.feature.PIXEL_2020_EXPERIENCE", + "com.google.android.feature.PIXEL_2021_MIDYEAR_EXPERIENCE", + "com.google.android.feature.PIXEL_2021_EXPERIENCE", + "com.google.android.feature.PIXEL_2022_MIDYEAR_EXPERIENCE", + "com.google.android.feature.PIXEL_2022_EXPERIENCE", + "com.google.android.feature.PIXEL_2023_MIDYEAR_EXPERIENCE", + "com.google.android.feature.PIXEL_2023_EXPERIENCE", + "com.google.android.feature.PIXEL_2024_MIDYEAR_EXPERIENCE", + "com.google.android.feature.PIXEL_2024_EXPERIENCE", + "com.google.android.feature.PIXEL_2025_MIDYEAR_EXPERIENCE" + ], + "values": null + } + ] + }, + { + "name": "GmsCore support", + "description": "Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.", + "use": true, + "dependencies": [ + "Change package name", + "ResourcePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.apps.photos": null + }, + "options": [ + { + "key": "gmsCoreVendorGroupId", + "title": "GmsCore vendor group ID", + "description": "The vendor's group ID for GmsCore.", + "required": true, + "type": "kotlin.String", + "default": "app.revanced", + "values": { + "ReVanced": "app.revanced" + } + } + ] + }, + { + "name": "Restore hidden 'Back up while charging' toggle", + "description": "Restores a hidden toggle to only run backups when the device is charging.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.google.android.apps.photos": null + }, + "options": [] + }, + { + "name": "Remove device restrictions", + "description": "Removes restrictions from using the app on any device. Requires mounting patched app over original.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.google.android.apps.recorder": null + }, + "options": [] + }, + { + "name": "Disable ads", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.myprog.hexedit": null + }, + "options": [] + }, + { + "name": "Unlock pro", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "ginlemon.iconpackstudio": [ + "2.2 build 016" + ] + }, + "options": [] + }, + { + "name": "Remove root detection", + "description": "Removes the check for root permissions and unlocked bootloader.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "at.gv.oe.app": null + }, + "options": [] + }, + { + "name": "Spoof signature", + "description": "Spoofs the signature of the app.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "at.gv.oe.app": null + }, + "options": [] + }, + { + "name": "Hide ads", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.nis.app": null + }, + "options": [] + }, + { + "name": "Hide ads", + "description": "Hides ads in stories, discover, profile, etc. An ad can still appear once when refreshing the home feed.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.instagram.android": null + }, + "options": [] + }, + { + "name": "Remove ads", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "net.binarymode.android.irplus": null + }, + "options": [] + }, + { + "name": "Disable mandatory login", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.adobe.lrmobile": null + }, + "options": [] + }, + { + "name": "Unlock premium", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.adobe.lrmobile": null + }, + "options": [] + }, + { + "name": "Unlock pro", + "description": null, + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.zombodroid.MemeGenerator": [ + "4.6364", + "4.6370", + "4.6375", + "4.6377" + ] + }, + "options": [] + }, + { + "name": "Hide inbox ads", + "description": "Hides ads in inbox.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.facebook.orca": null + }, + "options": [] + }, + { + "name": "Hide inbox subtabs", + "description": "Hides Home and Channels tabs between active now tray and chats.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.facebook.orca": null + }, + "options": [] + }, + { + "name": "Disable switching emoji to sticker", + "description": "Disables switching from emoji to sticker search mode in message input field.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.facebook.orca": [ + "439.0.0.29.119" + ] + }, + "options": [] + }, + { + "name": "Disable typing indicator", + "description": "Disables the indicator while typing a message.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.facebook.orca": null + }, + "options": [] + }, + { + "name": "Force English locale", + "description": "Forces wearable devices to use the English locale.", + "use": true, + "dependencies": [ + "Fix login" + ], + "compatiblePackages": { + "com.xiaomi.wearable": null + }, + "options": [] + }, + { + "name": "Fix login", + "description": "Fixes login for uncertified Mi Fitness app", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.xiaomi.wearable": null + }, + "options": [] + }, + { + "name": "Hide music video ads", + "description": "Hides ads that appear while listening to or streaming music videos, podcasts, or songs.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.google.android.apps.youtube.music": null + }, + "options": [] + }, + { + "name": "Enable exclusive audio playback", + "description": "Enables the option to play audio without video.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.google.android.apps.youtube.music": null + }, + "options": [] + }, + { + "name": "Permanent repeat", + "description": "Permanently remember your repeating preference even if the playlist ends or another track is played.", + "use": false, + "dependencies": [], + "compatiblePackages": { + "com.google.android.apps.youtube.music": null + }, + "options": [] + }, + { + "name": "Permanent shuffle", + "description": "Permanently remember your shuffle preference even if the playlist ends or another track is played.", + "use": false, + "dependencies": [], + "compatiblePackages": { + "com.google.android.apps.youtube.music": [ + "6.45.54", + "6.51.53", + "7.01.53", + "7.02.52", + "7.03.52" + ] + }, + "options": [] + }, + { + "name": "Hide category bar", + "description": "Hides the category bar at the top of the homepage.", + "use": false, + "dependencies": [], + "compatiblePackages": { + "com.google.android.apps.youtube.music": null + }, + "options": [] + }, + { + "name": "Hide 'Get Music Premium' label", + "description": "Hides the \"Get Music Premium\" label from the account menu and settings.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.google.android.apps.youtube.music": null + }, + "options": [] + }, + { + "name": "Remove upgrade button", + "description": "Removes the upgrade tab from the pivot bar.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.google.android.apps.youtube.music": null + }, + "options": [] + }, + { + "name": "Bypass certificate checks", + "description": "Bypasses certificate checks which prevent YouTube Music from working on Android Auto.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.google.android.apps.youtube.music": null + }, + "options": [] + }, + { + "name": "Remove background playback restrictions", + "description": "Removes restrictions on background playback, including playing kids videos in the background.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.google.android.apps.youtube.music": null + }, + "options": [] + }, + { + "name": "GmsCore support", + "description": "Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.", + "use": true, + "dependencies": [ + "Change package name", + "ResourcePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.apps.youtube.music": null + }, + "options": [ + { + "key": "gmsCoreVendorGroupId", + "title": "GmsCore vendor group ID", + "description": "The vendor's group ID for GmsCore.", + "required": true, + "type": "kotlin.String", + "default": "app.revanced", + "values": { + "ReVanced": "app.revanced" + } + } + ] + }, + { + "name": "Unlock pro", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "org.totschnig.myexpenses": null + }, + "options": [] + }, + { + "name": "Hide ads", + "description": "Hides most of the ads across the app.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.myfitnesspal.android": [ + "24.14.2" + ] + }, + "options": [] + }, + { + "name": "Remove broadcasts restriction", + "description": "Enables starting/stopping NetGuard via broadcasts.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "eu.faircode.netguard": null + }, + "options": [] + }, + { + "name": "Unlock pro", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.wakdev.apps.nfctools.se": null + }, + "options": [] + }, + { + "name": "Unlock pro", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.awedea.nyx": null + }, + "options": [] + }, + { + "name": "Fix crash", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "de.simon.openinghours": [ + "1.0" + ] + }, + "options": [] + }, + { + "name": "Spoof device ID", + "description": "Spoofs device ID to mitigate manual bans by developers.", + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.microblink.photomath": [ + "8.37.0" + ] + }, + "options": [] + }, + { + "name": "Hide update popup", + "description": "Prevents the update popup from showing up.", + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.microblink.photomath": [ + "8.32.0" + ] + }, + "options": [] + }, + { + "name": "Unlock plus", + "description": null, + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.microblink.photomath": [ + "8.37.0" + ] + }, + "options": [] + }, + { + "name": "Spoof Android device ID", + "description": "Spoofs the Android device ID used by the app for account authentication.This can be used to copy the account to another device.", + "use": false, + "dependencies": [], + "compatiblePackages": { + "com.piccomaeurope.fr": [ + "6.4.0", + "6.4.1", + "6.4.2", + "6.4.3", + "6.4.4", + "6.4.5", + "6.5.0", + "6.5.1", + "6.5.2", + "6.5.3", + "6.5.4", + "6.6.0", + "6.6.1", + "6.6.2" + ] + }, + "options": [ + { + "key": "android-device-id", + "title": "Android device ID", + "description": "The Android device ID to spoof to.", + "required": true, + "type": "kotlin.String", + "default": "0011223344556677", + "values": null + } + ] + }, + { + "name": "Disable tracking", + "description": "Disables tracking by replacing tracking URLs with example.com.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.piccomaeurope.fr": [ + "6.4.0", + "6.4.1", + "6.4.2", + "6.4.3", + "6.4.4", + "6.4.5", + "6.5.0", + "6.5.1", + "6.5.2", + "6.5.3", + "6.5.4", + "6.6.0", + "6.6.1", + "6.6.2" + ] + }, + "options": [] + }, + { + "name": "Hide ads", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "jp.pxv.android": null + }, + "options": [] + }, + { + "name": "Hide purchase reminder", + "description": "Hides the popup that reminds you to purchase the app.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.rarlab.rar": null + }, + "options": [] + }, + { + "name": "Hide ads", + "description": null, + "use": true, + "dependencies": [ + "ResourcePatch", + "BytecodePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.reddit.frontpage": [ + "2024.17.0" + ] + }, + "options": [] + }, + { + "name": "Spoof client", + "description": "Restores functionality of the app by using custom client ID.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.onelouder.baconreader": null, + "com.onelouder.baconreader.premium": null + }, + "options": [ + { + "key": "client-id", + "title": "OAuth client ID", + "description": "The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".", + "required": true, + "type": "kotlin.String", + "default": null, + "values": null + } + ] + }, + { + "name": "Disable ads", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.rubenmayayo.reddit": null + }, + "options": [] + }, + { + "name": "Spoof client", + "description": "Restores functionality of the app by using custom client ID.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.rubenmayayo.reddit": null + }, + "options": [ + { + "key": "client-id", + "title": "OAuth client ID", + "description": "The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".", + "required": true, + "type": "kotlin.String", + "default": null, + "values": null + } + ] + }, + { + "name": "Fix missing audio in video downloads", + "description": "Fixes audio missing in videos downloaded from v.redd.it.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.rubenmayayo.reddit": null + }, + "options": [] + }, + { + "name": "Fix /s/ links", + "description": null, + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.rubenmayayo.reddit": null + }, + "options": [] + }, + { + "name": "Spoof client", + "description": "Restores functionality of the app by using custom client ID.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "ml.docilealligator.infinityforreddit": null + }, + "options": [ + { + "key": "client-id", + "title": "OAuth client ID", + "description": "The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".", + "required": true, + "type": "kotlin.String", + "default": null, + "values": null + } + ] + }, + { + "name": "Unlock subscription", + "description": "Unlocks the subscription feature but requires a custom client ID.", + "use": true, + "dependencies": [ + "Spoof client" + ], + "compatiblePackages": { + "ml.docilealligator.infinityforreddit": null + }, + "options": [] + }, + { + "name": "Disable ads", + "description": null, + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "o.o.joey": null + }, + "options": [] + }, + { + "name": "Spoof client", + "description": "Restores functionality of the app by using custom client ID.", + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "o.o.joey": null, + "o.o.joey.pro": null, + "o.o.joey.dev": null + }, + "options": [ + { + "key": "client-id", + "title": "OAuth client ID", + "description": "The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".", + "required": true, + "type": "kotlin.String", + "default": null, + "values": null + } + ] + }, + { + "name": "Spoof client", + "description": "Restores functionality of the app by using custom client ID.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.andrewshu.android.reddit": null, + "com.andrewshu.android.redditdonation": null + }, + "options": [ + { + "key": "client-id", + "title": "OAuth client ID", + "description": "The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".", + "required": true, + "type": "kotlin.String", + "default": null, + "values": null + } + ] + }, + { + "name": "Spoof client", + "description": "Restores functionality of the app by using custom client ID.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "free.reddit.news": null, + "reddit.news": null + }, + "options": [ + { + "key": "client-id", + "title": "OAuth client ID", + "description": "The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".", + "required": true, + "type": "kotlin.String", + "default": null, + "values": null + } + ] + }, + { + "name": "Spoof client", + "description": "Restores functionality of the app by using custom client ID.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "me.ccrama.redditslide": null + }, + "options": [ + { + "key": "client-id", + "title": "OAuth client ID", + "description": "The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".", + "required": true, + "type": "kotlin.String", + "default": null, + "values": null + } + ] + }, + { + "name": "Disable ads", + "description": null, + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.laurencedawson.reddit_sync": null + }, + "options": [] + }, + { + "name": "Disable ads", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "io.syncapps.lemmy_sync": null + }, + "options": [] + }, + { + "name": "Disable Sync for Lemmy bottom sheet", + "description": "Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.laurencedawson.reddit_sync": [ + "v23.06.30-13:39" + ], + "com.laurencedawson.reddit_sync.pro": [], + "com.laurencedawson.reddit_sync.dev": [] + }, + "options": [] + }, + { + "name": "Spoof client", + "description": "Restores functionality of the app by using custom client ID.", + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.laurencedawson.reddit_sync": null, + "com.laurencedawson.reddit_sync.pro": null, + "com.laurencedawson.reddit_sync.dev": null + }, + "options": [ + { + "key": "client-id", + "title": "OAuth client ID", + "description": "The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".", + "required": true, + "type": "kotlin.String", + "default": null, + "values": null + } + ] + }, + { + "name": "Fix /s/ links", + "description": null, + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.laurencedawson.reddit_sync": null, + "com.laurencedawson.reddit_sync.pro": null, + "com.laurencedawson.reddit_sync.dev": null + }, + "options": [] + }, + { + "name": "Use /user/ endpoint", + "description": "Replaces the deprecated endpoint for viewing user profiles /u with /user, that used to fix a bug.", + "use": false, + "dependencies": [], + "compatiblePackages": { + "com.laurencedawson.reddit_sync": null, + "com.laurencedawson.reddit_sync.pro": null, + "com.laurencedawson.reddit_sync.dev": null + }, + "options": [] + }, + { + "name": "Fix video downloads", + "description": "Fixes a bug in Sync's MPD parser resulting in only the audio-track being saved.", + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.laurencedawson.reddit_sync": null, + "com.laurencedawson.reddit_sync.pro": null, + "com.laurencedawson.reddit_sync.dev": null + }, + "options": [] + }, + { + "name": "Disable screenshot popup", + "description": "Disables the popup that shows up when taking a screenshot.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.reddit.frontpage": null + }, + "options": [] + }, + { + "name": "Unlock premium Reddit icons", + "description": "Unlocks the premium Reddit icons.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.reddit.frontpage": null + }, + "options": [] + }, + { + "name": "Sanitize sharing links", + "description": "Removes (tracking) query parameters from the URLs when sharing links.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.reddit.frontpage": null + }, + "options": [] + }, + { + "name": "Remove root detection", + "description": "Removes the check for root permissions and unlocked bootloader.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "at.gv.bka.serviceportal": null + }, + "options": [] + }, + { + "name": "Remove file size limit", + "description": "Allows opening files larger than 2 MB in the text editor.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "pl.solidexplorer2": null + }, + "options": [] + }, + { + "name": "Remove badge tab", + "description": "Removes the badge tab from the activity tab.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.sony.songpal.mdr": null + }, + "options": [] + }, + { + "name": "Remove notification badge", + "description": "Removes the red notification badge from the activity tab.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.sony.songpal.mdr": [ + "10.1.0" + ] + }, + "options": [] + }, + { + "name": "Hide ads", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.soundcloud.android": null + }, + "options": [] + }, + { + "name": "Disable telemetry", + "description": "Disables SoundCloud's telemetry system.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.soundcloud.android": null + }, + "options": [] + }, + { + "name": "Enable offline sync", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.soundcloud.android": null + }, + "options": [] + }, + { + "name": "Custom theme", + "description": "Applies a custom theme.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.spotify.music": null + }, + "options": [ + { + "key": "backgroundColor", + "title": "Primary background color", + "description": "The background color. Can be a hex color or a resource reference.", + "required": true, + "type": "kotlin.String", + "default": "@android:color/black", + "values": null + }, + { + "key": "backgroundColorSecondary", + "title": "Secondary background color", + "description": "The secondary background color. (e.g. search box, artist & podcast). Can be a hex color or a resource reference.", + "required": true, + "type": "kotlin.String", + "default": "#ff282828", + "values": null + }, + { + "key": "accentColor", + "title": "Accent color", + "description": "The accent color ('Spotify green' by default). Can be a hex color or a resource reference.", + "required": true, + "type": "kotlin.String", + "default": "#ff1ed760", + "values": null + }, + { + "key": "accentColorPressed", + "title": "Pressed dark theme accent color", + "description": "The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.", + "required": true, + "type": "kotlin.String", + "default": "#ff169c46", + "values": null + } + ] + }, + { + "name": "Enable on demand", + "description": "Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.spotify.lite": null + }, + "options": [] + }, + { + "name": "Premium navbar tab", + "description": "Hides the premium tab from the navigation bar.", + "use": true, + "dependencies": [ + "ResourcePatch" + ], + "compatiblePackages": { + "com.spotify.music": null + }, + "options": [] + }, + { + "name": "Hide offers tab", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "de.stocard.stocard": null + }, + "options": [] + }, + { + "name": "Hide story bubbles", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "de.stocard.stocard": null + }, + "options": [] + }, + { + "name": "Unlock subscription features", + "description": "Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.strava": null + }, + "options": [] + }, + { + "name": "Disable subscription suggestions", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.strava": [ + "320.12" + ] + }, + "options": [] + }, + { + "name": "Remove Google Play Integrity check", + "description": "Removes the Google Play Integrity check. With this it's possible to use SwissID on custom ROMS.If the device is rooted, root permissions must be hidden from the app.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.swisssign.swissid.mobile": null + }, + "options": [] + }, + { + "name": "Unlock themes", + "description": "Unlocks all themes that are inaccessible until a certain level is reached.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.ticktick.task": null + }, + "options": [] + }, + { + "name": "Feed filter", + "description": "Removes ads, livestreams, stories, image videos and videos with a specific amount of views or likes from the feed.", + "use": true, + "dependencies": [ + "BytecodePatch", + "Settings" + ], + "compatiblePackages": { + "com.ss.android.ugc.trill": [ + "36.5.4" + ], + "com.zhiliaoapp.musically": [ + "36.5.4" + ] + }, + "options": [] + }, + { + "name": "Remember clear display", + "description": "Remembers the clear display configurations in between videos.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.ss.android.ugc.trill": [ + "36.5.4" + ], + "com.zhiliaoapp.musically": [ + "36.5.4" + ] + }, + "options": [] + }, + { + "name": "Downloads", + "description": "Removes download restrictions and changes the default path to download to.", + "use": true, + "dependencies": [ + "BytecodePatch", + "Settings" + ], + "compatiblePackages": { + "com.ss.android.ugc.trill": [ + "36.5.4" + ], + "com.zhiliaoapp.musically": [ + "36.5.4" + ] + }, + "options": [] + }, + { + "name": "Show seekbar", + "description": "Shows progress bar for all video.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.ss.android.ugc.trill": null, + "com.zhiliaoapp.musically": null + }, + "options": [] + }, + { + "name": "Playback speed", + "description": "Enables the playback speed option for all videos and retains the speed configurations in between videos.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.ss.android.ugc.trill": [ + "36.5.4" + ], + "com.zhiliaoapp.musically": [ + "36.5.4" + ] + }, + "options": [] + }, + { + "name": "Disable login requirement", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.ss.android.ugc.trill": null, + "com.zhiliaoapp.musically": null + }, + "options": [] + }, + { + "name": "Fix Google login", + "description": "Allows logging in with a Google account.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.ss.android.ugc.trill": null, + "com.zhiliaoapp.musically": null + }, + "options": [] + }, + { + "name": "Settings", + "description": "Adds ReVanced settings to TikTok.", + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.ss.android.ugc.trill": [ + "36.5.4" + ], + "com.zhiliaoapp.musically": [ + "36.5.4" + ] + }, + "options": [] + }, + { + "name": "SIM spoof", + "description": "Spoofs the information which is retrieved from the SIM card.", + "use": false, + "dependencies": [ + "BytecodePatch", + "Settings" + ], + "compatiblePackages": { + "com.ss.android.ugc.trill": null, + "com.zhiliaoapp.musically": null + }, + "options": [] + }, + { + "name": "Unlock pro", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "tv.trakt.trakt": [ + "1.1.1" + ] + }, + "options": [] + }, + { + "name": "Show on lockscreen", + "description": "Shows student id and student ticket on lockscreen.", + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "de.tudortmund.app": null + }, + "options": [] + }, + { + "name": "Disable dashboard ads", + "description": "Disables ads in the dashboard.", + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.tumblr": null + }, + "options": [] + }, + { + "name": "Disable Ad-Free Banner", + "description": "Disables the banner with a frog, prompting you to buy Tumblr Ad-Free.", + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.tumblr": null + }, + "options": [] + }, + { + "name": "Disable in-app update", + "description": "Disables the in-app update check and update prompt.", + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.tumblr": null + }, + "options": [] + }, + { + "name": "Disable blog notification reminder", + "description": "Disables the reminder to enable notifications for blogs you visit.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.tumblr": null + }, + "options": [] + }, + { + "name": "Disable gift message popup", + "description": "Disables the popup suggesting to buy TumblrMart items for other people.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.tumblr": null + }, + "options": [] + }, + { + "name": "Fix old versions", + "description": "Fixes old versions of the app (v33.2 and earlier) breaking due to Tumblr removing remnants of Tumblr Live from the API, which causes many requests to fail. This patch has no effect on newer versions of the app.", + "use": false, + "dependencies": [], + "compatiblePackages": { + "com.tumblr": null + }, + "options": [] + }, + { + "name": "Block audio ads", + "description": "Blocks audio ads in streams and VODs.", + "use": true, + "dependencies": [ + "BytecodePatch", + "Settings", + "ResourcePatch" + ], + "compatiblePackages": { + "tv.twitch.android.app": [ + "15.4.1", + "16.1.0", + "16.9.1" + ] + }, + "options": [] + }, + { + "name": "Block embedded ads", + "description": "Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.", + "use": true, + "dependencies": [ + "Block video ads", + "BytecodePatch", + "Settings" + ], + "compatiblePackages": { + "tv.twitch.android.app": [ + "15.4.1", + "16.1.0", + "16.9.1" + ] + }, + "options": [] + }, + { + "name": "Block video ads", + "description": "Blocks video ads in streams and VODs.", + "use": true, + "dependencies": [ + "BytecodePatch", + "Settings", + "ResourcePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "tv.twitch.android.app": [ + "15.4.1", + "16.1.0", + "16.9.1" + ] + }, + "options": [] + }, + { + "name": "Show deleted messages", + "description": "Shows deleted chat messages behind a clickable spoiler.", + "use": true, + "dependencies": [ + "BytecodePatch", + "Settings", + "ResourcePatch" + ], + "compatiblePackages": { + "tv.twitch.android.app": [ + "15.4.1", + "16.1.0", + "16.9.1" + ] + }, + "options": [] + }, + { + "name": "Auto claim channel points", + "description": "Automatically claim Channel Points.", + "use": true, + "dependencies": [ + "Settings", + "ResourcePatch" + ], + "compatiblePackages": { + "tv.twitch.android.app": [ + "15.4.1", + "16.1.0", + "16.9.1" + ] + }, + "options": [] + }, + { + "name": "Debug mode", + "description": "Enables Twitch's internal debugging mode.", + "use": false, + "dependencies": [ + "BytecodePatch", + "Settings", + "ResourcePatch" + ], + "compatiblePackages": { + "tv.twitch.android.app": null + }, + "options": [] + }, + { + "name": "Settings", + "description": "Adds settings menu to Twitch.", + "use": true, + "dependencies": [ + "BytecodePatch", + "ResourcePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "tv.twitch.android.app": [ + "15.4.1", + "16.1.0", + "16.9.1" + ] + }, + "options": [] + }, + { + "name": "Unlock downloads", + "description": "Unlocks the ability to download any video. GIFs can be downloaded via the menu on long press.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.twitter.android": null + }, + "options": [] + }, + { + "name": "Hide view count", + "description": "Hides the view count of Posts.", + "use": false, + "dependencies": [], + "compatiblePackages": { + "com.twitter.android": null + }, + "options": [] + }, + { + "name": "Dynamic color", + "description": "Replaces the default X (Formerly Twitter) Blue with the user's Material You palette.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.twitter.android": null + }, + "options": [] + }, + { + "name": "Hide ads", + "description": null, + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.twitter.android": null + }, + "options": [] + }, + { + "name": "Hide recommended users", + "description": null, + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.twitter.android": null + }, + "options": [] + }, + { + "name": "Change link sharing domain", + "description": "Replaces the domain name of Twitter links when sharing them.", + "use": true, + "dependencies": [ + "ResourcePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.twitter.android": null + }, + "options": [ + { + "key": "domainName", + "title": "Domain name", + "description": "The domain name to use when sharing links.", + "required": true, + "type": "kotlin.String", + "default": "fxtwitter.com", + "values": null + } + ] + }, + { + "name": "Open links with app chooser", + "description": "Instead of opening links directly, open them with an app chooser. As a result you can select a browser to open the link with.", + "use": false, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.twitter.android": [ + "10.48.0-release.0" + ] + }, + "options": [] + }, + { + "name": "Sanitize sharing links", + "description": "Removes the tracking query parameters from links before they are shared.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.twitter.android": null + }, + "options": [] + }, + { + "name": "Unlock pro", + "description": "Unlocks pro features.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "com.vsco.cam": [ + "345" + ] + }, + "options": [] + }, + { + "name": "Promo code unlock", + "description": "Disables the validation of promo code. Any code will work to unlock all features.", + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "de.dwd.warnapp": [ + "4.2.2" + ] + }, + "options": [] + }, + { + "name": "Hide ads", + "description": "Hides all in-app ads.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "at.willhaben": null + }, + "options": [] + }, + { + "name": "Unlock pro", + "description": "Unlocks all pro features.", + "use": true, + "dependencies": [], + "compatiblePackages": { + "co.windyapp.android": null + }, + "options": [] + }, + { + "name": "Hide ads", + "description": "Adds options to remove general ads.", + "use": true, + "dependencies": [ + "BytecodePatch", + "ResourcePatch", + "BytecodePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Video ads", + "description": "Adds an option to remove ads in the video player.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Copy video URL", + "description": "Adds options to display buttons in the video player to copy video URLs.", + "use": true, + "dependencies": [ + "ResourcePatch", + "BytecodePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Remove viewer discretion dialog", + "description": "Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Downloads", + "description": "Adds support to download videos with an external downloader app using the in-app download button or a video player action button.", + "use": true, + "dependencies": [ + "ResourcePatch", + "BytecodePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Disable precise seeking gesture", + "description": "Adds an option to disable precise seeking when swiping up on the seekbar.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Seekbar tapping", + "description": "Adds an option to enable tap-to-seek on the seekbar of the video player.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Enable slide to seek", + "description": "Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.", + "use": false, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Seekbar thumbnails", + "description": "Adds an option to use high quality fullscreen seekbar thumbnails. Patching 19.16.39 or lower adds an option to restore old seekbar thumbnails.", + "use": true, + "dependencies": [ + "BytecodePatch", + "ResourcePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Swipe controls", + "description": "Adds options to enable and configure volume and brightness swipe controls.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Disable auto captions", + "description": "Adds an option to disable captions from being automatically enabled.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Custom branding", + "description": "Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.", + "use": false, + "dependencies": [ + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": null + }, + "options": [ + { + "key": "appName", + "title": "App name", + "description": "The name of the app.", + "required": false, + "type": "kotlin.String", + "default": "YouTube ReVanced", + "values": { + "YouTube ReVanced": "YouTube ReVanced", + "YT ReVanced": "YT ReVanced", + "YT": "YT", + "YouTube": "YouTube" + } + }, + { + "key": "iconPath", + "title": "App icon", + "description": "The icon to apply to the app.\n\nIf a path to a folder is provided, the folder must contain the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders must contain the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png", + "required": false, + "type": "kotlin.String", + "default": "ReVanced*Logo", + "values": { + "ReVanced Logo": "ReVanced*Logo" + } + } + ] + }, + { + "name": "Change header", + "description": "Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.", + "use": false, + "dependencies": [], + "compatiblePackages": { + "com.google.android.youtube": null + }, + "options": [ + { + "key": "header", + "title": "Header", + "description": "The header to apply to the app.\n\nIf a path to a folder is provided, the folder must contain one or more of the following folders, depending on the DPI of the device:\n\n- drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-hdpi\n- drawable-mdpi\n\nEach of the folders must contain all of the following files:\n\n- yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png\n\nThe image dimensions must be as follows:\n- drawable-xxxhdpi: 512px x 192px\n- drawable-xxhdpi: 387px x 144px\n- drawable-xhdpi: 258px x 96px\n- drawable-hdpi: 194px x 72px\n- drawable-mdpi: 129px x 48px", + "required": true, + "type": "kotlin.String", + "default": "revanced*borderless", + "values": { + "YouTube": "header*", + "YouTube Premium": "premium*header", + "ReVanced": "revanced*", + "ReVanced (borderless logo)": "revanced*borderless" + } + } + ] + }, + { + "name": "Hide video action buttons", + "description": "Adds options to hide action buttons (such as the Download button) under videos.", + "use": true, + "dependencies": [ + "ResourcePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Navigation buttons", + "description": "Adds options to hide and change navigation buttons (such as the Shorts button).", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Hide player overlay buttons", + "description": "Adds options to hide the player cast, autoplay, caption button and next/ previous buttons.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Hide endscreen cards", + "description": "Adds an option to hide suggested video cards at the end of videos.", + "use": true, + "dependencies": [ + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Disable fullscreen ambient mode", + "description": "Adds an option to disable the ambient mode when in fullscreen.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Hide layout components", + "description": "Adds options to hide general layout components.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch", + "ResourcePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Hide info cards", + "description": "Adds an option to hide info cards that creators add in the video player.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Hide player flyout menu items", + "description": "Adds options to hide menu items that appear when pressing the gear icon in the video player.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Disable rolling number animations", + "description": "Adds an option to disable rolling number animations of video view count, user likes, and upload time.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Hide seekbar", + "description": "Adds an option to hide the seekbar.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Hide Shorts components", + "description": "Adds options to hide components related to YouTube Shorts.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch", + "ResourcePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Disable suggested video end screen", + "description": "Adds an option to disable the suggested video end screen at the end of videos.", + "use": true, + "dependencies": [ + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Hide timestamp", + "description": "Adds an option to hide the timestamp in the bottom left of the video player.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Miniplayer", + "description": "Adds options to change the in app minimized player. Patching target 19.16+ adds modern miniplayers.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Disable player popup panels", + "description": "Adds an option to disable panels (such as live chat) from opening automatically.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Remove player controls background", + "description": "Removes the dark background surrounding the video player controls.", + "use": false, + "dependencies": [], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Custom player overlay opacity", + "description": "Adds an option to change the opacity of the video player background when player controls are visible.", + "use": true, + "dependencies": [ + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Return YouTube Dislike", + "description": "Adds an option to show the dislike count of videos with Return YouTube Dislike.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch", + "BytecodePatch", + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Wide searchbar", + "description": "Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Shorts autoplay", + "description": "Adds options to automatically play the next Short.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "SponsorBlock", + "description": "Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "BytecodePatch", + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Spoof app version", + "description": "Adds an option to trick YouTube into thinking you are running an older version of the app. This can be used to restore old UI elements and features.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Change start page", + "description": "Adds an option to set which page the app opens in instead of the homepage.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Disable resuming Shorts on startup", + "description": "Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Enable tablet layout", + "description": "Adds an option to enable tablet layout.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Theme", + "description": "Adds options for theming and applies a custom background theme (dark background theme defaults to amoled black).", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch", + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [ + { + "key": "darkThemeBackgroundColor", + "title": "Dark theme background color", + "description": "Can be a hex color (#AARRGGBB) or a color resource reference.", + "required": false, + "type": "kotlin.String", + "default": "@android:color/black", + "values": { + "Amoled black": "@android:color/black", + "Material You": "@android:color/system_neutral1_900", + "Classic (old YouTube)": "#FF212121", + "Catppuccin (Mocha)": "#FF181825", + "Dark pink": "#FF290025", + "Dark blue": "#FF001029", + "Dark green": "#FF002905", + "Dark yellow": "#FF282900", + "Dark orange": "#FF291800", + "Dark red": "#FF290000" + } + }, + { + "key": "lightThemeBackgroundColor", + "title": "Light theme background color", + "description": "Can be a hex color (#AARRGGBB) or a color resource reference.", + "required": false, + "type": "kotlin.String", + "default": "@android:color/white", + "values": { + "White": "@android:color/white", + "Material You": "@android:color/system_neutral1_50", + "Catppuccin (Latte)": "#FFE6E9EF", + "Light pink": "#FFFCCFF3", + "Light blue": "#FFD1E0FF", + "Light green": "#FFCCFFCC", + "Light yellow": "#FFFDFFCC", + "Light orange": "#FFFFE6CC", + "Light red": "#FFFFD6D6" + } + } + ] + }, + { + "name": "Alternative thumbnails", + "description": "Adds options to replace video thumbnails using the DeArrow API or image captures from the video.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch", + "BytecodePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Bypass image region restrictions", + "description": "Adds an option to use a different host for user avatar and channel images and can fix missing images that are blocked in some countries.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Announcements", + "description": "Adds an option to show announcements from ReVanced on app startup.", + "use": true, + "dependencies": [ + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Always repeat", + "description": "Adds an option to always repeat videos when they end.", + "use": true, + "dependencies": [ + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Remove background playback restrictions", + "description": "Removes restrictions on background playback, including playing kids videos in the background.", + "use": true, + "dependencies": [ + "ResourcePatch", + "BytecodePatch", + "BytecodePatch", + "BytecodePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Enable debugging", + "description": "Adds options for debugging.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Spoof device dimensions", + "description": "Adds an option to spoof the device dimensions which can unlock higher video qualities.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Check watch history domain name resolution", + "description": "Checks if the device DNS server is preventing user watch history from being saved.", + "use": true, + "dependencies": [ + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Spoof video streams", + "description": "Spoofs the client video streams to allow video playback.", + "use": true, + "dependencies": [ + "BytecodePatch", + "ResourcePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "GmsCore support", + "description": "Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.", + "use": true, + "dependencies": [ + "Change package name", + "ResourcePatch", + "BytecodePatch", + "Hide player overlay buttons", + "Spoof video streams" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [ + { + "key": "gmsCoreVendorGroupId", + "title": "GmsCore vendor group ID", + "description": "The vendor's group ID for GmsCore.", + "required": true, + "type": "kotlin.String", + "default": "app.revanced", + "values": { + "ReVanced": "app.revanced" + } + } + ] + }, + { + "name": "Bypass URL redirects", + "description": "Adds an option to bypass URL redirects and open the original URL directly.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Open links externally", + "description": "Adds an option to always open links in your browser instead of in the in-app-browser.", + "use": true, + "dependencies": [ + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Remove tracking query parameter", + "description": "Adds an option to remove the tracking info from links you share.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Disable zoom haptics", + "description": "Adds an option to disable haptics when zooming.", + "use": true, + "dependencies": [ + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Remember video quality", + "description": "Adds an option to remember the last video quality selected.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "BytecodePatch", + "ResourcePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Playback speed", + "description": "Adds options to customize available playback speeds, remember the last playback speed selected and show a speed dialog button to the video player.", + "use": true, + "dependencies": [ + "BytecodePatch", + "BytecodePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Restore old video quality menu", + "description": "Adds an option to restore the old video quality menu with specific video resolution options.", + "use": true, + "dependencies": [ + "BytecodePatch", + "ResourcePatch", + "BytecodePatch", + "BytecodePatch" + ], + "compatiblePackages": { + "com.google.android.youtube": [ + "18.38.44", + "18.49.37", + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41" + ] + }, + "options": [] + }, + { + "name": "Unlock premium", + "description": null, + "use": true, + "dependencies": [], + "compatiblePackages": { + "io.yuka.android": [ + "4.29" + ] + }, + "options": [] + } +] \ No newline at end of file diff --git a/src/App.svelte b/src/App.svelte index 911a793..a653a6e 100755 --- a/src/App.svelte +++ b/src/App.svelte @@ -6,11 +6,9 @@ const supportedAppsSet = new Set(); for (const patch of patchesJson) { if (patch.compatiblePackages !== null) { - patch.compatiblePackages - .map((e) => e.name) - .forEach((e) => { - supportedAppsSet.add(e); - }); + Object.keys(patch.compatiblePackages).forEach((p) => + supportedAppsSet.add(p), + ); } } const supportedApps = [...supportedAppsSet]; @@ -69,7 +67,7 @@ let TOML = []; let configTOMLVisible = false; - let defaultPatchesJson = fetch("https://api.revanced.app/v2/patches/latest") + let defaultPatchesJson = fetch("patches.json") .then((r) => r.json()) .then((r) => r.patches || r); @@ -143,7 +141,7 @@ {#if t.patches_source !== "revanced/revanced-patches"} patches-source = "{t.patches_source}"
integrations-source = "{t.patches_source.split( - "/" + "/", )[0]}/revanced-integrations"
rv-brand = "{t.patches_source.split("/")[0]} ReVanced"
{/if} @@ -168,30 +166,14 @@ {#if t.exclusive_patches} exclusive-patches = {t.exclusive_patches}
{/if} + {#if t.opts.length > 0} + patcher-args = "{t.opts}"
+ {/if}
{/if} {/each} - -
- - -
# options.json
-
-
-        {(() => {
-            let oo = [];
-            TOML.forEach((t) => {
-              oo = [...oo, ...t.opts];
-            });
-            return "\n" + JSON.stringify(oo, undefined, 2);
-          })()}
-        
-
-
{/if} {#await defaultPatchesJson.then((j) => getPkgs(j)) then pkgs} diff --git a/src/lib/RVApp.svelte b/src/lib/RVApp.svelte index e101d34..ca102c1 100755 --- a/src/lib/RVApp.svelte +++ b/src/lib/RVApp.svelte @@ -33,45 +33,29 @@ function parsePatches(pkgName, patchesJson) { const patches = []; for (const patch of patchesJson) { - for (const pkg of patch.compatiblePackages || []) { - if (pkg.name === pkgName) { - const versionsSet = new Set(); - if (pkg.versions !== null) { - pkg.versions.forEach((e) => { - versionsSet.add(e); - }); - } - const versions = [...versionsSet]; - patches.push({ - name: patch.name, - description: patch.description, - pkg_versions: versions, - use: patch.use, - patchOptions: patch.options, + for (const pkg of Object.keys(patch.compatiblePackages || {})) { + if (pkg !== pkgName) continue; + const versionsSet = new Set(); + const pkgVersions = patch.compatiblePackages[pkg]; + if (pkgVersions !== null) { + pkgVersions.forEach((e) => { + versionsSet.add(e); }); } + const versions = [...versionsSet]; + patches.push({ + name: patch.name, + description: patch.description, + pkg_versions: versions, + use: patch.use, + patchOptions: patch.options, + }); } } return patches; } - let update_req = false; - let raw_patches_json; - - function getPatches(_dummy) { - update_req = false; - raw_patches_json = `https://api.revanced.app/v2/patches/${patches_version}`; - const j = - patches_version !== "latest" - ? fetch(raw_patches_json) - .then((r) => r.json()) - .then((r) => r.patches || r) - : defaultPatchesJson; - - return j.then((j) => parsePatches(pkgName, j)); - } - - $: patches = getPatches(update_req); + $: patches = defaultPatchesJson.then((j) => parsePatches(pkgName, j)); async function checkValidVersion(version) { for (const p of await patches) { @@ -87,66 +71,62 @@ let app_name_c = ""; let nodeRef; - $: (() => { - patches.then((patches) => { - const inc = []; - const exc = []; + $: patches.then((patches) => { + const inc = []; + const exc = []; - let exclusive; - if (selected_patches.length > patches.length / 2) { - exclusive = false; - for (const p of patches) { - const n = `'${p.name}'`; - if (!p.use && selected_patches.includes(p)) { - inc.push(n); - } else if (p.use && !selected_patches.includes(p)) { - exc.push(n); - } - } - } else { - exclusive = true; - selected_patches.forEach((p) => { - const n = `'${p.name}'`; + let exclusive; + if (selected_patches.length > patches.length / 2) { + exclusive = false; + for (const p of patches) { + const n = `'${p.name}'`; + if (!p.use && selected_patches.includes(p)) { inc.push(n); - }); + } else if (p.use && !selected_patches.includes(p)) { + exc.push(n); + } } + } else { + exclusive = true; + selected_patches.forEach((p) => { + const n = `'${p.name}'`; + inc.push(n); + }); + } - const incp = inc.join(" "); - const excp = exc.join(" "); - if (!app_name) app_name_c = reprName; - else app_name_c = app_name; + const incp = inc.join(" "); + const excp = exc.join(" "); + if (!app_name) app_name_c = reprName; + else app_name_c = app_name; - const selectedOptsReady = []; - for (const [patchName, patchOpt] of Object.entries(selectedOpts)) { - let b = true; - for (const [_, value] of Object.entries(patchOpt)) { - if (value.length > 0) b = false; - } - if (b) break; - const options = []; - for (const [key, value] of Object.entries(patchOpt)) { - if (value.length > 0) options.push({ key: key, value: value }); - } - selectedOptsReady.push({ patchName: patchName, options: options }); + let options = ""; + for (const [_, patchOpt] of Object.entries(selectedOpts)) { + let b = true; + for (const [_, value] of Object.entries(patchOpt)) { + if (value.length > 0) b = false; + } + if (b) break; + for (const [key, value] of Object.entries(patchOpt)) { + if (value.length > 0) options += `-O${key}=${value} `; } + } - TOML = { - app_name: app_name_c, - apkmirror_dlurl: apkmirror_dlurl, - patches_source: patches_source, - patches_version: patches_version, - version: version, - build_mode: build_mode, - arch: arch, - included_patches: incp, - excluded_patches: excp, - exclusive_patches: exclusive, - deleted: deleted, + TOML = { + app_name: app_name_c, + apkmirror_dlurl: apkmirror_dlurl, + patches_source: patches_source, + patches_version: patches_version, + version: version, + build_mode: build_mode, + arch: arch, + included_patches: incp, + excluded_patches: excp, + exclusive_patches: exclusive, + deleted: deleted, - opts: selectedOptsReady, - }; - }); - })(); + opts: options, + }; + }); let deleted = false; let selectedOpts = []; @@ -260,7 +240,6 @@ class="border-2 rounded border-gray-300 p-0.5 pl-1 w-full" size="60" bind:value={patches_version} - on:blur={(() => (update_req = true))()} /> @@ -284,7 +263,7 @@
- Could not fetch patches from {raw_patches_json} + Could not fetch patches
{/await}