1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9100],{8263:(t,e,a)=>{a.d(e,{By:()=>g,IZ:()=>h,JL:()=>l,hw:()=>o});let r=/<img\b[^>]*\bsrc\s*=\s*(["'])(data:image\/[^"']+|blob:[^"']+)\1[^>]*>/gi;function o(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Array.isArray(t.sections)&&t.sections.length>0?t:{...t,sections:[{header:"",text:"",image_url:"",image_source:"",block_quote:{text:"",author:"",role:"",avatar_url:""},list:[]}]}}function n(t){return[...new Set(t)]}function i(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return"string"==typeof t&&/(?:data:image\/|blob:)/i.test(t)?n([...t.matchAll(r)].map(t=>t[2])):[]}function l(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Array.isArray(t.sections)?n(t.sections.flatMap(t=>(function(){var t;let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return[e.header,e.text,null==(t=e.block_quote)?void 0:t.text,...Array.isArray(e.list)?e.list.flatMap(t=>[null==t?void 0:t.label,null==t?void 0:t.text]):[]]})(t).flatMap(i))):[]}async function s(t,e){if(t.startsWith("data:image/")){let e=t.match(/^data:(image\/[a-z0-9.+-]+)(;base64)?,([\s\S]*)$/i);if(!e)throw Error("The pasted image format is not supported.");let[,a,r,o]=e,n=r?atob(o.replace(/\s/g,"")):decodeURIComponent(o);return new Blob([Uint8Array.from(n,t=>t.charCodeAt(0))],{type:a})}let a=await e(t);if(!a.ok)throw Error("The pasted image could not be read from the browser.");return a.blob()}async function c(t){let{contentId:e,imageIndex:a=0,fetchImpl:r=fetch,idFactory:o=()=>"".concat(Date.now(),"-").concat(a,"-").concat(Math.random().toString(36).slice(2,10))}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=await s(t,r);if(!n.type.startsWith("image/"))throw Error("Only pasted image files can be uploaded.");if(n.size>0xa00000)throw Error("A pasted image is larger than 10 MB. Resize it and try again.");let i="content/".concat(String(e||"news").replace(/[^a-z0-9_-]/gi,"-").slice(0,80),"/inline-").concat(o(),".").concat(function(){var t;let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",a=(null==(t=e.split("/")[1])?void 0:t.toLowerCase())||"png";return"jpeg"===a?"jpg":"svg+xml"===a?"svg":a.replace(/[^a-z0-9]/g,"")||"png"}(n.type)),l=new FormData;l.append("file",n,i);let c=await r("/api/cloudflare",{method:"POST",body:l}),d=await c.json().catch(()=>({}));if(!c.ok||!d.url)throw Error(d.error||"A pasted image could not be uploaded. The article was not saved.");return d.url}async function d(t,e){if("string"!=typeof t||0===e.size)return t;let a=t;for(let[t,r]of e)a=a.split(t).join(r);return a}async function u(t,e){let a=await Promise.all(t.sections.map(async t=>({...t,header:await d(null==t?void 0:t.header,e),text:await d(null==t?void 0:t.text,e),block_quote:(null==t?void 0:t.block_quote)?{...t.block_quote,text:await d(t.block_quote.text,e)}:null==t?void 0:t.block_quote,list:Array.isArray(null==t?void 0:t.list)?await Promise.all(t.list.map(async t=>({...t,label:await d(null==t?void 0:t.label,e),text:await d(null==t?void 0:t.text,e)}))):null==t?void 0:t.list})));return{...t,sections:a}}async function h(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{upload:e=c,onProgress:a}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=l(t);if(0===r.length)return t;let o=t;for(let n=0;n<r.length;n+=1){let i=r[n],l=await e(i,{contentId:t.id||t._id,imageIndex:n});o=await u(o,new Map([[i,l]])),null==a||a({completed:n+1,total:r.length,content:o})}return o}function g(t,e,a){return Array.isArray(t)&&0!==t.length?a||!e?t[0]:t.find(t=>String(null==t?void 0:t._id)===String(e))||null:null}},9100:(t,e,a)=>{a.d(e,{ym:()=>k,jK:()=>S,vE:()=>C,KH:()=>P,Aq:()=>E,cS:()=>q,bW:()=>b,PN:()=>N,Gj:()=>j,Lt:()=>x,sm:()=>z,oB:()=>O,z5:()=>U,Yk:()=>I,We:()=>_,QV:()=>T,Dp:()=>v,ME:()=>A});var r=a(53455),o=a(95125),n=a(22663);let i=/<img\b[^>]*\bsrc\s*=\s*(["'])data:image\/[\s\S]*?\1[^>]*>/gi,l=/data:image\/[a-z0-9.+-]+;base64,[a-z0-9+/=\r\n]+/gi,s=/!\[[^\]]*\]\(\s*data:image\/[^)]*\)/gi,c=/url\(\s*(["']?)data:image\/[\s\S]*?\1\s*\)/gi,d=t=>
1"string"==typeof t&&/(?:data:image\/|blob:)/i.test(t);function u(t){return new TextEncoder().encode(String(t||"")).byteLength}function h(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return"string"==typeof t&&/^data:image\//i.test(t.trim())?(e&&(e.removedInlineDataImages=(e.removedInlineDataImages||0)+1),""):t}function g(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,{truncate:a=!0}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("string"!=typeof t||!/data:image\//i.test(t))return t;let a=()=>(e&&(e.removedInlineDataImages=(e.removedInlineDataImages||0)+1),"");return t.replace(i,a).replace(s,a).replace(c,a).replace(l,a)}(t,e);return a&&"string"==typeof r?function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:786432,a=String(t||"");if(u(a)<=e)return a;let r=Math.min(a.length,e);for(;u(a.slice(0,r))>e&&r>0;)r-=1;return"".concat(a.slice(0,r),"\n\x3c!-- OpenTools: oversized rich text truncated for public delivery --\x3e")}(r):r}var y=a(8263);let p=["headline","summary","meta_description","eyebrow","folder","slug","category","content_type","type","endpoint","topic","source_details","author","tags","thumbnail_image","banner_image","published","isEditedBy","featured","gsc_deindexed","toolsV2List","organizationSlugs","toolSlugs","llmSlugs","mcpSlugs"],f=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if("thumbnail_image"===t)return"thumbnail";if("banner_image"===t)return"banner";let e=t.match(/^sections\.(\d+)\.image_url$/);if(e)return"section ".concat(Number(e[1])+1," lead image");let a=t.match(/^sections\.(\d+)\.(?:text|header|block_quote\.text)$/);return a?"section ".concat(Number(a[1])+1," body"):t};function m(t){var e;let a=null==t||null==(e=t.response)?void 0:e.data,r=(null==a?void 0:a.message)||(null==a?void 0:a.error)||(null==t?void 0:t.message)||"Failed to save the article.",o=Array.isArray(null==a?void 0:a.fields)?a.fields.map(f).filter(Boolean):[];return o.length>0?"".concat(r," Fix: ").concat(o.join(", "),"."):r}let w=t=>{let e=[];for(let a in t)t.hasOwnProperty(a)&&e.push(encodeURIComponent(a)+"="+encodeURIComponent(t[a]));return e.join("&")},v=t=>{let e=t?w({categories:t}):"";return(0,r.I)({queryKey:["featuredTools",t],queryFn:async()=>(await o.A.get("/api/tools/featured".concat(e?"?".concat(e):""))).data})},b=t=>{let e=w(t);return(0,r.I)({queryKey:["".concat(e)||"categories"],queryFn:async()=>(await o.A.get(e?"/api/categories?".concat(e):"/api/categories")).data.categories.filter(t=>null!==t),refetchOnWindowFocus:!1})},A=t=>(0,r.I)({queryKey:[t],queryFn:async()=>(await o.A.get("/api/tools/".concat(t))).data}),_=async t=>{try{let e=await fetch("/api/tools?id=".concat(t.id),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!e.ok)throw Error("HTTP error! status: ".concat(e.status));return await e.json()}catch(t){console.error(t)}},T=async function(){let{search:t,toolId:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=await fetch((t=>{let e=new URLSearchParams;(null==t?void 0:t.search)&&e.set("search",t.search),(null==t?void 0:t.toolId)&&e.set("toolId",t.toolId);let a=e.toString();return a?"/api/admin/use-cases?".concat(a):"/api/admin/use-cases"})({search:t,toolId:e}));if(!a.ok)throw Error((await a.json().catch(()=>({}))).error||"HTTP ".concat(a.status));return(await a.json()).data||[]},S=async t=>{let{who_needs_this:e,description:a,iconEmoji:r,attachToolId:o}=t,n=await fetch("/api/admin/use-cases",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({who_needs_this:e,description:a,iconEmoji:r,attachToolId:o})}),i=await n.json().catch(()=>({}));if(!n.ok)throw Error(i.error||"HTTP ".concat(n.status));return i.data},k=async(t,e)=>{let a=await fetch("/api/admin/use-cases/".concat(t,"/attach"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({toolId:e})});if(!a.ok)throw Error((await a.json().catch(()=>({}))).error||"HTTP ".concat(a.status));return!0},q=async(t,e)=>{let a=await fetch("/api/admin/use-cases/".concat(t,"/detach"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({toolId:e})});if(!a.ok)throw Error((await a.json().catch(()=>({}))).error||"HTTP ".concat(a.status));return!0},E=async t=>{try{let e=await fetch("/api/search-query?id=".concat(t),{method:"DELETE"});return await e.json()}catch(t){throw console.error("Error in deleteSearchQuery:",t),t}},x=t=>(0,r.I)({queryKey:["websites",t],queryFn:async()=>(await o.A.get("/api/content/dashboard/getWebsites?".concat(t))).data,refetchOnWindowFocus:!1}),I=async t=>{let{feedId:e,isActive:a,websiteId:r}=t;try{let t=await fetch("/api/content/dashboard/rss-feed/".concat(e),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({active:a,websiteId:r})});if(t.ok)n.Ay.success("Feed updated successfully!");else throw Error("HTTP error! status: ".concat(t.status));return await t.json()}catch(t){throw console.error("Failed to update feed:",t),n.Ay.error("Failed to update feed"),t}},j=t=>(0,r.I)({queryKey:["rssFeeds",t],queryFn:async()=>(await o.A.get("/api/content/dashboard/rss-feed?".concat(t))).data,refetchOnWindowFocus:!1}),P=async t=>{try{let e=await o.A.delete("/api/content/dashboard/rss-feed",{data:{ids:t}});return n.Ay.success("Successfully deleted"),e}catch(t){throw console.error("Error deleting content:",t),n.Ay.error("Failed to delete content"),t}},F=new Set,O=async function(t){let e,{onMaterialized:a}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=String((null==t?void 0:t.id)||(null==t?void 0:t._id)||"");if(r&&F.has(r)){let t=Error("This article is already saving. Wait for it to finish, then try again.");throw n.Ay.error(t.message),t}r&&F.add(r);try{let r=(0,y.JL)(t).length;r>0&&(e="admin-news-inline-images",n.Ay.loading("Uploading ".concat(r," pasted image").concat(1===r?"":"s","..."),{id:e}),t=await (0,y.IZ)(t,{onProgress:t=>{let{completed:r,total:o,content:i}=t;null==a||a(i),n.Ay.loading("Uploading pasted images (".concat(r,"/").concat(o,")..."),{id:e})}}));let i=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=[];for(let a of["thumbnail_image","banner_image","markdownBody"])d(null==t?void 0:t[a])&&e.push(a);return Array.isArray(null==t?void 0:t.sections)&&t.sections.forEach((t,a)=>{for(let r of["header","text","image_url","image_source"])d(null==t?void 0:t[r])&&e.push("sections.".concat(a,".").concat(r));for(let o of["avatar_url","author","role","text"]){var r;d(null==t||null==(r=t.block_quote)?void 0:r[o])&&e.push("sections.".concat(a,".block_quote.").concat(o))}Array.isArray(null==t?void 0:t.list)&&t.list.forEach((t,r)=>{for(let o of["label","text"])d(null==t?void 0:t[o])&&e.push("sections.".concat(a,".list.").concat(r,".").concat(o))})}),e}(t);if(i.length>0){let t=Error("A pasted or browser-only image is not hosted yet. Replace it or wait for the upload, then try Save again.");throw t.response={data:{message:t.message,fields:i}},t}t=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}
1,e={id:t.id||t._id};for(let a of p)Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return Array.isArray(t.sections)&&(e.sections=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!Array.isArray(t))return t;let a=e.stats||null,r=!1!==e.truncate;return t.map(t=>({...t,header:g(null==t?void 0:t.header,a,{truncate:r}),text:g(null==t?void 0:t.text,a,{truncate:r}),image_url:h(null==t?void 0:t.image_url,a),image_source:g(null==t?void 0:t.image_source,a,{truncate:!1}),block_quote:(null==t?void 0:t.block_quote)?{...t.block_quote,avatar_url:h(t.block_quote.avatar_url,a),author:g(t.block_quote.author,a,{truncate:!1}),role:g(t.block_quote.role,a,{truncate:!1}),text:g(t.block_quote.text,a,{truncate:r})}:null==t?void 0:t.block_quote,list:Array.isArray(null==t?void 0:t.list)?t.list.map(t=>({...t,label:g(null==t?void 0:t.label,a,{truncate:!1}),text:g(null==t?void 0:t.text,a,{truncate:r})})):null==t?void 0:t.list}))}(t.sections,{truncate:!1})),e}(t);let l=await o.A.post("/api/content/",t);return n.Ay.success("Article saved.",e?{id:e}:void 0),l}catch(t){throw console.error("Error editing content:",t),n.Ay.error(m(t),e?{id:e}:void 0),t}finally{r&&F.delete(r)}},C=async t=>{try{let e=await o.A.delete("/api/content",{data:{ids:t}});return n.Ay.success("Successfully deleted"),e}catch(t){throw console.error("Error deleting content:",t),n.Ay.error("Failed to delete content"),t}},z=async(t,e)=>{try{let a=await o.A.patch("/api/content",{ids:t,published:e});return n.Ay.success("Successfully updated content status"),a}catch(t){throw console.error("Error updating :",t),n.Ay.error(m(t)),t}},N=()=>(0,r.I)({queryKey:["purchases"],queryFn:async()=>await o.A.get("/api/manage/purchases")}),U=async t=>{try{let e=await fetch("/api/manage/purchases/?id=".concat(t._id),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!e.ok)throw Error("HTTP error! status: ".concat(e.status));return await e.json()}catch(t){console.error(t)}}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.