1const y="woody_favorites_v2",E="woody_favorites",J="woody_favorites_v2__corrupt",Y="woody_favorites_cache",Oe=50,ve=200,be=100,Me=60,q="woody:favorites-changed",j="woody:favorites-error",B="woody:favorites-updated",O="s",d=/^(?:\d+|s\d+)$/,Re=50,Te=3;let n=null,h=!1,g=null,v=!1;const b=new Set,A=N(12);function N(e){let t;try{t=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID().replace(/-/g,""):null}catch{t=null}return t||(t=Date.now().toString(36)+Math.random().toString(36).slice(2)),t.slice(0,e)}function w(e){let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=Math.imul(t,16777619);return(t>>>0).toString(36)}function M(){try{return window.localStorage||null}catch{return null}}function x(e,t){try{const r=e.getItem(t);return r==null||r===""?null:JSON.parse(r)}catch{return}}function K(e){return e?e.code===22||e.code===1014||e.name==="QuotaExceededError"||e.name==="NS_ERROR_DOM_QUOTA_REACHED"||/quota/i.test(e.name||""):!1}function R(e){const t=Number(e);return Number.isFinite(t)&&t>0?t:Date.now()}function p(e,t){const r=String(e??"");return t==="sheet"?O+r:r}function Q(e){return!e||!e.dataset?null:e.dataset.sheetid?O+e.dataset.sheetid:e.dataset.postid||null}function X(){return{v:2,updatedAt:0,clientId:A,legacyHash:"",items:{},groups:[]}}function W(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;const t=Object.keys(e);return t.length?t.every(r=>e[r]==="f"||e[r]==="v"):!0}function F(e){const t=Date.now(),r={};return Object.keys(e).forEach(s=>{const o=e[s];d.test(s)&&(o==="f"||o==="v")&&(r[s]={s:o,at:t})}),{v:2,items:r,groups:[]}}function _(e){return e.sort((t,r)=>r[1].at-t[1].at)}function Z(e){const t=X();if(!e||typeof e!="object")return t;const r=new Set;if(Array.isArray(e.groups))for(let i=0;i<e.groups.length;i++){const c=e.groups[i];if(!c||typeof c!="object"||typeof c.id!="string"||!c.id||r.has(c.id))continue;const a=typeof c.name=="string"?c.name.trim().slice(0,60):"";if(a&&(r.add(c.id),t.groups.push({id:c.id,name:a,createdAt:R(c.createdAt)}),t.groups.length>=50))break}const s=e.items&&typeof e.items=="object"?e.items:{},o=[],u=[];return Object.keys(s).forEach(i=>{if(!d.test(i))return;const c=s[i];if(!c||typeof c!="object"||c.s!=="f"&&c.s!=="v")return;const a={s:c.s,at:R(c.at)};if(Number.isFinite(Number(c.miss))&&Number(c.miss)>0&&(a.miss=Math.min(Number(c.miss),3)),Array.isArray(c.g)){const f=[];c.g.forEach(m=>{typeof m=="string"&&r.has(m)&&f.indexOf(m)===-1&&f.push(m)}),f.length&&(a.g=f)}(a.s==="f"?o:u).push([i,a])}
1),_(o).slice(0,200).forEach(i=>{t.items[i[0]]=i[1]}),_(u).slice(0,100).forEach(i=>{t.items[i[0]]=i[1]}),t.updatedAt=R(e.updatedAt),t.legacyHash=typeof e.legacyHash=="string"?e.legacyHash:"",t.clientId=typeof e.clientId=="string"?e.clientId:A,t}function T(){const e=[],t=[];if(Object.keys(n.items).forEach(s=>{(n.items[s].s==="f"?e:t).push([s,n.items[s]])}),e.length<=200&&t.length<=100)return!1;const r={};return _(e).slice(0,200).forEach(s=>{r[s[0]]=s[1]}),_(t).slice(0,100).forEach(s=>{r[s[0]]=s[1]}),n.items=r,!0}function $(){let e=!1;return Object.keys(n.items).forEach(t=>{n.items[t].s==="v"&&(delete n.items[t],e=!0)}),e}function V(e){let t=x(e,y),r=!1;if(t===void 0){try{e.setItem(J,e.getItem(y))}catch{}t=null,r=!0}if(t&&t.v!==2&&W(t)&&(t=F(t),r=!0),!t){const s=x(e,E);s&&typeof s=="object"&&(t=F(s)),r=!0}return{state:Z(t),migrated:r}}function P(e){const t=function(){try{return e.getItem(E)}catch{return null}}();if(t==null||t===""||w(t)===n.legacyHash)return!1;let r;try{r=JSON.parse(t)}catch{return!1}if(!r||typeof r!="object")return!1;const s=Date.now();let o=!1;return Object.keys(r).forEach(u=>{const i=r[u];if(!d.test(u)||i!=="f"&&i!=="v")return;const c=n.items[u];c?i==="f"&&c.s!=="f"&&(c.s="f",c.at=s,o=!0):(n.items[u]={s:i,at:s},o=!0)}),o}function ee(){const e=M();if(!e){n=X(),h=!0;return}const t=V(e);n=t.state;const r=P(e),s=T();(t.migrated||r||s)&&U()}function te(){const e=M();e&&(n=V(e).state,P(e),T())}function re(){const e={};return Object.keys(n.items).forEach(t=>{e[t]=n.items[t].s}),e}function U(){const e=M();if(!e)return h=!0,!1;n.updatedAt=Date.now(),n.clientId=A;for(let t=0;t<=2;t++){const r=JSON.stringify(re());n.legacyHash=w(r);try{e.setItem(y,JSON.stringify(n));try{e.setItem(E,r)}catch{}return h=!1,!0}catch(s){if(!K(s)||t===2){h=!0,console.error(["[FAVORITES]",s]);try{document.dispatchEvent(new CustomEvent(j,{detail:{reason:"persist",error:s}}))}catch{}return!1}if(t===0)$();else try{e.removeItem(Y)}catch{}}}return!1}function C(){v=!0,g&&clearTimeout(g),g=setTimeout(I,50)}function I(){g&&(clearTimeout(g),g=null),v&&(v=!1,U())}function k(){const e=document.querySelector(".woody-favorites-cart");e&&e.dispatchEvent(new Event("update"))}function H(e,t){const r={type:e,ids:t&&t.ids||[],groupIds:t&&t.groupIds||[],source:t&&t.source||"user"};Object.defineProperty(r,"state",{get:L,enumerable:!0});try{document.dispatchEvent(new CustomEvent(q,{detail:r})),document.dispatchEvent(new CustomEvent(B))}catch(s){console.error(["[FAVORITES]",s])}b.forEach(s=>{try{s(r)}catch(o){console.error(["[FAVORITES]",o])}})}function l(e,t){T(),C(),H(e,t),k()}function S(e,t){try{document.dispatchEvent(new CustomEvent(j,{detail:Object.assign({reason:e},t||{})}))}catch{}}function L(){const e={};return Object.keys(n.items).forEach(t=>{const r=n.items[t],s={s:r.s,at:r.at};r.g&&(s.g=Object.freeze(r.g.slice())),r.miss!==void 0&&(s.miss=r.miss),e[t]=Object.freeze(s)}),Object.freeze({items:Object.freeze(e),groups:Object.freeze(n.groups.map(t=>Object.freeze(Object.assign({},t))))})}function D(e){return Object.keys(n.items).filter(t=>n.items[t].s===e)}function z(e){const t=e||{};let r=Object.keys(n.items).filter(s=>n.items[s].s==="f").map(s=>[s,n.items[s]]);return t.group&&(r=r.filter(s=>(s[1].g||[]).indexOf(t.group)!==-1)),t.order==="added_asc"?r.sort((s,o)=>s[1].at-o[1].at):r.sort((s,o)=>o[1].at-s[1].at),r.map(s=>s[0])}function se(){return D("v")}function ne(){return n.groups.map(e=>({id:e.id,name:e.name,createdAt:e.createdAt,count:z({group:e.id}).length}))}function oe(e){const t=n.groups.filter(r=>r.id===e)[0];return t?{id:t.id,name:t.name,createdAt:t.createdAt}:null}function G(e){return n.groups.some(t=>t.id===e)}function ie(e,t){const r=p(e,t);return!!n.items[r]&&n.items[r].s==="f"}function ce(e,t){const r=n.items[p(e,t)];return r&&r.g?r.g.slice():[]}function ue(e,t){const r=t||{},s=p(e,r.type);if(!d.test(s))return!1;const o=n.items[s],u=!!o&&o.s==="f";if(!u&&D("f").length>=200)return S("max_favorites",{max:200}),!1;const i=o||(n.items[s]={s:"v",at:Date.now()});if(i.s="f",u||(i.at=Date.now()),Array.isArray(r.groups)&&r.groups.length){const c=(i.g||[]).slice();r.groups.forEach(a=>{G(a)&&c.indexOf(a)===-1&&c.push(a)}),c.length&&(i.g=c)}return l("item:add",{ids:[s],groupIds:i.g||[],source:r.source}),!0}function ae(e,t){const r=t||{},s=p(e,r.type);if(!n.items[s])return!1;const o=n.items[s].g||[];return delete n.items[s],l("item:remove",{ids:[s],groupIds:o,source:r.source}),!0}function fe(e,t){const r=t||{},s=p(e,r.type),o=n.items[s];return!o||o.s!=="f"?!1:(o.s="v",o.at=Date.now(),delete o.g,l("item:remove",{ids:[s],source:r.source}),!0)}function le(e,t){const r=t||{},s=p(e,r.type);return!d.test(s)||n.items[s]?!1:(n.items[s]={s:"v",at:Date.now()},l("item:visit",{ids:[s],source:r.source||"user"}),!0)}function me(e,t){const r=t||{},s=String(e??"").trim().slice(0,60);if(!s)return S("group_name_required"),null;if(n.groups.length>=50)return S("max_groups",{max:50}),null;const o={id:"g_"+N(8),name:s,createdAt:Date.now()};return n.groups.push(o),l("group:create",{groupIds:[o.id],source:r.source}),o.id}function pe(e,t,r){const s=r||{},o=n.groups.filter(i=>i.id===e)[0];if(!o)return!1;const u=String(t??"").trim().slice(0,60);return u?(o.name=u,l("group:rename",{groupIds:[e],source:s.source}),!0):(S("group_name_required"),!1)}function de(e,t){const r=t||{},s=n.groups.map(u=>u.id).indexOf(e);if(s===-1)return!1;n.groups.splice(s,1);const o=[];
1return Object.keys(n.items).forEach(u=>{const i=n.items[u];if(!i.g)return;const c=i.g.filter(a=>a!==e);c.length!==i.g.length&&(o.push(u),c.length?i.g=c:delete i.g)}),l("group:delete",{ids:o,groupIds:[e],source:r.source}),!0}function ge(e,t,r){const s=r||{},o=p(e,s.type),u=n.items[o];if(!u||!G(t))return!1;const i=u.g||[];return i.indexOf(t)!==-1||(u.g=i.concat([t]),l("group:assign",{ids:[o],groupIds:[t],source:s.source})),!0}function ye(e,t,r){const s=r||{},o=p(e,s.type),u=n.items[o];if(!u||!u.g||u.g.indexOf(t)===-1)return!1;const i=u.g.filter(c=>c!==t);return i.length?u.g=i:delete u.g,l("group:unassign",{ids:[o],groupIds:[t],source:s.source}),!0}function he(e,t){const r=t||{},s=r.mode==="merge"?"merge":"replace",o=r.source||"legacy";if(!e||typeof e!="object")return!1;const u=Date.now(),i=[],c={};return Object.keys(e).forEach(a=>{const f=e[a];if(!d.test(a)||f!=="f"&&f!=="v")return;c[a]=f;const m=n.items[a];m?m.s!==f&&(m.s=f,m.at=u,i.push(a)):(n.items[a]={s:f,at:u},i.push(a))}),s==="replace"&&Object.keys(n.items).forEach(a=>{a in c||(delete n.items[a],i.push(a))}),i.length?(l("bulk:import",{ids:i,source:o}),!0):!1}function Ee(e,t){const r=t||{};if(!Array.isArray(e)||e.length===0)return!1;const s=[];let o=!1;return e.forEach(u=>{const i=n.items[u];if(!i)return;const c=(Number(i.miss)||0)+1;c>=3?(delete n.items[u],s.push(u)):i.miss=c,o=!0}),o?(l("item:missing",{ids:s.length?s:e,source:r.source||"url"}),s.length>0):!1}function Ae(e){if(!Array.isArray(e)||e.length===0)return!1;let t=!1;return e.forEach(r=>{const s=n.items[r];s&&s.miss!==void 0&&(delete s.miss,t=!0)}),t&&C(),t}function _e(e){return typeof e!="function"?function(){}:(b.add(e),function(){b.delete(e)})}function Ie(e){if(!(e.key!==null&&e.key!==y&&e.key!==E)){if(e.key===y&&e.newValue)try{const t=JSON.parse(e.newValue);if(t&&t.clientId===A)return}catch{}te(),H("hydrate",{source:"storage"}),k()}}ee();try{window.addEventListener("storage",Ie),window.addEventListener("pagehide",I),document.addEventListener("visibilitychange",function(){document.visibilityState==="hidden"&&I()})}catch(e){console.error(["[FAVORITES]",e])}const Se={get degraded(){return h},ready:Promise.resolve(),getState:L,getFavorites:z,getVisited:se,getByState:D,getGroups:ne,getGroup:oe,hasGroup:G,isFavorite:ie,getItemGroups:ce,add:ue,remove:ae,unfavorite:fe,visit:le,createGroup:me,renameGroup:pe,deleteGroup:de,assign:ge,unassign:ye,importFlat:he,markMissing:Ee,markPresent:Ae,subscribe:_e,flush:I,pingCart:k,toStorageId:p,cardStorageId:Q,SHEET_ID_PREFIX:O,MAX_GROUPS:50,MAX_FAVORITES:200,MAX_VISITED:100,GROUP_NAME_MAX:60};var ke=Se;export{q as CHANGED_EVENT,j as ERROR_EVENT,Me as GROUP_NAME_MAX,B as LEGACY_UPDATED_EVENT,ve as MAX_FAVORITES,Oe as MAX_GROUPS,be as MAX_VISITED,O as SHEET_ID_PREFIX,Q as cardStorageId,ke as default,p as toStorageId};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.