2shay commited on
Commit
34df61a
·
verified ·
1 Parent(s): c8f9427

deploy a31fd43

Browse files
assets/dial-C7M2OMm7.js ADDED
@@ -0,0 +1 @@
 
 
1
+ var e={$comment:`The compression dial (docs/PLAN.md C3, S0-03). Web and Mac load this file; neither hard-codes a level. Order = dial order, longest first. Labels come from spec/strings/en.json by label_key. Prompts are complete user messages with a {{text}} placeholder (reduce: {{lines}}); the runtime sends them through the model's chat template with thinking off.`,version:1,default:`short`,levels:[{id:`readall`,label_key:`dial.readall`,uses_llm:!1,spoken:!0,description:`Every sentence, in order, read aloud. No model. Always one key away.`},{id:`short`,label_key:`dial.short`,uses_llm:!0,spoken:!0,prompt:`prompts/short.md`,max_bullets_per_chunk:6,min_bullets_per_chunk:1,max_words_per_bullet:18,max_new_tokens:220,description:`3 to 6 plain sentences per chunk.`},{id:`caveman`,label_key:`dial.caveman`,uses_llm:!0,spoken:!0,prompt:`prompts/caveman.md`,max_bullets_per_chunk:5,min_bullets_per_chunk:1,max_words_per_bullet:9,max_new_tokens:120,description:`2 to 5 bullets of at most 9 words. Register: plain words, one idea per line, answer first.`},{id:`oneline`,label_key:`dial.oneline`,uses_llm:!0,spoken:!0,prompt:`prompts/oneline.md`,reduce_prompt:`prompts/reduce-oneline.md`,max_bullets_per_chunk:1,min_bullets_per_chunk:1,max_words_per_bullet:25,max_new_tokens:60,reduce:{group_size:10,max_depth:2,fallback_level:`short`,max_cut_fraction:.5},description:`One line for the whole document. More than one chunk: per-chunk lines, then reduce. Only the final line is spoken.`}]};export{e as t};
assets/index-DXg5mvOR.js ADDED
@@ -0,0 +1 @@
 
 
1
+ import{t as e}from"./net-Lng3b-MO.js";import{t}from"./dial-C7M2OMm7.js";var n,r,i,a,o,s,c,l,u,d,f,p,m,h,g={},_=[],v=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,y=Array.isArray;function b(e,t){for(var n in t)e[n]=t[n];return e}function x(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function S(e,t,r){var i,a,o,s={};for(o in t)o==`key`?i=t[o]:o==`ref`?a=t[o]:s[o]=t[o];if(arguments.length>2&&(s.children=arguments.length>3?n.call(arguments,2):r),typeof e==`function`&&e.defaultProps!=null)for(o in e.defaultProps)s[o]===void 0&&(s[o]=e.defaultProps[o]);return C(e,s,i,a,null)}function C(e,t,n,a,o){var s={type:e,props:t,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++i,__i:-1,__u:0};return o==null&&r.vnode!=null&&r.vnode(s),s}function w(e){return e.children}function T(e,t){this.props=e,this.context=t}function E(e,t){if(t==null)return e.__?E(e.__,e.__i+1):null;for(var n;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null)return n.__e;return typeof e.type==`function`?E(e):null}function D(e){if(e.__P&&e.__d){var t=e.__v,n=t.__e,i=[],a=[],o=b({},t);o.__v=t.__v+1,r.vnode&&r.vnode(o),I(e.__P,o,t,e.__n,e.__P.namespaceURI,32&t.__u?[n]:null,i,n??E(t),!!(32&t.__u),a),o.__v=t.__v,o.__.__k[o.__i]=o,re(i,o,a),t.__e=t.__=null,o.__e!=n&&O(o)}}function O(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(t){if(t!=null&&t.__e!=null)return e.__e=e.__c.base=t.__e}),O(e)}function k(e){(!e.__d&&(e.__d=!0)&&a.push(e)&&!A.__r++||o!=r.debounceRendering)&&((o=r.debounceRendering)||s)(A)}function A(){try{for(var e,t=1;a.length;)a.length>t&&a.sort(c),e=a.shift(),t=a.length,D(e)}finally{a.length=A.__r=0}}function ee(e,t,n,r,i,a,o,s,c,l,u){var d,f,p,m,h,v,y=r&&r.__k||_,b=t.length;for(c=j(n,t,y,c,b),d=0;d<b;d++)(p=n.__k[d])!=null&&(f=p.__i!=-1&&y[p.__i]||g,p.__i=d,v=I(e,p,f,i,a,o,s,c,l,u),m=p.__e,p.ref&&f.ref!=p.ref&&(f.ref&&L(f.ref,null,p),u.push(p.ref,p.__c||m,p)),h==null&&m!=null&&(h=m),4&p.__u?(c=M(p,c,e),f.__e&&(f.__e=null)):typeof p.type==`function`&&v!==void 0?c=v:m&&(c=m.nextSibling),p.__u&=-7);return n.__e=h,c}function j(e,t,n,r,i){var a,o,s,c,l,u=n.length,d=u,f=0;for(e.__k=Array(i),a=0;a<i;a++)(o=t[a])!=null&&typeof o!=`boolean`&&typeof o!=`function`?(typeof o==`string`||typeof o==`number`||typeof o==`bigint`||o.constructor==String?o=e.__k[a]=C(null,o,null,null,null):y(o)?o=e.__k[a]=C(w,{children:o},null,null,null):o.constructor===void 0&&o.__b>0?o=e.__k[a]=C(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):e.__k[a]=o,c=a+f,o.__=e,o.__b=e.__b+1,s=null,(l=o.__i=N(o,n,c,d))!=-1&&(d--,(s=n[l])&&(s.__u|=2)),s==null||s.__v==null?(l==-1&&(i>u?f--:i<u&&f++),typeof o.type!=`function`&&(o.__u|=4)):l!=c&&(l==c-1?f--:l==c+1?f++:(l>c?f--:f++,o.__u|=4))):e.__k[a]=null;if(d)for(a=0;a<u;a++)(s=n[a])!=null&&!(2&s.__u)&&(s.__e==r&&(r=E(s)),oe(s,s));return r}function M(e,t,n){var r,i;if(typeof e.type==`function`){for(r=e.__k,i=0;r&&i<r.length;i++)r[i]&&(r[i].__=e,t=M(r[i],t,n));return t}e.__e!=t&&(t&&e.type&&!t.parentNode&&(t=E(e)),t=n.insertBefore(e.__e,t||null));do t&&=t.nextSibling;while(t!=null&&t.nodeType==8);return t}function N(e,t,n,r){var i,a,o,s=e.key,c=e.type,l=t[n],u=l!=null&&!(2&l.__u);if(l===null&&s==null||u&&s==l.key&&c==l.type)return n;if(r>+!!u){for(i=n-1,a=n+1;i>=0||a<t.length;)if((l=t[o=i>=0?i--:a++])!=null&&!(2&l.__u)&&s==l.key&&c==l.type)return o}return-1}function P(e,t,n){t[0]==`-`?e.setProperty(t,n??``):e[t]=n==null?``:typeof n!=`number`||v.test(t)?n:n+`px`}function F(e,t,n,r,i){var a,o;n:if(t==`style`){if(typeof n==`string`)e.style.cssText=n;else{if(typeof r==`string`&&(e.style.cssText=r=``),r)for(t in r)n&&t in n||P(e.style,t,``);if(n)for(t in n)r&&n[t]==r[t]||P(e.style,t,n[t])}}else if(t[0]==`o`&&t[1]==`n`)a=t!=(t=t.replace(f,`$1`)),o=t.toLowerCase(),t=o in e||t==`onFocusOut`||t==`onFocusIn`?o.slice(2):t.slice(2),e.l||={},e.l[t+a]=n,n?r?n[d]=r[d]:(n[d]=p,e.addEventListener(t,a?h:m,a)):e.removeEventListener(t,a?h:m,a);else{if(i==`http://www.w3.org/2000/svg`)t=t.replace(/xlink(H|:h)/,`h`).replace(/sName$/,`s`);else if(t!=`width`&&t!=`height`&&t!=`href`&&t!=`list`&&t!=`form`&&t!=`tabIndex`&&t!=`download`&&t!=`rowSpan`&&t!=`colSpan`&&t!=`role`&&t!=`popover`&&t in e)try{e[t]=n??``;break n}catch{}typeof n==`function`||(n==null||!1===n&&t[4]!=`-`?e.removeAttribute(t):e.setAttribute(t,t==`popover`&&n==1?``:n))}}function te(e){return function(t){if(this.l){var n=this.l[t.type+e];if(t[u]==null)t[u]=p++;else if(t[u]<n[d])return;return n(r.event?r.event(t):t)}}}function I(e,t,n,i,a,o,s,c,l,u){var d,f,p,m,h,g,v,S,C,D,O,k,A,j,M,N,P=t.type;if(t.constructor!==void 0)return null;128&n.__u&&(l=!!(32&n.__u),o=[c=t.__e=n.__e]),(d=r.__b)&&d(t);n:if(typeof P==`function`){f=s.length;try{if(C=t.props,D=P.prototype&&P.prototype.render,O=(d=P.contextType)&&i[d.__c],k=d?O?O.props.value:d.__:i,n.__c?S=(p=t.__c=n.__c).__=p.__E:(D?t.__c=p=new P(C,k):(t.__c=p=new T(C,k),p.constructor=P,p.render=se),O&&O.sub(p),p.state||(p.state={}),p.__n=i,m=p.__d=!0,p.__h=[],p._sb=[]),D&&p.__s==null&&(p.__s=p.state),D&&P.getDerivedStateFromProps!=null&&(p.__s==p.state&&(p.__s=b({},p.__s)),b(p.__s,P.getDerivedStateFromProps(C,p.__s))),h=p.props,g=p.state,p.__v=t,m)D&&P.getDerivedStateFromProps==null&&p.componentWillMount!=null&&p.componentWillMount(),D&&p.componentDidMount!=null&&p.__h.push(p.componentDidMount);else{if(D&&P.getDerivedStateFromProps==null&&C!==h&&p.componentWillReceiveProps!=null&&p.componentWillReceiveProps(C,k),t.__v==n.__v||!p.__e&&p.shouldComponentUpdate!=null&&!1===p.shouldComponentUpdate(C,p.__s,k)){t.__v!=n.__v&&(p.props=C,p.state=p.__s,p.__d=!1),t.__e=n.__e,t.__k=n.__k,t.__k.some(function(e){e&&(e.__=t)}),_.push.apply(p.__h,p._sb),p._sb=[],p.__h.length&&s.push(p),c=E(n);break n}p.componentWillUpdate!=null&&p.componentWillUpdate(C,p.__s,k),D&&p.componentDidUpdate!=null&&p.__h.push(function(){p.componentDidUpdate(h,g,v)})}if(p.context=k,p.props=C,p.__P=e,p.__e=!1,A=r.__r,j=0,D)p.state=p.__s,p.__d=!1,A&&A(t),d=p.render(p.props,p.state,p.context),_.push.apply(p.__h,p._sb),p._sb=[];else do p.__d=!1,A&&A(t),d=p.render(p.props,p.state,p.context),p.state=p.__s;while(p.__d&&++j<25);p.state=p.__s,p.getChildContext!=null&&(i=b(b({},i),p.getChildContext())),D&&!m&&p.getSnapshotBeforeUpdate!=null&&(v=p.getSnapshotBeforeUpdate(h,g)),M=d!=null&&d.type===w&&d.key==null?ie(d.props.children):d,c=ee(e,y(M)?M:[M],t,n,i,a,o,s,c,l,u),p.base=t.__e,t.__u&=-161,p.__h.length&&s.push(p),S&&(p.__E=p.__=null)}catch(e){if(s.length=f,t.__v=null,l||o!=null){if(e.then){for(t.__u|=l?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;o!=null&&(o[o.indexOf(c)]=null),t.__e=c}else if(o!=null)for(N=o.length;N--;)x(o[N])}else t.__e=n.__e;t.__k??=n.__k||[],e.then||ne(t),r.__e(e,t,n)}}else o==null&&t.__v==n.__v?(t.__k=n.__k,t.__e=n.__e):c=t.__e=ae(n.__e,t,n,i,a,o,s,l,u);return(d=r.diffed)&&d(t),128&t.__u?void 0:c}function ne(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(ne))}function re(e,t,n){for(var i=0;i<n.length;i++)L(n[i],n[++i],n[++i]);r.__c&&r.__c(t,e),e.some(function(t){try{e=t.__h,t.__h=[],e.some(function(e){e.call(t)})}catch(e){r.__e(e,t.__v)}})}function ie(e){return typeof e!=`object`||!e||e.__b>0?e:y(e)?e.map(ie):e.constructor===void 0?b({},e):null}function ae(e,t,i,a,o,s,c,l,u){var d,f,p,m,h,_,v,b=i.props||g,S=t.props,C=t.type;if(C==`svg`?o=`http://www.w3.org/2000/svg`:C==`math`?o=`http://www.w3.org/1998/Math/MathML`:o||=`http://www.w3.org/1999/xhtml`,s!=null){for(d=0;d<s.length;d++)if((h=s[d])&&`setAttribute`in h==!!C&&(C?h.localName==C:h.nodeType==3)){e=h,s[d]=null;break}}if(e==null){if(C==null)return document.createTextNode(S);e=document.createElementNS(o,C,S.is&&S),l&&=(r.__m&&r.__m(t,s),!1),s=null}if(C==null)b===S||l&&e.data==S||(e.data=S);else{if(s=C==`textarea`&&S.defaultValue!=null?null:s&&n.call(e.childNodes),!l&&s!=null)for(b={},d=0;d<e.attributes.length;d++)b[(h=e.attributes[d]).name]=h.value;for(d in b)h=b[d],d==`dangerouslySetInnerHTML`?p=h:d==`children`||d in S||d==`value`&&`defaultValue`in S||d==`checked`&&`defaultChecked`in S||F(e,d,null,h,o);for(d in S)h=S[d],d==`children`?m=h:d==`dangerouslySetInnerHTML`?f=h:d==`value`?_=h:d==`checked`?v=h:l&&typeof h!=`function`||b[d]===h||F(e,d,h,b[d],o);if(f)l||p&&(f.__html==p.__html||f.__html==e.innerHTML)||(e.innerHTML=f.__html),t.__k=[];else if(p&&(e.innerHTML=``),ee(t.type==`template`?e.content:e,y(m)?m:[m],t,i,a,C==`foreignObject`?`http://www.w3.org/1999/xhtml`:o,s,c,s?s[0]:i.__k&&E(i,0),l,u),s!=null)for(d=s.length;d--;)x(s[d]);l&&C!=`textarea`||(d=`value`,C==`progress`&&_==null?e.removeAttribute(`value`):_!=null&&(_!==e[d]||C==`progress`&&!_||C==`option`&&_!=b[d])&&F(e,d,_,b[d],o),d=`checked`,v!=null&&v!=e[d]&&F(e,d,v,b[d],o))}return e}function L(e,t,n){try{if(typeof e==`function`){var i=typeof e.__u==`function`;i&&e.__u(),i&&t==null||(e.__u=e(t))}else e.current=t}catch(e){r.__e(e,n)}}function oe(e,t,n){var i,a;if(r.unmount&&r.unmount(e),(i=e.ref)&&(i.current&&i.current!=e.__e||L(i,null,t)),(i=e.__c)!=null){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(e){r.__e(e,t)}i.base=i.__P=i.__n=null}if(i=e.__k)for(a=0;a<i.length;a++)i[a]&&oe(i[a],t,n||typeof e.type!=`function`);n||x(e.__e),e.__c=e.__=e.__e=void 0}function se(e,t,n){return this.constructor(e,n)}function ce(e,t,i){var a,o,s,c;t==document&&(t=document.documentElement),r.__&&r.__(e,t),o=(a=typeof i==`function`)?null:i&&i.__k||t.__k,s=[],c=[],I(t,e=(!a&&i||t).__k=S(w,null,[e]),o||g,g,t.namespaceURI,!a&&i?[i]:o?null:t.firstChild?n.call(t.childNodes):null,s,!a&&i?i:o?o.__e:t.firstChild,a,c),re(s,e,c),e.props.children=null}n=_.slice,r={__e:function(e,t,n,r){for(var i,a,o;t=t.__;)if((i=t.__c)&&!i.__)try{if((a=i.constructor)&&a.getDerivedStateFromError!=null&&(i.setState(a.getDerivedStateFromError(e)),o=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(e,r||{}),o=i.__d),o)return i.__E=i}catch(t){e=t}throw e}},i=0,T.prototype.setState=function(e,t){var n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=b({},this.state);typeof e==`function`&&(e=e(b({},n),this.props)),e&&b(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),k(this))},T.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),k(this))},T.prototype.render=w,a=[],s=typeof Promise==`function`?Promise.prototype.then.bind(Promise.resolve()):setTimeout,c=function(e,t){return e.__v.__b-t.__v.__b},A.__r=0,l=Math.random().toString(8),u=`__d`+l,d=`__a`+l,f=/(PointerCapture)$|Capture$/i,p=0,m=te(!1),h=te(!0);var R,z,B,le,V=0,ue=[],H=r,de=H.__b,fe=H.__r,pe=H.diffed,me=H.__c,he=H.unmount,ge=H.__;function _e(e,t){H.__h&&H.__h(z,e,V||t),V=0;var n=z.__H||(z.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function U(e){return V=1,ve(Ce,e)}function ve(e,t,n){var r=_e(R++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):Ce(void 0,t),function(e){var t=r.__N?r.__N[0]:r.__[0],n=r.t(t,e);t!==n&&(r.__N=[n,r.__[1]],r.__c.setState({}))}],r.__c=z,!z.__f)){var i=function(e,t,n){if(!r.__c.__H)return!0;var i=!1,o=r.__c.props!==e;if(r.__c.__H.__.some(function(e){if(e.__N){i=!0;var t=e.__[0];e.__=e.__N,e.__N=void 0,t!==e.__[0]&&(o=!0)}}),a){var s=a.call(this,e,t,n);return i?s||o:s}return!i||o};z.__f=!0;var a=z.shouldComponentUpdate,o=z.componentWillUpdate;z.componentWillUpdate=function(e,t,n){if(this.__e){var r=a;a=void 0,i(e,t,n),a=r}o&&o.call(this,e,t,n)},z.shouldComponentUpdate=i}return r.__N||r.__}function W(e,t){var n=_e(R++,3);!H.__s&&Se(n.__H,t)&&(n.__=e,n.u=t,z.__H.__h.push(n))}function ye(){for(var e;e=ue.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(G),t.__h.some(K),t.__h=[]}catch(n){t.__h=[],H.__e(n,e.__v)}}}H.__b=function(e){z=null,de&&de(e)},H.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),ge&&ge(e,t)},H.__r=function(e){fe&&fe(e),R=0;var t=(z=e.__c).__H;t&&(B===z?(t.__h=[],z.__h=[],t.__.some(function(e){e.__N&&(e.__=e.__N),e.u=e.__N=void 0})):(t.__h.some(G),t.__h.some(K),t.__h=[],R=0)),B=z},H.diffed=function(e){pe&&pe(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(ue.push(t)!==1&&le===H.requestAnimationFrame||((le=H.requestAnimationFrame)||xe)(ye)),t.__H.__.some(function(e){e.u&&=(e.__H=e.u,void 0)})),B=z=null},H.__c=function(e,t){t.some(function(e){try{e.__h.some(G),e.__h=e.__h.filter(function(e){return!e.__||K(e)})}catch(n){t.some(function(e){e.__h&&=[]}),t=[],H.__e(n,e.__v)}}),me&&me(e,t)},H.unmount=function(e){he&&he(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.some(function(e){try{G(e)}catch(e){t=e}}),n.__H=void 0,t&&H.__e(t,n.__v))};var be=typeof requestAnimationFrame==`function`;function xe(e){var t,n=function(){clearTimeout(r),be&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,35);be&&(t=requestAnimationFrame(n))}function G(e){var t=z,n=e.__c;typeof n==`function`&&(e.__c=void 0,n()),z=t}function K(e){var t=z;e.__c=e.__(),z=t}function Se(e,t){return!e||e.length!==t.length||t.some(function(t,n){return t!==e[n]})}function Ce(e,t){return typeof t==`function`?t(e):t}var we={$comment:`Every user-facing string, both targets (docs/PLAN.md rule 8). S0-03 owns the KEYS; Values written in S1-L0 (Claude, Voice Bank protocol, 2026-09-24). Every message is spoken, so key names are spelled out (Control Option V, Command C), never symbols. Web and Mac load this file; no string literal lives in UI code (scripts/strings-check.mjs). Every notice/error is also spoken (rule 8, 'Speak messages' default on). Placeholders {n} {mb} {words} {level} are filled at runtime.`,version:1,locale:`en`,$plan_wording:{"notice.dial_shorter":`Making it shorter.`,"notice.dial_longer":`Adding detail.`,"notice.all_cut":`Couldn't make a summary I trust for this part.`,"notice.oneline_failed":`Couldn't boil this down to one line I trust. Here's the short version.`,"notice.input_limit":`This is over 120,000 words. Select a part of it.`,"mac.intake.press_cmd_c":`Press ⌘C to read it (spoken form: Press Command C to read it.)`,"mac.intake.no_copy_seen":`Didn't see a copy.`,"loading.summarizer_button":`Load summarizer ({mb} MB)`,"dial.readall":`Read all`,"dial.short":`Short`,"dial.caveman":`Caveman`,"dial.oneline":`One line`,$comment:`Wording the plan fixes (rules 2, 11, C3, C9, Architecture). S1-L0 keeps the meaning; it may tune words after the Voice Bank pass.`},strings:{"app.title":`Fruitbat`,"theme.toggle":`Dark mode`,"dial.readall":`Read all`,"dial.short":`Short`,"dial.caveman":`Caveman`,"dial.oneline":`One line`,"panel.title":`The short version`,"panel.empty":`Highlight some text or paste it below. Then pick how short you want it.`,"panel.read_chip":`Read`,"panel.summarize":`Read it`,"panel.stop":`Stop`,"panel.pause":`Pause`,"panel.resume":`Resume`,"panel.skip":`Skip`,"panel.read_this_part":`Read this part`,"panel.rate":`Speed`,"panel.rate_slower":`Slower`,"panel.rate_faster":`Faster`,"panel.voice":`Voice`,"panel.speak_messages":`Speak messages`,"panel.hide_pip":`Hide Pip`,"panel.show_pip":`Show Pip`,"panel.font_size":`Text size`,"panel.spacing":`Spacing`,"panel.dark_mode":`Dark mode`,"panel.position":`Panel position`,"panel.bug_report":`Report a problem`,"panel.stats":`Stats`,"panel.close":`Close`,"panel.now_reading":`Now reading`,"panel.next_up":`Next`,"intake.paste_placeholder":`Paste text here`,"intake.word_count":`{n} words`,"intake.drop_here":`Drop a text or PDF file here`,"intake.empty":`Nothing to read yet. Highlight some text or paste it here.`,"intake.sample_label":`Sample article`,"demo.try_it_now":`Try it now`,"demo.recording_label":`This one is a recording. Your own text runs on your machine.`,"demo.switch_level":`Turn the dial to hear the same article shorter or longer.`,"loading.probing":`Checking what this browser can do.`,"loading.voice":`Getting the voice ready.`,"loading.summarizer_button":`Load summarizer ({mb} MB)`,"loading.summarizer_size":`The summarizer is a {mb} MB download. It happens once and stays on this device.`,"loading.progress":`{mb} MB so far.`,"loading.cached":`Already on this device. No download needed.`,"loading.first_time":`First time here. The models download once and stay on this device.`,"loading.save_data":`Your browser is set to save data, so nothing big downloads until you ask.`,"loading.mobile":`On a phone the voice works and the sample is a recording. Open this on a laptop for the full thing.`,"loading.almost":`Almost there.`,"loading.ready":`Ready.`,"notice.dial_shorter":`Making it shorter.`,"notice.dial_longer":`Adding detail.`,"notice.all_cut":`Couldn't make a summary I trust for this part.`,"notice.oneline_failed":`Couldn't boil this down to one line I trust. Here's the short version.`,"notice.input_limit":`This is over 120,000 words. Select a part of it.`,"notice.no_webgpu":`This browser can't run the summarizer. Read all still works, and the sample is a recording.`,"notice.probe_failed":`The summarizer didn't start on this machine. Read all still works.`,"notice.low_end_tier":`Using a smaller summarizer so it fits this machine.`,"notice.stopped":`Stopped.`,"notice.done":`That's the end.`,"notice.paused":`Paused.`,"notice.making_summary":`Making the short version.`,"notice.reading_all":`Reading all of it.`,"error.model_download":`The download didn't finish. Check your connection and try again.`,"error.voice":`The voice didn't load. Try again in a moment.`,"error.generation":`Something went wrong making the summary. Read all still works.`,"error.storage_full":`This browser is out of storage, so stats won't be saved.`,"error.empty_input":`There's no text to read yet.`,"error.offline":`You're offline. Anything already downloaded still works.`,"error.unknown":`Something went wrong. Try again.`,"report.title":`Report a problem`,"report.preview_intro":`Here is everything the report contains. Nothing you were reading is in it.`,"report.describe":`What happened?`,"report.open_github":`Open on GitHub`,"report.copy":`Copy report`,"report.copied":`Copied.`,"report.privacy_note":`The report has numbers and settings only. Never your text, your audio or your file names.`,"stats.title":`Stats`,"stats.empty":`No runs yet.`,"stats.export":`Export CSV`,"stats.clear":`Clear stats`,"a11y.panel_region":`Fruitbat panel`,"a11y.bullet_list":`Summary`,"a11y.dial":`How short`,"a11y.pip":`Pip the fruit bat`,"mac.menu.summarize_selection":`Read the selection`,"mac.menu.summarize_clipboard":`Read the clipboard`,"mac.menu.summarize_region":`Read part of the screen`,"mac.menu.settings":`Settings`,"mac.menu.stats":`Stats`,"mac.menu.check_updates":`Check for updates`,"mac.menu.quit":`Quit Fruitbat`,"mac.onboarding.try_it":`Copy any text, then press Control Option V.`,"mac.onboarding.first_success":`Worked. Now try it on anything you highlight.`,"mac.onboarding.offer_accessibility":`Want to skip the copy step? Give Fruitbat the Accessibility permission and it reads what you highlight.`,"mac.onboarding.updates_disclosure":`Fruitbat checks for updates once a day. You can turn that off in Settings.`,"mac.onboarding.done":`You're set. Fruitbat lives in the menu bar.`,"mac.permission.accessibility":`Fruitbat needs the Accessibility permission to read what you highlight. Without it, copy the text first and press Control Option V.`,"mac.permission.accessibility_denied":`No Accessibility permission. Copy the text and press Control Option V instead.`,"mac.permission.screen_recording":`Fruitbat needs Screen Recording to read part of the screen. Without it, the other two ways still work.`,"mac.permission.screen_recording_denied":`No Screen Recording permission. Highlight text or copy it instead.`,"mac.permission.open_settings":`Open System Settings`,"mac.intake.press_cmd_c":`Press Command C to read it.`,"mac.intake.no_copy_seen":`Didn't see a copy.`,"mac.intake.clipboard_empty":`The clipboard is empty.`,"mac.intake.clipboard_not_text":`The clipboard doesn't have text in it.`,"mac.ocr.first_run_warning":`Anything on screen becomes text on this Mac, passwords included. It stays here.`,"mac.ocr.nothing_found":`Couldn't find any text there.`,"mac.ocr.pick_region":`Drag over the part you want read.`,"mac.update.toggle":`Check for updates`,"mac.update.available":`A new version is ready.`,"mac.update.up_to_date":`You're up to date.`,"mac.license.trial_days_left":`{n} days left in the trial.`,"mac.license.enter_key":`Enter your license key`,"mac.license.licensed":`Licensed. Thank you.`,"mac.license.nag":`Couldn't check the license in a while. Fruitbat keeps working.`,"mac.license.sign_out":`Sign out of this Mac`,"mac.license.invalid":`That key didn't work. Check it and try again.`,"intake.read_button":`Read this`}}.strings;function q(e){return we[e]??e}var J=t.default??`short`,Te=new Set;function Ee(){return J}function De(e){if(e!==J){J=e;for(let e of Te)e(J)}}var Oe=96,Y=36,X=8;function Z(){let e=typeof window<`u`?window.getSelection():null;return!e||e.isCollapsed||e.rangeCount===0?``:e.toString().trim()}function ke(){return Z().length>0}function Ae(e){return e.trim().length>=20}function je(){let e=typeof window<`u`?window.getSelection():null;if(!e||e.rangeCount===0)return null;let t=e.getRangeAt(0).getBoundingClientRect();return t.width===0&&t.height===0?null:t}function Me(e,t,n){let r=e.bottom+X;return r+Y>n&&(r=e.top-Y-X),r=Math.max(X,Math.min(r,n-Y-X)),{left:Math.max(X,Math.min(e.left,t-Oe-X)),top:r}}function Ne(e){return e.altKey&&e.code===`KeyR`}function Q(e){let t=e.trim();t&&window.__fruitbat.run(t,Ee())}var Pe=0;Array.isArray;function $(e,t,n,i,a,o){t||={};var s,c,l=t;if(`ref`in l)for(c in l={},t)c==`ref`?s=t[c]:l[c]=t[c];var u={type:e,props:l,key:n,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--Pe,__i:-1,__u:0,__source:a,__self:o};if(typeof e==`function`&&(s=e.defaultProps))for(c in s)l[c]===void 0&&(l[c]=s[c]);return r.vnode&&r.vnode(u),u}function Fe(e){let t=e.trim();return t===``?0:t.split(/\s+/).length}function Ie(){let[e,t]=U(``),n=Fe(e),r=e.trim()===``;function i(){r||Q(e)}return $(`div`,{class:`paste-box`,children:[$(`label`,{class:`paste-label`,for:`paste-input`,children:q(`intake.paste_placeholder`)}),$(`textarea`,{id:`paste-input`,class:`paste-textarea`,placeholder:q(`intake.paste_placeholder`),value:e,onInput:e=>t(e.target.value),onKeyDown:e=>{(e.metaKey||e.ctrlKey)&&e.key===`Enter`&&(e.preventDefault(),i())}}),$(`div`,{class:`paste-row`,children:[$(`p`,{class:`word-count`,"aria-live":`polite`,"data-word-count":n,children:q(`intake.word_count`).replace(`{n}`,String(n))}),$(`button`,{type:`button`,class:`read-button`,onClick:i,disabled:r,children:q(`intake.read_button`)})]})]})}function Le(){let[e,t]=U(null);return W(()=>{function e(){let e=Z();if(!Ae(e)){t(null);return}let n=je();if(!n){t(null);return}t({text:e,position:Me(n,window.innerWidth,window.innerHeight)})}function n(t){t.key!==`Escape`&&e()}function r(e){if(e.key===`Escape`){t(null);return}Ne(e)&&ke()&&(e.preventDefault(),Q(Z()),t(null))}return document.addEventListener(`mouseup`,e),document.addEventListener(`keyup`,n),document.addEventListener(`keydown`,r),window.addEventListener(`scroll`,e,{passive:!0,capture:!0}),window.addEventListener(`resize`,e),()=>{document.removeEventListener(`mouseup`,e),document.removeEventListener(`keyup`,n),document.removeEventListener(`keydown`,r),window.removeEventListener(`scroll`,e,{capture:!0}),window.removeEventListener(`resize`,e)}},[]),e?$(`button`,{type:`button`,class:`read-chip`,style:{left:`${e.position.left}px`,top:`${e.position.top}px`},"aria-label":q(`panel.read_chip`),onMouseDown:e=>e.preventDefault(),onClick:()=>{Q(e.text),t(null)},children:q(`panel.read_chip`)}):null}var Re=t.levels,ze=t.default??`short`;function Be({level:e,onChange:t}){return $(`fieldset`,{class:`dial`,children:[$(`legend`,{class:`visually-hidden`,children:q(`a11y.dial`)}),Re.map(n=>$(`label`,{class:`dial-option`,children:[$(`input`,{type:`radio`,name:`level`,value:n.id,checked:e===n.id,onChange:()=>t(n.id)}),$(`span`,{children:q(n.label_key)})]},n.id))]})}function Ve(){if(typeof document<`u`){let e=document.documentElement.getAttribute(`data-theme`);if(e===`dark`||e===`light`)return e}return typeof matchMedia<`u`&&matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}function He(){let[e,t]=U(Ve);return $(`button`,{type:`button`,class:`theme-toggle`,onClick:()=>{let n=e===`dark`?`light`:`dark`;t(n),document.documentElement.setAttribute(`data-theme`,n);try{localStorage.setItem(`fruitbat-theme`,n)}catch{}},"aria-pressed":e===`dark`,children:q(`theme.toggle`)})}function Ue({paragraphs:e}){return $(`article`,{class:`article`,"aria-label":q(`intake.sample_label`),children:e.map((e,t)=>$(`p`,{children:e},t))})}function We(){let[t,n]=U([]);return W(()=>{let t=!1;return e(`/sample.txt`).then(e=>e.text()).then(e=>{t||n(e.split(/\n{2,}/).map(e=>e.trim()).filter(Boolean))}).catch(()=>{t||n([])}),()=>{t=!0}},[]),t}function Ge(){let[e,t]=U(ze),n=We();return W(()=>{document.title=q(`app.title`)},[]),W(()=>{De(e)},[e]),$(`div`,{class:`app-shell`,children:[$(`header`,{class:`app-header`,children:[$(`h1`,{class:`app-title`,children:q(`app.title`)}),$(Be,{level:e,onChange:e=>{De(e),t(e)}}),$(He,{})]}),$(`main`,{class:`app-main`,children:[$(Ue,{paragraphs:n}),$(Ie,{})]}),$(`aside`,{id:`panel`,class:`panel`,"aria-label":q(`a11y.panel_region`),children:$(`p`,{class:`panel-empty`,children:q(`panel.empty`)})}),$(Le,{})]})}function Ke(){try{let e=localStorage.getItem(`fruitbat-theme`);(e===`dark`||e===`light`)&&document.documentElement.setAttribute(`data-theme`,e)}catch{}}var qe=0,Je=null;window.__fruitbat={run(e,t){qe+=1,Je={level:t,chars:e.length},window.dispatchEvent(new CustomEvent(`fruitbat:run`,{detail:{text:e,level:t}}))},stop(){window.dispatchEvent(new CustomEvent(`fruitbat:stop`))},stats(){return{runs:qe,last:Je}}},Ke();var Ye=document.getElementById(`app`);Ye&&ce($(Ge,{}),Ye);
assets/index-MrbJyoK3.js DELETED
@@ -1 +0,0 @@
1
- import{t as e}from"./net-Czt2kcl5.js";var t,n,r,i,a,o,s,c,l,u,d,f,p,m,h={},g=[],_=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,v=Array.isArray;function y(e,t){for(var n in t)e[n]=t[n];return e}function b(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function x(e,n,r){var i,a,o,s={};for(o in n)o==`key`?i=n[o]:o==`ref`?a=n[o]:s[o]=n[o];if(arguments.length>2&&(s.children=arguments.length>3?t.call(arguments,2):r),typeof e==`function`&&e.defaultProps!=null)for(o in e.defaultProps)s[o]===void 0&&(s[o]=e.defaultProps[o]);return S(e,s,i,a,null)}function S(e,t,i,a,o){var s={type:e,props:t,key:i,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++r,__i:-1,__u:0};return o==null&&n.vnode!=null&&n.vnode(s),s}function C(e){return e.children}function w(e,t){this.props=e,this.context=t}function T(e,t){if(t==null)return e.__?T(e.__,e.__i+1):null;for(var n;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null)return n.__e;return typeof e.type==`function`?T(e):null}function E(e){if(e.__P&&e.__d){var t=e.__v,r=t.__e,i=[],a=[],o=y({},t);o.__v=t.__v+1,n.vnode&&n.vnode(o),F(e.__P,o,t,e.__n,e.__P.namespaceURI,32&t.__u?[r]:null,i,r??T(t),!!(32&t.__u),a),o.__v=t.__v,o.__.__k[o.__i]=o,re(i,o,a),t.__e=t.__=null,o.__e!=r&&D(o)}}function D(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(t){if(t!=null&&t.__e!=null)return e.__e=e.__c.base=t.__e}),D(e)}function O(e){(!e.__d&&(e.__d=!0)&&i.push(e)&&!k.__r++||a!=n.debounceRendering)&&((a=n.debounceRendering)||o)(k)}function k(){try{for(var e,t=1;i.length;)i.length>t&&i.sort(s),e=i.shift(),t=i.length,E(e)}finally{i.length=k.__r=0}}function ee(e,t,n,r,i,a,o,s,c,l,u){var d,f,p,m,_,v,y=r&&r.__k||g,b=t.length;for(c=A(n,t,y,c,b),d=0;d<b;d++)(p=n.__k[d])!=null&&(f=p.__i!=-1&&y[p.__i]||h,p.__i=d,v=F(e,p,f,i,a,o,s,c,l,u),m=p.__e,p.ref&&f.ref!=p.ref&&(f.ref&&I(f.ref,null,p),u.push(p.ref,p.__c||m,p)),_==null&&m!=null&&(_=m),4&p.__u?(c=j(p,c,e),f.__e&&(f.__e=null)):typeof p.type==`function`&&v!==void 0?c=v:m&&(c=m.nextSibling),p.__u&=-7);return n.__e=_,c}function A(e,t,n,r,i){var a,o,s,c,l,u=n.length,d=u,f=0;for(e.__k=Array(i),a=0;a<i;a++)(o=t[a])!=null&&typeof o!=`boolean`&&typeof o!=`function`?(typeof o==`string`||typeof o==`number`||typeof o==`bigint`||o.constructor==String?o=e.__k[a]=S(null,o,null,null,null):v(o)?o=e.__k[a]=S(C,{children:o},null,null,null):o.constructor===void 0&&o.__b>0?o=e.__k[a]=S(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):e.__k[a]=o,c=a+f,o.__=e,o.__b=e.__b+1,s=null,(l=o.__i=M(o,n,c,d))!=-1&&(d--,(s=n[l])&&(s.__u|=2)),s==null||s.__v==null?(l==-1&&(i>u?f--:i<u&&f++),typeof o.type!=`function`&&(o.__u|=4)):l!=c&&(l==c-1?f--:l==c+1?f++:(l>c?f--:f++,o.__u|=4))):e.__k[a]=null;if(d)for(a=0;a<u;a++)(s=n[a])!=null&&!(2&s.__u)&&(s.__e==r&&(r=T(s)),oe(s,s));return r}function j(e,t,n){var r,i;if(typeof e.type==`function`){for(r=e.__k,i=0;r&&i<r.length;i++)r[i]&&(r[i].__=e,t=j(r[i],t,n));return t}e.__e!=t&&(t&&e.type&&!t.parentNode&&(t=T(e)),t=n.insertBefore(e.__e,t||null));do t&&=t.nextSibling;while(t!=null&&t.nodeType==8);return t}function M(e,t,n,r){var i,a,o,s=e.key,c=e.type,l=t[n],u=l!=null&&!(2&l.__u);if(l===null&&s==null||u&&s==l.key&&c==l.type)return n;if(r>+!!u){for(i=n-1,a=n+1;i>=0||a<t.length;)if((l=t[o=i>=0?i--:a++])!=null&&!(2&l.__u)&&s==l.key&&c==l.type)return o}return-1}function N(e,t,n){t[0]==`-`?e.setProperty(t,n??``):e[t]=n==null?``:typeof n!=`number`||_.test(t)?n:n+`px`}function P(e,t,n,r,i){var a,o;n:if(t==`style`){if(typeof n==`string`)e.style.cssText=n;else{if(typeof r==`string`&&(e.style.cssText=r=``),r)for(t in r)n&&t in n||N(e.style,t,``);if(n)for(t in n)r&&n[t]==r[t]||N(e.style,t,n[t])}}else if(t[0]==`o`&&t[1]==`n`)a=t!=(t=t.replace(d,`$1`)),o=t.toLowerCase(),t=o in e||t==`onFocusOut`||t==`onFocusIn`?o.slice(2):t.slice(2),e.l||={},e.l[t+a]=n,n?r?n[u]=r[u]:(n[u]=f,e.addEventListener(t,a?m:p,a)):e.removeEventListener(t,a?m:p,a);else{if(i==`http://www.w3.org/2000/svg`)t=t.replace(/xlink(H|:h)/,`h`).replace(/sName$/,`s`);else if(t!=`width`&&t!=`height`&&t!=`href`&&t!=`list`&&t!=`form`&&t!=`tabIndex`&&t!=`download`&&t!=`rowSpan`&&t!=`colSpan`&&t!=`role`&&t!=`popover`&&t in e)try{e[t]=n??``;break n}catch{}typeof n==`function`||(n==null||!1===n&&t[4]!=`-`?e.removeAttribute(t):e.setAttribute(t,t==`popover`&&n==1?``:n))}}function te(e){return function(t){if(this.l){var r=this.l[t.type+e];if(t[l]==null)t[l]=f++;else if(t[l]<r[u])return;return r(n.event?n.event(t):t)}}}function F(e,t,r,i,a,o,s,c,l,u){var d,f,p,m,h,_,x,S,E,D,O,k,A,j,M,N,P=t.type;if(t.constructor!==void 0)return null;128&r.__u&&(l=!!(32&r.__u),o=[c=t.__e=r.__e]),(d=n.__b)&&d(t);n:if(typeof P==`function`){f=s.length;try{if(E=t.props,D=P.prototype&&P.prototype.render,O=(d=P.contextType)&&i[d.__c],k=d?O?O.props.value:d.__:i,r.__c?S=(p=t.__c=r.__c).__=p.__E:(D?t.__c=p=new P(E,k):(t.__c=p=new w(E,k),p.constructor=P,p.render=se),O&&O.sub(p),p.state||(p.state={}),p.__n=i,m=p.__d=!0,p.__h=[],p._sb=[]),D&&p.__s==null&&(p.__s=p.state),D&&P.getDerivedStateFromProps!=null&&(p.__s==p.state&&(p.__s=y({},p.__s)),y(p.__s,P.getDerivedStateFromProps(E,p.__s))),h=p.props,_=p.state,p.__v=t,m)D&&P.getDerivedStateFromProps==null&&p.componentWillMount!=null&&p.componentWillMount(),D&&p.componentDidMount!=null&&p.__h.push(p.componentDidMount);else{if(D&&P.getDerivedStateFromProps==null&&E!==h&&p.componentWillReceiveProps!=null&&p.componentWillReceiveProps(E,k),t.__v==r.__v||!p.__e&&p.shouldComponentUpdate!=null&&!1===p.shouldComponentUpdate(E,p.__s,k)){t.__v!=r.__v&&(p.props=E,p.state=p.__s,p.__d=!1),t.__e=r.__e,t.__k=r.__k,t.__k.some(function(e){e&&(e.__=t)}),g.push.apply(p.__h,p._sb),p._sb=[],p.__h.length&&s.push(p),c=T(r);break n}p.componentWillUpdate!=null&&p.componentWillUpdate(E,p.__s,k),D&&p.componentDidUpdate!=null&&p.__h.push(function(){p.componentDidUpdate(h,_,x)})}if(p.context=k,p.props=E,p.__P=e,p.__e=!1,A=n.__r,j=0,D)p.state=p.__s,p.__d=!1,A&&A(t),d=p.render(p.props,p.state,p.context),g.push.apply(p.__h,p._sb),p._sb=[];else do p.__d=!1,A&&A(t),d=p.render(p.props,p.state,p.context),p.state=p.__s;while(p.__d&&++j<25);p.state=p.__s,p.getChildContext!=null&&(i=y(y({},i),p.getChildContext())),D&&!m&&p.getSnapshotBeforeUpdate!=null&&(x=p.getSnapshotBeforeUpdate(h,_)),M=d!=null&&d.type===C&&d.key==null?ie(d.props.children):d,c=ee(e,v(M)?M:[M],t,r,i,a,o,s,c,l,u),p.base=t.__e,t.__u&=-161,p.__h.length&&s.push(p),S&&(p.__E=p.__=null)}catch(e){if(s.length=f,t.__v=null,l||o!=null){if(e.then){for(t.__u|=l?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;o!=null&&(o[o.indexOf(c)]=null),t.__e=c}else if(o!=null)for(N=o.length;N--;)b(o[N])}else t.__e=r.__e;t.__k??=r.__k||[],e.then||ne(t),n.__e(e,t,r)}}else o==null&&t.__v==r.__v?(t.__k=r.__k,t.__e=r.__e):c=t.__e=ae(r.__e,t,r,i,a,o,s,l,u);return(d=n.diffed)&&d(t),128&t.__u?void 0:c}function ne(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(ne))}function re(e,t,r){for(var i=0;i<r.length;i++)I(r[i],r[++i],r[++i]);n.__c&&n.__c(t,e),e.some(function(t){try{e=t.__h,t.__h=[],e.some(function(e){e.call(t)})}catch(e){n.__e(e,t.__v)}})}function ie(e){return typeof e!=`object`||!e||e.__b>0?e:v(e)?e.map(ie):e.constructor===void 0?y({},e):null}function ae(e,r,i,a,o,s,c,l,u){var d,f,p,m,g,_,y,x=i.props||h,S=r.props,C=r.type;if(C==`svg`?o=`http://www.w3.org/2000/svg`:C==`math`?o=`http://www.w3.org/1998/Math/MathML`:o||=`http://www.w3.org/1999/xhtml`,s!=null){for(d=0;d<s.length;d++)if((g=s[d])&&`setAttribute`in g==!!C&&(C?g.localName==C:g.nodeType==3)){e=g,s[d]=null;break}}if(e==null){if(C==null)return document.createTextNode(S);e=document.createElementNS(o,C,S.is&&S),l&&=(n.__m&&n.__m(r,s),!1),s=null}if(C==null)x===S||l&&e.data==S||(e.data=S);else{if(s=C==`textarea`&&S.defaultValue!=null?null:s&&t.call(e.childNodes),!l&&s!=null)for(x={},d=0;d<e.attributes.length;d++)x[(g=e.attributes[d]).name]=g.value;for(d in x)g=x[d],d==`dangerouslySetInnerHTML`?p=g:d==`children`||d in S||d==`value`&&`defaultValue`in S||d==`checked`&&`defaultChecked`in S||P(e,d,null,g,o);for(d in S)g=S[d],d==`children`?m=g:d==`dangerouslySetInnerHTML`?f=g:d==`value`?_=g:d==`checked`?y=g:l&&typeof g!=`function`||x[d]===g||P(e,d,g,x[d],o);if(f)l||p&&(f.__html==p.__html||f.__html==e.innerHTML)||(e.innerHTML=f.__html),r.__k=[];else if(p&&(e.innerHTML=``),ee(r.type==`template`?e.content:e,v(m)?m:[m],r,i,a,C==`foreignObject`?`http://www.w3.org/1999/xhtml`:o,s,c,s?s[0]:i.__k&&T(i,0),l,u),s!=null)for(d=s.length;d--;)b(s[d]);l&&C!=`textarea`||(d=`value`,C==`progress`&&_==null?e.removeAttribute(`value`):_!=null&&(_!==e[d]||C==`progress`&&!_||C==`option`&&_!=x[d])&&P(e,d,_,x[d],o),d=`checked`,y!=null&&y!=e[d]&&P(e,d,y,x[d],o))}return e}function I(e,t,r){try{if(typeof e==`function`){var i=typeof e.__u==`function`;i&&e.__u(),i&&t==null||(e.__u=e(t))}else e.current=t}catch(e){n.__e(e,r)}}function oe(e,t,r){var i,a;if(n.unmount&&n.unmount(e),(i=e.ref)&&(i.current&&i.current!=e.__e||I(i,null,t)),(i=e.__c)!=null){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(e){n.__e(e,t)}i.base=i.__P=i.__n=null}if(i=e.__k)for(a=0;a<i.length;a++)i[a]&&oe(i[a],t,r||typeof e.type!=`function`);r||b(e.__e),e.__c=e.__=e.__e=void 0}function se(e,t,n){return this.constructor(e,n)}function ce(e,r,i){var a,o,s,c;r==document&&(r=document.documentElement),n.__&&n.__(e,r),o=(a=typeof i==`function`)?null:i&&i.__k||r.__k,s=[],c=[],F(r,e=(!a&&i||r).__k=x(C,null,[e]),o||h,h,r.namespaceURI,!a&&i?[i]:o?null:r.firstChild?t.call(r.childNodes):null,s,!a&&i?i:o?o.__e:r.firstChild,a,c),re(s,e,c),e.props.children=null}t=g.slice,n={__e:function(e,t,n,r){for(var i,a,o;t=t.__;)if((i=t.__c)&&!i.__)try{if((a=i.constructor)&&a.getDerivedStateFromError!=null&&(i.setState(a.getDerivedStateFromError(e)),o=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(e,r||{}),o=i.__d),o)return i.__E=i}catch(t){e=t}throw e}},r=0,w.prototype.setState=function(e,t){var n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=y({},this.state);typeof e==`function`&&(e=e(y({},n),this.props)),e&&y(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),O(this))},w.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),O(this))},w.prototype.render=C,i=[],o=typeof Promise==`function`?Promise.prototype.then.bind(Promise.resolve()):setTimeout,s=function(e,t){return e.__v.__b-t.__v.__b},k.__r=0,c=Math.random().toString(8),l=`__d`+c,u=`__a`+c,d=/(PointerCapture)$|Capture$/i,f=0,p=te(!1),m=te(!0);var L,R,z,le,B=0,ue=[],V=n,de=V.__b,fe=V.__r,pe=V.diffed,me=V.__c,he=V.unmount,ge=V.__;function _e(e,t){V.__h&&V.__h(R,e,B||t),B=0;var n=R.__H||(R.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function H(e){return B=1,ve(Ce,e)}function ve(e,t,n){var r=_e(L++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):Ce(void 0,t),function(e){var t=r.__N?r.__N[0]:r.__[0],n=r.t(t,e);t!==n&&(r.__N=[n,r.__[1]],r.__c.setState({}))}],r.__c=R,!R.__f)){var i=function(e,t,n){if(!r.__c.__H)return!0;var i=!1,o=r.__c.props!==e;if(r.__c.__H.__.some(function(e){if(e.__N){i=!0;var t=e.__[0];e.__=e.__N,e.__N=void 0,t!==e.__[0]&&(o=!0)}}),a){var s=a.call(this,e,t,n);return i?s||o:s}return!i||o};R.__f=!0;var a=R.shouldComponentUpdate,o=R.componentWillUpdate;R.componentWillUpdate=function(e,t,n){if(this.__e){var r=a;a=void 0,i(e,t,n),a=r}o&&o.call(this,e,t,n)},R.shouldComponentUpdate=i}return r.__N||r.__}function U(e,t){var n=_e(L++,3);!V.__s&&Se(n.__H,t)&&(n.__=e,n.u=t,R.__H.__h.push(n))}function ye(){for(var e;e=ue.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(W),t.__h.some(G),t.__h=[]}catch(n){t.__h=[],V.__e(n,e.__v)}}}V.__b=function(e){R=null,de&&de(e)},V.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),ge&&ge(e,t)},V.__r=function(e){fe&&fe(e),L=0;var t=(R=e.__c).__H;t&&(z===R?(t.__h=[],R.__h=[],t.__.some(function(e){e.__N&&(e.__=e.__N),e.u=e.__N=void 0})):(t.__h.some(W),t.__h.some(G),t.__h=[],L=0)),z=R},V.diffed=function(e){pe&&pe(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(ue.push(t)!==1&&le===V.requestAnimationFrame||((le=V.requestAnimationFrame)||xe)(ye)),t.__H.__.some(function(e){e.u&&=(e.__H=e.u,void 0)})),z=R=null},V.__c=function(e,t){t.some(function(e){try{e.__h.some(W),e.__h=e.__h.filter(function(e){return!e.__||G(e)})}catch(n){t.some(function(e){e.__h&&=[]}),t=[],V.__e(n,e.__v)}}),me&&me(e,t)},V.unmount=function(e){he&&he(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.some(function(e){try{W(e)}catch(e){t=e}}),n.__H=void 0,t&&V.__e(t,n.__v))};var be=typeof requestAnimationFrame==`function`;function xe(e){var t,n=function(){clearTimeout(r),be&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,35);be&&(t=requestAnimationFrame(n))}function W(e){var t=R,n=e.__c;typeof n==`function`&&(e.__c=void 0,n()),R=t}function G(e){var t=R;e.__c=e.__(),R=t}function Se(e,t){return!e||e.length!==t.length||t.some(function(t,n){return t!==e[n]})}function Ce(e,t){return typeof t==`function`?t(e):t}var K={$comment:`The compression dial (docs/PLAN.md C3, S0-03). Web and Mac load this file; neither hard-codes a level. Order = dial order, longest first. Labels come from spec/strings/en.json by label_key. Prompts are complete user messages with a {{text}} placeholder (reduce: {{lines}}); the runtime sends them through the model's chat template with thinking off.`,version:1,default:`short`,levels:[{id:`readall`,label_key:`dial.readall`,uses_llm:!1,spoken:!0,description:`Every sentence, in order, read aloud. No model. Always one key away.`},{id:`short`,label_key:`dial.short`,uses_llm:!0,spoken:!0,prompt:`prompts/short.md`,max_bullets_per_chunk:6,min_bullets_per_chunk:1,max_words_per_bullet:18,max_new_tokens:220,description:`3 to 6 plain sentences per chunk.`},{id:`caveman`,label_key:`dial.caveman`,uses_llm:!0,spoken:!0,prompt:`prompts/caveman.md`,max_bullets_per_chunk:5,min_bullets_per_chunk:1,max_words_per_bullet:9,max_new_tokens:120,description:`2 to 5 bullets of at most 9 words. Register: plain words, one idea per line, answer first.`},{id:`oneline`,label_key:`dial.oneline`,uses_llm:!0,spoken:!0,prompt:`prompts/oneline.md`,reduce_prompt:`prompts/reduce-oneline.md`,max_bullets_per_chunk:1,min_bullets_per_chunk:1,max_words_per_bullet:25,max_new_tokens:60,reduce:{group_size:10,max_depth:2,fallback_level:`short`,max_cut_fraction:.5},description:`One line for the whole document. More than one chunk: per-chunk lines, then reduce. Only the final line is spoken.`}]},we={$comment:`Every user-facing string, both targets (docs/PLAN.md rule 8). S0-03 owns the KEYS; Values written in S1-L0 (Claude, Voice Bank protocol, 2026-09-24). Every message is spoken, so key names are spelled out (Control Option V, Command C), never symbols. Web and Mac load this file; no string literal lives in UI code (scripts/strings-check.mjs). Every notice/error is also spoken (rule 8, 'Speak messages' default on). Placeholders {n} {mb} {words} {level} are filled at runtime.`,version:1,locale:`en`,$plan_wording:{"notice.dial_shorter":`Making it shorter.`,"notice.dial_longer":`Adding detail.`,"notice.all_cut":`Couldn't make a summary I trust for this part.`,"notice.oneline_failed":`Couldn't boil this down to one line I trust. Here's the short version.`,"notice.input_limit":`This is over 120,000 words. Select a part of it.`,"mac.intake.press_cmd_c":`Press ⌘C to read it (spoken form: Press Command C to read it.)`,"mac.intake.no_copy_seen":`Didn't see a copy.`,"loading.summarizer_button":`Load summarizer ({mb} MB)`,"dial.readall":`Read all`,"dial.short":`Short`,"dial.caveman":`Caveman`,"dial.oneline":`One line`,$comment:`Wording the plan fixes (rules 2, 11, C3, C9, Architecture). S1-L0 keeps the meaning; it may tune words after the Voice Bank pass.`},strings:{"app.title":`Fruitbat`,"theme.toggle":`Dark mode`,"dial.readall":`Read all`,"dial.short":`Short`,"dial.caveman":`Caveman`,"dial.oneline":`One line`,"panel.title":`The short version`,"panel.empty":`Highlight some text or paste it below. Then pick how short you want it.`,"panel.read_chip":`Read`,"panel.summarize":`Read it`,"panel.stop":`Stop`,"panel.pause":`Pause`,"panel.resume":`Resume`,"panel.skip":`Skip`,"panel.read_this_part":`Read this part`,"panel.rate":`Speed`,"panel.rate_slower":`Slower`,"panel.rate_faster":`Faster`,"panel.voice":`Voice`,"panel.speak_messages":`Speak messages`,"panel.hide_pip":`Hide Pip`,"panel.show_pip":`Show Pip`,"panel.font_size":`Text size`,"panel.spacing":`Spacing`,"panel.dark_mode":`Dark mode`,"panel.position":`Panel position`,"panel.bug_report":`Report a problem`,"panel.stats":`Stats`,"panel.close":`Close`,"panel.now_reading":`Now reading`,"panel.next_up":`Next`,"intake.paste_placeholder":`Paste text here`,"intake.word_count":`{n} words`,"intake.drop_here":`Drop a text or PDF file here`,"intake.empty":`Nothing to read yet. Highlight some text or paste it here.`,"intake.sample_label":`Sample article`,"demo.try_it_now":`Try it now`,"demo.recording_label":`This one is a recording. Your own text runs on your machine.`,"demo.switch_level":`Turn the dial to hear the same article shorter or longer.`,"loading.probing":`Checking what this browser can do.`,"loading.voice":`Getting the voice ready.`,"loading.summarizer_button":`Load summarizer ({mb} MB)`,"loading.summarizer_size":`The summarizer is a {mb} MB download. It happens once and stays on this device.`,"loading.progress":`{mb} MB so far.`,"loading.cached":`Already on this device. No download needed.`,"loading.first_time":`First time here. The models download once and stay on this device.`,"loading.save_data":`Your browser is set to save data, so nothing big downloads until you ask.`,"loading.mobile":`On a phone the voice works and the sample is a recording. Open this on a laptop for the full thing.`,"loading.almost":`Almost there.`,"loading.ready":`Ready.`,"notice.dial_shorter":`Making it shorter.`,"notice.dial_longer":`Adding detail.`,"notice.all_cut":`Couldn't make a summary I trust for this part.`,"notice.oneline_failed":`Couldn't boil this down to one line I trust. Here's the short version.`,"notice.input_limit":`This is over 120,000 words. Select a part of it.`,"notice.no_webgpu":`This browser can't run the summarizer. Read all still works, and the sample is a recording.`,"notice.probe_failed":`The summarizer didn't start on this machine. Read all still works.`,"notice.low_end_tier":`Using a smaller summarizer so it fits this machine.`,"notice.stopped":`Stopped.`,"notice.done":`That's the end.`,"notice.paused":`Paused.`,"notice.making_summary":`Making the short version.`,"notice.reading_all":`Reading all of it.`,"error.model_download":`The download didn't finish. Check your connection and try again.`,"error.voice":`The voice didn't load. Try again in a moment.`,"error.generation":`Something went wrong making the summary. Read all still works.`,"error.storage_full":`This browser is out of storage, so stats won't be saved.`,"error.empty_input":`There's no text to read yet.`,"error.offline":`You're offline. Anything already downloaded still works.`,"error.unknown":`Something went wrong. Try again.`,"report.title":`Report a problem`,"report.preview_intro":`Here is everything the report contains. Nothing you were reading is in it.`,"report.describe":`What happened?`,"report.open_github":`Open on GitHub`,"report.copy":`Copy report`,"report.copied":`Copied.`,"report.privacy_note":`The report has numbers and settings only. Never your text, your audio or your file names.`,"stats.title":`Stats`,"stats.empty":`No runs yet.`,"stats.export":`Export CSV`,"stats.clear":`Clear stats`,"a11y.panel_region":`Fruitbat panel`,"a11y.bullet_list":`Summary`,"a11y.dial":`How short`,"a11y.pip":`Pip the fruit bat`,"mac.menu.summarize_selection":`Read the selection`,"mac.menu.summarize_clipboard":`Read the clipboard`,"mac.menu.summarize_region":`Read part of the screen`,"mac.menu.settings":`Settings`,"mac.menu.stats":`Stats`,"mac.menu.check_updates":`Check for updates`,"mac.menu.quit":`Quit Fruitbat`,"mac.onboarding.try_it":`Copy any text, then press Control Option V.`,"mac.onboarding.first_success":`Worked. Now try it on anything you highlight.`,"mac.onboarding.offer_accessibility":`Want to skip the copy step? Give Fruitbat the Accessibility permission and it reads what you highlight.`,"mac.onboarding.updates_disclosure":`Fruitbat checks for updates once a day. You can turn that off in Settings.`,"mac.onboarding.done":`You're set. Fruitbat lives in the menu bar.`,"mac.permission.accessibility":`Fruitbat needs the Accessibility permission to read what you highlight. Without it, copy the text first and press Control Option V.`,"mac.permission.accessibility_denied":`No Accessibility permission. Copy the text and press Control Option V instead.`,"mac.permission.screen_recording":`Fruitbat needs Screen Recording to read part of the screen. Without it, the other two ways still work.`,"mac.permission.screen_recording_denied":`No Screen Recording permission. Highlight text or copy it instead.`,"mac.permission.open_settings":`Open System Settings`,"mac.intake.press_cmd_c":`Press Command C to read it.`,"mac.intake.no_copy_seen":`Didn't see a copy.`,"mac.intake.clipboard_empty":`The clipboard is empty.`,"mac.intake.clipboard_not_text":`The clipboard doesn't have text in it.`,"mac.ocr.first_run_warning":`Anything on screen becomes text on this Mac, passwords included. It stays here.`,"mac.ocr.nothing_found":`Couldn't find any text there.`,"mac.ocr.pick_region":`Drag over the part you want read.`,"mac.update.toggle":`Check for updates`,"mac.update.available":`A new version is ready.`,"mac.update.up_to_date":`You're up to date.`,"mac.license.trial_days_left":`{n} days left in the trial.`,"mac.license.enter_key":`Enter your license key`,"mac.license.licensed":`Licensed. Thank you.`,"mac.license.nag":`Couldn't check the license in a while. Fruitbat keeps working.`,"mac.license.sign_out":`Sign out of this Mac`,"mac.license.invalid":`That key didn't work. Check it and try again.`,"intake.read_button":`Read this`}}.strings;function q(e){return we[e]??e}var J=K.default??`short`,Te=new Set;function Ee(){return J}function De(e){if(e!==J){J=e;for(let e of Te)e(J)}}var Oe=96,Y=36,X=8;function Z(){let e=typeof window<`u`?window.getSelection():null;return!e||e.isCollapsed||e.rangeCount===0?``:e.toString().trim()}function ke(){return Z().length>0}function Ae(e){return e.trim().length>=20}function je(){let e=typeof window<`u`?window.getSelection():null;if(!e||e.rangeCount===0)return null;let t=e.getRangeAt(0).getBoundingClientRect();return t.width===0&&t.height===0?null:t}function Me(e,t,n){let r=e.bottom+X;return r+Y>n&&(r=e.top-Y-X),r=Math.max(X,Math.min(r,n-Y-X)),{left:Math.max(X,Math.min(e.left,t-Oe-X)),top:r}}function Ne(e){return e.altKey&&e.code===`KeyR`}function Q(e){let t=e.trim();t&&window.__fruitbat.run(t,Ee())}var Pe=0;Array.isArray;function $(e,t,r,i,a,o){t||={};var s,c,l=t;if(`ref`in l)for(c in l={},t)c==`ref`?s=t[c]:l[c]=t[c];var u={type:e,props:l,key:r,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--Pe,__i:-1,__u:0,__source:a,__self:o};if(typeof e==`function`&&(s=e.defaultProps))for(c in s)l[c]===void 0&&(l[c]=s[c]);return n.vnode&&n.vnode(u),u}function Fe(e){let t=e.trim();return t===``?0:t.split(/\s+/).length}function Ie(){let[e,t]=H(``),n=Fe(e),r=e.trim()===``;function i(){r||Q(e)}return $(`div`,{class:`paste-box`,children:[$(`label`,{class:`paste-label`,for:`paste-input`,children:q(`intake.paste_placeholder`)}),$(`textarea`,{id:`paste-input`,class:`paste-textarea`,placeholder:q(`intake.paste_placeholder`),value:e,onInput:e=>t(e.target.value),onKeyDown:e=>{(e.metaKey||e.ctrlKey)&&e.key===`Enter`&&(e.preventDefault(),i())}}),$(`div`,{class:`paste-row`,children:[$(`p`,{class:`word-count`,"aria-live":`polite`,"data-word-count":n,children:q(`intake.word_count`).replace(`{n}`,String(n))}),$(`button`,{type:`button`,class:`read-button`,onClick:i,disabled:r,children:q(`intake.read_button`)})]})]})}function Le(){let[e,t]=H(null);return U(()=>{function e(){let e=Z();if(!Ae(e)){t(null);return}let n=je();if(!n){t(null);return}t({text:e,position:Me(n,window.innerWidth,window.innerHeight)})}function n(t){t.key!==`Escape`&&e()}function r(e){if(e.key===`Escape`){t(null);return}Ne(e)&&ke()&&(e.preventDefault(),Q(Z()),t(null))}return document.addEventListener(`mouseup`,e),document.addEventListener(`keyup`,n),document.addEventListener(`keydown`,r),window.addEventListener(`scroll`,e,{passive:!0,capture:!0}),window.addEventListener(`resize`,e),()=>{document.removeEventListener(`mouseup`,e),document.removeEventListener(`keyup`,n),document.removeEventListener(`keydown`,r),window.removeEventListener(`scroll`,e,{capture:!0}),window.removeEventListener(`resize`,e)}},[]),e?$(`button`,{type:`button`,class:`read-chip`,style:{left:`${e.position.left}px`,top:`${e.position.top}px`},"aria-label":q(`panel.read_chip`),onMouseDown:e=>e.preventDefault(),onClick:()=>{Q(e.text),t(null)},children:q(`panel.read_chip`)}):null}var Re=K.levels,ze=K.default??`short`;function Be({level:e,onChange:t}){return $(`fieldset`,{class:`dial`,children:[$(`legend`,{class:`visually-hidden`,children:q(`a11y.dial`)}),Re.map(n=>$(`label`,{class:`dial-option`,children:[$(`input`,{type:`radio`,name:`level`,value:n.id,checked:e===n.id,onChange:()=>t(n.id)}),$(`span`,{children:q(n.label_key)})]},n.id))]})}function Ve(){if(typeof document<`u`){let e=document.documentElement.getAttribute(`data-theme`);if(e===`dark`||e===`light`)return e}return typeof matchMedia<`u`&&matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}function He(){let[e,t]=H(Ve);return $(`button`,{type:`button`,class:`theme-toggle`,onClick:()=>{let n=e===`dark`?`light`:`dark`;t(n),document.documentElement.setAttribute(`data-theme`,n);try{localStorage.setItem(`fruitbat-theme`,n)}catch{}},"aria-pressed":e===`dark`,children:q(`theme.toggle`)})}function Ue({paragraphs:e}){return $(`article`,{class:`article`,"aria-label":q(`intake.sample_label`),children:e.map((e,t)=>$(`p`,{children:e},t))})}function We(){let[t,n]=H([]);return U(()=>{let t=!1;return e(`/sample.txt`).then(e=>e.text()).then(e=>{t||n(e.split(/\n{2,}/).map(e=>e.trim()).filter(Boolean))}).catch(()=>{t||n([])}),()=>{t=!0}},[]),t}function Ge(){let[e,t]=H(ze),n=We();return U(()=>{document.title=q(`app.title`)},[]),U(()=>{De(e)},[e]),$(`div`,{class:`app-shell`,children:[$(`header`,{class:`app-header`,children:[$(`h1`,{class:`app-title`,children:q(`app.title`)}),$(Be,{level:e,onChange:e=>{De(e),t(e)}}),$(He,{})]}),$(`main`,{class:`app-main`,children:[$(Ue,{paragraphs:n}),$(Ie,{})]}),$(`aside`,{id:`panel`,class:`panel`,"aria-label":q(`a11y.panel_region`),children:$(`p`,{class:`panel-empty`,children:q(`panel.empty`)})}),$(Le,{})]})}function Ke(){try{let e=localStorage.getItem(`fruitbat-theme`);(e===`dark`||e===`light`)&&document.documentElement.setAttribute(`data-theme`,e)}catch{}}var qe=0,Je=null;window.__fruitbat={run(e,t){qe+=1,Je={level:t,chars:e.length},window.dispatchEvent(new CustomEvent(`fruitbat:run`,{detail:{text:e,level:t}}))},stop(){window.dispatchEvent(new CustomEvent(`fruitbat:stop`))},stats(){return{runs:qe,last:Je}}},Ke();var Ye=document.getElementById(`app`);Ye&&ce($(Ge,{}),Ye);
 
 
assets/llm.fake.worker-Bfzc_8yA.js ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ const e={$comment:`Scripted outputs for the fake LLM worker (docs/PLAN.md, Fake LLM for CI). Keyed by a fixture key passed as ?fake=<key>; a level set to null means 'derive from the chunk text' (first sentences, so grounding passes). Without a key the fake always derives. Every wasm-ci spec that needs summarization names ?llm=fake.`,version:1,entries:{"011":{short:[`- The park hosts 17 different bat species.`,`- The large colony of Brazilian free-tailed bats wow visitors every evening from spring through fall.`,`- Two other species have also been found regularly in Carlsbad Cavern.`,`- They fly about 1.5 miles before exiting the Natural Entrance.`],caveman:[`- Park hosts 17 bat species.`,`- Brazilian free-tailed bats fly out every evening.`,`- They fly about 1.5 miles to the exit.`],oneline:[`- The park hosts 17 bat species and the Brazilian free-tailed bats fly out every evening from spring through fall.`]},cutall:{$comment:`Every one-liner carries an invented number and name, so grounding cuts them all and One line must fall back to Short (which derives from the text and passes).`,short:null,caveman:null,oneline:[`- In 1999 Zorblatt paid 7,777 dollars for the whole thing.`]},think:{$comment:`A stray thinking block that the parser must strip.`,short:[`<think>`,`planning the summary`,`</think>`,`- The park hosts 17 different bat species.`,`- They fly about 1.5 miles before exiting the Natural Entrance.`],caveman:null,oneline:null}}}.entries,t=e=>self.postMessage(e),n=/* @__PURE__ */ new Set;let r=null;const i={short:4,caveman:3,oneline:1};function a(e){return e.split(/(?<=[.!?])\s+/).map(e=>e.trim()).filter(e=>e.length>0)}function o(e,t){let n=a(t),r=Math.min(i[e],Math.max(1,n.length));return n.slice(0,r).map(t=>e===`caveman`?t.split(/\s+/).slice(0,9).join(` `):t).map(e=>`- ${e}`)}function s(t,n,r){if(t&&e[t]){let r=e[t][n];if(Array.isArray(r))return r}return o(n,r)}const c=e=>new Promise(t=>setTimeout(t,e));async function l(e){let i=e.fake??{key:null,level:`short`,text:e.user,delay_ms:0},a=`${(/^Below are one-line summaries/.test(e.user)?[i.text.split(`
2
+ `).find(e=>e.startsWith(`- `))??`- ${i.text.split(`
3
+ `)[0]}`]:s(i.key,i.level,i.text)).join(`
4
+ `)}\n`.split(/(?<=\s)/),o=performance.now(),l=0;r=e.runId;try{for(let r of a){if(n.has(e.runId)){t({type:`aborted`,runId:e.runId});return}t({type:`token`,runId:e.runId,chunkIndex:e.chunkIndex,text:r}),l++,i.delay_ms>0&&await c(i.delay_ms)}if(n.has(e.runId)){t({type:`aborted`,runId:e.runId});return}t({type:`chunk_done`,runId:e.runId,chunkIndex:e.chunkIndex,tokens:l,ms:Math.round(performance.now()-o)})}finally{r===e.runId&&(r=null)}}self.onmessage=e=>{let i=e.data;switch(i.type){case`load`:t({type:`loaded`,runId:i.runId,modelId:`fake`,role:`fake`,downgraded:!1,ms:0});break;case`probe`:t({type:`probe_result`,runId:i.runId,ok:!0,ms:0});break;case`generate`:l(i);break;case`abort`:n.add(i.runId),r!==i.runId&&t({type:`aborted`,runId:i.runId})}};
assets/llm.worker-BQNPMMLY.js ADDED
The diff for this file is too large to render. See raw diff
 
assets/loader-wtFI4_em.js ADDED
The diff for this file is too large to render. See raw diff
 
assets/{net-Czt2kcl5.js → net-Lng3b-MO.js} RENAMED
@@ -1 +1 @@
1
- (function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e={$comment:`Every allowed outbound destination per target (docs/PLAN.md rule 1). Source for the privacy test (S1-12), the generated CSP connect-src (scripts/csp.mjs), NetworkPolicy.swift, and PRIVACY.md. web: S1-00b recorded the observed requests and redirects from a cold load of the dev Space on 2026-09-24 (plus curl -sI on the pinned file URLs); S0-03 added allowed_urls for every model tier, the same-origin prefixes, the CSP list, and the mac section (Hub placeholder for S2-03a, Polar x3, appcast fixed URL, release assets + objects.githubusercontent.com).`,version:1,web:{same_origin:{$comment:`The privacy test restricts same-origin requests to the Vite build manifest plus public/.`,paths_observed:[`/`,`/index.html`,`/coi-serviceworker.js`,`/assets/*`,`/ort/ort-wasm-simd-threaded.asyncify.mjs`,`/ort/ort-wasm-simd-threaded.asyncify.wasm`,`/models/kokoro-voices/af_heart.bin`,`/skeleton.html`,`/sample.txt`,`/fonts/AtkinsonHyperlegible-Regular.woff2`,`/fonts/AtkinsonHyperlegible-Bold.woff2`,`/fonts/AtkinsonHyperlegible-Italic.woff2`,`/fonts/AtkinsonHyperlegible-BoldItalic.woff2`],prefixes:[`/assets/`,`/ort/`,`/models/`,`/demo/`,`/coi-serviceworker.js`,`/`,`/index.html`,`/fonts/`,`/skeleton.html`,`/sample.txt`]},hub_files:{$comment:`Exact file URLs = url_template from spec/models.json with each model's pinned revision. GET only. No query string on the first request. allowed_urls (S0-03) is derived from spec/models.json for every tier (default, fallback-a, fallback-b, low-end, the CPU try-out files, the q8f16 voice variant); observed_2026_09_24 (S1-00b) is the subset the default configuration actually requested on the dev Space, and must stay a subset of allowed_urls. The privacy test asserts every Hub request URL is in allowed_urls and that the request count matches the chosen configuration.`,url_template:`https://huggingface.co/{id}/resolve/{revision}/{path}`,observed_2026_09_24:[`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/config.json`,`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/generation_config.json`,`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/tokenizer.json`,`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/tokenizer_config.json`,`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/onnx/model_q4f16.onnx`,`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/onnx/model_q4f16.onnx_data`,`https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/config.json`,`https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/tokenizer.json`,`https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/tokenizer_config.json`,`https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/onnx/model_quantized.onnx`],unpinned_seen_2026_09_24:[`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/main/tokenizer_config.json`,`https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/main/tokenizer_config.json`],unpinned_note:`Transformers.js 4.3.0 fetched tokenizer_config.json at main once per model despite the revision option. S1-03a's loader must pin it; the privacy test must fail on any resolve/main/ URL.`,allowed_urls:`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/config.json,https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/generation_config.json,https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/tokenizer.json,https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/tokenizer_config.json,https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/onnx/model_q4f16.onnx,https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/onnx/model_q4f16.onnx_data,https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/onnx/model_q4.onnx,https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/onnx/model_q4.onnx_data,https://huggingface.co/onnx-community/Qwen2.5-0.5B-Instruct/resolve/cc5cc01a65cc3ff17bdb73a7de33d879f62599b0/config.json,https://huggingface.co/onnx-community/Qwen2.5-0.5B-Instruct/resolve/cc5cc01a65cc3ff17bdb73a7de33d879f62599b0/generation_config.json,https://huggingface.co/onnx-community/Qwen2.5-0.5B-Instruct/resolve/cc5cc01a65cc3ff17bdb73a7de33d879f62599b0/tokenizer.json,https://huggingface.co/onnx-community/Qwen2.5-0.5B-Instruct/resolve/cc5cc01a65cc3ff17bdb73a7de33d879f62599b0/tokenizer_config.json,https://huggingface.co/onnx-community/Qwen2.5-0.5B-Instruct/resolve/cc5cc01a65cc3ff17bdb73a7de33d879f62599b0/onnx/model_q4f16.onnx,https://huggingface.co/onnx-community/Qwen3-0.6B-ONNX/resolve/da1453100cf3ff33ef56d17983fc7a8648706db6/config.json,https://huggingface.co/onnx-community/Qwen3-0.6B-ONNX/resolve/da1453100cf3ff33ef56d17983fc7a8648706db6/generation_config.json,https://huggingface.co/onnx-community/Qwen3-0.6B-ONNX/resolve/da1453100cf3ff33ef56d17983fc7a8648706db6/tokenizer.json,https://huggingface.co/onnx-community/Qwen3-0.6B-ONNX/resolve/da1453100cf3ff33ef56d17983fc7a8648706db6/tokenizer_config.json,https://huggingface.co/onnx-community/Qwen3-0.6B-ONNX/resolve/da1453100cf3ff33ef56d17983fc7a8648706db6/onnx/model_q4f16.onnx,https://huggingface.co/HuggingFaceTB/SmolLM2-360M-Instruct/resolve/a10cc1512eabd3dde888204e902eca88bddb4951/config.json,https://huggingface.co/HuggingFaceTB/SmolLM2-360M-Instruct/resolve/a10cc1512eabd3dde888204e902eca88bddb4951/generation_config.json,https://huggingface.co/HuggingFaceTB/SmolLM2-360M-Instruct/resolve/a10cc1512eabd3dde888204e902eca88bddb4951/tokenizer.json,https://huggingface.co/HuggingFaceTB/SmolLM2-360M-Instruct/resolve/a10cc1512eabd3dde888204e902eca88bddb4951/tokenizer_config.json,https://huggingface.co/HuggingFaceTB/SmolLM2-360M-Instruct/resolve/a10cc1512eabd3dde888204e902eca88bddb4951/onnx/model_q4f16.onnx,https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/config.json,https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/tokenizer.json,https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/tokenizer_config.json,https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/onnx/model_quantized.onnx,https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/onnx/model_q8f16.onnx`.split(`,`)},redirect_hosts:[`us.aws.cdn.hf.co`,`huggingface.co`],redirect_host_patterns:[`*.cdn.hf.co`],redirects_observed:{lfs:`https://huggingface.co/{id}/resolve/{revision}/{path} -> 302 -> https://us.aws.cdn.hf.co/xet-bridge-us/{hash}/{hash}?{signed params} -> 200`,small_json:`https://huggingface.co/{id}/resolve/{revision}/{path} -> 307 -> https://huggingface.co/api/resolve-cache/models/{id}/{revision}/{path}?{encoded path}=&etag={etag} -> 200`,how_checked:`curl -sI on 2026-09-24; the coi-serviceworker hides these hops from page-level Playwright capture`},redirect_query_params:{"us.aws.cdn.hf.co":[`user_id`,`X-Xet-Cas-Uid`,`response-content-disposition`,`Expires`,`Policy`,`Signature`,`Key-Pair-Id`,`Hash-Algorithm`,`response-content-type`,`xip`],"huggingface.co":[`etag`,`<url-encoded original path as the parameter name>`],$comment:"Keyed by host. A host that matches a redirect_host_pattern uses the parameters recorded for any listed host under the same pattern (region prefixes vary). S1-03a added response-content-type: the Hub sends it on small LFS files such as tokenizer.json (curl -sI 2026-09-24). 2026-09-25: the CDN began adding `xip`; without it every real-network model load was refused by net.ts. Redirect parameter names drift; the weekly health check should diff the observed names against this list."},methods:[`GET`],everything_else:`denied`,csp_connect_src:[`'self'`,`https://huggingface.co`,`https://us.aws.cdn.hf.co`,`https://*.cdn.hf.co`],$comment_csp:`scripts/csp.mjs (S1-12) generates <meta http-equiv=Content-Security-Policy> connect-src from this list. The CDN entries come from S1-00b's observed redirects; a new redirect host observed later is added here, never guessed.`},mac:{methods:[`GET`,`POST`],hub:{$comment:`Exact file URLs added in S2-03a from models.json.mac.`,allowed_urls:[],redirect_hosts:[]},polar:{$comment:`Stage 2b, deferred (docs/PLAN.md Q2). validate at most weekly; nag, never lock.`,allowed_urls:[`https://api.polar.sh/v1/customer-portal/license-keys/activate`,`https://api.polar.sh/v1/customer-portal/license-keys/validate`,`https://api.polar.sh/v1/customer-portal/license-keys/deactivate`]},updates:{$comment:`Sparkle 2. Fixed appcast URL (rule 10, C13); release assets redirect to objects.githubusercontent.com.`,appcast:`https://aj-prabhu.github.io/fruitbat/appcast.xml`,release_assets_prefix:`https://github.com/aj-prabhu/fruitbat/releases/download/`,redirect_hosts:[`objects.githubusercontent.com`]},bug_report:{$comment:`Opened in the user's browser, never by the app: a prefilled GitHub issue form URL.`,prefix:`https://github.com/aj-prabhu/fruitbat/issues/new`}}},t={$comment:`Pinned models, voices, and inference libraries per target (docs/PLAN.md rule 4). Every file URL is exact (url_template filled with id, revision, path); spec/network.json is generated from this list and the privacy test allows nothing else. S1-00a pinned the web runtime and the two default models it proved; S0-03 added the fallback tiers, the WebGPU voice variant, and licenses. Licenses: the onnx-community conversion cards carry no license field; the value recorded is the base model's license from its card (checked 2026-09-23 via the Hub API).`,version:1,web:{libraries:{"@huggingface/transformers":`4.3.0`,"onnxruntime-web":`1.31.0-dev.20260914-8d85527a0`,phonemizer:`1.2.1`,"kokoro-js":`1.2.1 (vendored loader in web/src/vendor/kokoro, Apache-2.0; npm package pins Transformers.js 3.x)`},summarizer:{role:`default`,id:`onnx-community/Qwen3.5-0.8B-Text-ONNX`,revision:`1e45daba048899e7f771657ada617ec49350aa91`,dtype:`q4f16`,device:`webgpu`,license:`apache-2.0 (base model Qwen/Qwen3.5-0.8B; the onnx-community card has no license field)`,files:[{path:`config.json`,bytes:1989},{path:`generation_config.json`,bytes:120},{path:`tokenizer.json`,bytes:19226111},{path:`tokenizer_config.json`,bytes:9119},{path:`onnx/model_q4f16.onnx`,bytes:597442},{path:`onnx/model_q4f16.onnx_data`,bytes:469331968}],url_template:`https://huggingface.co/{id}/resolve/{revision}/{path}`,cpu_tryout:{$comment:`spec/tools/try-prompts.mjs uses model_q4 on CPU (q4f16 has no CPU kernels).`,dtype:`q4`,files:[{path:`onnx/model_q4.onnx`,bytes:482783},{path:`onnx/model_q4.onnx_data`,bytes:550764544}]},cold_budget_with_voice_mb:562},voice:{id:`onnx-community/Kokoro-82M-v1.0-ONNX`,revision:`1939ad2a8e416c0acfeecc08a694d14ef25f2231`,dtype:`q8`,device:`wasm`,license:`apache-2.0 (card and base model hexgrad/Kokoro-82M)`,files:[{path:`config.json`,bytes:44},{path:`tokenizer.json`,bytes:3497},{path:`tokenizer_config.json`,bytes:113},{path:`onnx/model_quantized.onnx`,bytes:92361116}],url_template:`https://huggingface.co/{id}/resolve/{revision}/{path}`,voices_vendored:{path:`web/public/models/kokoro-voices/`,revision:`1939ad2a8e416c0acfeecc08a694d14ef25f2231`,files:[`af_heart.bin`],bytes_each:522240,planned:[`af_bella.bin (second voice for 9/29, S1-04)`]},tts_phoneme_limit:510,tts_phoneme_target:300,variants:{q8f16:{$comment:`WebGPU voice tried in the S1-05 bake-off (Fable pass); not the default.`,path:`onnx/model_q8f16.onnx`,bytes:86033585,device:`webgpu`}}},runtime_assets_same_origin:{path:`web/public/ort/`,from:`node_modules/onnxruntime-web/dist/ort-wasm-simd-threaded*.{mjs,wasm}`,why:`Transformers.js otherwise loads the WASM runtime from a CDN, which rule 1 forbids`},summarizer_fallbacks:[{role:`fallback-a`,id:`onnx-community/Qwen2.5-0.5B-Instruct`,revision:`cc5cc01a65cc3ff17bdb73a7de33d879f62599b0`,dtype:`q4f16`,device:`webgpu`,license:`apache-2.0 (base model Qwen/Qwen2.5-0.5B-Instruct)`,cold_budget_with_voice_mb:575,files:[{path:`config.json`,bytes:678},{path:`generation_config.json`,bytes:242},{path:`tokenizer.json`,bytes:7031673},{path:`tokenizer_config.json`,bytes:7306},{path:`onnx/model_q4f16.onnx`,bytes:483003582}],url_template:`https://huggingface.co/{id}/resolve/{revision}/{path}`},{role:`fallback-b`,id:`onnx-community/Qwen3-0.6B-ONNX`,revision:`da1453100cf3ff33ef56d17983fc7a8648706db6`,dtype:`q4f16`,device:`webgpu`,license:`apache-2.0 (base model Qwen/Qwen3-0.6B)`,cold_budget_with_voice_mb:662,files:[{path:`config.json`,bytes:912},{path:`generation_config.json`,bytes:219},{path:`tokenizer.json`,bytes:9117040},{path:`tokenizer_config.json`,bytes:9705},{path:`onnx/model_q4f16.onnx`,bytes:569789750}],url_template:`https://huggingface.co/{id}/resolve/{revision}/{path}`},{role:`low-end`,id:`HuggingFaceTB/SmolLM2-360M-Instruct`,revision:`a10cc1512eabd3dde888204e902eca88bddb4951`,dtype:`q4f16`,device:`webgpu`,license:`apache-2.0`,cold_budget_with_voice_mb:365,files:[{path:`config.json`,bytes:846},{path:`generation_config.json`,bytes:132},{path:`tokenizer.json`,bytes:2104556},{path:`tokenizer_config.json`,bytes:3764},{path:`onnx/model_q4f16.onnx`,bytes:272737275}],url_template:`https://huggingface.co/{id}/resolve/{revision}/{path}`}],cold_budget_mb:700},mac:{$comment:`Pinned in S2-03a (mlx-community Qwen3.5-2B-4bit or Qwen3-1.7B-4bit; mlx-community/Kokoro-82M-bf16; G2P assets inventory).`,libraries:{},summarizer:null,voice:null}};function n(){return t}function r(e,t){return e.url_template.replace(`{id}`,e.id).replace(`{revision}`,e.revision).replace(`{path}`,t)}function i(){let{summarizer:e,voice:t}=n().web;return[...e.files.map(t=>r(e,t.path)),...t.files.map(e=>r(t,e.path))]}var a=class extends Error{reason;url;constructor(e,t){super(`network policy: ${e}`),this.reason=e,this.url=t,this.name=`NetworkPolicyError`}};function o(){return e.web??{}}var s={allowed:0,rejected:0,redirect_rejected:0},c=null;function l(){if(!c){let e=[];for(let[t,n]of Object.entries(o().hub_files??{}))t.startsWith(`observed`)&&Array.isArray(n)&&e.push(...n);c=new Set([...i(),...e])}return c}function u(e){let t=o();if((t.redirect_hosts??[]).includes(e))return!0;for(let n of t.redirect_host_patterns??[])if(n.startsWith(`*.`)&&e.endsWith(n.slice(1))&&e.length>n.length-1)return!0;return!1}function d(e){for(let t of o().redirect_host_patterns??[])if(t.startsWith(`*.`)&&e.endsWith(t.slice(1))&&e.length>t.length-1)return t;return null}function f(e){let t=o().redirect_query_params??{};if(Array.isArray(t[e]))return new Set(t[e]);let n=d(e),r=new Set;if(n)for(let[e,i]of Object.entries(t))Array.isArray(i)&&d(e)===n&&i.forEach(e=>r.add(e));return r}function p(e){return e.slice(e.lastIndexOf(`/`)+1)}function m(e){if(!u(e.host))return{ok:!1,reason:`host not in redirect_hosts`};let t=f(e.host),n=[...l()].map(e=>new URL(e).pathname),r=null;for(let t of n){let n=t.match(/^\/(.+)\/resolve\/([0-9a-f]{40})\/(.+)$/);if(!n)continue;let i=`/api/resolve-cache/models/${n[1]}/${n[2]}/${n[3]}`;e.pathname===i&&(r=t)}let i=e.searchParams.get(`response-content-disposition`),a=/^\/xet-bridge-[a-z0-9-]+\/[0-9a-f]{8,64}\/[0-9a-f]{8,64}$/.test(e.pathname);if(!r&&i&&a){let e=/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i.exec(i)?.[1];if(e){let t=n.find(t=>p(t)===decodeURIComponent(e));t&&(r=t)}}if(!r)return{ok:!1,reason:`redirect target is not a pinned file`};for(let n of e.searchParams.keys())if(!t.has(n)&&decodeURIComponent(n)!==r)return{ok:!1,reason:`redirect query parameter not recorded`};return{ok:!0}}var h=new Set([`/sample.txt`]),g=[`/models/`,`/demo/`,`/assets/`,`/ort/`,`/fonts/`,`/__model_cache__/`];function _(e){return e.includes(`..`)?!1:h.has(e)||g.some(t=>e.startsWith(t))}function v(e,t){let n;try{n=new URL(e,t??(typeof location<`u`?location.origin:void 0))}catch{return{ok:!1,reason:`unparseable url`,url:null}}if(n.protocol!==`https:`&&n.protocol!==`http:`)return{ok:!1,reason:`scheme`,url:n};let r=typeof location<`u`?location.origin:null;if(r&&n.origin===r)return n.search?{ok:!1,reason:`query string on same-origin path`,url:n}:_(n.pathname)?{ok:!0,kind:`same-origin`,url:n}:{ok:!1,reason:`same-origin path not a shipped asset`,url:n};if(/\/resolve\/main\//.test(n.pathname))return{ok:!1,reason:`unpinned revision`,url:n};if(l().has(n.href)||n.search===``&&l().has(n.origin+n.pathname))return{ok:!0,kind:`exact`,url:n};let i=m(n);return i.ok?{ok:!0,kind:`redirect`,url:n}:{ok:!1,reason:i.reason??`not allowed`,url:n}}async function y(e,t){let n=v(e);if(!n.ok)throw s.rejected++,new a(n.reason,n.url?n.url.origin+n.url.pathname:`invalid`);if(t?.method&&t.method.toUpperCase()!==`GET`)throw s.rejected++,new a(`only GET`,n.url.origin+n.url.pathname);s.allowed++;let r=await fetch(n.url,{...t,method:`GET`,credentials:`omit`,referrerPolicy:`no-referrer`}),i=r.headers.get(`x-fruitbat-final-url`)||r.url||``;if(i&&i!==n.url.href){let e=v(i);if(!e.ok||e.kind!==`redirect`&&e.kind!==`same-origin`&&e.kind!==`exact`)throw s.redirect_rejected++,new a(`redirected off-list: ${e.ok?e.kind:e.reason}`,new URL(i).origin)}return r}var b=`/models/kokoro-voices/`,x=/^[a-z]{2}_[a-z]+$/;async function S(e){if(!x.test(e))throw Error(`bad voice id`);let t=await y(`${b}${e}.bin`);if(!t.ok)throw Error(`voice_http_${t.status}`);return new Float32Array(await t.arrayBuffer())}export{S as n,n as r,y as t};
 
1
+ (function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e={$comment:`Every allowed outbound destination per target (docs/PLAN.md rule 1). Source for the privacy test (S1-12), the generated CSP connect-src (scripts/csp.mjs), NetworkPolicy.swift, and PRIVACY.md. web: S1-00b recorded the observed requests and redirects from a cold load of the dev Space on 2026-09-24 (plus curl -sI on the pinned file URLs); S0-03 added allowed_urls for every model tier, the same-origin prefixes, the CSP list, and the mac section (Hub placeholder for S2-03a, Polar x3, appcast fixed URL, release assets + objects.githubusercontent.com).`,version:1,web:{same_origin:{$comment:`The privacy test restricts same-origin requests to the Vite build manifest plus public/.`,paths_observed:[`/`,`/index.html`,`/coi-serviceworker.js`,`/assets/*`,`/ort/ort-wasm-simd-threaded.asyncify.mjs`,`/ort/ort-wasm-simd-threaded.asyncify.wasm`,`/models/kokoro-voices/af_heart.bin`,`/skeleton.html`,`/sample.txt`,`/fonts/AtkinsonHyperlegible-Regular.woff2`,`/fonts/AtkinsonHyperlegible-Bold.woff2`,`/fonts/AtkinsonHyperlegible-Italic.woff2`,`/fonts/AtkinsonHyperlegible-BoldItalic.woff2`],prefixes:[`/assets/`,`/ort/`,`/models/`,`/demo/`,`/coi-serviceworker.js`,`/`,`/index.html`,`/fonts/`,`/skeleton.html`,`/sample.txt`]},hub_files:{$comment:`Exact file URLs = url_template from spec/models.json with each model's pinned revision. GET only. No query string on the first request. allowed_urls (S0-03) is derived from spec/models.json for every tier (default, fallback-a, fallback-b, low-end, the CPU try-out files, the q8f16 voice variant); observed_2026_09_24 (S1-00b) is the subset the default configuration actually requested on the dev Space, and must stay a subset of allowed_urls. The privacy test asserts every Hub request URL is in allowed_urls and that the request count matches the chosen configuration.`,url_template:`https://huggingface.co/{id}/resolve/{revision}/{path}`,observed_2026_09_24:[`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/config.json`,`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/generation_config.json`,`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/tokenizer.json`,`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/tokenizer_config.json`,`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/onnx/model_q4f16.onnx`,`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/onnx/model_q4f16.onnx_data`,`https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/config.json`,`https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/tokenizer.json`,`https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/tokenizer_config.json`,`https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/onnx/model_quantized.onnx`],unpinned_seen_2026_09_24:[`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/main/tokenizer_config.json`,`https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/main/tokenizer_config.json`],unpinned_note:`Transformers.js 4.3.0 fetched tokenizer_config.json at main once per model despite the revision option. S1-03a's loader must pin it; the privacy test must fail on any resolve/main/ URL.`,allowed_urls:`https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/config.json,https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/generation_config.json,https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/tokenizer.json,https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/tokenizer_config.json,https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/onnx/model_q4f16.onnx,https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/onnx/model_q4f16.onnx_data,https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/onnx/model_q4.onnx,https://huggingface.co/onnx-community/Qwen3.5-0.8B-Text-ONNX/resolve/1e45daba048899e7f771657ada617ec49350aa91/onnx/model_q4.onnx_data,https://huggingface.co/onnx-community/Qwen2.5-0.5B-Instruct/resolve/cc5cc01a65cc3ff17bdb73a7de33d879f62599b0/config.json,https://huggingface.co/onnx-community/Qwen2.5-0.5B-Instruct/resolve/cc5cc01a65cc3ff17bdb73a7de33d879f62599b0/generation_config.json,https://huggingface.co/onnx-community/Qwen2.5-0.5B-Instruct/resolve/cc5cc01a65cc3ff17bdb73a7de33d879f62599b0/tokenizer.json,https://huggingface.co/onnx-community/Qwen2.5-0.5B-Instruct/resolve/cc5cc01a65cc3ff17bdb73a7de33d879f62599b0/tokenizer_config.json,https://huggingface.co/onnx-community/Qwen2.5-0.5B-Instruct/resolve/cc5cc01a65cc3ff17bdb73a7de33d879f62599b0/onnx/model_q4f16.onnx,https://huggingface.co/onnx-community/Qwen3-0.6B-ONNX/resolve/da1453100cf3ff33ef56d17983fc7a8648706db6/config.json,https://huggingface.co/onnx-community/Qwen3-0.6B-ONNX/resolve/da1453100cf3ff33ef56d17983fc7a8648706db6/generation_config.json,https://huggingface.co/onnx-community/Qwen3-0.6B-ONNX/resolve/da1453100cf3ff33ef56d17983fc7a8648706db6/tokenizer.json,https://huggingface.co/onnx-community/Qwen3-0.6B-ONNX/resolve/da1453100cf3ff33ef56d17983fc7a8648706db6/tokenizer_config.json,https://huggingface.co/onnx-community/Qwen3-0.6B-ONNX/resolve/da1453100cf3ff33ef56d17983fc7a8648706db6/onnx/model_q4f16.onnx,https://huggingface.co/HuggingFaceTB/SmolLM2-360M-Instruct/resolve/a10cc1512eabd3dde888204e902eca88bddb4951/config.json,https://huggingface.co/HuggingFaceTB/SmolLM2-360M-Instruct/resolve/a10cc1512eabd3dde888204e902eca88bddb4951/generation_config.json,https://huggingface.co/HuggingFaceTB/SmolLM2-360M-Instruct/resolve/a10cc1512eabd3dde888204e902eca88bddb4951/tokenizer.json,https://huggingface.co/HuggingFaceTB/SmolLM2-360M-Instruct/resolve/a10cc1512eabd3dde888204e902eca88bddb4951/tokenizer_config.json,https://huggingface.co/HuggingFaceTB/SmolLM2-360M-Instruct/resolve/a10cc1512eabd3dde888204e902eca88bddb4951/onnx/model_q4f16.onnx,https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/config.json,https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/tokenizer.json,https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/tokenizer_config.json,https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/onnx/model_quantized.onnx,https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/1939ad2a8e416c0acfeecc08a694d14ef25f2231/onnx/model_q8f16.onnx`.split(`,`)},redirect_hosts:[`us.aws.cdn.hf.co`,`huggingface.co`],redirect_host_patterns:[`*.cdn.hf.co`],redirects_observed:{lfs:`https://huggingface.co/{id}/resolve/{revision}/{path} -> 302 -> https://us.aws.cdn.hf.co/xet-bridge-us/{hash}/{hash}?{signed params} -> 200`,small_json:`https://huggingface.co/{id}/resolve/{revision}/{path} -> 307 -> https://huggingface.co/api/resolve-cache/models/{id}/{revision}/{path}?{encoded path}=&etag={etag} -> 200`,how_checked:`curl -sI on 2026-09-24; the coi-serviceworker hides these hops from page-level Playwright capture`},redirect_query_params:{"us.aws.cdn.hf.co":[`user_id`,`X-Xet-Cas-Uid`,`response-content-disposition`,`Expires`,`Policy`,`Signature`,`Key-Pair-Id`,`Hash-Algorithm`,`response-content-type`,`xip`],"huggingface.co":[`etag`,`<url-encoded original path as the parameter name>`],$comment:"Keyed by host. A host that matches a redirect_host_pattern uses the parameters recorded for any listed host under the same pattern (region prefixes vary). S1-03a added response-content-type: the Hub sends it on small LFS files such as tokenizer.json (curl -sI 2026-09-24). 2026-09-25: the CDN began adding `xip`; without it every real-network model load was refused by net.ts. Redirect parameter names drift; the weekly health check should diff the observed names against this list."},methods:[`GET`],everything_else:`denied`,csp_connect_src:[`'self'`,`https://huggingface.co`,`https://us.aws.cdn.hf.co`,`https://*.cdn.hf.co`],$comment_csp:`scripts/csp.mjs (S1-12) generates <meta http-equiv=Content-Security-Policy> connect-src from this list. The CDN entries come from S1-00b's observed redirects; a new redirect host observed later is added here, never guessed.`},mac:{methods:[`GET`,`POST`],hub:{$comment:`Exact file URLs added in S2-03a from models.json.mac.`,allowed_urls:[],redirect_hosts:[]},polar:{$comment:`Stage 2b, deferred (docs/PLAN.md Q2). validate at most weekly; nag, never lock.`,allowed_urls:[`https://api.polar.sh/v1/customer-portal/license-keys/activate`,`https://api.polar.sh/v1/customer-portal/license-keys/validate`,`https://api.polar.sh/v1/customer-portal/license-keys/deactivate`]},updates:{$comment:`Sparkle 2. Fixed appcast URL (rule 10, C13); release assets redirect to objects.githubusercontent.com.`,appcast:`https://aj-prabhu.github.io/fruitbat/appcast.xml`,release_assets_prefix:`https://github.com/aj-prabhu/fruitbat/releases/download/`,redirect_hosts:[`objects.githubusercontent.com`]},bug_report:{$comment:`Opened in the user's browser, never by the app: a prefilled GitHub issue form URL.`,prefix:`https://github.com/aj-prabhu/fruitbat/issues/new`}}},t={$comment:`Pinned models, voices, and inference libraries per target (docs/PLAN.md rule 4). Every file URL is exact (url_template filled with id, revision, path); spec/network.json is generated from this list and the privacy test allows nothing else. S1-00a pinned the web runtime and the two default models it proved; S0-03 added the fallback tiers, the WebGPU voice variant, and licenses. Licenses: the onnx-community conversion cards carry no license field; the value recorded is the base model's license from its card (checked 2026-09-23 via the Hub API).`,version:1,web:{libraries:{"@huggingface/transformers":`4.3.0`,"onnxruntime-web":`1.31.0-dev.20260914-8d85527a0`,phonemizer:`1.2.1`,"kokoro-js":`1.2.1 (vendored loader in web/src/vendor/kokoro, Apache-2.0; npm package pins Transformers.js 3.x)`},summarizer:{role:`default`,id:`onnx-community/Qwen3.5-0.8B-Text-ONNX`,revision:`1e45daba048899e7f771657ada617ec49350aa91`,dtype:`q4f16`,device:`webgpu`,license:`apache-2.0 (base model Qwen/Qwen3.5-0.8B; the onnx-community card has no license field)`,files:[{path:`config.json`,bytes:1989},{path:`generation_config.json`,bytes:120},{path:`tokenizer.json`,bytes:19226111},{path:`tokenizer_config.json`,bytes:9119},{path:`onnx/model_q4f16.onnx`,bytes:597442},{path:`onnx/model_q4f16.onnx_data`,bytes:469331968}],url_template:`https://huggingface.co/{id}/resolve/{revision}/{path}`,cpu_tryout:{$comment:`spec/tools/try-prompts.mjs uses model_q4 on CPU (q4f16 has no CPU kernels).`,dtype:`q4`,files:[{path:`onnx/model_q4.onnx`,bytes:482783},{path:`onnx/model_q4.onnx_data`,bytes:550764544}]},cold_budget_with_voice_mb:562},voice:{id:`onnx-community/Kokoro-82M-v1.0-ONNX`,revision:`1939ad2a8e416c0acfeecc08a694d14ef25f2231`,dtype:`q8`,device:`wasm`,license:`apache-2.0 (card and base model hexgrad/Kokoro-82M)`,files:[{path:`config.json`,bytes:44},{path:`tokenizer.json`,bytes:3497},{path:`tokenizer_config.json`,bytes:113},{path:`onnx/model_quantized.onnx`,bytes:92361116}],url_template:`https://huggingface.co/{id}/resolve/{revision}/{path}`,voices_vendored:{path:`web/public/models/kokoro-voices/`,revision:`1939ad2a8e416c0acfeecc08a694d14ef25f2231`,files:[`af_heart.bin`],bytes_each:522240,planned:[`af_bella.bin (second voice for 9/29, S1-04)`]},tts_phoneme_limit:510,tts_phoneme_target:300,variants:{q8f16:{$comment:`WebGPU voice tried in the S1-05 bake-off (Fable pass); not the default.`,path:`onnx/model_q8f16.onnx`,bytes:86033585,device:`webgpu`}}},runtime_assets_same_origin:{path:`web/public/ort/`,from:`node_modules/onnxruntime-web/dist/ort-wasm-simd-threaded*.{mjs,wasm}`,why:`Transformers.js otherwise loads the WASM runtime from a CDN, which rule 1 forbids`},summarizer_fallbacks:[{role:`fallback-a`,id:`onnx-community/Qwen2.5-0.5B-Instruct`,revision:`cc5cc01a65cc3ff17bdb73a7de33d879f62599b0`,dtype:`q4f16`,device:`webgpu`,license:`apache-2.0 (base model Qwen/Qwen2.5-0.5B-Instruct)`,cold_budget_with_voice_mb:575,files:[{path:`config.json`,bytes:678},{path:`generation_config.json`,bytes:242},{path:`tokenizer.json`,bytes:7031673},{path:`tokenizer_config.json`,bytes:7306},{path:`onnx/model_q4f16.onnx`,bytes:483003582}],url_template:`https://huggingface.co/{id}/resolve/{revision}/{path}`,status:`OUT (S1-05 bake-off 2026-09-24: degenerate output at q4f16 on WebGPU, Chrome 153 / ORT 1.31 dev; see docs/adr/0001-web-model.md)`},{role:`fallback-b`,id:`onnx-community/Qwen3-0.6B-ONNX`,revision:`da1453100cf3ff33ef56d17983fc7a8648706db6`,dtype:`q4f16`,device:`webgpu`,license:`apache-2.0 (base model Qwen/Qwen3-0.6B)`,cold_budget_with_voice_mb:662,files:[{path:`config.json`,bytes:912},{path:`generation_config.json`,bytes:219},{path:`tokenizer.json`,bytes:9117040},{path:`tokenizer_config.json`,bytes:9705},{path:`onnx/model_q4f16.onnx`,bytes:569789750}],url_template:`https://huggingface.co/{id}/resolve/{revision}/{path}`,status:`untested (S1-14 browser matrix)`},{role:`low-end`,id:`HuggingFaceTB/SmolLM2-360M-Instruct`,revision:`a10cc1512eabd3dde888204e902eca88bddb4951`,dtype:`q4f16`,device:`webgpu`,license:`apache-2.0`,cold_budget_with_voice_mb:365,files:[{path:`config.json`,bytes:846},{path:`generation_config.json`,bytes:132},{path:`tokenizer.json`,bytes:2104556},{path:`tokenizer_config.json`,bytes:3764},{path:`onnx/model_q4f16.onnx`,bytes:272737275}],url_template:`https://huggingface.co/{id}/resolve/{revision}/{path}`,status:`works (S1-05: retried on memory failure; 10 kept / 0 cut on 011 Caveman)`}],cold_budget_mb:700},mac:{$comment:`Pinned in S2-03a (mlx-community Qwen3.5-2B-4bit or Qwen3-1.7B-4bit; mlx-community/Kokoro-82M-bf16; G2P assets inventory).`,libraries:{},summarizer:null,voice:null}};function n(){let{summarizer:e,summarizer_fallbacks:t}=r().web;return[{...e,role:`default`},...t??[]]}function r(){return t}function i(e,t){return e.url_template.replace(`{id}`,e.id).replace(`{revision}`,e.revision).replace(`{path}`,t)}function a(){let{voice:e}=r().web;return[...n(),e].flatMap(e=>e.files.map(t=>i(e,t.path)))}var o=class extends Error{reason;url;constructor(e,t){super(`network policy: ${e}`),this.reason=e,this.url=t,this.name=`NetworkPolicyError`}};function s(){return e.web??{}}var c={allowed:0,rejected:0,redirect_rejected:0},l=null;function u(){if(!l){let e=[];for(let[t,n]of Object.entries(s().hub_files??{}))t.startsWith(`observed`)&&Array.isArray(n)&&e.push(...n);l=new Set([...a(),...e])}return l}function d(e){let t=s();if((t.redirect_hosts??[]).includes(e))return!0;for(let n of t.redirect_host_patterns??[])if(n.startsWith(`*.`)&&e.endsWith(n.slice(1))&&e.length>n.length-1)return!0;return!1}function f(e){for(let t of s().redirect_host_patterns??[])if(t.startsWith(`*.`)&&e.endsWith(t.slice(1))&&e.length>t.length-1)return t;return null}function p(e){let t=s().redirect_query_params??{};if(Array.isArray(t[e]))return new Set(t[e]);let n=f(e),r=new Set;if(n)for(let[e,i]of Object.entries(t))Array.isArray(i)&&f(e)===n&&i.forEach(e=>r.add(e));return r}function m(e){return e.slice(e.lastIndexOf(`/`)+1)}function h(e){if(!d(e.host))return{ok:!1,reason:`host not in redirect_hosts`};let t=p(e.host),n=[...u()].map(e=>new URL(e).pathname),r=null;for(let t of n){let n=t.match(/^\/(.+)\/resolve\/([0-9a-f]{40})\/(.+)$/);if(!n)continue;let i=`/api/resolve-cache/models/${n[1]}/${n[2]}/${n[3]}`;e.pathname===i&&(r=t)}let i=e.searchParams.get(`response-content-disposition`),a=/^\/xet-bridge-[a-z0-9-]+\/[0-9a-f]{8,64}\/[0-9a-f]{8,64}$/.test(e.pathname);if(!r&&i&&a){let e=/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i.exec(i)?.[1];if(e){let t=n.find(t=>m(t)===decodeURIComponent(e));t&&(r=t)}}if(!r)return{ok:!1,reason:`redirect target is not a pinned file`};for(let n of e.searchParams.keys())if(!t.has(n)&&decodeURIComponent(n)!==r)return{ok:!1,reason:`redirect query parameter not recorded`};return{ok:!0}}var g=new Set([`/sample.txt`]),_=[`/models/`,`/demo/`,`/assets/`,`/ort/`,`/fonts/`,`/__model_cache__/`];function v(e){return e.includes(`..`)?!1:g.has(e)||_.some(t=>e.startsWith(t))}function y(e,t){let n;try{n=new URL(e,t??(typeof location<`u`?location.origin:void 0))}catch{return{ok:!1,reason:`unparseable url`,url:null}}if(n.protocol!==`https:`&&n.protocol!==`http:`)return{ok:!1,reason:`scheme`,url:n};let r=typeof location<`u`?location.origin:null;if(r&&n.origin===r)return n.search?{ok:!1,reason:`query string on same-origin path`,url:n}:v(n.pathname)?{ok:!0,kind:`same-origin`,url:n}:{ok:!1,reason:`same-origin path not a shipped asset`,url:n};if(/\/resolve\/main\//.test(n.pathname))return{ok:!1,reason:`unpinned revision`,url:n};if(u().has(n.href)||n.search===``&&u().has(n.origin+n.pathname))return{ok:!0,kind:`exact`,url:n};let i=h(n);return i.ok?{ok:!0,kind:`redirect`,url:n}:{ok:!1,reason:i.reason??`not allowed`,url:n}}async function b(e,t){let n=y(e);if(!n.ok)throw c.rejected++,new o(n.reason,n.url?n.url.origin+n.url.pathname:`invalid`);if(t?.method&&t.method.toUpperCase()!==`GET`)throw c.rejected++,new o(`only GET`,n.url.origin+n.url.pathname);c.allowed++;let r=await fetch(n.url,{...t,method:`GET`,credentials:`omit`,referrerPolicy:`no-referrer`}),i=r.headers.get(`x-fruitbat-final-url`)||r.url||``;if(i&&i!==n.url.href){let e=y(i);if(!e.ok||e.kind!==`redirect`&&e.kind!==`same-origin`&&e.kind!==`exact`)throw c.redirect_rejected++,new o(`redirected off-list: ${e.ok?e.kind:e.reason}`,new URL(i).origin)}return r}var x=`/models/kokoro-voices/`,S=/^[a-z]{2}_[a-z]+$/;async function C(e){if(!S.test(e))throw Error(`bad voice id`);let t=await b(`${x}${e}.bin`);if(!t.ok)throw Error(`voice_http_${t.status}`);return new Float32Array(await t.arrayBuffer())}export{n as i,C as n,r,b as t};
assets/skeleton-BVmU5cs7.js DELETED
The diff for this file is too large to render. See raw diff
 
assets/skeleton-CKiOv3Yu.js ADDED
The diff for this file is too large to render. See raw diff
 
assets/summarize-YEIgl_tE.js ADDED
@@ -0,0 +1,5034 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import{i as e,t}from"./loader-wtFI4_em.js";import{i as n,r}from"./net-Lng3b-MO.js";import{t as i}from"./dial-C7M2OMm7.js";var a=`Summarize the text below in exactly 5 bullet points that together cover the whole text. Rules:
2
+ - Each bullet is one plain sentence of at most 18 words. Condense; do not copy sentences.
3
+ - Start every line with "- ". Output nothing else: no title, no intro, no closing line.
4
+ - Keep every number, date, amount, and name exactly as written in the text. Do not add facts.
5
+ - Say who did what to whom the way the text says it. Keep "not" and "never" where the text has them.
6
+ - Keep the order of the text.
7
+
8
+ Text:
9
+ {{text}}
10
+ `,o=`Rewrite the text below as exactly 4 very short bullets for a reader who tires fast. Rules:
11
+ - Each bullet has at most 9 words. One idea per bullet. Together they cover the whole text.
12
+ - Plain short words. No filler, no jargon. The most important point comes first.
13
+ - Start every line with "- ". Output nothing else.
14
+ - Keep numbers and names exactly as written. Keep "not" and "never" where the text has them.
15
+
16
+ Text:
17
+ {{text}}
18
+ `,s=`State the single most important point of the text below in one line. Rules:
19
+ - One line only, at most 25 words, starting with "- ". Output nothing else.
20
+ - Keep numbers and names exactly as written. Keep "not" and "never" where the text has them.
21
+ - Say who did what to whom the way the text says it. Do not add anything the text does not say.
22
+
23
+ Text:
24
+ {{text}}
25
+ `,c=`Below are one-line summaries of consecutive parts of one document. Combine them into one line that states the document's single most important point. Rules:
26
+ - One line only, at most 25 words, starting with "- ". Output nothing else.
27
+ - Use only what the lines say. Keep numbers and names exactly as written. Keep "not" and "never" where the lines have them.
28
+ - Prefer the point that most of the lines share.
29
+
30
+ Lines:
31
+ {{lines}}
32
+ `,l=/\s/,u=null;function d(){return u||=new Intl.Segmenter(`en`,{granularity:`sentence`}),u}function f(e){let t=[];for(let{segment:n,index:r}of d().segment(e)){let i=r,a=r+n.length;for(;i<a&&l.test(e[i]);)i++;for(;a>i&&l.test(e[a-1]);)a--;i!==a&&t.push({text:e.slice(i,a),start:i,end:a})}return t}var p=class extends Error{phonemes;limit;constructor(e,t){super(`tts_overlimit: ${e} phonemes exceeds limit ${t}`),this.name=`tts_overlimit`,this.phonemes=e,this.limit=t}};async function m(e,t,n,r,i){if(await t(e.text)<=n){i.push(e);return}let a=g(e);if(a.length>1){for(let e of a)await m(e,t,n,r,i);return}await te(e,t,n,r,i)}var h=/[,;:](?=\s)|[—–]|(?<=\s)-(?=\s)/g;function g(e){let t=[],n=0;h.lastIndex=0;let r;for(;r=h.exec(e.text);){let i=r.index+r[0].length;i>n&&(t.push({text:e.text.slice(n,i),start:e.start+n,end:e.start+i}),n=i)}return(n<e.text.length||t.length===0)&&t.push({text:e.text.slice(n),start:e.start+n,end:e.end}),t}function ee(e,t){let n=[],r=/\S+/g,i;for(;i=r.exec(e);)n.push({start:t+i.index,end:t+i.index+i[0].length});return n}async function te(e,t,n,r,i){let a=ee(e.text,e.start);if(a.length<=1){await t(e.text)>r?await _(e,t,r,i):i.push(e);return}let o=[],s=0,c=0;for(let r=1;r<a.length;r++)await t(e.text.slice(a[s].start-e.start,a[r].end-e.start))<=n?c=r:(o.push(c),s=c+1,c=s);o.push(c);let l=e.start;for(let n=0;n<o.length;n++){let s=o[n],c=n===o.length-1?e.end:a[s+1].start,u={text:e.text.slice(l-e.start,c-e.start),start:l,end:c};await t(u.text)>r?await _(u,t,r,i):i.push(u),l=c}}async function _(e,t,n,r){let i=await t(e.text);if(i<=n){r.push(e);return}if(e.text.length<=1)throw new p(i,n);let a=Math.floor(e.text.length/2),o={text:e.text.slice(0,a),start:e.start,end:e.start+a},s={text:e.text.slice(a),start:e.start+a,end:e.end};await _(o,t,n,r),await _(s,t,n,r)}var v=class extends Error{chunks;constructor(e){super(`input_limit: ${e} chunks exceeds max_chunks`),this.name=`input_limit`,this.chunks=e}};async function y(e,t,n){let r=e=>t(e),i=[];for(let t of e)await r(t.text)<=n.chunk_input_tokens?i.push(t):await m(t,r,n.chunk_input_tokens,n.chunk_input_tokens,i);let a=[],o=[],s=``,c=async()=>{if(o.length===0)return;let e=o[0].start,t=o[o.length-1].end,n=o.map(e=>e.text).join(` `),i=await r(n);a.push({index:a.length,start:e,end:t,text:n,segments:o,tokens:i}),o=[],s=``};for(let e of i){let t=s?`${s} ${e.text}`:e.text,i=await r(t);o.length>0&&i>n.chunk_input_tokens?(await c(),s=e.text,await r(s)):s=t,o.push(e)}if(await c(),a.length>n.max_chunks)throw new v(a.length);return a}var b=/^(?:[-•*]|\d+[.)])\s+/,ne=`<think>`,re=`</think>`,x=class{opts;buffer=``;insideThink=!1;count=0;dropped=0;overlength=0;constructor(e){this.opts=e}push(e){return this.ingest(e),this.drainCompleteLines()}flush(){let e=this.buffer;this.buffer=``;let t=this.consumeLine(e);return t?[t]:[]}ingest(e){let t=e;for(;;){if(this.insideThink){let e=t.indexOf(re);if(e===-1)return;t=t.slice(e+8),this.insideThink=!1;continue}let e=t.indexOf(ne);if(e===-1){this.buffer+=t;return}this.buffer+=t.slice(0,e),t=t.slice(e+7),this.insideThink=!0}}drainCompleteLines(){let e=[],t;for(;(t=this.buffer.indexOf(`
33
+ `))!==-1;){let n=this.buffer.slice(0,t);this.buffer=this.buffer.slice(t+1);let r=this.consumeLine(n);r&&e.push(r)}return e}consumeLine(e){let t=e.trim();if(!b.test(t))return null;let n=t.replace(b,``).trim();if(n.length===0)return null;if(this.count>=this.opts.max_bullets_per_chunk)return this.dropped++,null;n.split(/\s+/).filter(Boolean).length>this.opts.max_words_per_bullet&&this.overlength++;let r={text:n,index:this.count};return this.count++,r}},S=new Set(`the
34
+ of
35
+ and
36
+ to
37
+ a
38
+ in
39
+ for
40
+ is
41
+ on
42
+ that
43
+ by
44
+ this
45
+ with
46
+ i
47
+ you
48
+ it
49
+ not
50
+ or
51
+ be
52
+ are
53
+ from
54
+ at
55
+ as
56
+ your
57
+ all
58
+ have
59
+ new
60
+ more
61
+ an
62
+ was
63
+ we
64
+ will
65
+ home
66
+ can
67
+ us
68
+ about
69
+ if
70
+ page
71
+ my
72
+ has
73
+ search
74
+ free
75
+ but
76
+ our
77
+ one
78
+ other
79
+ do
80
+ no
81
+ information
82
+ time
83
+ they
84
+ site
85
+ he
86
+ up
87
+ may
88
+ what
89
+ which
90
+ their
91
+ news
92
+ out
93
+ use
94
+ any
95
+ there
96
+ see
97
+ only
98
+ so
99
+ his
100
+ when
101
+ contact
102
+ here
103
+ business
104
+ who
105
+ web
106
+ also
107
+ now
108
+ help
109
+ get
110
+ pm
111
+ view
112
+ online
113
+ c
114
+ e
115
+ first
116
+ am
117
+ been
118
+ would
119
+ how
120
+ were
121
+ me
122
+ s
123
+ services
124
+ some
125
+ these
126
+ click
127
+ its
128
+ like
129
+ service
130
+ x
131
+ than
132
+ find
133
+ price
134
+ date
135
+ back
136
+ top
137
+ people
138
+ had
139
+ list
140
+ name
141
+ just
142
+ over
143
+ state
144
+ year
145
+ day
146
+ into
147
+ email
148
+ two
149
+ health
150
+ n
151
+ world
152
+ re
153
+ next
154
+ used
155
+ go
156
+ b
157
+ work
158
+ last
159
+ most
160
+ products
161
+ music
162
+ buy
163
+ data
164
+ make
165
+ them
166
+ should
167
+ product
168
+ system
169
+ post
170
+ her
171
+ city
172
+ t
173
+ add
174
+ policy
175
+ number
176
+ such
177
+ please
178
+ available
179
+ copyright
180
+ support
181
+ message
182
+ after
183
+ best
184
+ software
185
+ then
186
+ jan
187
+ good
188
+ video
189
+ well
190
+ d
191
+ where
192
+ info
193
+ rights
194
+ public
195
+ books
196
+ high
197
+ school
198
+ through
199
+ m
200
+ each
201
+ links
202
+ she
203
+ review
204
+ years
205
+ order
206
+ very
207
+ privacy
208
+ book
209
+ items
210
+ company
211
+ r
212
+ read
213
+ group
214
+ sex
215
+ need
216
+ many
217
+ user
218
+ said
219
+ de
220
+ does
221
+ set
222
+ under
223
+ general
224
+ research
225
+ university
226
+ january
227
+ mail
228
+ full
229
+ map
230
+ reviews
231
+ program
232
+ life
233
+ know
234
+ games
235
+ way
236
+ days
237
+ management
238
+ p
239
+ part
240
+ could
241
+ great
242
+ united
243
+ hotel
244
+ real
245
+ f
246
+ item
247
+ international
248
+ center
249
+ ebay
250
+ must
251
+ store
252
+ travel
253
+ comments
254
+ made
255
+ development
256
+ report
257
+ off
258
+ member
259
+ details
260
+ line
261
+ terms
262
+ before
263
+ hotels
264
+ did
265
+ send
266
+ right
267
+ type
268
+ because
269
+ local
270
+ those
271
+ using
272
+ results
273
+ office
274
+ education
275
+ national
276
+ car
277
+ design
278
+ take
279
+ posted
280
+ internet
281
+ address
282
+ community
283
+ within
284
+ states
285
+ area
286
+ want
287
+ phone
288
+ dvd
289
+ shipping
290
+ reserved
291
+ subject
292
+ between
293
+ forum
294
+ family
295
+ l
296
+ long
297
+ based
298
+ w
299
+ code
300
+ show
301
+ o
302
+ even
303
+ black
304
+ check
305
+ special
306
+ prices
307
+ website
308
+ index
309
+ being
310
+ women
311
+ much
312
+ sign
313
+ file
314
+ link
315
+ open
316
+ today
317
+ technology
318
+ south
319
+ case
320
+ project
321
+ same
322
+ pages
323
+ uk
324
+ version
325
+ section
326
+ own
327
+ found
328
+ sports
329
+ house
330
+ related
331
+ security
332
+ both
333
+ g
334
+ county
335
+ american
336
+ photo
337
+ game
338
+ members
339
+ power
340
+ while
341
+ care
342
+ network
343
+ down
344
+ computer
345
+ systems
346
+ three
347
+ total
348
+ place
349
+ end
350
+ following
351
+ download
352
+ h
353
+ him
354
+ without
355
+ per
356
+ access
357
+ think
358
+ north
359
+ resources
360
+ current
361
+ posts
362
+ big
363
+ media
364
+ law
365
+ control
366
+ water
367
+ history
368
+ pictures
369
+ size
370
+ art
371
+ personal
372
+ since
373
+ including
374
+ guide
375
+ shop
376
+ directory
377
+ board
378
+ location
379
+ change
380
+ white
381
+ text
382
+ small
383
+ rating
384
+ rate
385
+ government
386
+ children
387
+ during
388
+ usa
389
+ return
390
+ students
391
+ v
392
+ shopping
393
+ account
394
+ times
395
+ sites
396
+ level
397
+ digital
398
+ profile
399
+ previous
400
+ form
401
+ events
402
+ love
403
+ old
404
+ john
405
+ main
406
+ call
407
+ hours
408
+ image
409
+ department
410
+ title
411
+ description
412
+ non
413
+ k
414
+ y
415
+ insurance
416
+ another
417
+ why
418
+ shall
419
+ property
420
+ class
421
+ cd
422
+ still
423
+ money
424
+ quality
425
+ every
426
+ listing
427
+ content
428
+ country
429
+ private
430
+ little
431
+ visit
432
+ save
433
+ tools
434
+ low
435
+ reply
436
+ customer
437
+ december
438
+ compare
439
+ movies
440
+ include
441
+ college
442
+ value
443
+ article
444
+ york
445
+ man
446
+ card
447
+ jobs
448
+ provide
449
+ j
450
+ food
451
+ source
452
+ author
453
+ different
454
+ press
455
+ u
456
+ learn
457
+ sale
458
+ around
459
+ print
460
+ course
461
+ job
462
+ canada
463
+ process
464
+ teen
465
+ room
466
+ stock
467
+ training
468
+ too
469
+ credit
470
+ point
471
+ join
472
+ science
473
+ men
474
+ categories
475
+ advanced
476
+ west
477
+ sales
478
+ look
479
+ english
480
+ left
481
+ team
482
+ estate
483
+ box
484
+ conditions
485
+ select
486
+ windows
487
+ photos
488
+ gay
489
+ thread
490
+ week
491
+ category
492
+ note
493
+ live
494
+ large
495
+ gallery
496
+ table
497
+ register
498
+ however
499
+ june
500
+ october
501
+ november
502
+ market
503
+ library
504
+ really
505
+ action
506
+ start
507
+ series
508
+ model
509
+ features
510
+ air
511
+ industry
512
+ plan
513
+ human
514
+ provided
515
+ tv
516
+ yes
517
+ required
518
+ second
519
+ hot
520
+ accessories
521
+ cost
522
+ movie
523
+ forums
524
+ march
525
+ la
526
+ september
527
+ better
528
+ say
529
+ questions
530
+ july
531
+ yahoo
532
+ going
533
+ medical
534
+ test
535
+ friend
536
+ come
537
+ dec
538
+ server
539
+ pc
540
+ study
541
+ application
542
+ cart
543
+ staff
544
+ articles
545
+ san
546
+ feedback
547
+ again
548
+ play
549
+ looking
550
+ issues
551
+ april
552
+ never
553
+ users
554
+ complete
555
+ street
556
+ topic
557
+ comment
558
+ financial
559
+ things
560
+ working
561
+ against
562
+ standard
563
+ tax
564
+ person
565
+ below
566
+ mobile
567
+ less
568
+ got
569
+ blog
570
+ party
571
+ payment
572
+ equipment
573
+ login
574
+ student
575
+ let
576
+ programs
577
+ offers
578
+ legal
579
+ above
580
+ recent
581
+ park
582
+ stores
583
+ side
584
+ act
585
+ problem
586
+ red
587
+ give
588
+ memory
589
+ performance
590
+ social
591
+ q
592
+ august
593
+ quote
594
+ language
595
+ story
596
+ sell
597
+ options
598
+ experience
599
+ rates
600
+ create
601
+ key
602
+ body
603
+ young
604
+ america
605
+ important
606
+ field
607
+ few
608
+ east
609
+ paper
610
+ single
611
+ ii
612
+ age
613
+ activities
614
+ club
615
+ example
616
+ girls
617
+ additional
618
+ password
619
+ z
620
+ latest
621
+ something
622
+ road
623
+ gift
624
+ question
625
+ changes
626
+ night
627
+ ca
628
+ hard
629
+ texas
630
+ oct
631
+ pay
632
+ four
633
+ poker
634
+ status
635
+ browse
636
+ issue
637
+ range
638
+ building
639
+ seller
640
+ court
641
+ february
642
+ always
643
+ result
644
+ audio
645
+ light
646
+ write
647
+ war
648
+ nov
649
+ offer
650
+ blue
651
+ groups
652
+ al
653
+ easy
654
+ given
655
+ files
656
+ event
657
+ release
658
+ analysis
659
+ request
660
+ fax
661
+ china
662
+ making
663
+ picture
664
+ needs
665
+ possible
666
+ might
667
+ professional
668
+ yet
669
+ month
670
+ major
671
+ star
672
+ areas
673
+ future
674
+ space
675
+ committee
676
+ hand
677
+ sun
678
+ cards
679
+ problems
680
+ london
681
+ washington
682
+ meeting
683
+ rss
684
+ become
685
+ interest
686
+ id
687
+ child
688
+ keep
689
+ enter
690
+ california
691
+ porn
692
+ share
693
+ similar
694
+ garden
695
+ schools
696
+ million
697
+ added
698
+ reference
699
+ companies
700
+ listed
701
+ baby
702
+ learning
703
+ energy
704
+ run
705
+ delivery
706
+ net
707
+ popular
708
+ term
709
+ film
710
+ stories
711
+ put
712
+ computers
713
+ journal
714
+ reports
715
+ co
716
+ try
717
+ welcome
718
+ central
719
+ images
720
+ president
721
+ notice
722
+ god
723
+ original
724
+ head
725
+ radio
726
+ until
727
+ cell
728
+ color
729
+ self
730
+ council
731
+ away
732
+ includes
733
+ track
734
+ australia
735
+ discussion
736
+ archive
737
+ once
738
+ others
739
+ entertainment
740
+ agreement
741
+ format
742
+ least
743
+ society
744
+ months
745
+ log
746
+ safety
747
+ friends
748
+ sure
749
+ faq
750
+ trade
751
+ edition
752
+ cars
753
+ messages
754
+ marketing
755
+ tell
756
+ further
757
+ updated
758
+ association
759
+ able
760
+ having
761
+ provides
762
+ david
763
+ fun
764
+ already
765
+ green
766
+ studies
767
+ close
768
+ common
769
+ drive
770
+ specific
771
+ several
772
+ gold
773
+ feb
774
+ living
775
+ sep
776
+ collection
777
+ called
778
+ short
779
+ arts
780
+ lot
781
+ ask
782
+ display
783
+ limited
784
+ powered
785
+ solutions
786
+ means
787
+ director
788
+ daily
789
+ beach
790
+ past
791
+ natural
792
+ whether
793
+ due
794
+ et
795
+ electronics
796
+ five
797
+ upon
798
+ period
799
+ planning
800
+ database
801
+ says
802
+ official
803
+ weather
804
+ mar
805
+ land
806
+ average
807
+ done
808
+ technical
809
+ window
810
+ france
811
+ pro
812
+ region
813
+ island
814
+ record
815
+ direct
816
+ microsoft
817
+ conference
818
+ environment
819
+ records
820
+ st
821
+ district
822
+ calendar
823
+ costs
824
+ style
825
+ url
826
+ front
827
+ statement
828
+ update
829
+ parts
830
+ aug
831
+ ever
832
+ downloads
833
+ early
834
+ miles
835
+ sound
836
+ resource
837
+ present
838
+ applications
839
+ either
840
+ ago
841
+ document
842
+ word
843
+ works
844
+ material
845
+ bill
846
+ apr
847
+ written
848
+ talk
849
+ federal
850
+ hosting
851
+ rules
852
+ final
853
+ adult
854
+ tickets
855
+ thing
856
+ centre
857
+ requirements
858
+ via
859
+ cheap
860
+ nude
861
+ kids
862
+ finance
863
+ true
864
+ minutes
865
+ else
866
+ mark
867
+ third
868
+ rock
869
+ gifts
870
+ europe
871
+ reading
872
+ topics
873
+ bad
874
+ individual
875
+ tips
876
+ plus
877
+ auto
878
+ cover
879
+ usually
880
+ edit
881
+ together
882
+ videos
883
+ percent
884
+ fast
885
+ function
886
+ fact
887
+ unit
888
+ getting
889
+ global
890
+ tech
891
+ meet
892
+ far
893
+ economic
894
+ en
895
+ player
896
+ projects
897
+ lyrics
898
+ often
899
+ subscribe
900
+ submit
901
+ germany
902
+ amount
903
+ watch
904
+ included
905
+ feel
906
+ though
907
+ bank
908
+ risk
909
+ thanks
910
+ everything
911
+ deals
912
+ various
913
+ words
914
+ linux
915
+ jul
916
+ production
917
+ commercial
918
+ james
919
+ weight
920
+ town
921
+ heart
922
+ advertising
923
+ received
924
+ choose
925
+ treatment
926
+ newsletter
927
+ archives
928
+ points
929
+ knowledge
930
+ magazine
931
+ error
932
+ camera
933
+ jun
934
+ girl
935
+ currently
936
+ construction
937
+ toys
938
+ registered
939
+ clear
940
+ golf
941
+ receive
942
+ domain
943
+ methods
944
+ chapter
945
+ makes
946
+ protection
947
+ policies
948
+ loan
949
+ wide
950
+ beauty
951
+ manager
952
+ india
953
+ position
954
+ taken
955
+ sort
956
+ listings
957
+ models
958
+ michael
959
+ known
960
+ half
961
+ cases
962
+ step
963
+ engineering
964
+ florida
965
+ simple
966
+ quick
967
+ none
968
+ wireless
969
+ license
970
+ paul
971
+ friday
972
+ lake
973
+ whole
974
+ annual
975
+ published
976
+ later
977
+ basic
978
+ sony
979
+ shows
980
+ corporate
981
+ google
982
+ church
983
+ method
984
+ purchase
985
+ customers
986
+ active
987
+ response
988
+ practice
989
+ hardware
990
+ figure
991
+ materials
992
+ fire
993
+ holiday
994
+ chat
995
+ enough
996
+ designed
997
+ along
998
+ among
999
+ death
1000
+ writing
1001
+ speed
1002
+ html
1003
+ countries
1004
+ loss
1005
+ face
1006
+ brand
1007
+ discount
1008
+ higher
1009
+ effects
1010
+ created
1011
+ remember
1012
+ standards
1013
+ oil
1014
+ bit
1015
+ yellow
1016
+ political
1017
+ increase
1018
+ advertise
1019
+ kingdom
1020
+ base
1021
+ near
1022
+ environmental
1023
+ thought
1024
+ stuff
1025
+ french
1026
+ storage
1027
+ oh
1028
+ japan
1029
+ doing
1030
+ loans
1031
+ shoes
1032
+ entry
1033
+ stay
1034
+ nature
1035
+ orders
1036
+ availability
1037
+ africa
1038
+ summary
1039
+ turn
1040
+ mean
1041
+ growth
1042
+ notes
1043
+ agency
1044
+ king
1045
+ monday
1046
+ european
1047
+ activity
1048
+ copy
1049
+ although
1050
+ drug
1051
+ pics
1052
+ western
1053
+ income
1054
+ force
1055
+ cash
1056
+ employment
1057
+ overall
1058
+ bay
1059
+ river
1060
+ commission
1061
+ ad
1062
+ package
1063
+ contents
1064
+ seen
1065
+ players
1066
+ engine
1067
+ port
1068
+ album
1069
+ regional
1070
+ stop
1071
+ supplies
1072
+ started
1073
+ administration
1074
+ bar
1075
+ institute
1076
+ views
1077
+ plans
1078
+ double
1079
+ dog
1080
+ build
1081
+ screen
1082
+ exchange
1083
+ types
1084
+ soon
1085
+ sponsored
1086
+ lines
1087
+ electronic
1088
+ continue
1089
+ across
1090
+ benefits
1091
+ needed
1092
+ season
1093
+ apply
1094
+ someone
1095
+ held
1096
+ ny
1097
+ anything
1098
+ printer
1099
+ condition
1100
+ effective
1101
+ believe
1102
+ organization
1103
+ effect
1104
+ asked
1105
+ eur
1106
+ mind
1107
+ sunday
1108
+ selection
1109
+ casino
1110
+ pdf
1111
+ lost
1112
+ tour
1113
+ menu
1114
+ volume
1115
+ cross
1116
+ anyone
1117
+ mortgage
1118
+ hope
1119
+ silver
1120
+ corporation
1121
+ wish
1122
+ inside
1123
+ solution
1124
+ mature
1125
+ role
1126
+ rather
1127
+ weeks
1128
+ addition
1129
+ came
1130
+ supply
1131
+ nothing
1132
+ certain
1133
+ usr
1134
+ executive
1135
+ running
1136
+ lower
1137
+ necessary
1138
+ union
1139
+ jewelry
1140
+ according
1141
+ dc
1142
+ clothing
1143
+ mon
1144
+ com
1145
+ particular
1146
+ fine
1147
+ names
1148
+ robert
1149
+ homepage
1150
+ hour
1151
+ gas
1152
+ skills
1153
+ six
1154
+ bush
1155
+ islands
1156
+ advice
1157
+ career
1158
+ military
1159
+ rental
1160
+ decision
1161
+ leave
1162
+ british
1163
+ teens
1164
+ pre
1165
+ huge
1166
+ sat
1167
+ woman
1168
+ facilities
1169
+ zip
1170
+ bid
1171
+ kind
1172
+ sellers
1173
+ middle
1174
+ move
1175
+ cable
1176
+ opportunities
1177
+ taking
1178
+ values
1179
+ division
1180
+ coming
1181
+ tuesday
1182
+ object
1183
+ lesbian
1184
+ appropriate
1185
+ machine
1186
+ logo
1187
+ length
1188
+ actually
1189
+ nice
1190
+ score
1191
+ statistics
1192
+ client
1193
+ ok
1194
+ returns
1195
+ capital
1196
+ follow
1197
+ sample
1198
+ investment
1199
+ sent
1200
+ shown
1201
+ saturday
1202
+ christmas
1203
+ england
1204
+ culture
1205
+ band
1206
+ flash
1207
+ ms
1208
+ lead
1209
+ george
1210
+ choice
1211
+ went
1212
+ starting
1213
+ registration
1214
+ fri
1215
+ thursday
1216
+ courses
1217
+ consumer
1218
+ hi
1219
+ airport
1220
+ foreign
1221
+ artist
1222
+ outside
1223
+ furniture
1224
+ levels
1225
+ channel
1226
+ letter
1227
+ mode
1228
+ phones
1229
+ ideas
1230
+ wednesday
1231
+ structure
1232
+ fund
1233
+ summer
1234
+ allow
1235
+ degree
1236
+ contract
1237
+ button
1238
+ releases
1239
+ wed
1240
+ homes
1241
+ super
1242
+ male
1243
+ matter
1244
+ custom
1245
+ virginia
1246
+ almost
1247
+ took
1248
+ located
1249
+ multiple
1250
+ asian
1251
+ distribution
1252
+ editor
1253
+ inn
1254
+ industrial
1255
+ cause
1256
+ potential
1257
+ song
1258
+ cnet
1259
+ ltd
1260
+ los
1261
+ hp
1262
+ focus
1263
+ late
1264
+ fall
1265
+ featured
1266
+ idea
1267
+ rooms
1268
+ female
1269
+ responsible
1270
+ inc
1271
+ communications
1272
+ win
1273
+ associated
1274
+ thomas
1275
+ primary
1276
+ cancer
1277
+ numbers
1278
+ reason
1279
+ tool
1280
+ browser
1281
+ spring
1282
+ foundation
1283
+ answer
1284
+ voice
1285
+ eg
1286
+ friendly
1287
+ schedule
1288
+ documents
1289
+ communication
1290
+ purpose
1291
+ feature
1292
+ bed
1293
+ comes
1294
+ police
1295
+ everyone
1296
+ independent
1297
+ ip
1298
+ approach
1299
+ cameras
1300
+ brown
1301
+ physical
1302
+ operating
1303
+ hill
1304
+ maps
1305
+ medicine
1306
+ deal
1307
+ hold
1308
+ ratings
1309
+ chicago
1310
+ forms
1311
+ glass
1312
+ happy
1313
+ tue
1314
+ smith
1315
+ wanted
1316
+ developed
1317
+ thank
1318
+ safe
1319
+ unique
1320
+ survey
1321
+ prior
1322
+ telephone
1323
+ sport
1324
+ ready
1325
+ feed
1326
+ animal
1327
+ sources
1328
+ mexico
1329
+ population
1330
+ pa
1331
+ regular
1332
+ secure
1333
+ navigation
1334
+ operations
1335
+ therefore
1336
+ ass
1337
+ simply
1338
+ evidence
1339
+ station
1340
+ christian
1341
+ round
1342
+ paypal
1343
+ favorite
1344
+ understand
1345
+ option
1346
+ master
1347
+ valley
1348
+ recently
1349
+ probably
1350
+ thu
1351
+ rentals
1352
+ sea
1353
+ built
1354
+ publications
1355
+ blood
1356
+ cut
1357
+ worldwide
1358
+ improve
1359
+ connection
1360
+ publisher
1361
+ hall
1362
+ larger
1363
+ anti
1364
+ networks
1365
+ earth
1366
+ parents
1367
+ nokia
1368
+ impact
1369
+ transfer
1370
+ introduction
1371
+ kitchen
1372
+ strong
1373
+ tel
1374
+ carolina
1375
+ wedding
1376
+ properties
1377
+ hospital
1378
+ ground
1379
+ overview
1380
+ ship
1381
+ accommodation
1382
+ owners
1383
+ disease
1384
+ tx
1385
+ excellent
1386
+ paid
1387
+ italy
1388
+ perfect
1389
+ hair
1390
+ opportunity
1391
+ kit
1392
+ classic
1393
+ basis
1394
+ command
1395
+ cities
1396
+ william
1397
+ express
1398
+ anal
1399
+ award
1400
+ distance
1401
+ tree
1402
+ peter
1403
+ assessment
1404
+ ensure
1405
+ thus
1406
+ wall
1407
+ ie
1408
+ involved
1409
+ el
1410
+ extra
1411
+ especially
1412
+ interface
1413
+ pussy
1414
+ partners
1415
+ budget
1416
+ rated
1417
+ guides
1418
+ success
1419
+ maximum
1420
+ ma
1421
+ operation
1422
+ existing
1423
+ quite
1424
+ selected
1425
+ boy
1426
+ amazon
1427
+ patients
1428
+ restaurants
1429
+ beautiful
1430
+ warning
1431
+ wine
1432
+ locations
1433
+ horse
1434
+ vote
1435
+ forward
1436
+ flowers
1437
+ stars
1438
+ significant
1439
+ lists
1440
+ technologies
1441
+ owner
1442
+ retail
1443
+ animals
1444
+ useful
1445
+ directly
1446
+ manufacturer
1447
+ ways
1448
+ est
1449
+ son
1450
+ providing
1451
+ rule
1452
+ mac
1453
+ housing
1454
+ takes
1455
+ iii
1456
+ gmt
1457
+ bring
1458
+ catalog
1459
+ searches
1460
+ max
1461
+ trying
1462
+ mother
1463
+ authority
1464
+ considered
1465
+ told
1466
+ xml
1467
+ traffic
1468
+ programme
1469
+ joined
1470
+ input
1471
+ strategy
1472
+ feet
1473
+ agent
1474
+ valid
1475
+ bin
1476
+ modern
1477
+ senior
1478
+ ireland
1479
+ sexy
1480
+ teaching
1481
+ door
1482
+ grand
1483
+ testing
1484
+ trial
1485
+ charge
1486
+ units
1487
+ instead
1488
+ canadian
1489
+ cool
1490
+ normal
1491
+ wrote
1492
+ enterprise
1493
+ ships
1494
+ entire
1495
+ educational
1496
+ md
1497
+ leading
1498
+ metal
1499
+ positive
1500
+ fl
1501
+ fitness
1502
+ chinese
1503
+ opinion
1504
+ mb
1505
+ asia
1506
+ football
1507
+ abstract
1508
+ uses
1509
+ output
1510
+ funds
1511
+ mr
1512
+ greater
1513
+ likely
1514
+ develop
1515
+ employees
1516
+ artists
1517
+ alternative
1518
+ processing
1519
+ responsibility
1520
+ resolution
1521
+ java
1522
+ guest
1523
+ seems
1524
+ publication
1525
+ pass
1526
+ relations
1527
+ trust
1528
+ van
1529
+ contains
1530
+ session
1531
+ multi
1532
+ photography
1533
+ republic
1534
+ fees
1535
+ components
1536
+ vacation
1537
+ century
1538
+ academic
1539
+ assistance
1540
+ completed
1541
+ skin
1542
+ graphics
1543
+ indian
1544
+ prev
1545
+ ads
1546
+ mary
1547
+ il
1548
+ expected
1549
+ ring
1550
+ grade
1551
+ dating
1552
+ pacific
1553
+ mountain
1554
+ organizations
1555
+ pop
1556
+ filter
1557
+ mailing
1558
+ vehicle
1559
+ longer
1560
+ consider
1561
+ int
1562
+ northern
1563
+ behind
1564
+ panel
1565
+ floor
1566
+ german
1567
+ buying
1568
+ match
1569
+ proposed
1570
+ default
1571
+ require
1572
+ iraq
1573
+ boys
1574
+ outdoor
1575
+ deep
1576
+ morning
1577
+ otherwise
1578
+ allows
1579
+ rest
1580
+ protein
1581
+ plant
1582
+ reported
1583
+ hit
1584
+ transportation
1585
+ mm
1586
+ pool
1587
+ mini
1588
+ politics
1589
+ partner
1590
+ disclaimer
1591
+ authors
1592
+ boards
1593
+ faculty
1594
+ parties
1595
+ fish
1596
+ membership
1597
+ mission
1598
+ eye
1599
+ string
1600
+ sense
1601
+ modified
1602
+ pack
1603
+ released
1604
+ stage
1605
+ internal
1606
+ goods
1607
+ recommended
1608
+ born
1609
+ unless
1610
+ richard
1611
+ detailed
1612
+ japanese
1613
+ race
1614
+ approved
1615
+ background
1616
+ target
1617
+ except
1618
+ character
1619
+ usb
1620
+ maintenance
1621
+ ability
1622
+ maybe
1623
+ functions
1624
+ ed
1625
+ moving
1626
+ brands
1627
+ places
1628
+ php
1629
+ pretty
1630
+ trademarks
1631
+ phentermine
1632
+ spain
1633
+ southern
1634
+ yourself
1635
+ etc
1636
+ winter
1637
+ rape
1638
+ battery
1639
+ youth
1640
+ pressure
1641
+ submitted
1642
+ boston
1643
+ incest
1644
+ debt
1645
+ keywords
1646
+ medium
1647
+ television
1648
+ interested
1649
+ core
1650
+ break
1651
+ purposes
1652
+ throughout
1653
+ sets
1654
+ dance
1655
+ wood
1656
+ msn
1657
+ itself
1658
+ defined
1659
+ papers
1660
+ playing
1661
+ awards
1662
+ fee
1663
+ studio
1664
+ reader
1665
+ virtual
1666
+ device
1667
+ established
1668
+ answers
1669
+ rent
1670
+ las
1671
+ remote
1672
+ dark
1673
+ programming
1674
+ external
1675
+ apple
1676
+ le
1677
+ regarding
1678
+ instructions
1679
+ min
1680
+ offered
1681
+ theory
1682
+ enjoy
1683
+ remove
1684
+ aid
1685
+ surface
1686
+ minimum
1687
+ visual
1688
+ host
1689
+ variety
1690
+ teachers
1691
+ isbn
1692
+ martin
1693
+ manual
1694
+ block
1695
+ subjects
1696
+ agents
1697
+ increased
1698
+ repair
1699
+ fair
1700
+ civil
1701
+ steel
1702
+ understanding
1703
+ songs
1704
+ fixed
1705
+ wrong
1706
+ beginning
1707
+ hands
1708
+ associates
1709
+ finally
1710
+ az
1711
+ updates
1712
+ desktop
1713
+ classes
1714
+ paris
1715
+ ohio
1716
+ gets
1717
+ sector
1718
+ capacity
1719
+ requires
1720
+ jersey
1721
+ un
1722
+ fat
1723
+ fully
1724
+ father
1725
+ electric
1726
+ saw
1727
+ instruments
1728
+ quotes
1729
+ officer
1730
+ driver
1731
+ businesses
1732
+ dead
1733
+ respect
1734
+ unknown
1735
+ specified
1736
+ restaurant
1737
+ mike
1738
+ trip
1739
+ pst
1740
+ worth
1741
+ mi
1742
+ procedures
1743
+ poor
1744
+ teacher
1745
+ xxx
1746
+ eyes
1747
+ relationship
1748
+ workers
1749
+ farm
1750
+ fucking
1751
+ georgia
1752
+ peace
1753
+ traditional
1754
+ campus
1755
+ tom
1756
+ showing
1757
+ creative
1758
+ coast
1759
+ benefit
1760
+ progress
1761
+ funding
1762
+ devices
1763
+ lord
1764
+ grant
1765
+ sub
1766
+ agree
1767
+ fiction
1768
+ hear
1769
+ sometimes
1770
+ watches
1771
+ careers
1772
+ beyond
1773
+ goes
1774
+ families
1775
+ led
1776
+ museum
1777
+ themselves
1778
+ fan
1779
+ transport
1780
+ interesting
1781
+ blogs
1782
+ wife
1783
+ evaluation
1784
+ accepted
1785
+ former
1786
+ implementation
1787
+ ten
1788
+ hits
1789
+ zone
1790
+ complex
1791
+ th
1792
+ cat
1793
+ galleries
1794
+ references
1795
+ die
1796
+ presented
1797
+ jack
1798
+ flat
1799
+ flow
1800
+ agencies
1801
+ literature
1802
+ respective
1803
+ parent
1804
+ spanish
1805
+ michigan
1806
+ columbia
1807
+ setting
1808
+ dr
1809
+ scale
1810
+ stand
1811
+ economy
1812
+ highest
1813
+ helpful
1814
+ monthly
1815
+ critical
1816
+ frame
1817
+ musical
1818
+ definition
1819
+ secretary
1820
+ angeles
1821
+ networking
1822
+ path
1823
+ australian
1824
+ employee
1825
+ chief
1826
+ gives
1827
+ kb
1828
+ bottom
1829
+ magazines
1830
+ packages
1831
+ detail
1832
+ francisco
1833
+ laws
1834
+ changed
1835
+ pet
1836
+ heard
1837
+ begin
1838
+ individuals
1839
+ colorado
1840
+ royal
1841
+ clean
1842
+ switch
1843
+ russian
1844
+ largest
1845
+ african
1846
+ guy
1847
+ titles
1848
+ relevant
1849
+ guidelines
1850
+ justice
1851
+ connect
1852
+ bible
1853
+ dev
1854
+ cup
1855
+ basket
1856
+ applied
1857
+ weekly
1858
+ vol
1859
+ installation
1860
+ described
1861
+ demand
1862
+ pp
1863
+ suite
1864
+ vegas
1865
+ na
1866
+ square
1867
+ chris
1868
+ attention
1869
+ advance
1870
+ skip
1871
+ diet
1872
+ army
1873
+ auction
1874
+ gear
1875
+ lee
1876
+ os
1877
+ difference
1878
+ allowed
1879
+ correct
1880
+ charles
1881
+ nation
1882
+ selling
1883
+ lots
1884
+ piece
1885
+ sheet
1886
+ firm
1887
+ seven
1888
+ older
1889
+ illinois
1890
+ regulations
1891
+ elements
1892
+ species
1893
+ jump
1894
+ cells
1895
+ module
1896
+ resort
1897
+ facility
1898
+ random
1899
+ pricing
1900
+ dvds
1901
+ certificate
1902
+ minister
1903
+ motion
1904
+ looks
1905
+ fashion
1906
+ directions
1907
+ visitors
1908
+ documentation
1909
+ monitor
1910
+ trading
1911
+ forest
1912
+ calls
1913
+ whose
1914
+ coverage
1915
+ couple
1916
+ giving
1917
+ chance
1918
+ vision
1919
+ ball
1920
+ ending
1921
+ clients
1922
+ actions
1923
+ listen
1924
+ discuss
1925
+ accept
1926
+ automotive
1927
+ naked
1928
+ goal
1929
+ successful
1930
+ sold
1931
+ wind
1932
+ communities
1933
+ clinical
1934
+ situation
1935
+ sciences
1936
+ markets
1937
+ lowest
1938
+ highly
1939
+ publishing
1940
+ appear
1941
+ emergency
1942
+ developing
1943
+ lives
1944
+ currency
1945
+ leather
1946
+ determine
1947
+ milf
1948
+ temperature
1949
+ palm
1950
+ announcements
1951
+ patient
1952
+ actual
1953
+ historical
1954
+ stone
1955
+ bob
1956
+ commerce
1957
+ ringtones
1958
+ perhaps
1959
+ persons
1960
+ difficult
1961
+ scientific
1962
+ satellite
1963
+ fit
1964
+ tests
1965
+ village
1966
+ accounts
1967
+ amateur
1968
+ ex
1969
+ met
1970
+ pain
1971
+ xbox
1972
+ particularly
1973
+ factors
1974
+ coffee
1975
+ www
1976
+ settings
1977
+ cum
1978
+ buyer
1979
+ cultural
1980
+ steve
1981
+ easily
1982
+ oral
1983
+ ford
1984
+ poster
1985
+ edge
1986
+ functional
1987
+ root
1988
+ au
1989
+ fi
1990
+ closed
1991
+ holidays
1992
+ ice
1993
+ pink
1994
+ zealand
1995
+ balance
1996
+ monitoring
1997
+ graduate
1998
+ replies
1999
+ shot
2000
+ nc
2001
+ architecture
2002
+ initial
2003
+ label
2004
+ thinking
2005
+ scott
2006
+ llc
2007
+ sec
2008
+ recommend
2009
+ canon
2010
+ hardcore
2011
+ league
2012
+ waste
2013
+ minute
2014
+ bus
2015
+ provider
2016
+ optional
2017
+ dictionary
2018
+ cold
2019
+ accounting
2020
+ manufacturing
2021
+ sections
2022
+ chair
2023
+ fishing
2024
+ effort
2025
+ phase
2026
+ fields
2027
+ bag
2028
+ fantasy
2029
+ po
2030
+ letters
2031
+ motor
2032
+ va
2033
+ professor
2034
+ context
2035
+ install
2036
+ shirt
2037
+ apparel
2038
+ generally
2039
+ continued
2040
+ foot
2041
+ mass
2042
+ crime
2043
+ count
2044
+ breast
2045
+ techniques
2046
+ ibm
2047
+ rd
2048
+ johnson
2049
+ sc
2050
+ quickly
2051
+ dollars
2052
+ websites
2053
+ religion
2054
+ claim
2055
+ driving
2056
+ permission
2057
+ surgery
2058
+ patch
2059
+ heat
2060
+ wild
2061
+ measures
2062
+ generation
2063
+ kansas
2064
+ miss
2065
+ chemical
2066
+ doctor
2067
+ task
2068
+ reduce
2069
+ brought
2070
+ himself
2071
+ nor
2072
+ component
2073
+ enable
2074
+ exercise
2075
+ bug
2076
+ santa
2077
+ mid
2078
+ guarantee
2079
+ leader
2080
+ diamond
2081
+ israel
2082
+ se
2083
+ processes
2084
+ soft
2085
+ servers
2086
+ alone
2087
+ meetings
2088
+ seconds
2089
+ jones
2090
+ arizona
2091
+ keyword
2092
+ interests
2093
+ flight
2094
+ congress
2095
+ fuel
2096
+ username
2097
+ walk
2098
+ fuck
2099
+ produced
2100
+ italian
2101
+ paperback
2102
+ classifieds
2103
+ wait
2104
+ supported
2105
+ pocket
2106
+ saint
2107
+ rose
2108
+ freedom
2109
+ argument
2110
+ competition
2111
+ creating
2112
+ jim
2113
+ drugs
2114
+ joint
2115
+ premium
2116
+ providers
2117
+ fresh
2118
+ characters
2119
+ attorney
2120
+ upgrade
2121
+ di
2122
+ factor
2123
+ growing
2124
+ thousands
2125
+ km
2126
+ stream
2127
+ apartments
2128
+ pick
2129
+ hearing
2130
+ eastern
2131
+ auctions
2132
+ therapy
2133
+ entries
2134
+ dates
2135
+ generated
2136
+ signed
2137
+ upper
2138
+ administrative
2139
+ serious
2140
+ prime
2141
+ samsung
2142
+ limit
2143
+ began
2144
+ louis
2145
+ steps
2146
+ errors
2147
+ shops
2148
+ bondage
2149
+ del
2150
+ efforts
2151
+ informed
2152
+ ga
2153
+ ac
2154
+ thoughts
2155
+ creek
2156
+ ft
2157
+ worked
2158
+ quantity
2159
+ urban
2160
+ practices
2161
+ sorted
2162
+ reporting
2163
+ essential
2164
+ myself
2165
+ tours
2166
+ platform
2167
+ load
2168
+ affiliate
2169
+ labor
2170
+ immediately
2171
+ admin
2172
+ nursing
2173
+ defense
2174
+ machines
2175
+ designated
2176
+ tags
2177
+ heavy
2178
+ covered
2179
+ recovery
2180
+ joe
2181
+ guys
2182
+ integrated
2183
+ configuration
2184
+ cock
2185
+ merchant
2186
+ comprehensive
2187
+ expert
2188
+ universal
2189
+ protect
2190
+ drop
2191
+ solid
2192
+ cds
2193
+ presentation
2194
+ languages
2195
+ became
2196
+ orange
2197
+ compliance
2198
+ vehicles
2199
+ prevent
2200
+ theme
2201
+ rich
2202
+ im
2203
+ campaign
2204
+ marine
2205
+ improvement
2206
+ vs
2207
+ guitar
2208
+ finding
2209
+ pennsylvania
2210
+ examples
2211
+ ipod
2212
+ saying
2213
+ spirit
2214
+ ar
2215
+ claims
2216
+ porno
2217
+ challenge
2218
+ motorola
2219
+ acceptance
2220
+ strategies
2221
+ mo
2222
+ seem
2223
+ affairs
2224
+ touch
2225
+ intended
2226
+ towards
2227
+ sa
2228
+ goals
2229
+ hire
2230
+ election
2231
+ suggest
2232
+ branch
2233
+ charges
2234
+ serve
2235
+ affiliates
2236
+ reasons
2237
+ magic
2238
+ mount
2239
+ smart
2240
+ talking
2241
+ gave
2242
+ ones
2243
+ latin
2244
+ multimedia
2245
+ xp
2246
+ tits
2247
+ avoid
2248
+ certified
2249
+ manage
2250
+ corner
2251
+ rank
2252
+ computing
2253
+ oregon
2254
+ element
2255
+ birth
2256
+ virus
2257
+ abuse
2258
+ interactive
2259
+ requests
2260
+ separate
2261
+ quarter
2262
+ procedure
2263
+ leadership
2264
+ tables
2265
+ define
2266
+ racing
2267
+ religious
2268
+ facts
2269
+ breakfast
2270
+ kong
2271
+ column
2272
+ plants
2273
+ faith
2274
+ chain
2275
+ developer
2276
+ identify
2277
+ avenue
2278
+ missing
2279
+ died
2280
+ approximately
2281
+ domestic
2282
+ sitemap
2283
+ recommendations
2284
+ moved
2285
+ houston
2286
+ reach
2287
+ comparison
2288
+ mental
2289
+ viewed
2290
+ moment
2291
+ extended
2292
+ sequence
2293
+ inch
2294
+ attack
2295
+ sorry
2296
+ centers
2297
+ opening
2298
+ damage
2299
+ lab
2300
+ reserve
2301
+ recipes
2302
+ cvs
2303
+ gamma
2304
+ plastic
2305
+ produce
2306
+ snow
2307
+ placed
2308
+ truth
2309
+ counter
2310
+ failure
2311
+ follows
2312
+ eu
2313
+ weekend
2314
+ dollar
2315
+ camp
2316
+ ontario
2317
+ automatically
2318
+ des
2319
+ minnesota
2320
+ films
2321
+ bridge
2322
+ native
2323
+ fill
2324
+ williams
2325
+ movement
2326
+ printing
2327
+ baseball
2328
+ owned
2329
+ approval
2330
+ draft
2331
+ chart
2332
+ played
2333
+ contacts
2334
+ cc
2335
+ jesus
2336
+ readers
2337
+ clubs
2338
+ lcd
2339
+ wa
2340
+ jackson
2341
+ equal
2342
+ adventure
2343
+ matching
2344
+ offering
2345
+ shirts
2346
+ profit
2347
+ leaders
2348
+ posters
2349
+ institutions
2350
+ assistant
2351
+ variable
2352
+ ave
2353
+ dj
2354
+ advertisement
2355
+ expect
2356
+ parking
2357
+ headlines
2358
+ yesterday
2359
+ compared
2360
+ determined
2361
+ wholesale
2362
+ workshop
2363
+ russia
2364
+ gone
2365
+ codes
2366
+ kinds
2367
+ extension
2368
+ seattle
2369
+ statements
2370
+ golden
2371
+ completely
2372
+ teams
2373
+ fort
2374
+ cm
2375
+ wi
2376
+ lighting
2377
+ senate
2378
+ forces
2379
+ funny
2380
+ brother
2381
+ gene
2382
+ turned
2383
+ portable
2384
+ tried
2385
+ electrical
2386
+ applicable
2387
+ disc
2388
+ returned
2389
+ pattern
2390
+ ct
2391
+ hentai
2392
+ boat
2393
+ named
2394
+ theatre
2395
+ laser
2396
+ earlier
2397
+ manufacturers
2398
+ sponsor
2399
+ classical
2400
+ icon
2401
+ warranty
2402
+ dedicated
2403
+ indiana
2404
+ direction
2405
+ harry
2406
+ basketball
2407
+ objects
2408
+ ends
2409
+ delete
2410
+ evening
2411
+ assembly
2412
+ nuclear
2413
+ taxes
2414
+ mouse
2415
+ signal
2416
+ criminal
2417
+ issued
2418
+ brain
2419
+ sexual
2420
+ wisconsin
2421
+ powerful
2422
+ dream
2423
+ obtained
2424
+ false
2425
+ da
2426
+ cast
2427
+ flower
2428
+ felt
2429
+ personnel
2430
+ passed
2431
+ supplied
2432
+ identified
2433
+ falls
2434
+ pic
2435
+ soul
2436
+ aids
2437
+ opinions
2438
+ promote
2439
+ stated
2440
+ stats
2441
+ hawaii
2442
+ professionals
2443
+ appears
2444
+ carry
2445
+ flag
2446
+ decided
2447
+ nj
2448
+ covers
2449
+ hr
2450
+ em
2451
+ advantage
2452
+ hello
2453
+ designs
2454
+ maintain
2455
+ tourism
2456
+ priority
2457
+ newsletters
2458
+ adults
2459
+ clips
2460
+ savings
2461
+ iv
2462
+ graphic
2463
+ atom
2464
+ payments
2465
+ rw
2466
+ estimated
2467
+ binding
2468
+ brief
2469
+ ended
2470
+ winning
2471
+ eight
2472
+ anonymous
2473
+ iron
2474
+ straight
2475
+ script
2476
+ served
2477
+ wants
2478
+ miscellaneous
2479
+ prepared
2480
+ void
2481
+ dining
2482
+ alert
2483
+ integration
2484
+ atlanta
2485
+ dakota
2486
+ tag
2487
+ interview
2488
+ mix
2489
+ framework
2490
+ disk
2491
+ installed
2492
+ queen
2493
+ vhs
2494
+ credits
2495
+ clearly
2496
+ fix
2497
+ handle
2498
+ sweet
2499
+ desk
2500
+ criteria
2501
+ pubmed
2502
+ dave
2503
+ massachusetts
2504
+ diego
2505
+ hong
2506
+ vice
2507
+ associate
2508
+ ne
2509
+ truck
2510
+ behavior
2511
+ enlarge
2512
+ ray
2513
+ frequently
2514
+ revenue
2515
+ measure
2516
+ changing
2517
+ votes
2518
+ du
2519
+ duty
2520
+ looked
2521
+ discussions
2522
+ bear
2523
+ gain
2524
+ festival
2525
+ laboratory
2526
+ ocean
2527
+ flights
2528
+ experts
2529
+ signs
2530
+ lack
2531
+ depth
2532
+ iowa
2533
+ whatever
2534
+ logged
2535
+ laptop
2536
+ vintage
2537
+ train
2538
+ exactly
2539
+ dry
2540
+ explore
2541
+ maryland
2542
+ spa
2543
+ concept
2544
+ nearly
2545
+ eligible
2546
+ checkout
2547
+ reality
2548
+ forgot
2549
+ handling
2550
+ origin
2551
+ knew
2552
+ gaming
2553
+ feeds
2554
+ billion
2555
+ destination
2556
+ scotland
2557
+ faster
2558
+ intelligence
2559
+ dallas
2560
+ bought
2561
+ con
2562
+ ups
2563
+ nations
2564
+ route
2565
+ followed
2566
+ specifications
2567
+ broken
2568
+ tripadvisor
2569
+ frank
2570
+ alaska
2571
+ zoom
2572
+ blow
2573
+ battle
2574
+ residential
2575
+ anime
2576
+ speak
2577
+ decisions
2578
+ industries
2579
+ protocol
2580
+ query
2581
+ clip
2582
+ partnership
2583
+ editorial
2584
+ nt
2585
+ expression
2586
+ es
2587
+ equity
2588
+ provisions
2589
+ speech
2590
+ wire
2591
+ principles
2592
+ suggestions
2593
+ rural
2594
+ shared
2595
+ sounds
2596
+ replacement
2597
+ tape
2598
+ strategic
2599
+ judge
2600
+ spam
2601
+ economics
2602
+ acid
2603
+ bytes
2604
+ cent
2605
+ forced
2606
+ compatible
2607
+ fight
2608
+ apartment
2609
+ height
2610
+ null
2611
+ zero
2612
+ speaker
2613
+ filed
2614
+ gb
2615
+ netherlands
2616
+ obtain
2617
+ bc
2618
+ consulting
2619
+ recreation
2620
+ offices
2621
+ designer
2622
+ remain
2623
+ managed
2624
+ pr
2625
+ failed
2626
+ marriage
2627
+ roll
2628
+ korea
2629
+ banks
2630
+ fr
2631
+ participants
2632
+ secret
2633
+ bath
2634
+ aa
2635
+ kelly
2636
+ leads
2637
+ negative
2638
+ austin
2639
+ favorites
2640
+ toronto
2641
+ theater
2642
+ springs
2643
+ missouri
2644
+ andrew
2645
+ var
2646
+ perform
2647
+ healthy
2648
+ translation
2649
+ estimates
2650
+ font
2651
+ assets
2652
+ injury
2653
+ mt
2654
+ joseph
2655
+ ministry
2656
+ drivers
2657
+ lawyer
2658
+ figures
2659
+ married
2660
+ protected
2661
+ proposal
2662
+ sharing
2663
+ philadelphia
2664
+ portal
2665
+ waiting
2666
+ birthday
2667
+ beta
2668
+ fail
2669
+ gratis
2670
+ banking
2671
+ officials
2672
+ brian
2673
+ toward
2674
+ won
2675
+ slightly
2676
+ assist
2677
+ conduct
2678
+ contained
2679
+ lingerie
2680
+ shemale
2681
+ legislation
2682
+ calling
2683
+ parameters
2684
+ jazz
2685
+ serving
2686
+ bags
2687
+ profiles
2688
+ miami
2689
+ comics
2690
+ matters
2691
+ houses
2692
+ doc
2693
+ postal
2694
+ relationships
2695
+ tennessee
2696
+ wear
2697
+ controls
2698
+ breaking
2699
+ combined
2700
+ ultimate
2701
+ wales
2702
+ representative
2703
+ frequency
2704
+ introduced
2705
+ minor
2706
+ finish
2707
+ departments
2708
+ residents
2709
+ noted
2710
+ displayed
2711
+ mom
2712
+ reduced
2713
+ physics
2714
+ rare
2715
+ spent
2716
+ performed
2717
+ extreme
2718
+ samples
2719
+ davis
2720
+ daniel
2721
+ bars
2722
+ reviewed
2723
+ row
2724
+ oz
2725
+ forecast
2726
+ removed
2727
+ helps
2728
+ singles
2729
+ administrator
2730
+ cycle
2731
+ amounts
2732
+ contain
2733
+ accuracy
2734
+ dual
2735
+ rise
2736
+ usd
2737
+ sleep
2738
+ mg
2739
+ bird
2740
+ pharmacy
2741
+ brazil
2742
+ creation
2743
+ static
2744
+ scene
2745
+ hunter
2746
+ addresses
2747
+ lady
2748
+ crystal
2749
+ famous
2750
+ writer
2751
+ chairman
2752
+ violence
2753
+ fans
2754
+ oklahoma
2755
+ speakers
2756
+ drink
2757
+ academy
2758
+ dynamic
2759
+ gender
2760
+ eat
2761
+ permanent
2762
+ agriculture
2763
+ dell
2764
+ cleaning
2765
+ constitutes
2766
+ portfolio
2767
+ practical
2768
+ delivered
2769
+ collectibles
2770
+ infrastructure
2771
+ exclusive
2772
+ seat
2773
+ concerns
2774
+ colour
2775
+ vendor
2776
+ originally
2777
+ intel
2778
+ utilities
2779
+ philosophy
2780
+ regulation
2781
+ officers
2782
+ reduction
2783
+ aim
2784
+ bids
2785
+ referred
2786
+ supports
2787
+ nutrition
2788
+ recording
2789
+ regions
2790
+ junior
2791
+ toll
2792
+ les
2793
+ cape
2794
+ ann
2795
+ rings
2796
+ meaning
2797
+ tip
2798
+ secondary
2799
+ wonderful
2800
+ mine
2801
+ ladies
2802
+ henry
2803
+ ticket
2804
+ announced
2805
+ guess
2806
+ agreed
2807
+ prevention
2808
+ whom
2809
+ ski
2810
+ soccer
2811
+ math
2812
+ import
2813
+ posting
2814
+ presence
2815
+ instant
2816
+ mentioned
2817
+ automatic
2818
+ healthcare
2819
+ viewing
2820
+ maintained
2821
+ ch
2822
+ increasing
2823
+ majority
2824
+ connected
2825
+ christ
2826
+ dan
2827
+ dogs
2828
+ sd
2829
+ directors
2830
+ aspects
2831
+ austria
2832
+ ahead
2833
+ moon
2834
+ participation
2835
+ scheme
2836
+ utility
2837
+ preview
2838
+ fly
2839
+ manner
2840
+ matrix
2841
+ containing
2842
+ combination
2843
+ devel
2844
+ amendment
2845
+ despite
2846
+ strength
2847
+ guaranteed
2848
+ turkey
2849
+ libraries
2850
+ proper
2851
+ distributed
2852
+ degrees
2853
+ singapore
2854
+ enterprises
2855
+ delta
2856
+ fear
2857
+ seeking
2858
+ inches
2859
+ phoenix
2860
+ rs
2861
+ convention
2862
+ shares
2863
+ principal
2864
+ daughter
2865
+ standing
2866
+ voyeur
2867
+ comfort
2868
+ colors
2869
+ wars
2870
+ cisco
2871
+ ordering
2872
+ kept
2873
+ alpha
2874
+ appeal
2875
+ cruise
2876
+ bonus
2877
+ certification
2878
+ previously
2879
+ hey
2880
+ bookmark
2881
+ buildings
2882
+ specials
2883
+ beat
2884
+ disney
2885
+ household
2886
+ batteries
2887
+ adobe
2888
+ smoking
2889
+ bbc
2890
+ becomes
2891
+ drives
2892
+ arms
2893
+ alabama
2894
+ tea
2895
+ improved
2896
+ trees
2897
+ avg
2898
+ achieve
2899
+ positions
2900
+ dress
2901
+ subscription
2902
+ dealer
2903
+ contemporary
2904
+ sky
2905
+ utah
2906
+ nearby
2907
+ rom
2908
+ carried
2909
+ happen
2910
+ exposure
2911
+ panasonic
2912
+ hide
2913
+ permalink
2914
+ signature
2915
+ gambling
2916
+ refer
2917
+ miller
2918
+ provision
2919
+ outdoors
2920
+ clothes
2921
+ caused
2922
+ luxury
2923
+ babes
2924
+ frames
2925
+ viagra
2926
+ certainly
2927
+ indeed
2928
+ newspaper
2929
+ toy
2930
+ circuit
2931
+ layer
2932
+ printed
2933
+ slow
2934
+ removal
2935
+ easier
2936
+ src
2937
+ liability
2938
+ trademark
2939
+ hip
2940
+ printers
2941
+ faqs
2942
+ nine
2943
+ adding
2944
+ kentucky
2945
+ mostly
2946
+ eric
2947
+ spot
2948
+ taylor
2949
+ trackback
2950
+ prints
2951
+ spend
2952
+ factory
2953
+ interior
2954
+ revised
2955
+ grow
2956
+ americans
2957
+ optical
2958
+ promotion
2959
+ relative
2960
+ amazing
2961
+ clock
2962
+ dot
2963
+ hiv
2964
+ identity
2965
+ suites
2966
+ conversion
2967
+ feeling
2968
+ hidden
2969
+ reasonable
2970
+ victoria
2971
+ serial
2972
+ relief
2973
+ revision
2974
+ broadband
2975
+ influence
2976
+ ratio
2977
+ pda
2978
+ importance
2979
+ rain
2980
+ onto
2981
+ dsl
2982
+ planet
2983
+ webmaster
2984
+ copies
2985
+ recipe
2986
+ zum
2987
+ permit
2988
+ seeing
2989
+ proof
2990
+ dna
2991
+ diff
2992
+ tennis
2993
+ bass
2994
+ prescription
2995
+ bedroom
2996
+ empty
2997
+ instance
2998
+ hole
2999
+ pets
3000
+ ride
3001
+ licensed
3002
+ orlando
3003
+ specifically
3004
+ tim
3005
+ bureau
3006
+ maine
3007
+ sql
3008
+ represent
3009
+ conservation
3010
+ pair
3011
+ ideal
3012
+ specs
3013
+ recorded
3014
+ don
3015
+ pieces
3016
+ finished
3017
+ parks
3018
+ dinner
3019
+ lawyers
3020
+ sydney
3021
+ stress
3022
+ cream
3023
+ ss
3024
+ runs
3025
+ trends
3026
+ yeah
3027
+ discover
3028
+ sexo
3029
+ ap
3030
+ patterns
3031
+ boxes
3032
+ louisiana
3033
+ hills
3034
+ javascript
3035
+ fourth
3036
+ nm
3037
+ advisor
3038
+ mn
3039
+ marketplace
3040
+ nd
3041
+ evil
3042
+ aware
3043
+ wilson
3044
+ shape
3045
+ evolution
3046
+ irish
3047
+ certificates
3048
+ objectives
3049
+ stations
3050
+ suggested
3051
+ gps
3052
+ op
3053
+ remains
3054
+ acc
3055
+ greatest
3056
+ firms
3057
+ concerned
3058
+ euro
3059
+ operator
3060
+ structures
3061
+ generic
3062
+ encyclopedia
3063
+ usage
3064
+ cap
3065
+ ink
3066
+ charts
3067
+ continuing
3068
+ mixed
3069
+ census
3070
+ interracial
3071
+ peak
3072
+ tn
3073
+ competitive
3074
+ exist
3075
+ wheel
3076
+ transit
3077
+ dick
3078
+ suppliers
3079
+ salt
3080
+ compact
3081
+ poetry
3082
+ lights
3083
+ tracking
3084
+ angel
3085
+ bell
3086
+ keeping
3087
+ preparation
3088
+ attempt
3089
+ receiving
3090
+ matches
3091
+ accordance
3092
+ width
3093
+ noise
3094
+ engines
3095
+ forget
3096
+ array
3097
+ discussed
3098
+ accurate
3099
+ stephen
3100
+ elizabeth
3101
+ climate
3102
+ reservations
3103
+ pin
3104
+ playstation
3105
+ alcohol
3106
+ greek
3107
+ instruction
3108
+ managing
3109
+ annotation
3110
+ sister
3111
+ raw
3112
+ differences
3113
+ walking
3114
+ explain
3115
+ smaller
3116
+ newest
3117
+ establish
3118
+ gnu
3119
+ happened
3120
+ expressed
3121
+ jeff
3122
+ extent
3123
+ sharp
3124
+ lesbians
3125
+ ben
3126
+ lane
3127
+ paragraph
3128
+ kill
3129
+ mathematics
3130
+ aol
3131
+ compensation
3132
+ ce
3133
+ export
3134
+ managers
3135
+ aircraft
3136
+ modules
3137
+ sweden
3138
+ conflict
3139
+ conducted
3140
+ versions
3141
+ employer
3142
+ occur
3143
+ percentage
3144
+ knows
3145
+ mississippi
3146
+ describe
3147
+ concern
3148
+ backup
3149
+ requested
3150
+ citizens
3151
+ connecticut
3152
+ heritage
3153
+ personals
3154
+ immediate
3155
+ holding
3156
+ trouble
3157
+ spread
3158
+ coach
3159
+ kevin
3160
+ agricultural
3161
+ expand
3162
+ supporting
3163
+ audience
3164
+ assigned
3165
+ jordan
3166
+ collections
3167
+ ages
3168
+ participate
3169
+ plug
3170
+ specialist
3171
+ cook
3172
+ affect
3173
+ virgin
3174
+ experienced
3175
+ investigation
3176
+ raised
3177
+ hat
3178
+ institution
3179
+ directed
3180
+ dealers
3181
+ searching
3182
+ sporting
3183
+ helping
3184
+ perl
3185
+ affected
3186
+ lib
3187
+ bike
3188
+ totally
3189
+ plate
3190
+ expenses
3191
+ indicate
3192
+ blonde
3193
+ ab
3194
+ proceedings
3195
+ favourite
3196
+ transmission
3197
+ anderson
3198
+ utc
3199
+ characteristics
3200
+ der
3201
+ lose
3202
+ organic
3203
+ seek
3204
+ experiences
3205
+ albums
3206
+ cheats
3207
+ extremely
3208
+ verzeichnis
3209
+ contracts
3210
+ guests
3211
+ hosted
3212
+ diseases
3213
+ concerning
3214
+ developers
3215
+ equivalent
3216
+ chemistry
3217
+ tony
3218
+ neighborhood
3219
+ nevada
3220
+ kits
3221
+ thailand
3222
+ variables
3223
+ agenda
3224
+ anyway
3225
+ continues
3226
+ tracks
3227
+ advisory
3228
+ cam
3229
+ curriculum
3230
+ logic
3231
+ template
3232
+ prince
3233
+ circle
3234
+ soil
3235
+ grants
3236
+ anywhere
3237
+ psychology
3238
+ responses
3239
+ atlantic
3240
+ wet
3241
+ circumstances
3242
+ edward
3243
+ investor
3244
+ identification
3245
+ ram
3246
+ leaving
3247
+ wildlife
3248
+ appliances
3249
+ matt
3250
+ elementary
3251
+ cooking
3252
+ speaking
3253
+ sponsors
3254
+ fox
3255
+ unlimited
3256
+ respond
3257
+ sizes
3258
+ plain
3259
+ exit
3260
+ entered
3261
+ iran
3262
+ arm
3263
+ keys
3264
+ launch
3265
+ wave
3266
+ checking
3267
+ costa
3268
+ belgium
3269
+ printable
3270
+ holy
3271
+ acts
3272
+ guidance
3273
+ mesh
3274
+ trail
3275
+ enforcement
3276
+ symbol
3277
+ crafts
3278
+ highway
3279
+ buddy
3280
+ hardcover
3281
+ observed
3282
+ dean
3283
+ setup
3284
+ poll
3285
+ booking
3286
+ glossary
3287
+ fiscal
3288
+ celebrity
3289
+ styles
3290
+ denver
3291
+ unix
3292
+ filled
3293
+ bond
3294
+ channels
3295
+ ericsson
3296
+ appendix
3297
+ notify
3298
+ blues
3299
+ chocolate
3300
+ pub
3301
+ portion
3302
+ scope
3303
+ hampshire
3304
+ supplier
3305
+ cables
3306
+ cotton
3307
+ bluetooth
3308
+ controlled
3309
+ requirement
3310
+ authorities
3311
+ biology
3312
+ dental
3313
+ killed
3314
+ border
3315
+ ancient
3316
+ debate
3317
+ representatives
3318
+ starts
3319
+ pregnancy
3320
+ causes
3321
+ arkansas
3322
+ biography
3323
+ leisure
3324
+ attractions
3325
+ learned
3326
+ transactions
3327
+ notebook
3328
+ explorer
3329
+ historic
3330
+ attached
3331
+ opened
3332
+ tm
3333
+ husband
3334
+ disabled
3335
+ authorized
3336
+ crazy
3337
+ upcoming
3338
+ britain
3339
+ concert
3340
+ retirement
3341
+ scores
3342
+ financing
3343
+ efficiency
3344
+ sp
3345
+ comedy
3346
+ adopted
3347
+ efficient
3348
+ weblog
3349
+ linear
3350
+ commitment
3351
+ specialty
3352
+ bears
3353
+ jean
3354
+ hop
3355
+ carrier
3356
+ edited
3357
+ constant
3358
+ visa
3359
+ mouth
3360
+ jewish
3361
+ meter
3362
+ linked
3363
+ portland
3364
+ interviews
3365
+ concepts
3366
+ nh
3367
+ gun
3368
+ reflect
3369
+ pure
3370
+ deliver
3371
+ wonder
3372
+ hell
3373
+ lessons
3374
+ fruit
3375
+ begins
3376
+ qualified
3377
+ reform
3378
+ lens
3379
+ alerts
3380
+ treated
3381
+ discovery
3382
+ draw
3383
+ mysql
3384
+ classified
3385
+ relating
3386
+ assume
3387
+ confidence
3388
+ alliance
3389
+ fm
3390
+ confirm
3391
+ warm
3392
+ neither
3393
+ lewis
3394
+ howard
3395
+ offline
3396
+ leaves
3397
+ engineer
3398
+ lifestyle
3399
+ consistent
3400
+ replace
3401
+ clearance
3402
+ connections
3403
+ inventory
3404
+ converter
3405
+ suck
3406
+ organisation
3407
+ babe
3408
+ checks
3409
+ reached
3410
+ becoming
3411
+ blowjob
3412
+ safari
3413
+ objective
3414
+ indicated
3415
+ sugar
3416
+ crew
3417
+ legs
3418
+ sam
3419
+ stick
3420
+ securities
3421
+ allen
3422
+ pdt
3423
+ relation
3424
+ enabled
3425
+ genre
3426
+ slide
3427
+ montana
3428
+ volunteer
3429
+ tested
3430
+ rear
3431
+ democratic
3432
+ enhance
3433
+ switzerland
3434
+ exact
3435
+ bound
3436
+ parameter
3437
+ adapter
3438
+ processor
3439
+ node
3440
+ formal
3441
+ dimensions
3442
+ contribute
3443
+ lock
3444
+ hockey
3445
+ storm
3446
+ micro
3447
+ colleges
3448
+ laptops
3449
+ mile
3450
+ showed
3451
+ challenges
3452
+ editors
3453
+ mens
3454
+ threads
3455
+ bowl
3456
+ supreme
3457
+ brothers
3458
+ recognition
3459
+ presents
3460
+ ref
3461
+ tank
3462
+ submission
3463
+ dolls
3464
+ estimate
3465
+ encourage
3466
+ navy
3467
+ kid
3468
+ regulatory
3469
+ inspection
3470
+ consumers
3471
+ cancel
3472
+ limits
3473
+ territory
3474
+ transaction
3475
+ manchester
3476
+ weapons
3477
+ paint
3478
+ delay
3479
+ pilot
3480
+ outlet
3481
+ contributions
3482
+ continuous
3483
+ db
3484
+ czech
3485
+ resulting
3486
+ cambridge
3487
+ initiative
3488
+ novel
3489
+ pan
3490
+ execution
3491
+ disability
3492
+ increases
3493
+ ultra
3494
+ winner
3495
+ idaho
3496
+ contractor
3497
+ ph
3498
+ episode
3499
+ examination
3500
+ potter
3501
+ dish
3502
+ plays
3503
+ bulletin
3504
+ ia
3505
+ pt
3506
+ indicates
3507
+ modify
3508
+ oxford
3509
+ adam
3510
+ truly
3511
+ epinions
3512
+ painting
3513
+ committed
3514
+ extensive
3515
+ affordable
3516
+ universe
3517
+ candidate
3518
+ databases
3519
+ patent
3520
+ slot
3521
+ psp
3522
+ outstanding
3523
+ ha
3524
+ eating
3525
+ perspective
3526
+ planned
3527
+ watching
3528
+ lodge
3529
+ messenger
3530
+ mirror
3531
+ tournament
3532
+ consideration
3533
+ ds
3534
+ discounts
3535
+ sterling
3536
+ sessions
3537
+ kernel
3538
+ boobs
3539
+ stocks
3540
+ buyers
3541
+ journals
3542
+ gray
3543
+ catalogue
3544
+ ea
3545
+ jennifer
3546
+ antonio
3547
+ charged
3548
+ broad
3549
+ taiwan
3550
+ und
3551
+ chosen
3552
+ demo
3553
+ greece
3554
+ lg
3555
+ swiss
3556
+ sarah
3557
+ clark
3558
+ labour
3559
+ hate
3560
+ terminal
3561
+ publishers
3562
+ nights
3563
+ behalf
3564
+ caribbean
3565
+ liquid
3566
+ rice
3567
+ nebraska
3568
+ loop
3569
+ salary
3570
+ reservation
3571
+ foods
3572
+ gourmet
3573
+ guard
3574
+ properly
3575
+ orleans
3576
+ saving
3577
+ nfl
3578
+ remaining
3579
+ empire
3580
+ resume
3581
+ twenty
3582
+ newly
3583
+ raise
3584
+ prepare
3585
+ avatar
3586
+ gary
3587
+ depending
3588
+ illegal
3589
+ expansion
3590
+ vary
3591
+ hundreds
3592
+ rome
3593
+ arab
3594
+ lincoln
3595
+ helped
3596
+ premier
3597
+ tomorrow
3598
+ purchased
3599
+ milk
3600
+ decide
3601
+ consent
3602
+ drama
3603
+ visiting
3604
+ performing
3605
+ downtown
3606
+ keyboard
3607
+ contest
3608
+ collected
3609
+ nw
3610
+ bands
3611
+ boot
3612
+ suitable
3613
+ ff
3614
+ absolutely
3615
+ millions
3616
+ lunch
3617
+ dildo
3618
+ audit
3619
+ push
3620
+ chamber
3621
+ guinea
3622
+ findings
3623
+ muscle
3624
+ featuring
3625
+ iso
3626
+ implement
3627
+ clicking
3628
+ scheduled
3629
+ polls
3630
+ typical
3631
+ tower
3632
+ yours
3633
+ sum
3634
+ misc
3635
+ calculator
3636
+ significantly
3637
+ chicken
3638
+ temporary
3639
+ attend
3640
+ shower
3641
+ alan
3642
+ sending
3643
+ jason
3644
+ tonight
3645
+ dear
3646
+ sufficient
3647
+ holdem
3648
+ shell
3649
+ province
3650
+ catholic
3651
+ oak
3652
+ vat
3653
+ awareness
3654
+ vancouver
3655
+ governor
3656
+ beer
3657
+ seemed
3658
+ contribution
3659
+ measurement
3660
+ swimming
3661
+ spyware
3662
+ formula
3663
+ constitution
3664
+ packaging
3665
+ solar
3666
+ jose
3667
+ catch
3668
+ jane
3669
+ pakistan
3670
+ ps
3671
+ reliable
3672
+ consultation
3673
+ northwest
3674
+ sir
3675
+ doubt
3676
+ earn
3677
+ finder
3678
+ unable
3679
+ periods
3680
+ classroom
3681
+ tasks
3682
+ democracy
3683
+ attacks
3684
+ kim
3685
+ wallpaper
3686
+ merchandise
3687
+ const
3688
+ resistance
3689
+ doors
3690
+ symptoms
3691
+ resorts
3692
+ biggest
3693
+ memorial
3694
+ visitor
3695
+ twin
3696
+ forth
3697
+ insert
3698
+ baltimore
3699
+ gateway
3700
+ ky
3701
+ dont
3702
+ alumni
3703
+ drawing
3704
+ candidates
3705
+ charlotte
3706
+ ordered
3707
+ biological
3708
+ fighting
3709
+ transition
3710
+ happens
3711
+ preferences
3712
+ spy
3713
+ romance
3714
+ instrument
3715
+ bruce
3716
+ split
3717
+ themes
3718
+ powers
3719
+ heaven
3720
+ br
3721
+ bits
3722
+ pregnant
3723
+ twice
3724
+ classification
3725
+ focused
3726
+ egypt
3727
+ physician
3728
+ hollywood
3729
+ bargain
3730
+ wikipedia
3731
+ cellular
3732
+ norway
3733
+ vermont
3734
+ asking
3735
+ blocks
3736
+ normally
3737
+ lo
3738
+ spiritual
3739
+ hunting
3740
+ diabetes
3741
+ suit
3742
+ ml
3743
+ shift
3744
+ chip
3745
+ res
3746
+ sit
3747
+ bodies
3748
+ photographs
3749
+ cutting
3750
+ wow
3751
+ simon
3752
+ writers
3753
+ marks
3754
+ flexible
3755
+ loved
3756
+ favourites
3757
+ mapping
3758
+ numerous
3759
+ relatively
3760
+ birds
3761
+ satisfaction
3762
+ represents
3763
+ char
3764
+ indexed
3765
+ pittsburgh
3766
+ superior
3767
+ preferred
3768
+ saved
3769
+ paying
3770
+ cartoon
3771
+ shots
3772
+ intellectual
3773
+ moore
3774
+ granted
3775
+ choices
3776
+ carbon
3777
+ spending
3778
+ comfortable
3779
+ magnetic
3780
+ interaction
3781
+ listening
3782
+ effectively
3783
+ registry
3784
+ crisis
3785
+ outlook
3786
+ massive
3787
+ denmark
3788
+ employed
3789
+ bright
3790
+ treat
3791
+ header
3792
+ cs
3793
+ poverty
3794
+ formed
3795
+ piano
3796
+ echo
3797
+ que
3798
+ grid
3799
+ sheets
3800
+ patrick
3801
+ experimental
3802
+ puerto
3803
+ revolution
3804
+ consolidation
3805
+ displays
3806
+ plasma
3807
+ allowing
3808
+ earnings
3809
+ voip
3810
+ mystery
3811
+ landscape
3812
+ dependent
3813
+ mechanical
3814
+ journey
3815
+ delaware
3816
+ bidding
3817
+ consultants
3818
+ risks
3819
+ banner
3820
+ applicant
3821
+ charter
3822
+ fig
3823
+ barbara
3824
+ cooperation
3825
+ counties
3826
+ acquisition
3827
+ ports
3828
+ implemented
3829
+ sf
3830
+ directories
3831
+ recognized
3832
+ dreams
3833
+ blogger
3834
+ notification
3835
+ kg
3836
+ licensing
3837
+ stands
3838
+ teach
3839
+ occurred
3840
+ textbooks
3841
+ rapid
3842
+ pull
3843
+ hairy
3844
+ diversity
3845
+ cleveland
3846
+ ut
3847
+ reverse
3848
+ deposit
3849
+ seminar
3850
+ investments
3851
+ latina
3852
+ nasa
3853
+ wheels
3854
+ sexcam
3855
+ specify
3856
+ accessibility
3857
+ dutch
3858
+ sensitive
3859
+ templates
3860
+ formats
3861
+ tab
3862
+ depends
3863
+ boots
3864
+ holds
3865
+ router
3866
+ concrete
3867
+ si
3868
+ editing
3869
+ poland
3870
+ folder
3871
+ womens
3872
+ css
3873
+ completion
3874
+ upload
3875
+ pulse
3876
+ universities
3877
+ technique
3878
+ contractors
3879
+ milfhunter
3880
+ voting
3881
+ courts
3882
+ notices
3883
+ subscriptions
3884
+ calculate
3885
+ mc
3886
+ detroit
3887
+ alexander
3888
+ broadcast
3889
+ converted
3890
+ metro
3891
+ toshiba
3892
+ anniversary
3893
+ improvements
3894
+ strip
3895
+ specification
3896
+ pearl
3897
+ accident
3898
+ nick
3899
+ accessible
3900
+ accessory
3901
+ resident
3902
+ plot
3903
+ qty
3904
+ possibly
3905
+ airline
3906
+ typically
3907
+ representation
3908
+ regard
3909
+ pump
3910
+ exists
3911
+ arrangements
3912
+ smooth
3913
+ conferences
3914
+ uniprotkb
3915
+ beastiality
3916
+ strike
3917
+ consumption
3918
+ birmingham
3919
+ flashing
3920
+ lp
3921
+ narrow
3922
+ afternoon
3923
+ threat
3924
+ surveys
3925
+ sitting
3926
+ putting
3927
+ consultant
3928
+ controller
3929
+ ownership
3930
+ committees
3931
+ penis
3932
+ legislative
3933
+ researchers
3934
+ vietnam
3935
+ trailer
3936
+ anne
3937
+ castle
3938
+ gardens
3939
+ missed
3940
+ malaysia
3941
+ unsubscribe
3942
+ antique
3943
+ labels
3944
+ willing
3945
+ bio
3946
+ molecular
3947
+ upskirt
3948
+ acting
3949
+ heads
3950
+ stored
3951
+ exam
3952
+ logos
3953
+ residence
3954
+ attorneys
3955
+ milfs
3956
+ antiques
3957
+ density
3958
+ hundred
3959
+ ryan
3960
+ operators
3961
+ strange
3962
+ sustainable
3963
+ philippines
3964
+ statistical
3965
+ beds
3966
+ breasts
3967
+ mention
3968
+ innovation
3969
+ pcs
3970
+ employers
3971
+ grey
3972
+ parallel
3973
+ honda
3974
+ amended
3975
+ operate
3976
+ bills
3977
+ bold
3978
+ bathroom
3979
+ stable
3980
+ opera
3981
+ definitions
3982
+ von
3983
+ doctors
3984
+ lesson
3985
+ cinema
3986
+ asset
3987
+ ag
3988
+ scan
3989
+ elections
3990
+ drinking
3991
+ blowjobs
3992
+ reaction
3993
+ blank
3994
+ enhanced
3995
+ entitled
3996
+ severe
3997
+ generate
3998
+ stainless
3999
+ newspapers
4000
+ hospitals
4001
+ vi
4002
+ deluxe
4003
+ humor
4004
+ aged
4005
+ monitors
4006
+ exception
4007
+ lived
4008
+ duration
4009
+ bulk
4010
+ successfully
4011
+ indonesia
4012
+ pursuant
4013
+ sci
4014
+ fabric
4015
+ edt
4016
+ visits
4017
+ primarily
4018
+ tight
4019
+ domains
4020
+ capabilities
4021
+ pmid
4022
+ contrast
4023
+ recommendation
4024
+ flying
4025
+ recruitment
4026
+ sin
4027
+ berlin
4028
+ cute
4029
+ organized
4030
+ ba
4031
+ para
4032
+ siemens
4033
+ adoption
4034
+ improving
4035
+ cr
4036
+ expensive
4037
+ meant
4038
+ capture
4039
+ pounds
4040
+ buffalo
4041
+ organisations
4042
+ plane
4043
+ pg
4044
+ explained
4045
+ seed
4046
+ programmes
4047
+ desire
4048
+ expertise
4049
+ mechanism
4050
+ camping
4051
+ ee
4052
+ jewellery
4053
+ meets
4054
+ welfare
4055
+ peer
4056
+ caught
4057
+ eventually
4058
+ marked
4059
+ driven
4060
+ measured
4061
+ medline
4062
+ bottle
4063
+ agreements
4064
+ considering
4065
+ innovative
4066
+ marshall
4067
+ massage
4068
+ rubber
4069
+ conclusion
4070
+ closing
4071
+ tampa
4072
+ thousand
4073
+ meat
4074
+ legend
4075
+ grace
4076
+ susan
4077
+ ing
4078
+ ks
4079
+ adams
4080
+ python
4081
+ monster
4082
+ alex
4083
+ bang
4084
+ villa
4085
+ bone
4086
+ columns
4087
+ disorders
4088
+ bugs
4089
+ collaboration
4090
+ hamilton
4091
+ detection
4092
+ ftp
4093
+ cookies
4094
+ inner
4095
+ formation
4096
+ tutorial
4097
+ med
4098
+ engineers
4099
+ entity
4100
+ cruises
4101
+ gate
4102
+ holder
4103
+ proposals
4104
+ moderator
4105
+ sw
4106
+ tutorials
4107
+ settlement
4108
+ portugal
4109
+ lawrence
4110
+ roman
4111
+ duties
4112
+ valuable
4113
+ erotic
4114
+ tone
4115
+ collectables
4116
+ ethics
4117
+ forever
4118
+ dragon
4119
+ busy
4120
+ captain
4121
+ fantastic
4122
+ imagine
4123
+ brings
4124
+ heating
4125
+ leg
4126
+ neck
4127
+ hd
4128
+ wing
4129
+ governments
4130
+ purchasing
4131
+ scripts
4132
+ abc
4133
+ stereo
4134
+ appointed
4135
+ taste
4136
+ dealing
4137
+ commit
4138
+ tiny
4139
+ operational
4140
+ rail
4141
+ airlines
4142
+ liberal
4143
+ livecam
4144
+ jay
4145
+ trips
4146
+ gap
4147
+ sides
4148
+ tube
4149
+ turns
4150
+ corresponding
4151
+ descriptions
4152
+ cache
4153
+ belt
4154
+ jacket
4155
+ determination
4156
+ animation
4157
+ oracle
4158
+ er
4159
+ matthew
4160
+ lease
4161
+ productions
4162
+ aviation
4163
+ hobbies
4164
+ proud
4165
+ excess
4166
+ disaster
4167
+ console
4168
+ commands
4169
+ jr
4170
+ telecommunications
4171
+ instructor
4172
+ giant
4173
+ achieved
4174
+ injuries
4175
+ shipped
4176
+ bestiality
4177
+ seats
4178
+ approaches
4179
+ biz
4180
+ alarm
4181
+ voltage
4182
+ anthony
4183
+ nintendo
4184
+ usual
4185
+ loading
4186
+ stamps
4187
+ appeared
4188
+ franklin
4189
+ angle
4190
+ rob
4191
+ vinyl
4192
+ highlights
4193
+ mining
4194
+ designers
4195
+ melbourne
4196
+ ongoing
4197
+ worst
4198
+ imaging
4199
+ betting
4200
+ scientists
4201
+ liberty
4202
+ wyoming
4203
+ blackjack
4204
+ argentina
4205
+ era
4206
+ convert
4207
+ possibility
4208
+ analyst
4209
+ commissioner
4210
+ dangerous
4211
+ garage
4212
+ exciting
4213
+ reliability
4214
+ thongs
4215
+ gcc
4216
+ unfortunately
4217
+ respectively
4218
+ volunteers
4219
+ attachment
4220
+ ringtone
4221
+ finland
4222
+ morgan
4223
+ derived
4224
+ pleasure
4225
+ honor
4226
+ asp
4227
+ oriented
4228
+ eagle
4229
+ desktops
4230
+ pants
4231
+ columbus
4232
+ nurse
4233
+ prayer
4234
+ appointment
4235
+ workshops
4236
+ hurricane
4237
+ quiet
4238
+ luck
4239
+ postage
4240
+ producer
4241
+ represented
4242
+ mortgages
4243
+ dial
4244
+ responsibilities
4245
+ cheese
4246
+ comic
4247
+ carefully
4248
+ jet
4249
+ productivity
4250
+ investors
4251
+ crown
4252
+ par
4253
+ underground
4254
+ diagnosis
4255
+ maker
4256
+ crack
4257
+ principle
4258
+ picks
4259
+ vacations
4260
+ gang
4261
+ semester
4262
+ calculated
4263
+ cumshot
4264
+ fetish
4265
+ applies
4266
+ casinos
4267
+ appearance
4268
+ smoke
4269
+ apache
4270
+ filters
4271
+ incorporated
4272
+ nv
4273
+ craft
4274
+ cake
4275
+ notebooks
4276
+ apart
4277
+ fellow
4278
+ blind
4279
+ lounge
4280
+ mad
4281
+ algorithm
4282
+ semi
4283
+ coins
4284
+ andy
4285
+ gross
4286
+ strongly
4287
+ cafe
4288
+ valentine
4289
+ hilton
4290
+ ken
4291
+ proteins
4292
+ horror
4293
+ su
4294
+ exp
4295
+ familiar
4296
+ capable
4297
+ douglas
4298
+ debian
4299
+ till
4300
+ involving
4301
+ pen
4302
+ investing
4303
+ christopher
4304
+ admission
4305
+ epson
4306
+ shoe
4307
+ elected
4308
+ carrying
4309
+ victory
4310
+ sand
4311
+ madison
4312
+ terrorism
4313
+ joy
4314
+ editions
4315
+ cpu
4316
+ mainly
4317
+ ethnic
4318
+ ran
4319
+ parliament
4320
+ actor
4321
+ finds
4322
+ seal
4323
+ situations
4324
+ fifth
4325
+ allocated
4326
+ citizen
4327
+ vertical
4328
+ corrections
4329
+ structural
4330
+ municipal
4331
+ describes
4332
+ prize
4333
+ sr
4334
+ occurs
4335
+ jon
4336
+ absolute
4337
+ disabilities
4338
+ consists
4339
+ anytime
4340
+ substance
4341
+ prohibited
4342
+ addressed
4343
+ lies
4344
+ pipe
4345
+ soldiers
4346
+ nr
4347
+ guardian
4348
+ lecture
4349
+ simulation
4350
+ layout
4351
+ initiatives
4352
+ ill
4353
+ concentration
4354
+ classics
4355
+ lbs
4356
+ lay
4357
+ interpretation
4358
+ horses
4359
+ lol
4360
+ dirty
4361
+ deck
4362
+ wayne
4363
+ donate
4364
+ taught
4365
+ bankruptcy
4366
+ mp
4367
+ worker
4368
+ optimization
4369
+ alive
4370
+ temple
4371
+ substances
4372
+ prove
4373
+ discovered
4374
+ wings
4375
+ breaks
4376
+ genetic
4377
+ restrictions
4378
+ participating
4379
+ waters
4380
+ promise
4381
+ thin
4382
+ exhibition
4383
+ prefer
4384
+ ridge
4385
+ cabinet
4386
+ modem
4387
+ harris
4388
+ mph
4389
+ bringing
4390
+ sick
4391
+ dose
4392
+ evaluate
4393
+ tiffany
4394
+ tropical
4395
+ collect
4396
+ bet
4397
+ composition
4398
+ toyota
4399
+ streets
4400
+ nationwide
4401
+ vector
4402
+ definitely
4403
+ shaved
4404
+ turning
4405
+ buffer
4406
+ purple
4407
+ existence
4408
+ commentary
4409
+ larry
4410
+ limousines
4411
+ developments
4412
+ def
4413
+ immigration
4414
+ destinations
4415
+ lets
4416
+ mutual
4417
+ pipeline
4418
+ necessarily
4419
+ syntax
4420
+ li
4421
+ attribute
4422
+ prison
4423
+ skill
4424
+ chairs
4425
+ nl
4426
+ everyday
4427
+ apparently
4428
+ surrounding
4429
+ mountains
4430
+ moves
4431
+ popularity
4432
+ inquiry
4433
+ ethernet
4434
+ checked
4435
+ exhibit
4436
+ throw
4437
+ trend
4438
+ sierra
4439
+ visible
4440
+ cats
4441
+ desert
4442
+ postposted
4443
+ ya
4444
+ oldest
4445
+ rhode
4446
+ nba
4447
+ busty
4448
+ coordinator
4449
+ obviously
4450
+ mercury
4451
+ steven
4452
+ handbook
4453
+ greg
4454
+ navigate
4455
+ worse
4456
+ summit
4457
+ victims
4458
+ epa
4459
+ spaces
4460
+ fundamental
4461
+ burning
4462
+ escape
4463
+ coupons
4464
+ somewhat
4465
+ receiver
4466
+ substantial
4467
+ tr
4468
+ progressive
4469
+ cialis
4470
+ bb
4471
+ boats
4472
+ glance
4473
+ scottish
4474
+ championship
4475
+ arcade
4476
+ richmond
4477
+ sacramento
4478
+ impossible
4479
+ ron
4480
+ russell
4481
+ tells
4482
+ obvious
4483
+ fiber
4484
+ depression
4485
+ graph
4486
+ covering
4487
+ platinum
4488
+ judgment
4489
+ bedrooms
4490
+ talks
4491
+ filing
4492
+ foster
4493
+ modeling
4494
+ passing
4495
+ awarded
4496
+ testimonials
4497
+ trials
4498
+ tissue
4499
+ nz
4500
+ memorabilia
4501
+ clinton
4502
+ masters
4503
+ bonds
4504
+ cartridge
4505
+ alberta
4506
+ explanation
4507
+ folk
4508
+ org
4509
+ commons
4510
+ cincinnati
4511
+ subsection
4512
+ fraud
4513
+ electricity
4514
+ permitted
4515
+ spectrum
4516
+ arrival
4517
+ okay
4518
+ pottery
4519
+ emphasis
4520
+ roger
4521
+ aspect
4522
+ workplace
4523
+ awesome
4524
+ mexican
4525
+ confirmed
4526
+ counts
4527
+ priced
4528
+ wallpapers
4529
+ hist
4530
+ crash
4531
+ lift
4532
+ desired
4533
+ inter
4534
+ closer
4535
+ assumes
4536
+ heights
4537
+ shadow
4538
+ riding
4539
+ infection
4540
+ firefox
4541
+ lisa
4542
+ expense
4543
+ grove
4544
+ eligibility
4545
+ venture
4546
+ clinic
4547
+ korean
4548
+ healing
4549
+ princess
4550
+ mall
4551
+ entering
4552
+ packet
4553
+ spray
4554
+ studios
4555
+ involvement
4556
+ dad
4557
+ buttons
4558
+ placement
4559
+ observations
4560
+ vbulletin
4561
+ funded
4562
+ thompson
4563
+ winners
4564
+ extend
4565
+ roads
4566
+ subsequent
4567
+ pat
4568
+ dublin
4569
+ rolling
4570
+ fell
4571
+ motorcycle
4572
+ yard
4573
+ disclosure
4574
+ establishment
4575
+ memories
4576
+ nelson
4577
+ te
4578
+ arrived
4579
+ creates
4580
+ faces
4581
+ tourist
4582
+ cocks
4583
+ av
4584
+ mayor
4585
+ murder
4586
+ sean
4587
+ adequate
4588
+ senator
4589
+ yield
4590
+ presentations
4591
+ grades
4592
+ cartoons
4593
+ pour
4594
+ digest
4595
+ reg
4596
+ lodging
4597
+ tion
4598
+ dust
4599
+ hence
4600
+ wiki
4601
+ entirely
4602
+ replaced
4603
+ radar
4604
+ rescue
4605
+ undergraduate
4606
+ losses
4607
+ combat
4608
+ reducing
4609
+ stopped
4610
+ occupation
4611
+ lakes
4612
+ butt
4613
+ donations
4614
+ associations
4615
+ citysearch
4616
+ closely
4617
+ radiation
4618
+ diary
4619
+ seriously
4620
+ kings
4621
+ shooting
4622
+ kent
4623
+ adds
4624
+ nsw
4625
+ ear
4626
+ flags
4627
+ pci
4628
+ baker
4629
+ launched
4630
+ elsewhere
4631
+ pollution
4632
+ conservative
4633
+ guestbook
4634
+ shock
4635
+ effectiveness
4636
+ walls
4637
+ abroad
4638
+ ebony
4639
+ tie
4640
+ ward
4641
+ drawn
4642
+ arthur
4643
+ ian
4644
+ visited
4645
+ roof
4646
+ walker
4647
+ demonstrate
4648
+ atmosphere
4649
+ suggests
4650
+ kiss
4651
+ beast
4652
+ ra
4653
+ operated
4654
+ experiment
4655
+ targets
4656
+ overseas
4657
+ purchases
4658
+ dodge
4659
+ counsel
4660
+ federation
4661
+ pizza
4662
+ invited
4663
+ yards
4664
+ assignment
4665
+ chemicals
4666
+ gordon
4667
+ mod
4668
+ farmers
4669
+ rc
4670
+ queries
4671
+ bmw
4672
+ rush
4673
+ ukraine
4674
+ absence
4675
+ nearest
4676
+ cluster
4677
+ vendors
4678
+ mpeg
4679
+ whereas
4680
+ yoga
4681
+ serves
4682
+ woods
4683
+ surprise
4684
+ lamp
4685
+ rico
4686
+ partial
4687
+ shoppers
4688
+ phil
4689
+ everybody
4690
+ couples
4691
+ nashville
4692
+ ranking
4693
+ jokes
4694
+ cst
4695
+ http
4696
+ ceo
4697
+ simpson
4698
+ twiki
4699
+ sublime
4700
+ counseling
4701
+ palace
4702
+ acceptable
4703
+ satisfied
4704
+ glad
4705
+ wins
4706
+ measurements
4707
+ verify
4708
+ globe
4709
+ trusted
4710
+ copper
4711
+ milwaukee
4712
+ rack
4713
+ medication
4714
+ warehouse
4715
+ shareware
4716
+ ec
4717
+ rep
4718
+ dicke
4719
+ kerry
4720
+ receipt
4721
+ supposed
4722
+ ordinary
4723
+ nobody
4724
+ ghost
4725
+ violation
4726
+ configure
4727
+ stability
4728
+ mit
4729
+ applying
4730
+ southwest
4731
+ boss
4732
+ pride
4733
+ institutional
4734
+ expectations
4735
+ independence
4736
+ knowing
4737
+ reporter
4738
+ metabolism
4739
+ keith
4740
+ champion
4741
+ cloudy
4742
+ linda
4743
+ ross
4744
+ personally
4745
+ chile
4746
+ anna
4747
+ plenty
4748
+ solo
4749
+ sentence
4750
+ throat
4751
+ ignore
4752
+ maria
4753
+ uniform
4754
+ excellence
4755
+ wealth
4756
+ tall
4757
+ rm
4758
+ somewhere
4759
+ vacuum
4760
+ dancing
4761
+ attributes
4762
+ recognize
4763
+ brass
4764
+ writes
4765
+ plaza
4766
+ pdas
4767
+ outcomes
4768
+ survival
4769
+ quest
4770
+ publish
4771
+ sri
4772
+ screening
4773
+ toe
4774
+ thumbnail
4775
+ trans
4776
+ jonathan
4777
+ whenever
4778
+ nova
4779
+ lifetime
4780
+ api
4781
+ pioneer
4782
+ booty
4783
+ forgotten
4784
+ acrobat
4785
+ plates
4786
+ acres
4787
+ venue
4788
+ athletic
4789
+ thermal
4790
+ essays
4791
+ behaviour
4792
+ vital
4793
+ telling
4794
+ fairly
4795
+ coastal
4796
+ config
4797
+ cf
4798
+ charity
4799
+ intelligent
4800
+ edinburgh
4801
+ vt
4802
+ excel
4803
+ modes
4804
+ obligation
4805
+ campbell
4806
+ wake
4807
+ stupid
4808
+ harbor
4809
+ hungary
4810
+ traveler
4811
+ urw
4812
+ segment
4813
+ realize
4814
+ regardless
4815
+ lan
4816
+ enemy
4817
+ puzzle
4818
+ rising
4819
+ aluminum
4820
+ wells
4821
+ wishlist
4822
+ opens
4823
+ insight
4824
+ sms
4825
+ shit
4826
+ restricted
4827
+ republican
4828
+ secrets
4829
+ lucky
4830
+ latter
4831
+ merchants
4832
+ thick
4833
+ trailers
4834
+ repeat
4835
+ syndrome
4836
+ philips
4837
+ attendance
4838
+ penalty
4839
+ drum
4840
+ glasses
4841
+ enables
4842
+ nec
4843
+ iraqi
4844
+ builder
4845
+ vista
4846
+ jessica
4847
+ chips
4848
+ terry
4849
+ flood
4850
+ foto
4851
+ ease
4852
+ arguments
4853
+ amsterdam
4854
+ orgy
4855
+ arena
4856
+ adventures
4857
+ pupils
4858
+ stewart
4859
+ announcement
4860
+ tabs
4861
+ outcome
4862
+ xx
4863
+ appreciate
4864
+ expanded
4865
+ casual
4866
+ grown
4867
+ polish
4868
+ lovely
4869
+ extras
4870
+ gm
4871
+ centres
4872
+ jerry
4873
+ clause
4874
+ smile
4875
+ lands
4876
+ ri
4877
+ troops
4878
+ indoor
4879
+ bulgaria
4880
+ armed
4881
+ broker
4882
+ charger
4883
+ regularly
4884
+ believed
4885
+ pine
4886
+ cooling
4887
+ tend
4888
+ gulf
4889
+ rt
4890
+ rick
4891
+ trucks
4892
+ cp
4893
+ mechanisms
4894
+ divorce
4895
+ laura
4896
+ shopper
4897
+ tokyo
4898
+ partly
4899
+ nikon
4900
+ customize
4901
+ tradition
4902
+ candy
4903
+ pills
4904
+ tiger
4905
+ donald
4906
+ folks
4907
+ sensor
4908
+ exposed
4909
+ telecom
4910
+ hunt
4911
+ angels
4912
+ deputy
4913
+ indicators
4914
+ sealed
4915
+ thai
4916
+ emissions
4917
+ physicians
4918
+ loaded
4919
+ fred
4920
+ complaint
4921
+ scenes
4922
+ experiments
4923
+ balls
4924
+ afghanistan
4925
+ dd
4926
+ boost
4927
+ spanking
4928
+ scholarship
4929
+ governance
4930
+ mill
4931
+ founded
4932
+ supplements
4933
+ chronic
4934
+ icons
4935
+ tranny
4936
+ moral
4937
+ den
4938
+ catering
4939
+ aud
4940
+ finger
4941
+ keeps
4942
+ pound
4943
+ locate
4944
+ camcorder
4945
+ pl
4946
+ trained
4947
+ burn
4948
+ implementing
4949
+ roses
4950
+ labs
4951
+ ourselves
4952
+ bread
4953
+ tobacco
4954
+ wooden
4955
+ motors
4956
+ tough
4957
+ roberts
4958
+ incident
4959
+ gonna
4960
+ dynamics
4961
+ lie
4962
+ crm
4963
+ rf
4964
+ conversation
4965
+ decrease
4966
+ cumshots
4967
+ chest
4968
+ pension
4969
+ billy
4970
+ revenues
4971
+ emerging
4972
+ worship
4973
+ bukkake
4974
+ capability
4975
+ ak
4976
+ fe
4977
+ craig
4978
+ herself
4979
+ producing
4980
+ churches
4981
+ precision
4982
+ damages
4983
+ reserves
4984
+ contributed
4985
+ solve
4986
+ shorts
4987
+ reproduction
4988
+ minority
4989
+ td
4990
+ diverse
4991
+ amp
4992
+ ingredients
4993
+ sb
4994
+ ah
4995
+ johnny
4996
+ sole
4997
+ franchise
4998
+ recorder
4999
+ complaints
5000
+ facing
5001
+ sm
5002
+ nancy
5003
+ promotions
5004
+ tones
5005
+ passion
5006
+ rehabilitation
5007
+ maintaining
5008
+ sight
5009
+ laid
5010
+ clay
5011
+ defence
5012
+ patches
5013
+ weak
5014
+ refund
5015
+ usc
5016
+ towns
5017
+ environments
5018
+ trembl
5019
+ divided
5020
+ blvd
5021
+ reception
5022
+ amd
5023
+ wise
5024
+ emails
5025
+ cyprus
5026
+ wv
5027
+ odds
5028
+ correctly
5029
+ insider
5030
+ seminars
5031
+ consequences
5032
+ makers
5033
+ `.split(/\r?\n/).map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)),C={zero:0,one:1,two:2,three:3,four:4,five:5,six:6,seven:7,eight:8,nine:9,ten:10,eleven:11,twelve:12,thirteen:13,fourteen:14,fifteen:15,sixteen:16,seventeen:17,eighteen:18,nineteen:19},w={twenty:20,thirty:30,forty:40,fifty:50,sixty:60,seventy:70,eighty:80,ninety:90},T={first:1,second:2,third:3,fourth:4,fifth:5,sixth:6,seventh:7,eighth:8,ninth:9,tenth:10,eleventh:11,twelfth:12,thirteenth:13,fourteenth:14,fifteenth:15,sixteenth:16,seventeenth:17,eighteenth:18,nineteenth:19,twentieth:20,thirtieth:30,fortieth:40,fiftieth:50,sixtieth:60,seventieth:70,eightieth:80,ninetieth:90,hundredth:100};function ie(e){let t=e;t=t.replace(/\b(?:a|an|one)\s+hundredth\b/gi,`100`),t=t.replace(/\b(?:a|an|one)\s+hundred\b/gi,`100`);let n=Object.keys(w).join(`|`),r=Object.keys(C).filter(e=>C[e]>=1&&C[e]<=9).join(`|`),i=Object.keys(T).filter(e=>T[e]>=1&&T[e]<=9).join(`|`);t=t.replace(RegExp(`\\b(${n})[\\s-](${r})\\b`,`gi`),(e,t,n)=>String(w[t.toLowerCase()]+C[n.toLowerCase()])),t=t.replace(RegExp(`\\b(${n})[\\s-](${i})\\b`,`gi`),(e,t,n)=>String(w[t.toLowerCase()]+T[n.toLowerCase()]));let a=Object.keys(T).join(`|`);t=t.replace(RegExp(`\\b(${a})\\b`,`gi`),e=>String(T[e.toLowerCase()])),t=t.replace(RegExp(`\\b(${n})\\b`,`gi`),e=>String(w[e.toLowerCase()]));let o=Object.keys(C).join(`|`);return t=t.replace(RegExp(`\\b(${o})\\b`,`gi`),e=>String(C[e.toLowerCase()])),t}var E=String.raw`\d{1,3}(?:,\d{3})+(?:\.\d+)?|\d+(?:\.\d+)?`,D=new RegExp(E,`g`);function O(e){let t=ie(e);t=t.replace(/\b(\d+)(?:st|nd|rd|th)\b/gi,`$1`),t=t.replace(new RegExp(String.raw`[$€£]\s?(${E})`,`g`),(e,t)=>t),t=t.replace(new RegExp(String.raw`\b(?:USD|EUR|GBP)\s?(${E})`,`gi`),(e,t)=>t),t=t.replace(new RegExp(String.raw`(${E})\s?(?:USD|EUR|GBP)\b`,`gi`),(e,t)=>t),t=t.replace(new RegExp(String.raw`(${E})\s+(?:dollars?|cents?|pounds?|euros?)\b`,`gi`),(e,t)=>t),t=t.replace(new RegExp(String.raw`(${E})\s?%`,`g`),(e,t)=>t),t=t.replace(new RegExp(String.raw`(${E})\s+per\s?cent\b`,`gi`),(e,t)=>t),t=t.replace(new RegExp(String.raw`(${E})\s+percent\b`,`gi`),(e,t)=>t);let n=new Set;for(let e of t.match(D)??[])n.add(e.replace(/,/g,``));return n}var ae=new Set([`The`,`A`,`An`,`It`,`They`,`This`,`These`,`That`,`We`,`He`,`She`,`I`,`You`,`Here`,`There`,`Then`].map(e=>e.toLowerCase())),k=new Set([`.`,`!`,`?`,`:`,`;`,`—`]),A=new Set([`"`,`'`,`“`,`‘`]);function j(e){return e.replace(/^[^\p{L}\p{N}]+/u,``).replace(/[^\p{L}\p{N}]+$/u,``)}function oe(e){return e.length>=2&&e.length<=5&&/^\p{Lu}+$/u.test(e)}var se=new Set([`USD`,`EUR`,`GBP`,`JPY`,`CNY`,`INR`,`CAD`,`AUD`,`CHF`,`MXN`]);function ce(e,t,n){if(e.length===0||se.has(e)||!/\p{Lu}/u.test(e[0])||oe(e)&&n.has(e.toLowerCase()))return!1;if(!t)return!0;let r=e.toLowerCase();return!(n.has(r)||ae.has(r))}function le(e,t=S){let n=e.split(/\s+/).filter(e=>e.length>0),r=[];for(let e=0;e<n.length;e++){let i=n[e],a=j(i);if(!a)continue;let o=e>0?n[e-1]:null;ce(a,e===0||o!==null&&k.has(o[o.length-1])||A.has(i[0]),t)&&r.push(a)}return r}function M(e){let t=e.replace(/['’]s$/i,``).toLowerCase(),n=t.split(`-`).filter(e=>e.length>0);return n.length>1?[t,...n]:[t]}function ue(e){let t=new Set;for(let n of e.split(/\s+/)){let e=j(n);if(e)for(let n of M(e))t.add(n)}return t}function N(e,t){let n=M(e),r=n[0];return t.has(r)?!0:n.length>1&&n.slice(1).every(e=>t.has(e))}function P(e,t,n){let r=[],i=O(e),a=O(t);for(let e of i)a.has(e)||r.push(`number_not_in_source:${e}`);let o=le(e,n),s=ue(t);for(let e of o)N(e,s)||r.push(`name_not_in_source:${e}`);return{ok:r.length===0,reasons:r}}var F=new Map;function I(n=r().web.summarizer){let i=F.get(n.id);return i||(t(),i=e.from_pretrained(n.id,{revision:n.revision}).catch(e=>{throw F.delete(n.id),e}),F.set(n.id,i)),i}async function L(e,t){return R(await I(t),e)}function R(e,t){if(t.length===0)return 0;let{input_ids:n}=e(t,{add_special_tokens:!1});return n.dims.at(-1)??0}function z(e=typeof location<`u`?location.search:``){let t=new URLSearchParams(e),n=t.get(`inject`),r=Number(t.get(`chunk`));return{llm:t.get(`llm`)===`fake`?`fake`:`real`,inject:n===`nogpu`||n===`devicelost`||n===`oom`?n:null,delay_ms:Math.max(0,Number(t.get(`delay`)??0)||0),fake:t.get(`fake`),model:t.get(`model`),prompt:t.get(`prompt`)===`system`?`system`:`default`,chunk:Number.isFinite(r)&&r>0?r:null}}async function B(e=null){let t={ok:!1,available:!1,adapter:!1,device:!1,f16:!1,reason:`no_navigator_gpu`};if(e===`nogpu`)return{...t,reason:`injected_nogpu`};let n=navigator.gpu;if(!n)return t;t.available=!0;try{let e=await n.requestAdapter();if(!e)return{...t,reason:`no_adapter`};t.adapter=!0,t.f16=e.features.has(`shader-f16`);let r=await e.requestDevice();t.device=!!r,r.destroy()}catch{return{...t,reason:t.adapter?`no_device`:`no_adapter`}}return t.ok=t.device,t.reason=t.ok?`ok`:`no_device`,t}var V={chunk_input_tokens:1600,max_chunks:100},H=15e3,de=new Map(i.levels.map(e=>[e.id,e])),U={"prompts/short.md":a,"prompts/caveman.md":o,"prompts/oneline.md":s,"prompts/reduce-oneline.md":c},fe=`You write summaries for people who tire when reading. Obey the bullet count exactly. Output only the bullet lines, nothing before or after.`;function W(){return{level:null,level_used:null,chunks:0,bullets_total:0,bullets_cut:0,all_cut_chunks:0,parser_dropped:0,parser_overlength:0,reduce_calls:0,ttfa_ms:null,gen_ms:0,tokens:0,tok_s:null,model_id:null,role:null,downgraded:!1,load_ms:null,probe_ms:null,per_chunk_kept:[]}}var pe=class{flags;state=`idle`;gpu=null;error=null;worker=null;runId=0;loaded=!1;modelSpec=null;pending=null;loading=null;drain=null;stopDuringProbe=!1;runOpts=null;waiters=new Map;modelRequests=0;runStats=W();notices=[];lastProgress=null;onNotice=null;onProgress=null;constructor(e=z()){this.flags=e}tier(){let e=n();return e.find(e=>e.role===this.flags.model)??e[0]}sizeMb(){return Math.round(this.tier().files.reduce((e,t)=>e+t.bytes,0)/1e6)}requests(){return this.modelRequests}stats(){return{...this.runStats,per_chunk_kept:[...this.runStats.per_chunk_kept]}}noticesSeen(){return[...this.notices]}notice(e){this.notices.push(e),this.onNotice?.(e),this.runOpts?.onNotice?.(e)}probeP=null;probe(){return this.gpu?Promise.resolve(this.gpu):(this.probeP||=this.probeOnce().finally(()=>{this.probeP=null}),this.probeP)}async probeOnce(){return this.state=`probing`,this.gpu=await B(this.flags.inject),this.flags.llm===`fake`&&(this.gpu={...this.gpu,ok:!0,reason:`ok`}),this.gpu.ok?this.state=`idle`:(this.state=`failed`,this.error=`webgpu:${this.gpu.reason}`,this.notice({key:`notice.no_webgpu`})),this.gpu}ensureWorker(){return this.worker?this.worker:(this.worker=this.flags.llm===`fake`?new Worker(new URL(`/assets/llm.fake.worker-Bfzc_8yA.js`,``+import.meta.url),{type:`module`}):new Worker(new URL(`/assets/llm.worker-BQNPMMLY.js`,``+import.meta.url),{type:`module`}),this.worker.onmessage=e=>this.onWorkerMessage(e.data),this.worker.onerror=e=>{this.worker?.terminate(),this.worker=null,this.loaded=!1,this.state=`failed`,this.error=`worker:${e.message}`,this.pending?.reject(Error(this.error)),this.pending=null;for(let e of this.waiters.values())e.reject(Error(this.error));this.waiters.clear()},this.worker)}post(e){this.ensureWorker().postMessage(e)}waitFor(e,t){return new Promise((n,r)=>this.waiters.set(`${e}:${t}`,{resolve:n,reject:r}))}onWorkerMessage(e){if(e.type===`aborted`){let t=this.waiters.get(`aborted:${e.runId}`);t&&(this.waiters.delete(`aborted:${e.runId}`),t.resolve(e))}if(e.runId!==this.runId)return;if(e.type===`progress`){e.status===`initiate`&&this.modelRequests++,(e.status===`progress`||e.status===`download`)&&(this.lastProgress={file:e.file,loaded:e.loaded,total:e.total},this.onProgress?.(this.lastProgress));return}if(e.type===`token`){this.pending&&this.pending.chunkIndex===e.chunkIndex&&this.pending.onToken(e.text);return}if(e.type===`chunk_done`){let t=this.pending;t&&t.chunkIndex===e.chunkIndex&&(this.pending=null,t.resolve({tokens:e.tokens,ms:e.ms,aborted:!1}));return}if(e.type===`aborted`){let e=this.pending;this.pending=null,e?.resolve({tokens:0,ms:0,aborted:!0});return}if(e.type===`error`){let t=Error(`${e.name}: ${e.message}`),n=this.pending;this.pending=null,n?.reject(t);for(let e of this.waiters.values())e.reject(t);this.waiters.clear(),this.worker?.terminate(),this.worker=null,this.loaded=!1;return}let t=this.waiters.get(`${e.type}:${e.runId}`);t&&(this.waiters.delete(`${e.type}:${e.runId}`),t.resolve(e))}async ensureLoaded(e={}){if(this.loaded)return!0;if(this.drain&&await this.drain,e.signal?.aborted)return!1;if(this.loading){let t=()=>this.abort();e.signal?.addEventListener(`abort`,t,{once:!0});try{return await this.loading}finally{e.signal?.removeEventListener(`abort`,t)}}let t=this.loadOnce(e);this.loading=t;try{return await t}finally{this.loading===t&&(this.loading=null)}}async loadOnce(e){if(this.stopDuringProbe=!1,!(await this.probe()).ok)return!1;if(e.signal?.aborted||this.stopDuringProbe)return this.stopDuringProbe=!1,this.state=`stopped`,this.error=`aborted`,this.notice({key:`notice.stopped`}),!1;this.state=`loading`;let t=++this.runId,n=this.tier();this.modelSpec=n;let r=()=>this.abort();e.signal?.addEventListener(`abort`,r,{once:!0});try{let e=performance.now(),r=this.waitFor(`loaded`,t);this.post({type:`load`,runId:t,model:n,inject:this.flags.inject});let i=await r;this.runStats.model_id=i.modelId,this.runStats.role=i.role,this.runStats.downgraded=i.downgraded,this.runStats.load_ms=Math.round(performance.now()-e),i.downgraded&&this.notice({key:`notice.low_end_tier`});let a=this.waitFor(`probe_result`,t);this.post({type:`probe`,runId:t});let o=await a;return this.runStats.probe_ms=o.ms,o.ok?(this.loaded=!0,this.state=`idle`,!0):(this.state=`failed`,this.error=`probe:${o.error??`failed`}`,this.notice({key:`notice.probe_failed`}),!1)}catch(e){return e instanceof Error&&e.name===`AbortError`?(this.state=`stopped`,this.error=`aborted`,this.notice({key:`notice.stopped`}),!1):(this.state=`failed`,this.error=e instanceof Error?e.message:String(e),this.notice({key:this.error.startsWith(`OutOfMemory`)?`notice.probe_failed`:`error.model_download`}),!1)}finally{e.signal?.removeEventListener(`abort`,r)}}stopped(){return this.state===`stopped`}countTokens=e=>this.flags.llm===`fake`?Math.ceil(e.split(/\s+/).filter(Boolean).length*1.3):L(e,this.activeTier());activeTier(){return n().find(e=>e.role===this.runStats.role)??this.modelSpec??this.tier()}levelCfg(e){let t=de.get(e);if(!t||!t.prompt)throw Error(`unknown level ${e}`);return{max_bullets_per_chunk:6,max_words_per_bullet:18,max_new_tokens:220,...t}}generate(e,t,n,r,i,a,o){return new Promise((s,c)=>{this.pending={runId:e,chunkIndex:t,onToken:o,resolve:s,reject:c};let l={type:`generate`,runId:e,chunkIndex:t,user:n,maxNewTokens:a};this.flags.prompt===`system`&&(l.system=fe),this.flags.llm===`fake`&&(l.fake={key:this.flags.fake,level:r,text:i,delay_ms:this.flags.delay_ms}),this.post(l)})}abort(){if(this.state===`probing`){this.stopDuringProbe=!0;return}if(this.state!==`running`&&this.state!==`loading`)return;let e=this.runId;this.state=`stopped`,this.post({type:`abort`,runId:e}),this.pending?.resolve({tokens:0,ms:0,aborted:!0}),this.pending=null;let t=Error(`aborted`);t.name=`AbortError`;for(let[n,r]of this.waiters)n.endsWith(`:${e}`)&&!n.startsWith(`aborted:`)&&(this.waiters.delete(n),r.reject(t));this.armDrain(e)}armDrain(e){let t=`aborted:${e}`,n=this.waitFor(`aborted`,e).then(()=>void 0,()=>void 0),r,i=new Promise(e=>{r=setTimeout(()=>{this.waiters.delete(t),this.resetWorker(),e()},H)}),a=Promise.race([n,i]).then(()=>{clearTimeout(r),this.drain===a&&(this.drain=null)});this.drain=a}resetWorker(){this.worker?.terminate(),this.worker=null,this.loaded=!1,this.pending=null,this.waiters.clear()}inFlight=null;summarize(e,t,n={}){let r=this.inFlight??Promise.resolve(),i=()=>(this.drain??Promise.resolve()).then(()=>this.summarizeNow(e,t,n)),a=r.then(i,i);return this.inFlight=a,a.then(()=>{this.inFlight===a&&(this.inFlight=null)},()=>{this.inFlight===a&&(this.inFlight=null)}),a}async summarizeNow(e,t,n={}){this.runOpts=n;try{return await this.summarizeRun(e,t,n)}finally{this.runOpts===n&&(this.runOpts=null)}}async summarizeRun(e,t,n){if(n.signal?.aborted){let e=this.runStats;return this.runStats={...W(),model_id:e.model_id,role:e.role,downgraded:e.downgraded,load_ms:e.load_ms,probe_ms:e.probe_ms,level:t},this.state=`stopped`,this.error=`aborted`,this.stats()}if(!await this.ensureLoaded({signal:n.signal}))return this.stats();let r=++this.runId,i=performance.now(),a=this.runStats;this.runStats={...W(),model_id:a.model_id,role:a.role,downgraded:a.downgraded,load_ms:a.load_ms,probe_ms:a.probe_ms,level:t},this.state=`running`,this.error=null;let o=()=>this.abort();n.signal?.addEventListener(`abort`,o,{once:!0});try{let a={...V,chunk_input_tokens:this.flags.chunk??V.chunk_input_tokens},o;try{o=await y(f(e),this.countTokens,a)}catch(e){if(e instanceof v)return this.notice({key:`notice.input_limit`}),this.state=`failed`,this.error=`input_limit`,this.stats();throw e}this.runStats.chunks=o.length;let s=e=>{this.runStats.ttfa_ms===null&&(this.runStats.ttfa_ms=Math.round(performance.now()-i)),n.onBullet?.(e)},c;return c=t===`oneline`?await this.oneLine(r,o,s,n):await this.perChunk(r,o,t,s,n),this.stopped()||c&&(this.runStats.tok_s=this.runStats.gen_ms>0?Math.round(this.runStats.tokens/(this.runStats.gen_ms/1e3)*10)/10:null,this.state=`done`),this.stats()}catch(e){return this.stopped()?this.stats():(this.state=`failed`,this.error=e instanceof Error?e.message:String(e),this.notice({key:`error.generation`}),this.stats())}finally{n.signal?.removeEventListener(`abort`,o)}}async perChunk(e,t,n,r,i){let a=this.levelCfg(n),o=U[a.prompt];this.runStats.level_used=n;for(let s of t){if(e!==this.runId||this.state===`stopped`)return!1;let t=new x({max_bullets_per_chunk:a.max_bullets_per_chunk,max_words_per_bullet:a.max_words_per_bullet}),c=0,l=e=>{this.runStats.bullets_total++,P(e.text,s.text,S).ok?(c++,r({text:e.text,chunkIndex:s.index,index:e.index,start:s.start,end:s.end})):this.runStats.bullets_cut++},u=await this.generate(e,s.index,o.replace(`{{text}}`,()=>s.text),n,s.text,a.max_new_tokens,e=>{i.onToken?.(e);for(let n of t.push(e))l(n)});if(u.aborted)return!1;for(let e of t.flush())l(e);this.runStats.parser_dropped+=t.dropped,this.runStats.parser_overlength+=t.overlength,this.runStats.tokens+=u.tokens,this.runStats.gen_ms+=u.ms,this.runStats.per_chunk_kept.push(c),c===0&&(this.runStats.all_cut_chunks++,this.notice({key:`notice.all_cut`,chunkIndex:s.index,start:s.start,end:s.end}))}return!0}async oneLine(e,t,n,r){let i=this.levelCfg(`oneline`),a=i.reduce??{group_size:10,max_depth:2,fallback_level:`short`,max_cut_fraction:.5},o=U[i.prompt];this.runStats.level_used=`oneline`;let s=[],c=0;for(let n of t){if(e!==this.runId||this.state===`stopped`)return!1;let t=new x({max_bullets_per_chunk:1,max_words_per_bullet:i.max_words_per_bullet}),a=[],l=await this.generate(e,n.index,o.replace(`{{text}}`,()=>n.text),`oneline`,n.text,i.max_new_tokens,e=>{r.onToken?.(e);for(let n of t.push(e))a.push(n.text)});if(l.aborted)return!1;for(let e of t.flush())a.push(e.text);this.runStats.parser_dropped+=t.dropped,this.runStats.parser_overlength+=t.overlength,this.runStats.tokens+=l.tokens,this.runStats.gen_ms+=l.ms,this.runStats.bullets_total+=a.length;let u=a[0];u&&P(u,n.text,S).ok?(s.push(u),this.runStats.per_chunk_kept.push(1)):(c++,this.runStats.bullets_cut+=+!!u,this.runStats.per_chunk_kept.push(0))}let l=async()=>(this.notice({key:`notice.oneline_failed`}),this.runStats.per_chunk_kept=[],this.perChunk(e,t,a.fallback_level,n,r));if(t.length===0||c/t.length>a.max_cut_fraction||s.length===0)return l();let u=s,d=0;for(;u.length>1&&d<a.max_depth;){d++;let t=[];for(let n=0;n<u.length;n+=a.group_size){if(e!==this.runId||this.state===`stopped`)return!1;let o=u.slice(n,n+a.group_size).map(e=>`- ${e}`).join(`
5034
+ `),s=new x({max_bullets_per_chunk:1,max_words_per_bullet:i.max_words_per_bullet}),c=[];this.runStats.reduce_calls++;let l=await this.generate(e,1e3+d*100+n,U[`prompts/reduce-oneline.md`].replace(`{{lines}}`,()=>o),`oneline`,o,i.max_new_tokens,e=>{r.onToken?.(e);for(let t of s.push(e))c.push(t.text)});if(l.aborted)return!1;for(let e of s.flush())c.push(e.text);this.runStats.parser_dropped+=s.dropped,this.runStats.parser_overlength+=s.overlength,this.runStats.tokens+=l.tokens,this.runStats.gen_ms+=l.ms,this.runStats.bullets_total+=c.length;let f=c[0];f&&P(f,o,S).ok?t.push(f):f&&this.runStats.bullets_cut++}if(t.length===0)return l();u=t}let f=u[0];return n({text:f,chunkIndex:-1,index:0,start:t[0].start,end:t[t.length-1].end}),!0}},G=e=>document.getElementById(e),K=G(`status`),me=G(`text`),he=G(`level`),q=G(`bullets`),J=G(`raw`),Y=z(),X=new pe(Y),Z={bullets:[],notices:[],raw:``,aborted:!1,flags:Y,isolated:typeof crossOriginIsolated<`u`&&crossOriginIsolated,ready:!1};X.onNotice=e=>{K.textContent=`notice: ${e.key}`},X.onProgress=e=>{K.textContent=`loading ${e.file??``} ${e.loaded&&e.total?Math.round(e.loaded/e.total*100)+`%`:``}`};var Q=Promise.resolve();function $(e,t){let n=Q.then(()=>ge(e,t));return Q=n.catch(()=>void 0),n}async function ge(e,t){Z.bullets=[],Z.notices=[],Z.raw=``,Z.aborted=!1,q.replaceChildren(),J.textContent=``;let n=await X.summarize(e,t,{onNotice:e=>Z.notices.push(e),onBullet:e=>{Z.bullets.push(e);let t=document.createElement(`li`);t.textContent=e.text,q.appendChild(t)},onToken:e=>{Z.raw+=e,J.textContent=Z.raw}});return Z.aborted=X.state===`stopped`,K.textContent=`${X.state}: ${Z.bullets.length} bullets`,{bullets:Z.bullets,notices:Z.notices,raw:Z.raw,stats:n,state:X.state,error:X.error,aborted:Z.aborted}}window.__llm={probe:()=>X.probe(),load:()=>X.ensureLoaded(),summarize:$,abort:()=>X.abort(),state:()=>({state:X.state,error:X.error,gpu:X.gpu,isolated:Z.isolated,ready:Z.ready,flags:Y}),stats:()=>X.stats(),requests:()=>X.requests(),notices:()=>X.noticesSeen(),sizeMb:()=>X.sizeMb(),bullets:()=>Z.bullets},G(`go`).addEventListener(`click`,()=>void $(me.value,he.value)),G(`stop`).addEventListener(`click`,()=>X.abort()),X.probe().then(e=>{Z.ready=!0,K.textContent=`ready: webgpu=${e.ok?`yes`:`no (`+e.reason+`)`} llm=${Y.llm} size=${X.sizeMb()} MB`});
index.html CHANGED
@@ -6,8 +6,9 @@
6
  <title>Fruitbat</title>
7
  <!-- Cross-origin isolation on a static host: the service worker adds COOP/COEP (S1-00a). -->
8
  <script src="/coi-serviceworker.js"></script>
9
- <script type="module" crossorigin src="/assets/index-MrbJyoK3.js"></script>
10
- <link rel="modulepreload" crossorigin href="/assets/net-Czt2kcl5.js">
 
11
  <link rel="stylesheet" crossorigin href="/assets/index-fNqh6DMT.css">
12
  </head>
13
  <body>
 
6
  <title>Fruitbat</title>
7
  <!-- Cross-origin isolation on a static host: the service worker adds COOP/COEP (S1-00a). -->
8
  <script src="/coi-serviceworker.js"></script>
9
+ <script type="module" crossorigin src="/assets/index-DXg5mvOR.js"></script>
10
+ <link rel="modulepreload" crossorigin href="/assets/net-Lng3b-MO.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/dial-C7M2OMm7.js">
12
  <link rel="stylesheet" crossorigin href="/assets/index-fNqh6DMT.css">
13
  </head>
14
  <body>
skeleton.html CHANGED
@@ -6,8 +6,9 @@
6
  <title>Fruitbat walking skeleton</title>
7
  <!-- Cross-origin isolation on a static host: the service worker adds COOP/COEP (S1-00a). -->
8
  <script src="/coi-serviceworker.js"></script>
9
- <script type="module" crossorigin src="/assets/skeleton-BVmU5cs7.js"></script>
10
- <link rel="modulepreload" crossorigin href="/assets/net-Czt2kcl5.js">
 
11
  </head>
12
  <body>
13
  <h1>Fruitbat, walking skeleton (S1-00a)</h1>
 
6
  <title>Fruitbat walking skeleton</title>
7
  <!-- Cross-origin isolation on a static host: the service worker adds COOP/COEP (S1-00a). -->
8
  <script src="/coi-serviceworker.js"></script>
9
+ <script type="module" crossorigin src="/assets/skeleton-CKiOv3Yu.js"></script>
10
+ <link rel="modulepreload" crossorigin href="/assets/net-Lng3b-MO.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/loader-wtFI4_em.js">
12
  </head>
13
  <body>
14
  <h1>Fruitbat, walking skeleton (S1-00a)</h1>
summarize.html ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Fruitbat summarizer harness</title>
7
+ <script src="/coi-serviceworker.js"></script>
8
+ <script type="module" crossorigin src="/assets/summarize-YEIgl_tE.js"></script>
9
+ <link rel="modulepreload" crossorigin href="/assets/net-Lng3b-MO.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/loader-wtFI4_em.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/dial-C7M2OMm7.js">
12
+ </head>
13
+ <body>
14
+ <h1>Summarizer harness (S1-05)</h1>
15
+ <p>Test page for the summarizer engine. Nothing downloads until you press Summarize (rule 11).</p>
16
+ <p id="status">starting</p>
17
+ <textarea id="text" rows="10" cols="90"></textarea>
18
+ <p>
19
+ <select id="level"><option value="short">Short</option><option value="caveman">Caveman</option><option value="oneline">One line</option></select>
20
+ <button id="go" type="button">Summarize</button>
21
+ <button id="stop" type="button">Stop</button>
22
+ </p>
23
+ <ul id="bullets"></ul>
24
+ <pre id="raw"></pre>
25
+ </body>
26
+ </html>