From 212b5ece3c715a45d99ac709442fe8911c2998a3 Mon Sep 17 00:00:00 2001 From: Adam Gospodarczyk Date: Sun, 17 Nov 2024 11:03:15 +0100 Subject: [PATCH] S03E01 --- package.json | 1 + text-splitter/TextService.ts | 207 ++++++++++ text-splitter/app.ts | 45 +++ text-splitter/example_article.json | 189 +++++++++ text-splitter/example_article.md | 239 ++++++++++++ text-splitter/lorem_ipsum.json | 245 ++++++++++++ text-splitter/lorem_ipsum.md | 1 + text-splitter/splitted.json | 118 ++++++ text-splitter/youtube_transcript.json | 209 ++++++++++ text-splitter/youtube_transcript.md | 1 + unstructured/OpenAIService.ts | 111 ++++++ unstructured/TextService.ts | 223 +++++++++++ unstructured/app.ts | 72 ++++ unstructured/source.md | 422 ++++++++++++++++++++ unstructured/tools.json | 543 ++++++++++++++++++++++++++ 15 files changed, 2626 insertions(+) create mode 100644 text-splitter/TextService.ts create mode 100644 text-splitter/app.ts create mode 100644 text-splitter/example_article.json create mode 100644 text-splitter/example_article.md create mode 100644 text-splitter/lorem_ipsum.json create mode 100644 text-splitter/lorem_ipsum.md create mode 100644 text-splitter/splitted.json create mode 100644 text-splitter/youtube_transcript.json create mode 100644 text-splitter/youtube_transcript.md create mode 100644 unstructured/OpenAIService.ts create mode 100644 unstructured/TextService.ts create mode 100644 unstructured/app.ts create mode 100644 unstructured/source.md create mode 100644 unstructured/tools.json diff --git a/package.json b/package.json index 769fc606..84d489fe 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "audio": "bun run audio/app.ts", "audio-map": "bun run audio-map/app.ts", "text-splitter": "bun run text-splitter/app.ts", + "unstructured": "bun run unstructured/app.ts", "video": "bun run video/app.ts", "dev": "vite", "build": "vite build", diff --git a/text-splitter/TextService.ts b/text-splitter/TextService.ts new file mode 100644 index 00000000..6560b261 --- /dev/null +++ b/text-splitter/TextService.ts @@ -0,0 +1,207 @@ +import { createByModelName } from '@microsoft/tiktokenizer'; + +interface IDoc { + text: string; + metadata: { + tokens: number; + headers: Headers; + urls: string[]; + images: string[]; + }; +} + +interface Headers { + [key: string]: string[]; +} + +export class TextSplitter { + private tokenizer?: Awaited>; + + private readonly MODEL_NAME: string; + private readonly SPECIAL_TOKENS = new Map([ + ['<|im_start|>', 100264], + ['<|im_end|>', 100265], + ['<|im_sep|>', 100266], + ]); + + constructor(modelName: string = 'gpt-4') { + this.MODEL_NAME = modelName; + } + + private async initializeTokenizer(): Promise { + if (!this.tokenizer) { + this.tokenizer = await createByModelName(this.MODEL_NAME, this.SPECIAL_TOKENS); + } + } + + private countTokens(text: string): number { + if (!this.tokenizer) { + throw new Error('Tokenizer not initialized'); + } + const formattedContent = this.formatForTokenization(text); + const tokens = this.tokenizer.encode(formattedContent, Array.from(this.SPECIAL_TOKENS.keys())); + return tokens.length; + } + + private formatForTokenization(text: string): string { + return `<|im_start|>user\n${text}<|im_end|>\n<|im_start|>assistant<|im_end|>`; + } + + async split(text: string, limit: number): Promise { + console.log(`Starting split process with limit: ${limit} tokens`); + await this.initializeTokenizer(); + const chunks: IDoc[] = []; + let position = 0; + const totalLength = text.length; + const currentHeaders: Headers = {}; + + while (position < totalLength) { + console.log(`Processing chunk starting at position: ${position}`); + const { chunkText, chunkEnd } = this.getChunk(text, position, limit); + const tokens = this.countTokens(chunkText); + console.log(`Chunk tokens: ${tokens}`); + + const headersInChunk = this.extractHeaders(chunkText); + this.updateCurrentHeaders(currentHeaders, headersInChunk); + + const { content, urls, images } = this.extractUrlsAndImages(chunkText); + + chunks.push({ + text: content, + metadata: { + tokens, + headers: { ...currentHeaders }, + urls, + images, + }, + }); + + console.log(`Chunk processed. New position: ${chunkEnd}`); + position = chunkEnd; + } + + console.log(`Split process completed. Total chunks: ${chunks.length}`); + return chunks; + } + + private getChunk(text: string, start: number, limit: number): { chunkText: string; chunkEnd: number } { + console.log(`Getting chunk starting at ${start} with limit ${limit}`); + + // Account for token overhead due to formatting + const overhead = this.countTokens(this.formatForTokenization('')) - this.countTokens(''); + + // Initial tentative end position + let end = Math.min(start + Math.floor((text.length - start) * limit / this.countTokens(text.slice(start))), text.length); + + // Adjust end to avoid exceeding token limit + let chunkText = text.slice(start, end); + let tokens = this.countTokens(chunkText); + + while (tokens + overhead > limit && end > start) { + console.log(`Chunk exceeds limit with ${tokens + overhead} tokens. Adjusting end position...`); + end = this.findNewChunkEnd(text, start, end); + chunkText = text.slice(start, end); + tokens = this.countTokens(chunkText); + } + + // Adjust chunk end to align with newlines without significantly reducing size + end = this.adjustChunkEnd(text, start, end, tokens + overhead, limit); + + chunkText = text.slice(start, end); + tokens = this.countTokens(chunkText); + console.log(`Final chunk end: ${end}`); + return { chunkText, chunkEnd: end }; + } + + private adjustChunkEnd(text: string, start: number, end: number, currentTokens: number, limit: number): number { + const minChunkTokens = limit * 0.8; // Minimum chunk size is 80% of limit + + const nextNewline = text.indexOf('\n', end); + const prevNewline = text.lastIndexOf('\n', end); + + // Try extending to next newline + if (nextNewline !== -1 && nextNewline < text.length) { + const extendedEnd = nextNewline + 1; + const chunkText = text.slice(start, extendedEnd); + const tokens = this.countTokens(chunkText); + if (tokens <= limit && tokens >= minChunkTokens) { + console.log(`Extending chunk to next newline at position ${extendedEnd}`); + return extendedEnd; + } + } + + // Try reducing to previous newline + if (prevNewline > start) { + const reducedEnd = prevNewline + 1; + const chunkText = text.slice(start, reducedEnd); + const tokens = this.countTokens(chunkText); + if (tokens <= limit && tokens >= minChunkTokens) { + console.log(`Reducing chunk to previous newline at position ${reducedEnd}`); + return reducedEnd; + } + } + + // Return original end if adjustments aren't suitable + return end; + } + + private findNewChunkEnd(text: string, start: number, end: number): number { + // Reduce end position to try to fit within token limit + let newEnd = end - Math.floor((end - start) / 10); // Reduce by 10% each iteration + if (newEnd <= start) { + newEnd = start + 1; // Ensure at least one character is included + } + return newEnd; + } + + private extractHeaders(text: string): Headers { + const headers: Headers = {}; + const headerRegex = /(^|\n)(#{1,6})\s+(.*)/g; + let match; + + while ((match = headerRegex.exec(text)) !== null) { + const level = match[2].length; + const content = match[3].trim(); + const key = `h${level}`; + headers[key] = headers[key] || []; + headers[key].push(content); + } + + return headers; + } + + private updateCurrentHeaders(current: Headers, extracted: Headers): void { + for (let level = 1; level <= 6; level++) { + const key = `h${level}`; + if (extracted[key]) { + current[key] = extracted[key]; + this.clearLowerHeaders(current, level); + } + } + } + + private clearLowerHeaders(headers: Headers, level: number): void { + for (let l = level + 1; l <= 6; l++) { + delete headers[`h${l}`]; + } + } + + private extractUrlsAndImages(text: string): { content: string; urls: string[]; images: string[] } { + const urls: string[] = []; + const images: string[] = []; + let urlIndex = 0; + let imageIndex = 0; + + const content = text + .replace(/!\[([^\]]*)\]\(([^)]+)\)/g, (_match, altText, url) => { + images.push(url); + return `![${altText}]({{$img${imageIndex++}}})`; + }) + .replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_match, linkText, url) => { + urls.push(url); + return `[${linkText}]({{$url${urlIndex++}}})`; + }); + + return { content, urls, images }; + } +} \ No newline at end of file diff --git a/text-splitter/app.ts b/text-splitter/app.ts new file mode 100644 index 00000000..13417d33 --- /dev/null +++ b/text-splitter/app.ts @@ -0,0 +1,45 @@ +import fs from 'fs'; +import path from 'path'; +import { TextSplitter } from "./TextService"; + +const splitter = new TextSplitter(); + +async function processFile(filePath: string) { + const text = fs.readFileSync(filePath, 'utf-8'); + const docs = await splitter.split(text, 1000); + const jsonFilePath = path.join(path.dirname(filePath), `${path.basename(filePath, '.md')}.json`); + fs.writeFileSync(jsonFilePath, JSON.stringify(docs, null, 2)); + + const chunkSizes = docs.map(doc => doc.metadata.tokens); + const avgChunkSize = chunkSizes.reduce((sum, size) => sum + size, 0) / chunkSizes.length; + const minChunkSize = Math.min(...chunkSizes); + const maxChunkSize = Math.max(...chunkSizes); + const medianChunkSize = chunkSizes.sort((a, b) => a - b)[Math.floor(chunkSizes.length / 2)]; + + return { + file: path.basename(filePath), + avgChunkSize: avgChunkSize.toFixed(2), + medianChunkSize, + minChunkSize, + maxChunkSize, + totalChunks: chunkSizes.length + }; +} + +async function main() { + // Get all markdown files in the current directory + const directoryPath = path.join(__dirname); + const files = fs.readdirSync(directoryPath); + const reports = []; + + for (const file of files) { + if (path.extname(file) === '.md') { + const report = await processFile(path.join(directoryPath, file)); + reports.push(report); + } + } + + console.table(reports); +} + +main().catch(console.error); \ No newline at end of file diff --git a/text-splitter/example_article.json b/text-splitter/example_article.json new file mode 100644 index 00000000..0bf0b02c --- /dev/null +++ b/text-splitter/example_article.json @@ -0,0 +1,189 @@ +[ + { + "text": "# Indie Hacker's toolstack 2024\n\nApplications and tools are essential in my daily life. Although I monitor the market for new solutions, I don't focus on it much due to my process. In this post, I'll share this process, along with a list of tools and their configurations. While everyone's workflow varies, you'll likely find helpful inspiration here.\n\n## Text editor(s)\n\nWriting is a key element of my work and various processes, such as learning. Moreover, text appears in different areas: daily communication, emails, newsletters, articles, scripts, website descriptions, documentation, documents. Reports from [Rize]({{$url0}}) show that the text editor is the application where I spend the most time (23%). Therefore, I ensure that writing experiences foster the creative process.\n\nCurrently, I work with several text editors. They are:\n\n- [iA Writer]({{$url1}}): In my view, it's the top markdown syntax editor, with minimalism as its prime benefit. Yet, it's not ideal for note management, and all connected features are lacking.\n\n![]({{$img0}})\n\n- [Paper]({{$url2}}): a great candidate to replace iA Writer. The writing experience is even better than iA Writer. Unfortunately, the app has some bugs and limitations, which make me use it only for simple notes.\n\n![]({{$img1}})\n\n- [Obsidian]({{$url3}}): an app I rarely write in and usually just paste content from iA Writer or Paper. However, it excels in content organization. Moreover, combined with [Vitepress]({{$url4}}), it allows me to share most of my notes online as a static website.\n\n![]({{$img2}})\n\n- [Notion]({{$url5}}): it's the last app where I write content mainly in collaboration with others, to share with others or due to automation (Notion is the only one of the above editors that provides an API, which connects with my services).\n\n![]({{$img3}})\n\nWorking with multiple text editors in practice works quite well because iA Writer is used for writing longer forms, Paper for short notes, Obsidian helps organize them, and Notion allows sharing with others. The common element for these editors, however, is the **Markdown syntax** I wrote more about in [Plain Text is What You Need]({{$url6}}).\n\nWhen I write, GPT-4 / Claude 3 Opus continuously accompanies me, their role being **to correct and enhance readability** or similar transformations of the content I produce. LLMs also perform well during brainstorming sessions and discussions on the topic I'm currently focusing on.\n\n![]({{$img4}})\n\nWhile writing:\n\n- Editor is in full-screen mode\n- Typing on [Wooting 60HE]({{$url7}}) keyboard\n- Listening to music on [Spotify]({{$url8}}) or [Endel]({{$url9}})\n- Taking screenshots with [Xnapper]({{$url10}})\n- Generating code snippets in [ray.so]({{$url11}}) via Puppeteer automation macro\n- Optimizing images with a macro linked to [TinyPNG]({{$url12}})\n- Sharing images and files using [Dropshare]({{$url13}})\n- Hosting images and files on [DigitalOcean]({{$url14}})\n- Using converters for HTML -> Markdown, Markdown -> HTML, Notion -> Markdown, and Markdown -> Notion. This allows me to write newsletters and blogs in markdown editor, then automate conversion to the target format. Uploading files to my own hosting is key here.\n- Keyboard settings: \\\"Key repeat rate\\\" at maximum and \\\"Delay until repeat\\\" at minimum\n- Using `text expander` for frequently repeated phrases like proper names (e.g., .tech becomes Tech•sistence), URLs, email addresses, contact details\n", + "metadata": { + "tokens": 958, + "headers": { + "h1": [ + "Indie Hacker's toolstack 2024" + ], + "h2": [ + "Text editor(s)" + ] + }, + "urls": [ + "https://rize.io/", + "https://ia.net/topics/category/writer", + "https://papereditor.app/", + "https://obsidian.md/", + "https://vitepress.vuejs.org/", + "https://www.notion.so/", + "https://www.techsistence.com/p/plain-text-is-what-you-need-but-why", + "https://wooting.io/", + "https://www.spotify.com/", + "https://endel.io/", + "https://xnapper.com/", + "https://ray.so/", + "https://tinypng.com/", + "https://dropshare.app/", + "https://www.digitalocean.com/" + ], + "images": [ + "https://cloud.overment.com/2024-05-30/tech_ia-ee9f8793-8.png", + "https://cloud.overment.com/2024-05-30/tech_ia-ee9f8793-8.png", + "https://cloud.overment.com/2024-05-30/tech_obsidian-70b500cb-d.png", + "https://cloud.overment.com/2024-05-30/tech_notion-8972a825-3.png", + "https://cloud.overment.com/2024-05-30/tech_writing-dd3a8ec4-5.png" + ] + } + }, + { + "text": "- Navigating almost entirely with the keyboard, avoiding the mouse. Useful shortcuts include: move cursor to start/end of word (`Command + ← or →`), start/end of line (`Option + ← or →`), start/end of paragraph (`Command + ↑ or ↓`), delete next/previous word (`Option + Backspace or Option + Shift + Backspace`), select line/word/paragraph.\n- Using trackpad gestures for controlling music, managing windows/desktops, switching text editor functions, or sending selected text to AI assistant.\n- Utilizing keyboard shortcuts for actions related to screenshots, file optimization, and uploading.\n- Using clipboard manager [Paste]({{$url0}}) for easier text editing and returning to previously copied content (links, snippets).\n\nAll the above activities apply to each mentioned application. Even if Notion allows pasting images directly into the document, I still upload them to my server first. Attachments uploaded directly to Notion expire and are accessible only after logging in, which is problematic for automation.\n\n## General Workflow\n\nTasks, emails, and events are another area that I have quite well optimized. Unlike the tools where I write text, the priority here is the ability to connect with APIs. This allows me to leverage automation and AI in data organization. I wrote more about this in [User Interfaces may change because \\\"AI knows what we mean\\\"]({{$url1}}).\n\n### Managing tasks\n\n[Linear]({{$url2}}) is used both by our product team and myself to organize my work. All my tasks go here, and I almost never enter or edit their statuses manually. Instead, some entries appear as a result of automation (e.g., a new message with a label or a new file on Google Drive requiring my attention). Other entries I add via voice messages on Apple Watch or messages to the AI assistant on the Slack channel. \n\n![]({{$img0}})\n\nOf all the task management tools, so far I’ve liked Todoist and Linear the most. In both cases, we’re talking about an API that allows almost unrestricted management of your data. Besides the API, a clear graphical interface and keyboard shortcut support are important to me, and Linear definitely performed better in this regard. Especially since, as you can see in the screenshot above, you can set views tailored to your needs or current situation.\n\nSo, on the topic of task management:\n\n- I mainly add and edit tasks via voice or simple Slack and Alice messages. The AI then assigns new entries to the appropriate categories, priorities, and deadlines.\n- The organization and updating of entries in Linear is handled by a series of GPT-4 prompts, which consider the rules I've defined once. If needed, I can override them by simply stating that a given task should be assigned to a different project than indicated by the category descriptions.\n- Automation fills a large part of my tasks with various events and schedules. When possible, the AI assistant fetches additional information for the task description.\n- My priority is API availability, as automation allows me to focus on executing tasks, removing most of the organizational burden, except for planning-related activities.\n\n### E-mail\n\nFor years, I've been using Google Workspace in conjunction with Superhuman. This is no coincidence, as Gmail itself is a great service that also has rich automation capabilities, both through external services (e.g., scenarios on [make.com]({{$url3}})) and internal settings (advanced filters).\n\n![]({{$img1}})\n\nEmail automation for me involves responding to new messages that Gmail automatically assigns specific labels to. For example, messages containing the keyword \\\"Invoice\\\" are assigned the \\\"Invoices\\\" label. This, in turn, triggers a Make.com scenario that takes further actions with the content of that message (e.g., saving the attachment to Google Drive or adding a task to Linear).\n\n![]({{$img2}})\n\nSometimes, filter rules aren't enough to correctly capture all messages. In those cases, I manually add labels in Superhuman, but I do this using keyboard shortcuts, which makes the whole process much easier.\n\n![]({{$img3}})\n\nWorking with email also involves an account connected to an AI assistant, which can send me various messages after completing assigned tasks. I wrote more about this in the post [Personal AGI]({{$url4}}).\n", + "metadata": { + "tokens": 997, + "headers": { + "h1": [ + "Indie Hacker's toolstack 2024" + ], + "h2": [ + "General Workflow" + ], + "h3": [ + "Managing tasks", + "E-mail" + ] + }, + "urls": [ + "https://setapp.com/apps/paste", + "https://www.techsistence.com/p/user-interfaces-may-change-because", + "https://linear.app/", + "make.com", + "https://www.techsistence.com/p/personal-agi-pushing-gpt-4-turbo" + ], + "images": [ + "https://cloud.overment.com/2024-05-30/tech_linear-6ac89e32-a.png", + "https://cloud.overment.com/2024-05-30/tech_super-659802da-c.png", + "https://cloud.overment.com/2024-05-30/tech_filters-9b8c5133-9.png", + "https://cloud.overment.com/2024-05-30/tech_supershortcuts-a6dbf423-9.png" + ] + } + }, + { + "text": "\nRegarding email management:\n\n- Superhuman's keyboard shortcuts and overall look & feel make working with email enjoyable and fast. Its high price is justified (though this is very subjective).\n- Gmail / Google Workspace is a \\\"must-have.\\\"\n- Combining automatic filters with labels and automation greatly simplifies email management, document organization, and prioritization.\n\n### Calendar\n\nMy calendar is mostly empty, with no more than two recurring meetings in bi-weekly cycles. This allows me to work with focus, communicating asynchronously via Slack or other channels.\n\nHowever, you can book a slot in my calendar through [Zencal]({{$url0}}). These are pre-set time blocks that automatically disappear when a meeting is scheduled or another entry, such as a trip, appears in my calendar.\n![]({{$img0}})\n\nSimilarly to a task list, I can add new calendar entries via voice message to my AI assistant. The assistant can also check my availability or retrieve events from a specific range. Ultimately, I still occasionally check the calendar myself, and then I use the [Notion Calendar]({{$url1}}) app.\n\n![]({{$img1}})\n\nNotion Calendar in its own way resembles Superhuman and offers intuitive keyboard shortcuts and a minimalist interface.\n\nOn the topic of calendar management:\n\n- Managing entries is done either by voice or through simple messages to an AI assistant (requires custom integrations)\n- Zencal is a brilliant tool for scheduling meetings (including paid ones), which can incorporate various automations (e.g., sending forms before the meeting or notes after the meeting)\n- Notion Calendar is a good, though not perfect, client.\n\n## Searching Web\n\n[Arc Browser]({{$url2}}) is my main browser on both macOS and iOS. Despite the ability to organize tabs or profiles, I only use its basic functionalities. Yet, the Command Bar (`Command + T`) and Little Arc (`Command + Option + N`) make a significant difference for me.\n\n![]({{$img2}})\n\nIn a situation where I come across an interesting source (e.g., article, publication, or video) that I can't review at the moment or know I'll want to return to, I use a keyboard shortcut to send the open page to the AI assistant. The assistant then fetches available information about the page and saves the link to it in Linear and Feedly (pinning it to the appropriate board).\n\nThe thread of staying up-to-date and monitoring news on topics that interest me is addressed through Feedly. Similar to previous tools, the main factor influencing the choice here is the availability of an API.\n\n![]({{$img3}})\n\nI've connected Feedly boards with Make.com automations, so simply pinning a post triggers additional actions. For instance, it saves the link in my assistant's long-term memory. This memory is linked with search engines (Algolia and Qdrant), allowing easy retrieval of previously saved sources without needing to specify their exact names.\n\n![]({{$img4}})\n\nSo, browsing the web for me means:\n\n- A browser solely for Internet browsing. I don't save bookmarks or other info. Instead, I use macros and automation to organize knowledge in set places, all controlled by LLM (GPT-4-turbo and GPT-4o).\n- Staying updated and exploring new topics with Feedly and sites like [Product Hunt]({{$url3}}), [daily.dev]({{$url4}}), [Indie Hackers]({{$url5}}), or [HackerNews]({{$url6}}).\n- The foundation of the whole system is my custom AI assistant and its long-term memory. Note, this isn't Alice from [heyalice.app]({{$url7}}), but my private app, which I'm gradually making publicly available.\n", + "metadata": { + "tokens": 909, + "headers": { + "h1": [ + "Indie Hacker's toolstack 2024" + ], + "h2": [ + "Searching Web" + ], + "h3": [ + "Calendar" + ] + }, + "urls": [ + "https://zencal.io/", + "https://www.notion.so/product/calendar", + "https://arc.net/", + "https://www.producthunt.com/", + "https://app.daily.dev/onboarding", + "https://www.indiehackers.com/", + "https://news.ycombinator.com/", + "https://heyalice.app" + ], + "images": [ + "https://cloud.overment.com/2024-05-30/tech_schedule-b6fa1c16-3.png", + "https://cloud.overment.com/2024-05-30/tech_cal-ae93f4da-8.png", + "https://cloud.overment.com/2024-05-30/tech_arc-a98a5765-5.png", + "https://cloud.overment.com/2024-05-30/tech_feed-9961c0a1-9.png", + "https://cloud.overment.com/2024-05-30/tech_memory-d7413d87-2.png" + ] + } + }, + { + "text": "\n## Graphic Design\n\nDesigning UI and promotional materials is an integral part of my work. I mainly use [Figma]({{$url0}}) and recently returned to [Adobe Photoshop Beta]({{$url1}}) due to its Generative AI features, which are excellent for editing images and assets generated in Midjourney.\n\nBelow is an example of covers for one of my courses, which I generated in Midjourney with slight editing through Adobe Firefly. \n\n![]({{$img0}})\n\nFigma works phenomenally for UI design, especially when using components and the auto-layout feature.\n\n![]({{$img1}})\n\nThere are creations, however, that are generated according to templates, and creating new versions involves only text replacement or simple layout editing. In such cases, Webflow becomes my graphic editor.\n\n![]({{$img2}})\n\nThe AI assistant only needs information from me on how to generate the graphic (or set of graphics), along with the set of information needed to create them (e.g., text, link to background image). The assistant automates contact with Webflow to update the CMS entry, then downloads the page as a PNG and sends it to me.\n\n![]({{$img3}})\n\nWhen designing creations, I always use Midjourney Alpha. I generate various graphic or asset variants there, which I often combine in Photoshop. \n\n![]({{$img4}})\n\nSummarizing the topic of graphic design:\n\n- I use Generative AI, and currently, Midjourney or Stable Diffusion 3 works best.\n- Figma is undeniably the best available tool for interface design or creating advertisements. It's definitely worth getting to know its more advanced features, which save a lot of time.\n- Webflow combined with HTMLCSSToImage allows for automatic generation of graphics based on templates. Alternatively, you can use the latter tool directly, where you only need an HTML template in which you replace individual elements with automation.\n- Combining LLM with a set of templates allows for easy generation of entire sets of advertisements in various variants.\n\n\n## Programming\n\nProgramming is the second (after writing texts) activity that takes up most of my time, and therefore I also pay a lot of attention to it in the context of optimizing the entire process.\n\nI use the following tools:\n\n- [IntelliJ IDEA]({{$url2}}): This is my main code editor. Although I don't program in JAVA, IntelliJ works great with various programming languages (for me, it's TypeScript and Rust).\n- [Supermaven]({{$url3}}): This is an alternative to Github Copilot that I have just started using, and it makes a great first impression by suggesting code very intelligently.\n- [iTerm]({{$url4}}): Although I have gone through many different terminals, iTerm won with its simplicity and the fact that it performs its task perfectly.\n- [TablePlus]({{$url5}}): This is a great database client for macOS.\n\n![]({{$img5}})\n\nAbove you can see my IntelliJ configuration. All panels and additional options are turned off because I constantly use keyboard shortcuts. This is especially justified due to the very high customization possibilities of this IDE and the presence of a \\\"Command Palette\\\" style search.\n\n![]({{$img6}})\n\nFor actions that do not have a keyboard shortcut or I simply use them rarely, I use Search Menu Items, one of the options of the [Raycast]({{$url6}}) application.\n\n![]({{$img7}})\n\nSince the release of ChatGPT, large language models have been my constant companions in programming. I'm not just talking about generating code or debugging but also discussing problems, making design decisions, and learning new technologies. Of course, the final decisions are always mine, but models like GPT-4-turbo or Claude 3 Opus are almost perfect conversation partners.\n", + "metadata": { + "tokens": 987, + "headers": { + "h1": [ + "Indie Hacker's toolstack 2024" + ], + "h2": [ + "Graphic Design", + "Programming" + ] + }, + "urls": [ + "https://figma.com", + "https://www.adobe.com/products/photoshop.html", + "https://www.jetbrains.com/idea/", + "https://supermaven.com/", + "https://iterm2.com/", + "https://tableplus.com/", + "https://www.raycast.com/" + ], + "images": [ + "https://cloud.overment.com/2024-05-30/tech_covers-31b8727b-c.png", + "https://cloud.overment.com/2024-05-30/tech_components-31c52ec9-8.png", + "https://cloud.overment.com/2024-05-30/tech_webflow-4bc4e1f1-3.png", + "https://cloud.overment.com/2024-05-30/tech_gen-cbce636f-e.png", + "https://cloud.overment.com/2024-05-30/tech_mid-829ce30c-9.png", + "https://cloud.overment.com/2024-05-30/tech_intelij-4283c83e-c.png", + "https://cloud.overment.com/2024-05-30/tech_files-4268c510-0.png", + "https://cloud.overment.com/2024-05-30/tech_items-0a49d7b1-6.png" + ] + } + }, + { + "text": "\nSo, on the topic of programming:\n\n- I use the best available tools that work for me. For example, despite the enormous popularity of Visual Studio Code, IntelliJ works incomparably better for me. The main argument here is that IntelliJ simply \\\"understands my code\\\" much better than VSC.\n- Generative AI is another level of pair programming for me because, in this case, such a partner is available to me all the time and often has much more knowledge than I do, although it quite often makes mistakes. Despite this, the final balance of mistakes with the value I receive is definitely positive.\n- Where justified, I use tools to automate working with code. A \\\"must-have\\\" is application deployment, which I always perform through Github Actions.\n- As seen even in the previous points, I use programming skills not only to develop products and work but also to develop tools for my needs. \n\n## Macros and Automations\n\nI'll write a separate post about macros and automation, as it's too extensive a topic to cover in a few points. I'll just note that I work with applications: [Shortcuts]({{$url0}}), [Keyboard Maestro]({{$url1}}), [Better Touch Tool]({{$url2}}), [Raycast]({{$url3}}), and of course [make.com]({{$url4}}).\n\nThe whole system is also supplemented by my personal API, which is directly integrated with my AI assistant. As a result, macros and automations can communicate with both me and each other. The system gradually evolves with the development of large language models and entire ecosystems of tools.\n\nSo if you're interested in this topic and want to see how I've addressed it, be sure to subscribe to Tech•sistence.\n\n## Fun\n\nOutside of work, I'm also a fan of books and games, spending my free afternoons and evenings with them. I log all the titles I've read on my Goodreads profile, often sharing highlighted passages or notes.\n\n![]({{$img0}})\n\nI always read books in the [Amazon Kindle]({{$url5}}) app or listen via [Audible]({{$url6}}). It’s very helpful that if you have both the audiobook and e-book versions, progress syncs between devices, making reading much easier.\n\nHowever, in the past several months, I've spent much less time with books because my main area of interest has shifted to topics that books haven’t been written about yet, like Generative AI or new programming languages and tools. As for books, I now reach for more challenging, timeless titles that require much more time than typical bestsellers in business, psychology, or economics.\n\nFor games, my number one is currently PlayStation 5, followed by Nvidia GeForce Now, a streaming service connected to my Steam account (and more). Outside home, I also play on the Steam Deck, which is an incredibly impressive device, and the Nintendo Switch.\n\n![]({{$img1}})\n\nBoth while gaming and reading, I also listen to music, which (as you might know) is also connected to my AI assistant. Therefore, the availability of an API and cross-platform functionality is essential for the player, and Spotify excels in this regard.\n\n![]({{$img2}})\n\nWhen I need to focus, e.g., while programming, designing, or writing longer texts, I also turn to [endel.io]({{$url7}}).\n\n![]({{$img3}})\n\n## Summary\n\nAlthough I didn't manage to exhaust the topic of tools, I think I outlined the general framework of the set I currently use quite well.\n\nIf you have any questions about the selected tools or the ways I work with them, let me know in the comments. Similarly, if you want my future posts to cover specific topics, let me know as well.\n\nClosing this post, I'll just note that the mentioned set is constantly changing. Even if some of the tools have been with me for years, the ways I work with them change. I see this as an important part of my development and daily life. The whole setup is configured not only to increase my productivity but also to make each of my days more enjoyable and simply fun.\n\nHave fun,\nAdam\n\n\n", + "metadata": { + "tokens": 980, + "headers": { + "h1": [ + "Indie Hacker's toolstack 2024" + ], + "h2": [ + "Macros and Automations", + "Fun", + "Summary" + ] + }, + "urls": [ + "https://apps.apple.com/us/app/shortcuts/id915249334", + "https://folivora.ai/", + "https://folivora.ai/", + "https://www.raycast.com/", + "https://www.make.com/", + "https://play.google.com/store/apps/details", + "https://www.audible.com", + "https://endel.io/" + ], + "images": [ + "https://cloud.overment.com/2024-05-30/tech_goodreads-9d29499c-a.png", + "https://cloud.overment.com/2024-05-30/tech_gfn-158e7285-2.png", + "https://cloud.overment.com/2024-05-30/tech_spotify-bc1fa329-6.png", + "https://cloud.overment.com/2024-05-30/tech_endel-aad69006-1.png" + ] + } + }, + { + "text": "#techsistence #newsletter", + "metadata": { + "tokens": 14, + "headers": { + "h1": [ + "Indie Hacker's toolstack 2024" + ], + "h2": [ + "Macros and Automations", + "Fun", + "Summary" + ] + }, + "urls": [], + "images": [] + } + } +] \ No newline at end of file diff --git a/text-splitter/example_article.md b/text-splitter/example_article.md new file mode 100644 index 00000000..266a6ae2 --- /dev/null +++ b/text-splitter/example_article.md @@ -0,0 +1,239 @@ +# Indie Hacker's toolstack 2024 + +Applications and tools are essential in my daily life. Although I monitor the market for new solutions, I don't focus on it much due to my process. In this post, I'll share this process, along with a list of tools and their configurations. While everyone's workflow varies, you'll likely find helpful inspiration here. + +## Text editor(s) + +Writing is a key element of my work and various processes, such as learning. Moreover, text appears in different areas: daily communication, emails, newsletters, articles, scripts, website descriptions, documentation, documents. Reports from [Rize](https://rize.io/) show that the text editor is the application where I spend the most time (23%). Therefore, I ensure that writing experiences foster the creative process. + +Currently, I work with several text editors. They are: + +- [iA Writer](https://ia.net/topics/category/writer): In my view, it's the top markdown syntax editor, with minimalism as its prime benefit. Yet, it's not ideal for note management, and all connected features are lacking. + +![](https://cloud.overment.com/2024-05-30/tech_ia-ee9f8793-8.png) + +- [Paper](https://papereditor.app/): a great candidate to replace iA Writer. The writing experience is even better than iA Writer. Unfortunately, the app has some bugs and limitations, which make me use it only for simple notes. + +![](https://cloud.overment.com/2024-05-30/tech_ia-ee9f8793-8.png) + +- [Obsidian](https://obsidian.md/): an app I rarely write in and usually just paste content from iA Writer or Paper. However, it excels in content organization. Moreover, combined with [Vitepress](https://vitepress.vuejs.org/), it allows me to share most of my notes online as a static website. + +![](https://cloud.overment.com/2024-05-30/tech_obsidian-70b500cb-d.png) + +- [Notion](https://www.notion.so/): it's the last app where I write content mainly in collaboration with others, to share with others or due to automation (Notion is the only one of the above editors that provides an API, which connects with my services). + +![](https://cloud.overment.com/2024-05-30/tech_notion-8972a825-3.png) + +Working with multiple text editors in practice works quite well because iA Writer is used for writing longer forms, Paper for short notes, Obsidian helps organize them, and Notion allows sharing with others. The common element for these editors, however, is the **Markdown syntax** I wrote more about in [Plain Text is What You Need](https://www.techsistence.com/p/plain-text-is-what-you-need-but-why). + +When I write, GPT-4 / Claude 3 Opus continuously accompanies me, their role being **to correct and enhance readability** or similar transformations of the content I produce. LLMs also perform well during brainstorming sessions and discussions on the topic I'm currently focusing on. + +![](https://cloud.overment.com/2024-05-30/tech_writing-dd3a8ec4-5.png) + +While writing: + +- Editor is in full-screen mode +- Typing on [Wooting 60HE](https://wooting.io/) keyboard +- Listening to music on [Spotify](https://www.spotify.com/) or [Endel](https://endel.io/) +- Taking screenshots with [Xnapper](https://xnapper.com/) +- Generating code snippets in [ray.so](https://ray.so/) via Puppeteer automation macro +- Optimizing images with a macro linked to [TinyPNG](https://tinypng.com/) +- Sharing images and files using [Dropshare](https://dropshare.app/) +- Hosting images and files on [DigitalOcean](https://www.digitalocean.com/) +- Using converters for HTML -> Markdown, Markdown -> HTML, Notion -> Markdown, and Markdown -> Notion. This allows me to write newsletters and blogs in markdown editor, then automate conversion to the target format. Uploading files to my own hosting is key here. +- Keyboard settings: \"Key repeat rate\" at maximum and \"Delay until repeat\" at minimum +- Using `text expander` for frequently repeated phrases like proper names (e.g., .tech becomes Tech•sistence), URLs, email addresses, contact details +- Navigating almost entirely with the keyboard, avoiding the mouse. Useful shortcuts include: move cursor to start/end of word (`Command + ← or →`), start/end of line (`Option + ← or →`), start/end of paragraph (`Command + ↑ or ↓`), delete next/previous word (`Option + Backspace or Option + Shift + Backspace`), select line/word/paragraph. +- Using trackpad gestures for controlling music, managing windows/desktops, switching text editor functions, or sending selected text to AI assistant. +- Utilizing keyboard shortcuts for actions related to screenshots, file optimization, and uploading. +- Using clipboard manager [Paste](https://setapp.com/apps/paste) for easier text editing and returning to previously copied content (links, snippets). + +All the above activities apply to each mentioned application. Even if Notion allows pasting images directly into the document, I still upload them to my server first. Attachments uploaded directly to Notion expire and are accessible only after logging in, which is problematic for automation. + +## General Workflow + +Tasks, emails, and events are another area that I have quite well optimized. Unlike the tools where I write text, the priority here is the ability to connect with APIs. This allows me to leverage automation and AI in data organization. I wrote more about this in [User Interfaces may change because \"AI knows what we mean\"](https://www.techsistence.com/p/user-interfaces-may-change-because). + +### Managing tasks + +[Linear](https://linear.app/) is used both by our product team and myself to organize my work. All my tasks go here, and I almost never enter or edit their statuses manually. Instead, some entries appear as a result of automation (e.g., a new message with a label or a new file on Google Drive requiring my attention). Other entries I add via voice messages on Apple Watch or messages to the AI assistant on the Slack channel. + +![](https://cloud.overment.com/2024-05-30/tech_linear-6ac89e32-a.png) + +Of all the task management tools, so far I’ve liked Todoist and Linear the most. In both cases, we’re talking about an API that allows almost unrestricted management of your data. Besides the API, a clear graphical interface and keyboard shortcut support are important to me, and Linear definitely performed better in this regard. Especially since, as you can see in the screenshot above, you can set views tailored to your needs or current situation. + +So, on the topic of task management: + +- I mainly add and edit tasks via voice or simple Slack and Alice messages. The AI then assigns new entries to the appropriate categories, priorities, and deadlines. +- The organization and updating of entries in Linear is handled by a series of GPT-4 prompts, which consider the rules I've defined once. If needed, I can override them by simply stating that a given task should be assigned to a different project than indicated by the category descriptions. +- Automation fills a large part of my tasks with various events and schedules. When possible, the AI assistant fetches additional information for the task description. +- My priority is API availability, as automation allows me to focus on executing tasks, removing most of the organizational burden, except for planning-related activities. + +### E-mail + +For years, I've been using Google Workspace in conjunction with Superhuman. This is no coincidence, as Gmail itself is a great service that also has rich automation capabilities, both through external services (e.g., scenarios on [make.com](make.com)) and internal settings (advanced filters). + +![](https://cloud.overment.com/2024-05-30/tech_super-659802da-c.png) + +Email automation for me involves responding to new messages that Gmail automatically assigns specific labels to. For example, messages containing the keyword \"Invoice\" are assigned the \"Invoices\" label. This, in turn, triggers a Make.com scenario that takes further actions with the content of that message (e.g., saving the attachment to Google Drive or adding a task to Linear). + +![](https://cloud.overment.com/2024-05-30/tech_filters-9b8c5133-9.png) + +Sometimes, filter rules aren't enough to correctly capture all messages. In those cases, I manually add labels in Superhuman, but I do this using keyboard shortcuts, which makes the whole process much easier. + +![](https://cloud.overment.com/2024-05-30/tech_supershortcuts-a6dbf423-9.png) + +Working with email also involves an account connected to an AI assistant, which can send me various messages after completing assigned tasks. I wrote more about this in the post [Personal AGI](https://www.techsistence.com/p/personal-agi-pushing-gpt-4-turbo). + +Regarding email management: + +- Superhuman's keyboard shortcuts and overall look & feel make working with email enjoyable and fast. Its high price is justified (though this is very subjective). +- Gmail / Google Workspace is a \"must-have.\" +- Combining automatic filters with labels and automation greatly simplifies email management, document organization, and prioritization. + +### Calendar + +My calendar is mostly empty, with no more than two recurring meetings in bi-weekly cycles. This allows me to work with focus, communicating asynchronously via Slack or other channels. + +However, you can book a slot in my calendar through [Zencal](https://zencal.io/). These are pre-set time blocks that automatically disappear when a meeting is scheduled or another entry, such as a trip, appears in my calendar. +![](https://cloud.overment.com/2024-05-30/tech_schedule-b6fa1c16-3.png) + +Similarly to a task list, I can add new calendar entries via voice message to my AI assistant. The assistant can also check my availability or retrieve events from a specific range. Ultimately, I still occasionally check the calendar myself, and then I use the [Notion Calendar](https://www.notion.so/product/calendar) app. + +![](https://cloud.overment.com/2024-05-30/tech_cal-ae93f4da-8.png) + +Notion Calendar in its own way resembles Superhuman and offers intuitive keyboard shortcuts and a minimalist interface. + +On the topic of calendar management: + +- Managing entries is done either by voice or through simple messages to an AI assistant (requires custom integrations) +- Zencal is a brilliant tool for scheduling meetings (including paid ones), which can incorporate various automations (e.g., sending forms before the meeting or notes after the meeting) +- Notion Calendar is a good, though not perfect, client. + +## Searching Web + +[Arc Browser](https://arc.net/) is my main browser on both macOS and iOS. Despite the ability to organize tabs or profiles, I only use its basic functionalities. Yet, the Command Bar (`Command + T`) and Little Arc (`Command + Option + N`) make a significant difference for me. + +![](https://cloud.overment.com/2024-05-30/tech_arc-a98a5765-5.png) + +In a situation where I come across an interesting source (e.g., article, publication, or video) that I can't review at the moment or know I'll want to return to, I use a keyboard shortcut to send the open page to the AI assistant. The assistant then fetches available information about the page and saves the link to it in Linear and Feedly (pinning it to the appropriate board). + +The thread of staying up-to-date and monitoring news on topics that interest me is addressed through Feedly. Similar to previous tools, the main factor influencing the choice here is the availability of an API. + +![](https://cloud.overment.com/2024-05-30/tech_feed-9961c0a1-9.png) + +I've connected Feedly boards with Make.com automations, so simply pinning a post triggers additional actions. For instance, it saves the link in my assistant's long-term memory. This memory is linked with search engines (Algolia and Qdrant), allowing easy retrieval of previously saved sources without needing to specify their exact names. + +![](https://cloud.overment.com/2024-05-30/tech_memory-d7413d87-2.png) + +So, browsing the web for me means: + +- A browser solely for Internet browsing. I don't save bookmarks or other info. Instead, I use macros and automation to organize knowledge in set places, all controlled by LLM (GPT-4-turbo and GPT-4o). +- Staying updated and exploring new topics with Feedly and sites like [Product Hunt](https://www.producthunt.com/), [daily.dev](https://app.daily.dev/onboarding), [Indie Hackers](https://www.indiehackers.com/), or [HackerNews](https://news.ycombinator.com/). +- The foundation of the whole system is my custom AI assistant and its long-term memory. Note, this isn't Alice from [heyalice.app](https://heyalice.app), but my private app, which I'm gradually making publicly available. + +## Graphic Design + +Designing UI and promotional materials is an integral part of my work. I mainly use [Figma](https://figma.com) and recently returned to [Adobe Photoshop Beta](https://www.adobe.com/products/photoshop.html) due to its Generative AI features, which are excellent for editing images and assets generated in Midjourney. + +Below is an example of covers for one of my courses, which I generated in Midjourney with slight editing through Adobe Firefly. + +![](https://cloud.overment.com/2024-05-30/tech_covers-31b8727b-c.png) + +Figma works phenomenally for UI design, especially when using components and the auto-layout feature. + +![](https://cloud.overment.com/2024-05-30/tech_components-31c52ec9-8.png) + +There are creations, however, that are generated according to templates, and creating new versions involves only text replacement or simple layout editing. In such cases, Webflow becomes my graphic editor. + +![](https://cloud.overment.com/2024-05-30/tech_webflow-4bc4e1f1-3.png) + +The AI assistant only needs information from me on how to generate the graphic (or set of graphics), along with the set of information needed to create them (e.g., text, link to background image). The assistant automates contact with Webflow to update the CMS entry, then downloads the page as a PNG and sends it to me. + +![](https://cloud.overment.com/2024-05-30/tech_gen-cbce636f-e.png) + +When designing creations, I always use Midjourney Alpha. I generate various graphic or asset variants there, which I often combine in Photoshop. + +![](https://cloud.overment.com/2024-05-30/tech_mid-829ce30c-9.png) + +Summarizing the topic of graphic design: + +- I use Generative AI, and currently, Midjourney or Stable Diffusion 3 works best. +- Figma is undeniably the best available tool for interface design or creating advertisements. It's definitely worth getting to know its more advanced features, which save a lot of time. +- Webflow combined with HTMLCSSToImage allows for automatic generation of graphics based on templates. Alternatively, you can use the latter tool directly, where you only need an HTML template in which you replace individual elements with automation. +- Combining LLM with a set of templates allows for easy generation of entire sets of advertisements in various variants. + + +## Programming + +Programming is the second (after writing texts) activity that takes up most of my time, and therefore I also pay a lot of attention to it in the context of optimizing the entire process. + +I use the following tools: + +- [IntelliJ IDEA](https://www.jetbrains.com/idea/): This is my main code editor. Although I don't program in JAVA, IntelliJ works great with various programming languages (for me, it's TypeScript and Rust). +- [Supermaven](https://supermaven.com/): This is an alternative to Github Copilot that I have just started using, and it makes a great first impression by suggesting code very intelligently. +- [iTerm](https://iterm2.com/): Although I have gone through many different terminals, iTerm won with its simplicity and the fact that it performs its task perfectly. +- [TablePlus](https://tableplus.com/): This is a great database client for macOS. + +![](https://cloud.overment.com/2024-05-30/tech_intelij-4283c83e-c.png) + +Above you can see my IntelliJ configuration. All panels and additional options are turned off because I constantly use keyboard shortcuts. This is especially justified due to the very high customization possibilities of this IDE and the presence of a \"Command Palette\" style search. + +![](https://cloud.overment.com/2024-05-30/tech_files-4268c510-0.png) + +For actions that do not have a keyboard shortcut or I simply use them rarely, I use Search Menu Items, one of the options of the [Raycast](https://www.raycast.com/) application. + +![](https://cloud.overment.com/2024-05-30/tech_items-0a49d7b1-6.png) + +Since the release of ChatGPT, large language models have been my constant companions in programming. I'm not just talking about generating code or debugging but also discussing problems, making design decisions, and learning new technologies. Of course, the final decisions are always mine, but models like GPT-4-turbo or Claude 3 Opus are almost perfect conversation partners. + +So, on the topic of programming: + +- I use the best available tools that work for me. For example, despite the enormous popularity of Visual Studio Code, IntelliJ works incomparably better for me. The main argument here is that IntelliJ simply \"understands my code\" much better than VSC. +- Generative AI is another level of pair programming for me because, in this case, such a partner is available to me all the time and often has much more knowledge than I do, although it quite often makes mistakes. Despite this, the final balance of mistakes with the value I receive is definitely positive. +- Where justified, I use tools to automate working with code. A \"must-have\" is application deployment, which I always perform through Github Actions. +- As seen even in the previous points, I use programming skills not only to develop products and work but also to develop tools for my needs. + +## Macros and Automations + +I'll write a separate post about macros and automation, as it's too extensive a topic to cover in a few points. I'll just note that I work with applications: [Shortcuts](https://apps.apple.com/us/app/shortcuts/id915249334), [Keyboard Maestro](https://folivora.ai/), [Better Touch Tool](https://folivora.ai/), [Raycast](https://www.raycast.com/), and of course [make.com](https://www.make.com/). + +The whole system is also supplemented by my personal API, which is directly integrated with my AI assistant. As a result, macros and automations can communicate with both me and each other. The system gradually evolves with the development of large language models and entire ecosystems of tools. + +So if you're interested in this topic and want to see how I've addressed it, be sure to subscribe to Tech•sistence. + +## Fun + +Outside of work, I'm also a fan of books and games, spending my free afternoons and evenings with them. I log all the titles I've read on my Goodreads profile, often sharing highlighted passages or notes. + +![](https://cloud.overment.com/2024-05-30/tech_goodreads-9d29499c-a.png) + +I always read books in the [Amazon Kindle](https://play.google.com/store/apps/details) app or listen via [Audible](https://www.audible.com). It’s very helpful that if you have both the audiobook and e-book versions, progress syncs between devices, making reading much easier. + +However, in the past several months, I've spent much less time with books because my main area of interest has shifted to topics that books haven’t been written about yet, like Generative AI or new programming languages and tools. As for books, I now reach for more challenging, timeless titles that require much more time than typical bestsellers in business, psychology, or economics. + +For games, my number one is currently PlayStation 5, followed by Nvidia GeForce Now, a streaming service connected to my Steam account (and more). Outside home, I also play on the Steam Deck, which is an incredibly impressive device, and the Nintendo Switch. + +![](https://cloud.overment.com/2024-05-30/tech_gfn-158e7285-2.png) + +Both while gaming and reading, I also listen to music, which (as you might know) is also connected to my AI assistant. Therefore, the availability of an API and cross-platform functionality is essential for the player, and Spotify excels in this regard. + +![](https://cloud.overment.com/2024-05-30/tech_spotify-bc1fa329-6.png) + +When I need to focus, e.g., while programming, designing, or writing longer texts, I also turn to [endel.io](https://endel.io/). + +![](https://cloud.overment.com/2024-05-30/tech_endel-aad69006-1.png) + +## Summary + +Although I didn't manage to exhaust the topic of tools, I think I outlined the general framework of the set I currently use quite well. + +If you have any questions about the selected tools or the ways I work with them, let me know in the comments. Similarly, if you want my future posts to cover specific topics, let me know as well. + +Closing this post, I'll just note that the mentioned set is constantly changing. Even if some of the tools have been with me for years, the ways I work with them change. I see this as an important part of my development and daily life. The whole setup is configured not only to increase my productivity but also to make each of my days more enjoyable and simply fun. + +Have fun, +Adam + + +#techsistence #newsletter \ No newline at end of file diff --git a/text-splitter/lorem_ipsum.json b/text-splitter/lorem_ipsum.json new file mode 100644 index 00000000..066e5aec --- /dev/null +++ b/text-splitter/lorem_ipsum.json @@ -0,0 +1,245 @@ +[ + { + "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing e", + "metadata": { + "tokens": 907, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "lit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum ", + "metadata": { + "tokens": 913, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, s", + "metadata": { + "tokens": 909, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "celerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. ", + "metadata": { + "tokens": 907, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet ", + "metadata": { + "tokens": 907, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec i", + "metadata": { + "tokens": 907, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "d leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus int", + "metadata": { + "tokens": 906, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "erdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet,", + "metadata": { + "tokens": 911, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": " consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex v", + "metadata": { + "tokens": 909, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "itae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetu", + "metadata": { + "tokens": 911, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "r adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpi", + "metadata": { + "tokens": 911, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "s.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta ", + "metadata": { + "tokens": 907, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla", + "metadata": { + "tokens": 906, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": " laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus ", + "metadata": { + "tokens": 907, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vita", + "metadata": { + "tokens": 905, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "e sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscin", + "metadata": { + "tokens": 909, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "g elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ", + "metadata": { + "tokens": 913, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit ", + "metadata": { + "tokens": 908, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum do", + "metadata": { + "tokens": 912, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "lor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, s", + "metadata": { + "tokens": 908, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "celerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae", + "metadata": { + "tokens": 905, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": ". Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat ali", + "metadata": { + "tokens": 906, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "quet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodale", + "metadata": { + "tokens": 903, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "s. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipisci", + "metadata": { + "tokens": 906, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "ng elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae", + "metadata": { + "tokens": 908, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": " sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet", + "metadata": { + "tokens": 906, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": ", consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vita", + "metadata": { + "tokens": 709, + "headers": {}, + "urls": [], + "images": [] + } + } +] \ No newline at end of file diff --git a/text-splitter/lorem_ipsum.md b/text-splitter/lorem_ipsum.md new file mode 100644 index 00000000..a55287de --- /dev/null +++ b/text-splitter/lorem_ipsum.md @@ -0,0 +1 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vitae. Quisque ante dui, porta eu felis nec, scelerisque pharetra turpis.Lorem ipsum dolor sit amet, consectetur adipiscing elit interdum hendrerit ex vitae sodales.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus interdum hendrerit ex vitae sodales. Donec id leo ipsum. Phasellus volutpat aliquet mauris, et blandit nulla laoreet vita \ No newline at end of file diff --git a/text-splitter/splitted.json b/text-splitter/splitted.json new file mode 100644 index 00000000..9e2a343e --- /dev/null +++ b/text-splitter/splitted.json @@ -0,0 +1,118 @@ +[ + { + "text": "# Indie Hacker's toolstack 2024\n\nApplications and tools are essential in my daily life. Although I monitor the market for new solutions, I don't focus on it much due to my process. In this post, I'll share this process, along with a list of tools and their configurations. While everyone's workflow varies, you'll likely find helpful inspiration here.\n\n## Text editor(s)\n\nWriting is a key element of my work and various processes, such as learning. Moreover, text appears in different areas: daily communication, emails, newsletters, articles, scripts, website descriptions, documentation, documents. Reports from [Rize]({{$url0}}) show that the text editor is the application where I spend the most time (23%). Therefore, I ensure that writing experiences foster the creative process.\n\nCurrently, I work with several text editors. They are:\n\n- [iA Writer]({{$url1}}): In my view, it's the top markdown syntax editor, with minimalism as its prime benefit. Yet, it's not ideal for note management, and all connected features are lacking.\n\n![]({{$img0}})\n\n- [Paper]({{$url2}}): a great candidate to replace iA Writer. The writing experience is even better than iA Writer. Unfortunately, the app has some bugs and limitations, which make me use it only for simple notes.\n\n![]({{$img1}})\n\n- [Obsidian]({{$url3}}): an app I rarely write in and usually just paste content from iA Writer or Paper. However, it excels in content organization. Moreover, combined with [Vitepress]({{$url4}}), it allows me to share most of my notes online as a static website.\n\n![]({{$img2}})\n\n- [Notion]({{$url5}}): it's the last app where I write content mainly in collaboration with others, to share with others or due to automation (Notion is the only one of the above editors that provides an API, which connects with my services).\n\n![]({{$img3}})\n\nWorking with multiple text editors in practice works quite well because iA Writer is used for writing longer forms, Paper for short notes, Obsidian helps organize them, and Notion allows sharing with others. The common element for these editors, however, is the **Markdown syntax** I wrote more about in [Plain Text is What You Need]({{$url6}}).\n\nWhen I write, GPT-4 / Claude 3 Opus continuously accompanies me, their role being **to correct and enhance readability** or similar transformations of the content I produce. LLMs also perform well during brainstorming sessions and discussions on the topic I'm currently focusing on.\n\n![]({{$img4}})\n\nWhile writing:\n\n- Editor is in full-screen mode\n- Typing on [Wooting 60HE]({{$url7}}) keyboard\n- Listening to music on [Spotify]({{$url8}}) or [Endel]({{$url9}})\n- Taking screenshots with [Xnapper]({{$url10}})\n- Generating code snippets in [ray.so]({{$url11}}) via Puppeteer automation macro\n- Optimizing images with a macro linked to [TinyPNG]({{$url12}})\n- Sharing images and files using [Dropshare]({{$url13}})\n- Hosting images and files on [DigitalOcean]({{$url14}})\n- Using converters for HTML -> Markdown, Markdown -> HTML, Notion -> Markdown, and Markdown -> Notion. This allows me to write newsletters and blogs in markdown editor, then automate conversion to the target format. Uploading files to my own hosting is key here.\n- Keyboard settings: \\\"Key repeat rate\\\" at maximum and \\\"Delay until repeat\\\" at minimum\n- Using `text expander` for frequently repeated phrases like proper names (e.g., .tech becomes Tech•sistence), URLs, email addresses, contact details\n- Navigating almost entirely with the keyboard, avoiding the mouse. Useful shortcuts include: move cursor to start/end of word (`Command + ← or →`), start/end of line (`Option + ← or →`), start/end of paragraph (`Command + ↑ or ↓`), delete next/previous word (`Option + Backspace or Option + Shift + Backspace`), select line/word/paragraph.\n- Using trackpad gestures for controlling music, managing windows/desktops, switching text editor functions, or sending selected text to AI assistant.\n- Utilizing keyboard shortcuts for actions related to screenshots, file optimization, and uploading.\n- Using clipboard manager [Paste]({{$url15}}) for easier text editing and returning to previously copied content (links, snippets).\n\nAll the above activities apply to each mentioned application. Even if Notion allows pasting images directly into the document, I still upload them to my server first. Attachments uploaded directly to Notion expire and are accessible only after logging in, which is problematic for automation.\n\n## General Workflow\n\nTasks, emails, and events are another area that I have quite well optimized. Unlike the tools where I write text, the priority here is the ability to connect with APIs. This allows me to leverage automation and AI in data organization. I wrote more about this in [User Interfaces may change because \\\"AI knows what we mean\\\"]({{$url16}}).\n\n### Managing tasks\n\n[Linear]({{$url17}}) is used both by our product team and myself to organize my work. All my tasks go here, and I almost never enter or edit their statuses manually. Instead, some entries appear as a result of automation (e.g., a new message with a label or a new file on Google Drive requiring my attention). Other entries I add via voice messages on Apple Watch or messages to the AI assistant on the Slack channel. \n\n![]({{$img5}})\n\nOf all the task management tools, so far I’ve liked Todoist and Linear the most. In both cases, we’re talking about an API that allows almost unrestricted management of your data. Besides the API, a clear graphical interface and keyboard shortcut support are important to me, and Linear definitely performed better in this regard. Especially since, as you can see in the screenshot above, you can set views tailored to your needs or current situation.\n\nSo, on the topic of task management:\n\n- I mainly add and edit tasks via voice or simple Slack and Alice messages. The AI then assigns new entries to the appropriate categories, priorities, and deadlines.\n- The organization and updating of entries in Linear is handled by a series of GPT-4 prompts, which consider the rules I've defined once. If needed, I can override them by simply stating that a given task should be assigned to a different project than indicated by the category descriptions.\n- Automation fills a large part of my tasks with various events and schedules. When possible, the AI assistant fetches additional information for the task description.\n- My priority is API availability, as automation allows me to focus on executing tasks, removing most of the organizational burden, except for planning-related activities.\n\n### E-mail\n\nFor years, I've been using Google Workspace in conjunction with Superhuman. This is no coincidence, as Gmail itself is a great service that also has rich automation capabilities, both through external services (e.g., scenarios on [make.com]({{$url18}})) and internal settings (advanced filters).\n\n![]({{$img6}})\n\nEmail automation for me involves responding to new messages that Gmail automatically assigns specific labels to. For example, messages containing the keyword \\\"Invoice\\\" are assigned the \\\"Invoices\\\" label. This, in turn, triggers a Make.com scenario that takes further actions with the content of that message (e.g., saving the attachment to Google Drive or adding a task to Linear).\n\n![]({{$img7}})\n\nSometimes, filter rules aren't enough to correctly capture all messages. In those cases, I manually add labels in Superhuman, but I do this using keyboard shortcuts, which makes the whole process much easier.\n\n![]({{$img8}})\n\nWorking with email also involves an account connected to an AI assistant, which can send me various messages after completing assigned tasks. I wrote more about this in the post [Personal AGI]({{$url19}}).\n\nRegarding email management:\n\n- Superhuman's keyboard shortcuts and overall look & feel make working with email enjoyable and fast. Its high price is justified (though this is very subjective).\n- Gmail / Google Workspace is a \\\"must-have.\\\"\n- Combining automatic filters with labels and automation greatly simplifies email management, document organization, and prioritization.\n\n### Calendar\n\nMy calendar is mostly empty, with no more than two recurring meetings in bi-weekly cycles. This allows me to work with focus, communicating asynchronously via Slack or other channels.\n\nHowever, you can book a slot in my calendar through [Zencal]({{$url20}}). These are pre-set time blocks that automatically disappear when a meeting is scheduled or another entry, such as a trip, appears in my calendar.\n![]({{$img9}})\n\nSimilarly to a task list, I can add new calendar entries via voice message to my AI assistant. The assistant can also check my availability or retrieve events from a specific range. Ultimately, I still occasionally check the calendar myself, and then I use the [Notion Calendar]({{$url21}}) app.\n\n![]({{$img10}})\n\nNotion Calendar in its own way resembles Superhuman and offers intuitive keyboard shortcuts and a minimalist interface.\n\nOn the topic of calendar management:\n\n- Managing entries is done either by voice or through simple messages to an AI assistant (requires custom integrations)\n- Zencal is a brilliant tool for scheduling meetings (including paid ones), which can incorporate various automations (e.g., sending forms before the meeting or notes after the meeting)\n- Notion Calendar is a good, though not perfect, client.\n\n## Searching Web\n\n[Arc Browser]({{$url22}}) is my main browser on both macOS and iOS. Despite the ability to organize tabs or profiles, I only use its basic functionalities. Yet, the Command Bar (`Command + T`) and Little Arc (`Command + Option + N`) make a significant difference for me.\n\n![]({{$img11}})\n\n", + "metadata": { + "tokens": 2421, + "headers": { + "h1": [ + "Indie Hacker's toolstack 2024" + ], + "h2": [ + "Text editor(s)", + "General Workflow", + "Searching Web" + ], + "h3": [ + "Managing tasks", + "E-mail", + "Calendar" + ] + }, + "urls": [ + "https://rize.io/", + "https://ia.net/topics/category/writer", + "https://papereditor.app/", + "https://obsidian.md/", + "https://vitepress.vuejs.org/", + "https://www.notion.so/", + "https://www.techsistence.com/p/plain-text-is-what-you-need-but-why", + "https://wooting.io/", + "https://www.spotify.com/", + "https://endel.io/", + "https://xnapper.com/", + "https://ray.so/", + "https://tinypng.com/", + "https://dropshare.app/", + "https://www.digitalocean.com/", + "https://setapp.com/apps/paste", + "https://www.techsistence.com/p/user-interfaces-may-change-because", + "https://linear.app/", + "make.com", + "https://www.techsistence.com/p/personal-agi-pushing-gpt-4-turbo", + "https://zencal.io/", + "https://www.notion.so/product/calendar", + "https://arc.net/" + ], + "images": [ + "https://cloud.overment.com/2024-05-30/tech_ia-ee9f8793-8.png", + "https://cloud.overment.com/2024-05-30/tech_ia-ee9f8793-8.png", + "https://cloud.overment.com/2024-05-30/tech_obsidian-70b500cb-d.png", + "https://cloud.overment.com/2024-05-30/tech_notion-8972a825-3.png", + "https://cloud.overment.com/2024-05-30/tech_writing-dd3a8ec4-5.png", + "https://cloud.overment.com/2024-05-30/tech_linear-6ac89e32-a.png", + "https://cloud.overment.com/2024-05-30/tech_super-659802da-c.png", + "https://cloud.overment.com/2024-05-30/tech_filters-9b8c5133-9.png", + "https://cloud.overment.com/2024-05-30/tech_supershortcuts-a6dbf423-9.png", + "https://cloud.overment.com/2024-05-30/tech_schedule-b6fa1c16-3.png", + "https://cloud.overment.com/2024-05-30/tech_cal-ae93f4da-8.png", + "https://cloud.overment.com/2024-05-30/tech_arc-a98a5765-5.png" + ] + } + }, + { + "text": "In a situation where I come across an interesting source (e.g., article, publication, or video) that I can't review at the moment or know I'll want to return to, I use a keyboard shortcut to send the open page to the AI assistant. The assistant then fetches available information about the page and saves the link to it in Linear and Feedly (pinning it to the appropriate board).\n\nThe thread of staying up-to-date and monitoring news on topics that interest me is addressed through Feedly. Similar to previous tools, the main factor influencing the choice here is the availability of an API.\n\n![]({{$img0}})\n\nI've connected Feedly boards with Make.com automations, so simply pinning a post triggers additional actions. For instance, it saves the link in my assistant's long-term memory. This memory is linked with search engines (Algolia and Qdrant), allowing easy retrieval of previously saved sources without needing to specify their exact names.\n\n![]({{$img1}})\n\nSo, browsing the web for me means:\n\n- A browser solely for Internet browsing. I don't save bookmarks or other info. Instead, I use macros and automation to organize knowledge in set places, all controlled by LLM (GPT-4-turbo and GPT-4o).\n- Staying updated and exploring new topics with Feedly and sites like [Product Hunt]({{$url0}}), [daily.dev]({{$url1}}), [Indie Hackers]({{$url2}}), or [HackerNews]({{$url3}}).\n- The foundation of the whole system is my custom AI assistant and its long-term memory. Note, this isn't Alice from [heyalice.app]({{$url4}}), but my private app, which I'm gradually making publicly available.\n\n## Graphic Design\n\nDesigning UI and promotional materials is an integral part of my work. I mainly use [Figma]({{$url5}}) and recently returned to [Adobe Photoshop Beta]({{$url6}}) due to its Generative AI features, which are excellent for editing images and assets generated in Midjourney.\n\nBelow is an example of covers for one of my courses, which I generated in Midjourney with slight editing through Adobe Firefly. \n\n![]({{$img2}})\n\nFigma works phenomenally for UI design, especially when using components and the auto-layout feature.\n\n![]({{$img3}})\n\nThere are creations, however, that are generated according to templates, and creating new versions involves only text replacement or simple layout editing. In such cases, Webflow becomes my graphic editor.\n\n![]({{$img4}})\n\nThe AI assistant only needs information from me on how to generate the graphic (or set of graphics), along with the set of information needed to create them (e.g., text, link to background image). The assistant automates contact with Webflow to update the CMS entry, then downloads the page as a PNG and sends it to me.\n\n![]({{$img5}})\n\nWhen designing creations, I always use Midjourney Alpha. I generate various graphic or asset variants there, which I often combine in Photoshop. \n\n![]({{$img6}})\n\nSummarizing the topic of graphic design:\n\n- I use Generative AI, and currently, Midjourney or Stable Diffusion 3 works best.\n- Figma is undeniably the best available tool for interface design or creating advertisements. It's definitely worth getting to know its more advanced features, which save a lot of time.\n- Webflow combined with HTMLCSSToImage allows for automatic generation of graphics based on templates. Alternatively, you can use the latter tool directly, where you only need an HTML template in which you replace individual elements with automation.\n- Combining LLM with a set of templates allows for easy generation of entire sets of advertisements in various variants.\n\n\n## Programming\n\nProgramming is the second (after writing texts) activity that takes up most of my time, and therefore I also pay a lot of attention to it in the context of optimizing the entire process.\n\nI use the following tools:\n\n- [IntelliJ IDEA]({{$url7}}): This is my main code editor. Although I don't program in JAVA, IntelliJ works great with various programming languages (for me, it's TypeScript and Rust).\n- [Supermaven]({{$url8}}): This is an alternative to Github Copilot that I have just started using, and it makes a great first impression by suggesting code very intelligently.\n- [iTerm]({{$url9}}): Although I have gone through many different terminals, iTerm won with its simplicity and the fact that it performs its task perfectly.\n- [TablePlus]({{$url10}}): This is a great database client for macOS.\n\n![]({{$img7}})\n\nAbove you can see my IntelliJ configuration. All panels and additional options are turned off because I constantly use keyboard shortcuts. This is especially justified due to the very high customization possibilities of this IDE and the presence of a \\\"Command Palette\\\" style search.\n\n![]({{$img8}})\n\nFor actions that do not have a keyboard shortcut or I simply use them rarely, I use Search Menu Items, one of the options of the [Raycast]({{$url11}}) application.\n\n![]({{$img9}})\n\nSince the release of ChatGPT, large language models have been my constant companions in programming. I'm not just talking about generating code or debugging but also discussing problems, making design decisions, and learning new technologies. Of course, the final decisions are always mine, but models like GPT-4-turbo or Claude 3 Opus are almost perfect conversation partners.\n\nSo, on the topic of programming:\n\n- I use the best available tools that work for me. For example, despite the enormous popularity of Visual Studio Code, IntelliJ works incomparably better for me. The main argument here is that IntelliJ simply \\\"understands my code\\\" much better than VSC.\n- Generative AI is another level of pair programming for me because, in this case, such a partner is available to me all the time and often has much more knowledge than I do, although it quite often makes mistakes. Despite this, the final balance of mistakes with the value I receive is definitely positive.\n- Where justified, I use tools to automate working with code. A \\\"must-have\\\" is application deployment, which I always perform through Github Actions.\n- As seen even in the previous points, I use programming skills not only to develop products and work but also to develop tools for my needs. \n\n## Macros and Automations\n\nI'll write a separate post about macros and automation, as it's too extensive a topic to cover in a few points. I'll just note that I work with applications: [Shortcuts]({{$url12}}), [Keyboard Maestro]({{$url13}}), [Better Touch Tool]({{$url14}}), [Raycast]({{$url15}}), and of course [make.com]({{$url16}}).\n\nThe whole system is also supplemented by my personal API, which is directly integrated with my AI assistant. As a result, macros and automations can communicate with both me and each other. The system gradually evolves with the development of large language models and entire ecosystems of tools.\n\nSo if you're interested in this topic and want to see how I've addressed it, be sure to subscribe to Tech•sistence.\n\n## Fun\n\nOutside of work, I'm also a fan of books and games, spending my free afternoons and evenings with them. I log all the titles I've read on my Goodreads profile, often sharing highlighted passages or notes.\n\n![]({{$img10}})\n\nI always read books in the [Amazon Kindle]({{$url17}}) app or listen via [Audible]({{$url18}}). It’s very helpful that if you have both the audiobook and e-book versions, progress syncs between devices, making reading much easier.\n\nHowever, in the past several months, I've spent much less time with books because my main area of interest has shifted to topics that books haven’t been written about yet, like Generative AI or new programming languages and tools. As for books, I now reach for more challenging, timeless titles that require much more time than typical bestsellers in business, psychology, or economics.\n\nFor games, my number one is currently PlayStation 5, followed by Nvidia GeForce Now, a streaming service connected to my Steam account (and more). Outside home, I also play on the Steam Deck, which is an incredibly impressive device, and the Nintendo Switch.\n\n![]({{$img11}})\n\nBoth while gaming and reading, I also listen to music, which (as you might know) is also connected to my AI assistant. Therefore, the availability of an API and cross-platform functionality is essential for the player, and Spotify excels in this regard.\n\n![]({{$img12}})\n\nWhen I need to focus, e.g., while programming, designing, or writing longer texts, I also turn to [endel.io]({{$url19}}).\n\n![]({{$img13}})\n\n## Summary\n\nAlthough I didn't manage to exhaust the topic of tools, I think I outlined the general framework of the set I currently use quite well.\n\nIf you have any questions about the selected tools or the ways I work with them, let me know in the comments. Similarly, if you want my future posts to cover specific topics, let me know as well.\n\nClosing this post, I'll just note that the mentioned set is constantly changing. Even if some of the tools have been with me for years, the ways I work with them change. I see this as an important part of my development and daily life. The whole setup is configured not only to increase my productivity but also to make each of my days more enjoyable and simply fun.\n\nHave fun,\nAdam\n\n\n", + "metadata": { + "tokens": 2386, + "headers": { + "h1": [ + "Indie Hacker's toolstack 2024" + ], + "h2": [ + "Graphic Design", + "Programming", + "Macros and Automations", + "Fun", + "Summary" + ] + }, + "urls": [ + "https://www.producthunt.com/", + "https://app.daily.dev/onboarding", + "https://www.indiehackers.com/", + "https://news.ycombinator.com/", + "https://heyalice.app", + "https://figma.com", + "https://www.adobe.com/products/photoshop.html", + "https://www.jetbrains.com/idea/", + "https://supermaven.com/", + "https://iterm2.com/", + "https://tableplus.com/", + "https://www.raycast.com/", + "https://apps.apple.com/us/app/shortcuts/id915249334", + "https://folivora.ai/", + "https://folivora.ai/", + "https://www.raycast.com/", + "https://www.make.com/", + "https://play.google.com/store/apps/details", + "https://www.audible.com", + "https://endel.io/" + ], + "images": [ + "https://cloud.overment.com/2024-05-30/tech_feed-9961c0a1-9.png", + "https://cloud.overment.com/2024-05-30/tech_memory-d7413d87-2.png", + "https://cloud.overment.com/2024-05-30/tech_covers-31b8727b-c.png", + "https://cloud.overment.com/2024-05-30/tech_components-31c52ec9-8.png", + "https://cloud.overment.com/2024-05-30/tech_webflow-4bc4e1f1-3.png", + "https://cloud.overment.com/2024-05-30/tech_gen-cbce636f-e.png", + "https://cloud.overment.com/2024-05-30/tech_mid-829ce30c-9.png", + "https://cloud.overment.com/2024-05-30/tech_intelij-4283c83e-c.png", + "https://cloud.overment.com/2024-05-30/tech_files-4268c510-0.png", + "https://cloud.overment.com/2024-05-30/tech_items-0a49d7b1-6.png", + "https://cloud.overment.com/2024-05-30/tech_goodreads-9d29499c-a.png", + "https://cloud.overment.com/2024-05-30/tech_gfn-158e7285-2.png", + "https://cloud.overment.com/2024-05-30/tech_spotify-bc1fa329-6.png", + "https://cloud.overment.com/2024-05-30/tech_endel-aad69006-1.png" + ] + } + } +] \ No newline at end of file diff --git a/text-splitter/youtube_transcript.json b/text-splitter/youtube_transcript.json new file mode 100644 index 00000000..a8caec96 --- /dev/null +++ b/text-splitter/youtube_transcript.json @@ -0,0 +1,209 @@ +[ + { + "text": "0 -> electric cars have many advantages which\\n2 -> have helped lead to their Rising\\n3 -> popularity such as requiring a lot less\\n6 -> maintenance however the battery is still\\n8 -> very expensive and if it ever needs to\\n10 -> be replaced it's a huge expense luckily\\n13 -> there are practices you can put into\\n15 -> place to make the battery last a really\\n18 -> really long time and there are things\\n20 -> you really shouldn't do which can\\n22 -> dramatically shorten that lifetime my\\n24 -> goal for this video is to not only\\n25 -> explain the best and worst practices but\\n28 -> actually explain why at the microscopic\\n31 -> level why these are good or bad ideas\\n33 -> now before we get into these practices\\n36 -> it's worth mentioning this video is\\n37 -> about nmc batteries meaning batteries\\n39 -> made up of nickel manganese and Cobalt\\n42 -> oxides it's a chemistry that gives you a\\n44 -> lot of range and it's commonly used in46 -> the automotive space now if you don't\\n48 -> know what chemistry your electric car's\\n50 -> battery uses and why would you well much\\n53 -> of these are good practices regardless\\n55 -> we'll get into exceptions later so we're\\n58 -> going to have three main rules number\\n60 -> one don't store your car's battery at\\n63 -> 100% for long periods of time especially\\n66 -> when it's hot out now leaving your\\n68 -> electric car in the hot sun for months\\n70 -> at a time sounds like an edge case and\\n72 -> it is but it helps lay the foundation\\n74 -> for this video now if you haven't yet\\n76 -> seen my video on how a lithium ion\\n78 -> battery works that is certainly worth\\n80 -> checking out but the big question here\\n82 -> is why do batteries lose capacity over\\n85 -> time and I've Illustrated many of the\\n87 -> reasons here there's a lot of reasons\\n89 -> why batteries will lose capacity over91 -> time the important thing to keep in mind\\n93 -> is that if the battery is hotter and if\\n95 -> the battery is at a higher voltage which\\n97 -> occurs when it's at a higher state of\\n99 -> charge these reactions are more\\n101 -> prominent and they happen more quickly\\n103 -> so you get more degradation when you\\n105 -> have higher temperatures and at a higher\\n107 -> voltage in other words a higher state of\\n109 -> charge so one example I want to look at\\n111 -> is called the solid electrolyte\\n113 -> interface formation which occurs on both\\n116 -> the particles in the anode as well as\\n118 -> the particles in the cathode where it is\\n120 -> then called cathode electrolyte\\n122 -> interface so very simply what happens\\n124 -> when you're originally creating the\\n126 -> battery and you add the liquid\\n127 -> electrolyte and you put it through its\\n129 -> very first charge cycle well this solid\\n132 -> electrolyte interface forms on these134 -> particles and this formation consumes\\n137 -> the electrolyte it consumes lithium it\\n139 -> consumes materials from the cathode and\\n141 -> anode and so you're consuming useful\\n143 -> materials from that battery and as a\\n145 -> result you actually lose about 10% of\\n147 -> the battery's initial capacity on that\\n149 -> very first charge now you as a consumer\\n152 -> never see this because this is done at\\n153 -> the factory long before you ever get a\\n155 -> product using this battery but it is\\n157 -> worth mentioning because this continues\\n159 -> to grow and so as long as this\\n162 -> electrolyte interface continues to grow\\n164 -> and consume other materials it means\\n165 -> it's taking away from the usefulness of\\n168 -> your battery now there was a really cool\\n170 -> study done where they found that if you\\n172 -> store a battery at a higher temperature\\n174 -> it has more degradation but they also176 -> found that if you store a battery at a\\n178 -> higher state of charge it also has more\\n180 -> degradation so what did they do well\\n182 -> they took a bunch of batteries and they\\n184 -> stored them in a room at 50° C so very\\n188 -> warm and they stored these batteries\\n190 -> with a different state of charge so one\\n192 -> of them at ", + "metadata": { + "tokens": 981, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "100% state of charge one at\\n194 -> 90% one at 80% and so on and what did\\n197 -> they find well the battery that was\\n199 -> stored at 100% state of charge had less\\n202 -> than 60% of its original capacity after\\n206 -> less than 200 days so it had degraded a\\n210 -> ton versus the battery stored at 30%\\n212 -> state of charge was only down to 85% of\\n216 -> its original rated capacity after about\\n219 -> 400 days so significantly more capacity\\n223 -> and much longer duration than it was in\\n225 -> the test so heat and voltage are both\\n228 -> bad for battery degradation now there's230 -> an Incredible video by Professor Jeff\\n232 -> Dawn a lithium ion battery researcher\\n235 -> with seemingly endless knowledge in this\\n237 -> space who also had a 5-year research\\n239 -> partner partnership with Tesla for\\n240 -> battery development he provides specific\\n243 -> advice so for each of these three rules\\n246 -> I'm going to share his advice for what\\n248 -> you should do all right so say you're\\n250 -> storing your electric car for a long\\n252 -> period of time and it's going to be in a\\n254 -> hot environment what should you do well\\n256 -> he says you should Target a 30% state of\\n258 -> charge for that duration now if you're\\n261 -> storing it in the cold even for a long\\n263 -> period of time there's no worries\\n265 -> because of the cold temperatures you'll\\n267 -> have very little reactivity so storing\\n269 -> it at say 70% is no big deal number two\\n272 -> don't wait until the battery is low to275 -> recharge it unless necessary now the\\n277 -> critical part here is that you have a\\n279 -> relatively low depth of discharge\\n281 -> meaning say keeping your battery at 80%\\n284 -> and only discharging to 60% before\\n286 -> charging again it's fine to use the\\n289 -> whole battery when you need it but after\\n290 -> a short trip plug it in a bunch of small\\n293 -> charges is much better than in frequent\\n296 -> F depth charges okay so why well let's\\n300 -> look at the particles that make up the\\n301 -> cathode and if we zoom in on one of\\n304 -> these electrode particles we can see\\n306 -> that it's made up of many many many\\n309 -> small crystallites and each one of these\\n311 -> small crystallites has its own structure\\n313 -> that's repeated so you've got oxygen\\n315 -> metals and lithium that's moving to and\\n317 -> from the anode back to the cathode back\\n319 -> to the anode and so as this lithium322 -> leaves this crystal structure well this\\n324 -> formation expands in One Direction and\\n327 -> it shrinks in another formation and\\n330 -> again the orientation of these are all\\n332 -> over the place so you've got a bunch of\\n334 -> different crystals all with different\\n335 -> orientation that are expanding and\\n337 -> Contracting in different ways so you can\\n340 -> imagine that as that keeps happening you\\n342 -> start to have cracks form within this\\n344 -> particle as these particles are getting\\n346 -> bigger and smaller they're creating\\n347 -> these cracks within the particle well as\\n350 -> these cracks form you have that cathode\\n353 -> electrolyte interface formation so again\\n355 -> you start consuming more materials more\\n358 -> useful materials within the battery from\\n360 -> the electrolyte the lithium things like\\n363 -> that and so you have battery degradation\\n365 -> okay so why does depth of discharge367 -> matter then well the growth of these\\n370 -> crystals is roughly proportional to the\\n373 -> depth of discharge so for example if\\n375 -> you're just going from 60% battery to\\n377 -> 40% battery well that's only 20% of your\\n380 -> total battery right versus if you're\\n3", + "metadata": { + "tokens": 903, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "82 -> going from 100% to 0% 100% of your total\\n385 -> battery so that 60 to 40 has about a\\n387 -> fifth of the effect of this growth and\\n390 -> contraction that you have Within These\\n392 -> crystals meaning if you use these\\n394 -> smaller battery ranges you have much\\n397 -> less cracking occur within these\\n398 -> particles and the battery lasts\\n400 -> significantly longer so again a really\\n403 -> cool study looked at how a battery's\\n405 -> depth of discharge impacted its\\n407 -> normalized capacity over time okay so\\n409 -> for this study they're putting the same\\n411 -> amount of energy in and out of all the\\n414 -> batteries but they're using a different416 -> percentage of the battery to do it so\\n418 -> for example if you're just going from\\n420 -> 40% to 60% well you're going to have a\\n422 -> bunch of small charges versus if you're\\n424 -> going from 0 to 100% you're going to\\n426 -> have fewer charges but the same amount\\n428 -> of energy cuz you're using the whole\\n430 -> battery and so what did they find well\\n432 -> they found that going from 0 to 100%\\n435 -> constantly the battery only had about\\n438 -> 50% of its capacity after less than a\\n441 -> 100 days versus going from 40 to 60%\\n445 -> constantly the battery was at about 85%\\n448 -> after 400 Days okay well what does this\\n451 -> mean as far as context so going from 60\\n454 -> to 40% constantly was the equivalent\\n457 -> after 400 Days of about 3,200 full\\n461 -> cycles of that battery now if you were\\n463 -> to have a battery uh on an EV that had a\\n466 -> 250 Mi range well that means this\\n468 -> battery would last about470 -> 800,000 miles before its degradation\\n473 -> reached about 85% so that's incredible\\n477 -> right now the catch is that means you're\\n479 -> only using 20% of the battery so you'd\\n481 -> be limiting yourself to 50 m trips\\n484 -> personally I don't stress about this one\\n486 -> the easiest way to think of it is to\\n488 -> just plug in your car after every trip\\n490 -> rather than waiting till the battery is\\n491 -> low to recharge it all right so what\\n493 -> does Professor Jeff Don recommend he\\n496 -> says stick to low stateof charge ranges\\n498 -> 25% is great now obviously if you can't\\n501 -> charge at home this is tough to do which\\n504 -> is fine if you follow the next rule he\\n506 -> says your battery will still very likely\\n508 -> outl last the life of the car number\\n511 -> three don't regularly charge to 100%\\n515 -> okay what the heck shouldn't this be the\\n517 -> car Maker's problem not mine yes520 -> absolutely that's why warranties exist\\n523 -> and there are real engineering solutions\\n525 -> to these problems so to understand\\n527 -> number three let's look at the\\n529 -> engineering Solutions now once again\\n531 -> looking at the particles that make up\\n532 -> our cathode there's a very clever\\n534 -> solution here we're instead of using a\\n536 -> bunch of many small crystals you use a\\n540 -> single crystal structure for the entire\\n542 -> particle so what this means is you have\\n545 -> uniform expansion and contraction of\\n547 -> that entire particle rather than having\\n549 -> a bunch of crystallites at different\\n551 -> orientations which as they grow and\\n553 -> contract they create all these cracks so\\n555 -> you avoid that cracking using this\\n557 -> single crystal structure this is used in\\n560 -> some Modern EVs and it has much longer\\n563 -> capacity retention another Trend you're565 -> tending to see is batteries that are\\n567 -> using higher nickel content all right so\\n569 -> if you use a battery with more nickel it\\n571 -> has better energy density seems lik", + "metadata": { + "tokens": 929, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "e a\\n573 -> smart thing to do so what's the problem\\n575 -> well here we're looking at two different\\n577 -> graphs with different nickel content in\\n579 -> these batteries this one has about 50%\\n582 -> for the cathode this one has about 80%\\n584 -> for the cathode so using that higher\\n586 -> nickel content you can see the voltage\\n588 -> curve looks a bit different where we\\n590 -> have this Plateau at the end for that\\n592 -> latter portion of the state of charge\\n594 -> from about 75% to 100% you've got this\\n597 -> Plateau well this plateau toe is\\n599 -> associated with a large volumetric\\n601 -> change so you want to avoid that\\n603 -> especially if you're using these uh you\\n605 -> know many small crystallites as the608 -> structure for that cathode so you avoid\\n610 -> that region you help avoid that micro\\n612 -> cracking well what if you use a single\\n615 -> crystal structure and also what if you\\n617 -> use a lower nickel content well you\\n619 -> don't have that Plateau you don't have\\n621 -> to worry about that as much no problem\\n622 -> you can charge up to 100% the same is\\n625 -> basically true for lithium iron\\n626 -> phosphate batteries which use a\\n628 -> different chemistry all right but even\\n630 -> if we're using a higher nickel content\\n632 -> as long as we're using a single crystal\\n634 -> structure we don't have to worry about\\n635 -> cracking right well yes unfortunately\\n639 -> this Plateau is also associated with a\\n641 -> very small amount of oxygen being\\n643 -> released during that portion of charging\\n646 -> so you want to avoid this even if you're\\n648 -> using a single crystal structure if you650 -> have a high nickel content battery\\n652 -> because that relates to gas formation\\n655 -> within the battery which means you're\\n656 -> going to have degradation over time all\\n658 -> right what's what's the Dr Don\\n660 -> recommendation charge to 75% that way\\n663 -> you have plenty of range daily and say\\n665 -> you have a long trip coming up well\\n667 -> charge the night before to 100% to have\\n669 -> the extra range if you need it now\\n671 -> obviously if you live in an apartment\\n673 -> without charging going out and only\\n675 -> charging up to 75% sounds very tedious\\n678 -> and repetitive and personally I'm of the\\n680 -> mindset that if you can't charge your\\n681 -> electric vehicle at home well it really\\n683 -> doesn't make sense for you yet to those\\n685 -> who do it hats off to you but it's\\n687 -> certainly not very convenient so I think\\n689 -> the simple message is don't stress about0 -> electric cars have many advantages which\\n2 -> have helped lead to their Rising\\n3 -> popularity such as requiring a lot less\\n6 -> maintenance however the battery is still\\n8 -> very expensive and if it ever needs to\\n10 -> be replaced it's a huge expense luckily\\n13 -> there are practices you can put into\\n15 -> place to make the battery last a really\\n18 -> really long time and there are things\\n20 -> you really shouldn't do which can\\n22 -> dramatically shorten that lifetime my\\n24 -> goal for this video is to not only\\n25 -> explain the best and worst practices but\\n28 -> actually explain why at the microscopic\\n31 -> level why these are good or bad ideas\\n33 -> now before we get into these practices\\n36 -> it's worth mentioning this video is\\n37 -> about nmc batteries meaning batteries\\n39 -> made up of nickel manganese and Cobalt\\n42 -> oxides it's a chemistry that gives you a\\n44 -> lot of range and it's commonly used in46 -> the automotive space now if you don't\\n48 -> know what chemistry your electric car's\\n50 -> battery uses and why would yo", + "metadata": { + "tokens": 908, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "u well much\\n53 -> of these are good practices regardless\\n55 -> we'll get into exceptions later so we're\\n58 -> going to have three main rules number\\n60 -> one don't store your car's battery at\\n63 -> 100% for long periods of time especially\\n66 -> when it's hot out now leaving your\\n68 -> electric car in the hot sun for months\\n70 -> at a time sounds like an edge case and\\n72 -> it is but it helps lay the foundation\\n74 -> for this video now if you haven't yet\\n76 -> seen my video on how a lithium ion\\n78 -> battery works that is certainly worth\\n80 -> checking out but the big question here\\n82 -> is why do batteries lose capacity over\\n85 -> time and I've Illustrated many of the\\n87 -> reasons here there's a lot of reasons\\n89 -> why batteries will lose capacity over91 -> time the important thing to keep in mind\\n93 -> is that if the battery is hotter and if\\n95 -> the battery is at a higher voltage which\\n97 -> occurs when it's at a higher state of\\n99 -> charge these reactions are more\\n101 -> prominent and they happen more quickly\\n103 -> so you get more degradation when you\\n105 -> have higher temperatures and at a higher\\n107 -> voltage in other words a higher state of\\n109 -> charge so one example I want to look at\\n111 -> is called the solid electrolyte\\n113 -> interface formation which occurs on both\\n116 -> the particles in the anode as well as\\n118 -> the particles in the cathode where it is\\n120 -> then called cathode electrolyte\\n122 -> interface so very simply what happens\\n124 -> when you're originally creating the\\n126 -> battery and you add the liquid\\n127 -> electrolyte and you put it through its\\n129 -> very first charge cycle well this solid\\n132 -> electrolyte interface forms on these134 -> particles and this formation consumes\\n137 -> the electrolyte it consumes lithium it\\n139 -> consumes materials from the cathode and\\n141 -> anode and so you're consuming useful\\n143 -> materials from that battery and as a\\n145 -> result you actually lose about 10% of\\n147 -> the battery's initial capacity on that\\n149 -> very first charge now you as a consumer\\n152 -> never see this because this is done at\\n153 -> the factory long before you ever get a\\n155 -> product using this battery but it is\\n157 -> worth mentioning because this continues\\n159 -> to grow and so as long as this\\n162 -> electrolyte interface continues to grow\\n164 -> and consume other materials it means\\n165 -> it's taking away from the usefulness of\\n168 -> your battery now there was a really cool\\n170 -> study done where they found that if you\\n172 -> store a battery at a higher temperature\\n174 -> it has more degradation but they also176 -> found that if you store a battery at a\\n178 -> higher state of charge it also has more\\n180 -> degradation so what did they do well\\n182 -> they took a bunch of batteries and they\\n184 -> stored them in a room at 50° C so very\\n188 -> warm and they stored these batteries\\n190 -> with a different state of charge so one\\n192 -> of them at 100% state of charge one at\\n194 -> 90% one at 80% and so on and what did\\n197 -> they find well the battery that was\\n199 -> stored at 100% state of charge had less\\n202 -> than 60% of its original capacity after\\n206 -> less than 200 days so it had degraded a\\n210 -> ton versus the battery stored at 30%\\n212 -> state of charge was only down to 85% of\\n216 -> its original rated capacity after about\\n219 -> 400 days so significantly more capacity\\n223 -> and much longer duration than it was in\\n225 -> the test so heat and voltage are both\\n228 -> bad for battery degradation now there's230 -> an Incredible video by Professor Jeff\\n232 -> Dawn a lithium ion battery researcher\\n235 -> with seemingly endless knowledge in this\\n237 -> space who also had a 5-year research\\n239 -> partner partnership with Tesla for\\n240 -> battery development he provides specific\\n243 -> advice so for each of these three rules\\n246 -> I'm going to share his advice for what\\n248 -> you should do all right so say you're\\n250 -> storing your electric car for a long\\n252 -> period of time and it", + "metadata": { + "tokens": 991, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "9;s going to be in a\\n254 -> hot environment what should you do well\\n256 -> he says you should Target a 30% state of\\n258 -> charge for that duration now if you're\\n261 -> storing it in the cold even for a long\\n263 -> period of time there's no worries\\n265 -> because of the cold temperatures you'll\\n267 -> have very little reactivity so storing\\n269 -> it at say 70% is no big deal number two\\n272 -> don't wait until the battery is low to275 -> recharge it unless necessary now the\\n277 -> critical part here is that you have a\\n279 -> relatively low depth of discharge\\n281 -> meaning say keeping your battery at 80%\\n284 -> and only discharging to 60% before\\n286 -> charging again it's fine to use the\\n289 -> whole battery when you need it but after\\n290 -> a short trip plug it in a bunch of small\\n293 -> charges is much better than in frequent\\n296 -> F depth charges okay so why well let's\\n300 -> look at the particles that make up the\\n301 -> cathode and if we zoom in on one of\\n304 -> these electrode particles we can see\\n306 -> that it's made up of many many many\\n309 -> small crystallites and each one of these\\n311 -> small crystallites has its own structure\\n313 -> that's repeated so you've got oxygen\\n315 -> metals and lithium that's moving to and\\n317 -> from the anode back to the cathode back\\n319 -> to the anode and so as this lithium322 -> leaves this crystal structure well this\\n324 -> formation expands in One Direction and\\n327 -> it shrinks in another formation and\\n330 -> again the orientation of these are all\\n332 -> over the place so you've got a bunch of\\n334 -> different crystals all with different\\n335 -> orientation that are expanding and\\n337 -> Contracting in different ways so you can\\n340 -> imagine that as that keeps happening you\\n342 -> start to have cracks form within this\\n344 -> particle as these particles are getting\\n346 -> bigger and smaller they're creating\\n347 -> these cracks within the particle well as\\n350 -> these cracks form you have that cathode\\n353 -> electrolyte interface formation so again\\n355 -> you start consuming more materials more\\n358 -> useful materials within the battery from\\n360 -> the electrolyte the lithium things like\\n363 -> that and so you have battery degradation\\n365 -> okay so why does depth of discharge367 -> matter then well the growth of these\\n370 -> crystals is roughly proportional to the\\n373 -> depth of discharge so for example if\\n375 -> you're just going from 60% battery to\\n377 -> 40% battery well that's only 20% of your\\n380 -> total battery right versus if you're\\n382 -> going from 100% to 0% 100% of your total\\n385 -> battery so that 60 to 40 has about a\\n387 -> fifth of the effect of this growth and\\n390 -> contraction that you have Within These\\n392 -> crystals meaning if you use these\\n394 -> smaller battery ranges you have much\\n397 -> less cracking occur within these\\n398 -> particles and the battery lasts\\n400 -> significantly longer so again a really\\n403 -> cool study looked at how a battery's\\n405 -> depth of discharge impacted its\\n407 -> normalized capacity over time okay so\\n409 -> for this study they're putting the same\\n411 -> amount of energy in and out of all the\\n414 -> batteries but they're using a different416 -> percentage of the battery to do it so\\n418 -> for example if you're just going from\\n420 -> 40% to 60% well you're going to have a\\n422 -> bunch of small charges versus if you're\\n424 -> going from 0 to 100% you're going to\\n426 -> have fewer charges but the same amount\\n428 -> of energy cuz you're using the whole\\n430 -> battery and so what did they find well\\n432 -> they found th", + "metadata": { + "tokens": 918, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "at going from 0 to 100%\\n435 -> constantly the battery only had about\\n438 -> 50% of its capacity after less than a\\n441 -> 100 days versus going from 40 to 60%\\n445 -> constantly the battery was at about 85%\\n448 -> after 400 Days okay well what does this\\n451 -> mean as far as context so going from 60\\n454 -> to 40% constantly was the equivalent\\n457 -> after 400 Days of about 3,200 full\\n461 -> cycles of that battery now if you were\\n463 -> to have a battery uh on an EV that had a\\n466 -> 250 Mi range well that means this\\n468 -> battery would last about470 -> 800,000 miles before its degradation\\n473 -> reached about 85% so that's incredible\\n477 -> right now the catch is that means you're\\n479 -> only using 20% of the battery so you'd\\n481 -> be limiting yourself to 50 m trips\\n484 -> personally I don't stress about this one\\n486 -> the easiest way to think of it is to\\n488 -> just plug in your car after every trip\\n490 -> rather than waiting till the battery is\\n491 -> low to recharge it all right so what\\n493 -> does Professor Jeff Don recommend he\\n496 -> says stick to low stateof charge ranges\\n498 -> 25% is great now obviously if you can't\\n501 -> charge at home this is tough to do which\\n504 -> is fine if you follow the next rule he\\n506 -> says your battery will still very likely\\n508 -> outl last the life of the car number\\n511 -> three don't regularly charge to 100%\\n515 -> okay what the heck shouldn't this be the\\n517 -> car Maker's problem not mine yes520 -> absolutely that's why warranties exist\\n523 -> and there are real engineering solutions\\n525 -> to these problems so to understand\\n527 -> number three let's look at the\\n529 -> engineering Solutions now once again\\n531 -> looking at the particles that make up\\n532 -> our cathode there's a very clever\\n534 -> solution here we're instead of using a\\n536 -> bunch of many small crystals you use a\\n540 -> single crystal structure for the entire\\n542 -> particle so what this means is you have\\n545 -> uniform expansion and contraction of\\n547 -> that entire particle rather than having\\n549 -> a bunch of crystallites at different\\n551 -> orientations which as they grow and\\n553 -> contract they create all these cracks so\\n555 -> you avoid that cracking using this\\n557 -> single crystal structure this is used in\\n560 -> some Modern EVs and it has much longer\\n563 -> capacity retention another Trend you're565 -> tending to see is batteries that are\\n567 -> using higher nickel content all right so\\n569 -> if you use a battery with more nickel it\\n571 -> has better energy density seems like a\\n573 -> smart thing to do so what's the problem\\n575 -> well here we're looking at two different\\n577 -> graphs with different nickel content in\\n579 -> these batteries this one has about 50%\\n582 -> for the cathode this one has about 80%\\n584 -> for the cathode so using that higher\\n586 -> nickel content you can see the voltage\\n588 -> curve looks a bit different where we\\n590 -> have this Plateau at the end for that\\n592 -> latter portion of the state of charge\\n594 -> from about 75% to 100% you've got this\\n597 -> Plateau well this plateau toe is\\n599 -> associated with a large volumetric\\n601 -> change so you want to avoid that\\n603 -> especially if you're using these uh you\\n605 -> know many small crystallites as the608 -> structure for that cathode so you avoid\\n610 -> that region you help avoid that micro\\n612 -> cracking well what if you use a single\\n615 -> crystal structure and also what if you\\n617 -> use a lower nickel content well you\\n619 -> don't have that Plateau you don't have\\n621 -> to worry about that as much no problem\\n622 -> you ca", + "metadata": { + "tokens": 923, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "n charge up to 100% the same is\\n625 -> basically true for lithium iron\\n626 -> phosphate batteries which use a\\n628 -> different chemistry all right but even\\n630 -> if we're using a higher nickel content\\n632 -> as long as we're using a single crystal\\n634 -> structure we don't have to worry about\\n635 -> cracking right well yes unfortunately\\n639 -> this Plateau is also associated with a\\n641 -> very small amount of oxygen being\\n643 -> released during that portion of charging\\n646 -> so you want to avoid this even if you're\\n648 -> using a single crystal structure if you650 -> have a high nickel content battery\\n652 -> because that relates to gas formation\\n655 -> within the battery which means you're\\n656 -> going to have degradation over time all\\n658 -> right what's what's the Dr Don\\n660 -> recommendation charge to 75% that way\\n663 -> you have plenty of range daily and say\\n665 -> you have a long trip coming up well\\n667 -> charge the night before to 100% to have\\n669 -> the extra range if you need it now\\n671 -> obviously if you live in an apartment\\n673 -> without charging going out and only\\n675 -> charging up to 75% sounds very tedious\\n678 -> and repetitive and personally I'm of the\\n680 -> mindset that if you can't charge your\\n681 -> electric vehicle at home well it really\\n683 -> doesn't make sense for you yet to those\\n685 -> who do it hats off to you but it's\\n687 -> certainly not very convenient so I think\\n689 -> the simple message is don't stress about0 -> electric cars have many advantages which\\n2 -> have helped lead to their Rising\\n3 -> popularity such as requiring a lot less\\n6 -> maintenance however the battery is still\\n8 -> very expensive and if it ever needs to\\n10 -> be replaced it's a huge expense luckily\\n13 -> there are practices you can put into\\n15 -> place to make the battery last a really\\n18 -> really long time and there are things\\n20 -> you really shouldn't do which can\\n22 -> dramatically shorten that lifetime my\\n24 -> goal for this video is to not only\\n25 -> explain the best and worst practices but\\n28 -> actually explain why at the microscopic\\n31 -> level why these are good or bad ideas\\n33 -> now before we get into these practices\\n36 -> it's worth mentioning this video is\\n37 -> about nmc batteries meaning batteries\\n39 -> made up of nickel manganese and Cobalt\\n42 -> oxides it's a chemistry that gives you a\\n44 -> lot of range and it's commonly used in46 -> the automotive space now if you don't\\n48 -> know what chemistry your electric car's\\n50 -> battery uses and why would you well much\\n53 -> of these are good practices regardless\\n55 -> we'll get into exceptions later so we're\\n58 -> going to have three main rules number\\n60 -> one don't store your car's battery at\\n63 -> 100% for long periods of time especially\\n66 -> when it's hot out now leaving your\\n68 -> electric car in the hot sun for months\\n70 -> at a time sounds like an edge case and\\n72 -> it is but it helps lay the foundation\\n74 -> for this video now if you haven't yet\\n76 -> seen my video on how a lithium ion\\n78 -> battery works that is certainly worth\\n80 -> checking out but the big question here\\n82 -> is why do batteries lose capacity over\\n85 -> time and I've Illustrated many of the\\n87 -> reasons here there's a lot of reasons\\n89 -> why batteries will lose capacity over91 -> time the important thing to keep in mind\\n93 -> is that if the battery is hotter and if\\n95 -> the battery is at a higher voltage which\\n97 -> occurs when it's at a higher state of\\n99 -> charge these reactions are more\\n101 -> prominent and they happen more quickly\\n103 -> so", + "metadata": { + "tokens": 907, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": " you get more degradation when you\\n105 -> have higher temperatures and at a higher\\n107 -> voltage in other words a higher state of\\n109 -> charge so one example I want to look at\\n111 -> is called the solid electrolyte\\n113 -> interface formation which occurs on both\\n116 -> the particles in the anode as well as\\n118 -> the particles in the cathode where it is\\n120 -> then called cathode electrolyte\\n122 -> interface so very simply what happens\\n124 -> when you're originally creating the\\n126 -> battery and you add the liquid\\n127 -> electrolyte and you put it through its\\n129 -> very first charge cycle well this solid\\n132 -> electrolyte interface forms on these134 -> particles and this formation consumes\\n137 -> the electrolyte it consumes lithium it\\n139 -> consumes materials from the cathode and\\n141 -> anode and so you're consuming useful\\n143 -> materials from that battery and as a\\n145 -> result you actually lose about 10% of\\n147 -> the battery's initial capacity on that\\n149 -> very first charge now you as a consumer\\n152 -> never see this because this is done at\\n153 -> the factory long before you ever get a\\n155 -> product using this battery but it is\\n157 -> worth mentioning because this continues\\n159 -> to grow and so as long as this\\n162 -> electrolyte interface continues to grow\\n164 -> and consume other materials it means\\n165 -> it's taking away from the usefulness of\\n168 -> your battery now there was a really cool\\n170 -> study done where they found that if you\\n172 -> store a battery at a higher temperature\\n174 -> it has more degradation but they also176 -> found that if you store a battery at a\\n178 -> higher state of charge it also has more\\n180 -> degradation so what did they do well\\n182 -> they took a bunch of batteries and they\\n184 -> stored them in a room at 50° C so very\\n188 -> warm and they stored these batteries\\n190 -> with a different state of charge so one\\n192 -> of them at 100% state of charge one at\\n194 -> 90% one at 80% and so on and what did\\n197 -> they find well the battery that was\\n199 -> stored at 100% state of charge had less\\n202 -> than 60% of its original capacity after\\n206 -> less than 200 days so it had degraded a\\n210 -> ton versus the battery stored at 30%\\n212 -> state of charge was only down to 85% of\\n216 -> its original rated capacity after about\\n219 -> 400 days so significantly more capacity\\n223 -> and much longer duration than it was in\\n225 -> the test so heat and voltage are both\\n228 -> bad for battery degradation now there's230 -> an Incredible video by Professor Jeff\\n232 -> Dawn a lithium ion battery researcher\\n235 -> with seemingly endless knowledge in this\\n237 -> space who also had a 5-year research\\n239 -> partner partnership with Tesla for\\n240 -> battery development he provides specific\\n243 -> advice so for each of these three rules\\n246 -> I'm going to share his advice for what\\n248 -> you should do all right so say you're\\n250 -> storing your electric car for a long\\n252 -> period of time and it's going to be in a\\n254 -> hot environment what should you do well\\n256 -> he says you should Target a 30% state of\\n258 -> charge for that duration now if you're\\n261 -> storing it in the cold even for a long\\n263 -> period of time there's no worries\\n265 -> because of the cold temperatures you'll\\n267 -> have very little reactivity so storing\\n269 -> it at say 70% is no big deal number two\\n272 -> don't wait until the battery is low to275 -> recharge it unless necessary now the\\n277 -> critical part here is that you have a\\n279 -> relatively low depth of discharge\\n281 -> meaning say keeping your battery at 80%\\n284 -> and only discharging to 60% before\\n286", + "metadata": { + "tokens": 891, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": " -> charging again it's fine to use the\\n289 -> whole battery when you need it but after\\n290 -> a short trip plug it in a bunch of small\\n293 -> charges is much better than in frequent\\n296 -> F depth charges okay so why well let's\\n300 -> look at the particles that make up the\\n301 -> cathode and if we zoom in on one of\\n304 -> these electrode particles we can see\\n306 -> that it's made up of many many many\\n309 -> small crystallites and each one of these\\n311 -> small crystallites has its own structure\\n313 -> that's repeated so you've got oxygen\\n315 -> metals and lithium that's moving to and\\n317 -> from the anode back to the cathode back\\n319 -> to the anode and so as this lithium322 -> leaves this crystal structure well this\\n324 -> formation expands in One Direction and\\n327 -> it shrinks in another formation and\\n330 -> again the orientation of these are all\\n332 -> over the place so you've got a bunch of\\n334 -> different crystals all with different\\n335 -> orientation that are expanding and\\n337 -> Contracting in different ways so you can\\n340 -> imagine that as that keeps happening you\\n342 -> start to have cracks form within this\\n344 -> particle as these particles are getting\\n346 -> bigger and smaller they're creating\\n347 -> these cracks within the particle well as\\n350 -> these cracks form you have that cathode\\n353 -> electrolyte interface formation so again\\n355 -> you start consuming more materials more\\n358 -> useful materials within the battery from\\n360 -> the electrolyte the lithium things like\\n363 -> that and so you have battery degradation\\n365 -> okay so why does depth of discharge367 -> matter then well the growth of these\\n370 -> crystals is roughly proportional to the\\n373 -> depth of discharge so for example if\\n375 -> you're just going from 60% battery to\\n377 -> 40% battery well that's only 20% of your\\n380 -> total battery right versus if you're\\n382 -> going from 100% to 0% 100% of your total\\n385 -> battery so that 60 to 40 has about a\\n387 -> fifth of the effect of this growth and\\n390 -> contraction that you have Within These\\n392 -> crystals meaning if you use these\\n394 -> smaller battery ranges you have much\\n397 -> less cracking occur within these\\n398 -> particles and the battery lasts\\n400 -> significantly longer so again a really\\n403 -> cool study looked at how a battery's\\n405 -> depth of discharge impacted its\\n407 -> normalized capacity over time okay so\\n409 -> for this study they're putting the same\\n411 -> amount of energy in and out of all the\\n414 -> batteries but they're using a different416 -> percentage of the battery to do it so\\n418 -> for example if you're just going from\\n420 -> 40% to 60% well you're going to have a\\n422 -> bunch of small charges versus if you're\\n424 -> going from 0 to 100% you're going to\\n426 -> have fewer charges but the same amount\\n428 -> of energy cuz you're using the whole\\n430 -> battery and so what did they find well\\n432 -> they found that going from 0 to 100%\\n435 -> constantly the battery only had about\\n438 -> 50% of its capacity after less than a\\n441 -> 100 days versus going from 40 to 60%\\n445 -> constantly the battery was at about 85%\\n448 -> after 400 Days okay well what does this\\n451 -> mean as far as context so going from 60\\n454 -> to 40% constantly was the equivalent\\n457 -> after 400 Days of about 3,200 full\\n461 -> cycles of that battery now if you were\\n463 -> to have a battery uh on an EV that had a\\n466 -> 250 Mi range well that means this\\n468 -> battery would last about470 -> 800,000 miles before its degradation\\n473 -> reached about 85% so that's incredible\\n477 -> right now the catch i", + "metadata": { + "tokens": 926, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "s that means you're\\n479 -> only using 20% of the battery so you'd\\n481 -> be limiting yourself to 50 m trips\\n484 -> personally I don't stress about this one\\n486 -> the easiest way to think of it is to\\n488 -> just plug in your car after every trip\\n490 -> rather than waiting till the battery is\\n491 -> low to recharge it all right so what\\n493 -> does Professor Jeff Don recommend he\\n496 -> says stick to low stateof charge ranges\\n498 -> 25% is great now obviously if you can't\\n501 -> charge at home this is tough to do which\\n504 -> is fine if you follow the next rule he\\n506 -> says your battery will still very likely\\n508 -> outl last the life of the car number\\n511 -> three don't regularly charge to 100%\\n515 -> okay what the heck shouldn't this be the\\n517 -> car Maker's problem not mine yes520 -> absolutely that's why warranties exist\\n523 -> and there are real engineering solutions\\n525 -> to these problems so to understand\\n527 -> number three let's look at the\\n529 -> engineering Solutions now once again\\n531 -> looking at the particles that make up\\n532 -> our cathode there's a very clever\\n534 -> solution here we're instead of using a\\n536 -> bunch of many small crystals you use a\\n540 -> single crystal structure for the entire\\n542 -> particle so what this means is you have\\n545 -> uniform expansion and contraction of\\n547 -> that entire particle rather than having\\n549 -> a bunch of crystallites at different\\n551 -> orientations which as they grow and\\n553 -> contract they create all these cracks so\\n555 -> you avoid that cracking using this\\n557 -> single crystal structure this is used in\\n560 -> some Modern EVs and it has much longer\\n563 -> capacity retention another Trend you're565 -> tending to see is batteries that are\\n567 -> using higher nickel content all right so\\n569 -> if you use a battery with more nickel it\\n571 -> has better energy density seems like a\\n573 -> smart thing to do so what's the problem\\n575 -> well here we're looking at two different\\n577 -> graphs with different nickel content in\\n579 -> these batteries this one has about 50%\\n582 -> for the cathode this one has about 80%\\n584 -> for the cathode so using that higher\\n586 -> nickel content you can see the voltage\\n588 -> curve looks a bit different where we\\n590 -> have this Plateau at the end for that\\n592 -> latter portion of the state of charge\\n594 -> from about 75% to 100% you've got this\\n597 -> Plateau well this plateau toe is\\n599 -> associated with a large volumetric\\n601 -> change so you want to avoid that\\n603 -> especially if you're using these uh you\\n605 -> know many small crystallites as the608 -> structure for that cathode so you avoid\\n610 -> that region you help avoid that micro\\n612 -> cracking well what if you use a single\\n615 -> crystal structure and also what if you\\n617 -> use a lower nickel content well you\\n619 -> don't have that Plateau you don't have\\n621 -> to worry about that as much no problem\\n622 -> you can charge up to 100% the same is\\n625 -> basically true for lithium iron\\n626 -> phosphate batteries which use a\\n628 -> different chemistry all right but even\\n630 -> if we're using a higher nickel content\\n632 -> as long as we're using a single crystal\\n634 -> structure we don't have to worry about\\n635 -> cracking right well yes unfortunately\\n639 -> this Plateau is also associated with a\\n641 -> very small amount of oxygen being\\n643 -> released during that portion of charging\\n646 -> so you want to avoid this even if you're\\n648 -> using a single crystal structure if you650 -> have a high nickel content battery\\n652 -> because that relates to gas formation\\n655 -", + "metadata": { + "tokens": 900, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "> within the battery which means you're\\n656 -> going to have degradation over time all\\n658 -> right what's what's the Dr Don\\n660 -> recommendation charge to 75% that way\\n663 -> you have plenty of range daily and say\\n665 -> you have a long trip coming up well\\n667 -> charge the night before to 100% to have\\n669 -> the extra range if you need it now\\n671 -> obviously if you live in an apartment\\n673 -> without charging going out and only\\n675 -> charging up to 75% sounds very tedious\\n678 -> and repetitive and personally I'm of the\\n680 -> mindset that if you can't charge your\\n681 -> electric vehicle at home well it really\\n683 -> doesn't make sense for you yet to those\\n685 -> who do it hats off to you but it's\\n687 -> certainly not very convenient so I think\\n689 -> the simple message is don't stress about0 -> electric cars have many advantages which\\n2 -> have helped lead to their Rising\\n3 -> popularity such as requiring a lot less\\n6 -> maintenance however the battery is still\\n8 -> very expensive and if it ever needs to\\n10 -> be replaced it's a huge expense luckily\\n13 -> there are practices you can put into\\n15 -> place to make the battery last a really\\n18 -> really long time and there are things\\n20 -> you really shouldn't do which can\\n22 -> dramatically shorten that lifetime my\\n24 -> goal for this video is to not only\\n25 -> explain the best and worst practices but\\n28 -> actually explain why at the microscopic\\n31 -> level why these are good or bad ideas\\n33 -> now before we get into these practices\\n36 -> it's worth mentioning this video is\\n37 -> about nmc batteries meaning batteries\\n39 -> made up of nickel manganese and Cobalt\\n42 -> oxides it's a chemistry that gives you a\\n44 -> lot of range and it's commonly used in46 -> the automotive space now if you don't\\n48 -> know what chemistry your electric car's\\n50 -> battery uses and why would you well much\\n53 -> of these are good practices regardless\\n55 -> we'll get into exceptions later so we're\\n58 -> going to have three main rules number\\n60 -> one don't store your car's battery at\\n63 -> 100% for long periods of time especially\\n66 -> when it's hot out now leaving your\\n68 -> electric car in the hot sun for months\\n70 -> at a time sounds like an edge case and\\n72 -> it is but it helps lay the foundation\\n74 -> for this video now if you haven't yet\\n76 -> seen my video on how a lithium ion\\n78 -> battery works that is certainly worth\\n80 -> checking out but the big question here\\n82 -> is why do batteries lose capacity over\\n85 -> time and I've Illustrated many of the\\n87 -> reasons here there's a lot of reasons\\n89 -> why batteries will lose capacity over91 -> time the important thing to keep in mind\\n93 -> is that if the battery is hotter and if\\n95 -> the battery is at a higher voltage which\\n97 -> occurs when it's at a higher state of\\n99 -> charge these reactions are more\\n101 -> prominent and they happen more quickly\\n103 -> so you get more degradation when you\\n105 -> have higher temperatures and at a higher\\n107 -> voltage in other words a higher state of\\n109 -> charge so one example I want to look at\\n111 -> is called the solid electrolyte\\n113 -> interface formation which occurs on both\\n116 -> the particles in the anode as well as\\n118 -> the particles in the cathode where it is\\n120 -> then called cathode electrolyte\\n122 -> interface so very simply what happens\\n124 -> when you're originally creating the\\n126 -> battery and you add the liquid\\n127 -> electrolyte and you put it through its\\n129 -> very first charge cycle well this solid\\n132 -> electrolyte interface forms on these134 -> par", + "metadata": { + "tokens": 901, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "ticles and this formation consumes\\n137 -> the electrolyte it consumes lithium it\\n139 -> consumes materials from the cathode and\\n141 -> anode and so you're consuming useful\\n143 -> materials from that battery and as a\\n145 -> result you actually lose about 10% of\\n147 -> the battery's initial capacity on that\\n149 -> very first charge now you as a consumer\\n152 -> never see this because this is done at\\n153 -> the factory long before you ever get a\\n155 -> product using this battery but it is\\n157 -> worth mentioning because this continues\\n159 -> to grow and so as long as this\\n162 -> electrolyte interface continues to grow\\n164 -> and consume other materials it means\\n165 -> it's taking away from the usefulness of\\n168 -> your battery now there was a really cool\\n170 -> study done where they found that if you\\n172 -> store a battery at a higher temperature\\n174 -> it has more degradation but they also176 -> found that if you store a battery at a\\n178 -> higher state of charge it also has more\\n180 -> degradation so what did they do well\\n182 -> they took a bunch of batteries and they\\n184 -> stored them in a room at 50° C so very\\n188 -> warm and they stored these batteries\\n190 -> with a different state of charge so one\\n192 -> of them at 100% state of charge one at\\n194 -> 90% one at 80% and so on and what did\\n197 -> they find well the battery that was\\n199 -> stored at 100% state of charge had less\\n202 -> than 60% of its original capacity after\\n206 -> less than 200 days so it had degraded a\\n210 -> ton versus the battery stored at 30%\\n212 -> state of charge was only down to 85% of\\n216 -> its original rated capacity after about\\n219 -> 400 days so significantly more capacity\\n223 -> and much longer duration than it was in\\n225 -> the test so heat and voltage are both\\n228 -> bad for battery degradation now there's230 -> an Incredible video by Professor Jeff\\n232 -> Dawn a lithium ion battery researcher\\n235 -> with seemingly endless knowledge in this\\n237 -> space who also had a 5-year research\\n239 -> partner partnership with Tesla for\\n240 -> battery development he provides specific\\n243 -> advice so for each of these three rules\\n246 -> I'm going to share his advice for what\\n248 -> you should do all right so say you're\\n250 -> storing your electric car for a long\\n252 -> period of time and it's going to be in a\\n254 -> hot environment what should you do well\\n256 -> he says you should Target a 30% state of\\n258 -> charge for that duration now if you're\\n261 -> storing it in the cold even for a long\\n263 -> period of time there's no worries\\n265 -> because of the cold temperatures you'll\\n267 -> have very little reactivity so storing\\n269 -> it at say 70% is no big deal number two\\n272 -> don't wait until the battery is low to275 -> recharge it unless necessary now the\\n277 -> critical part here is that you have a\\n279 -> relatively low depth of discharge\\n281 -> meaning say keeping your battery at 80%\\n284 -> and only discharging to 60% before\\n286 -> charging again it's fine to use the\\n289 -> whole battery when you need it but after\\n290 -> a short trip plug it in a bunch of small\\n293 -> charges is much better than in frequent\\n296 -> F depth charges okay so why well let's\\n300 -> look at the particles that make up the\\n301 -> cathode and if we zoom in on one of\\n304 -> these electrode particles we can see\\n306 -> that it's made up of many many many\\n309 -> small crystallites and each one of these\\n311 -> small crystallites has its own structure\\n313 -> that's repeated so you've got oxygen\\n315 -> metals and lithium that's moving to and\\n317 -> from the anode back to the cathode back\\n319 ", + "metadata": { + "tokens": 912, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "-> to the anode and so as this lithium322 -> leaves this crystal structure well this\\n324 -> formation expands in One Direction and\\n327 -> it shrinks in another formation and\\n330 -> again the orientation of these are all\\n332 -> over the place so you've got a bunch of\\n334 -> different crystals all with different\\n335 -> orientation that are expanding and\\n337 -> Contracting in different ways so you can\\n340 -> imagine that as that keeps happening you\\n342 -> start to have cracks form within this\\n344 -> particle as these particles are getting\\n346 -> bigger and smaller they're creating\\n347 -> these cracks within the particle well as\\n350 -> these cracks form you have that cathode\\n353 -> electrolyte interface formation so again\\n355 -> you start consuming more materials more\\n358 -> useful materials within the battery from\\n360 -> the electrolyte the lithium things like\\n363 -> that and so you have battery degradation\\n365 -> okay so why does depth of discharge367 -> matter then well the growth of these\\n370 -> crystals is roughly proportional to the\\n373 -> depth of discharge so for example if\\n375 -> you're just going from 60% battery to\\n377 -> 40% battery well that's only 20% of your\\n380 -> total battery right versus if you're\\n382 -> going from 100% to 0% 100% of your total\\n385 -> battery so that 60 to 40 has about a\\n387 -> fifth of the effect of this growth and\\n390 -> contraction that you have Within These\\n392 -> crystals meaning if you use these\\n394 -> smaller battery ranges you have much\\n397 -> less cracking occur within these\\n398 -> particles and the battery lasts\\n400 -> significantly longer so again a really\\n403 -> cool study looked at how a battery's\\n405 -> depth of discharge impacted its\\n407 -> normalized capacity over time okay so\\n409 -> for this study they're putting the same\\n411 -> amount of energy in and out of all the\\n414 -> batteries but they're using a different416 -> percentage of the battery to do it so\\n418 -> for example if you're just going from\\n420 -> 40% to 60% well you're going to have a\\n422 -> bunch of small charges versus if you're\\n424 -> going from 0 to 100% you're going to\\n426 -> have fewer charges but the same amount\\n428 -> of energy cuz you're using the whole\\n430 -> battery and so what did they find well\\n432 -> they found that going from 0 to 100%\\n435 -> constantly the battery only had about\\n438 -> 50% of its capacity after less than a\\n441 -> 100 days versus going from 40 to 60%\\n445 -> constantly the battery was at about 85%\\n448 -> after 400 Days okay well what does this\\n451 -> mean as far as context so going from 60\\n454 -> to 40% constantly was the equivalent\\n457 -> after 400 Days of about 3,200 full\\n461 -> cycles of that battery now if you were\\n463 -> to have a battery uh on an EV that had a\\n466 -> 250 Mi range well that means this\\n468 -> battery would last about470 -> 800,000 miles before its degradation\\n473 -> reached about 85% so that's incredible\\n477 -> right now the catch is that means you're\\n479 -> only using 20% of the battery so you'd\\n481 -> be limiting yourself to 50 m trips\\n484 -> personally I don't stress about this one\\n486 -> the easiest way to think of it is to\\n488 -> just plug in your car after every trip\\n490 -> rather than waiting till the battery is\\n491 -> low to recharge it all right so what\\n493 -> does Professor Jeff Don recommend he\\n496 -> says stick to low stateof charge ranges\\n498 -> 25% is great now obviously if you can't\\n501 -> charge at home this is tough to do which\\n504 -> is fine if you follow the next rule he\\n506 -> says your battery will still very likely\\n508 -> outl last the life of the c", + "metadata": { + "tokens": 927, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "ar number\\n511 -> three don't regularly charge to 100%\\n515 -> okay what the heck shouldn't this be the\\n517 -> car Maker's problem not mine yes520 -> absolutely that's why warranties exist\\n523 -> and there are real engineering solutions\\n525 -> to these problems so to understand\\n527 -> number three let's look at the\\n529 -> engineering Solutions now once again\\n531 -> looking at the particles that make up\\n532 -> our cathode there's a very clever\\n534 -> solution here we're instead of using a\\n536 -> bunch of many small crystals you use a\\n540 -> single crystal structure for the entire\\n542 -> particle so what this means is you have\\n545 -> uniform expansion and contraction of\\n547 -> that entire particle rather than having\\n549 -> a bunch of crystallites at different\\n551 -> orientations which as they grow and\\n553 -> contract they create all these cracks so\\n555 -> you avoid that cracking using this\\n557 -> single crystal structure this is used in\\n560 -> some Modern EVs and it has much longer\\n563 -> capacity retention another Trend you're565 -> tending to see is batteries that are\\n567 -> using higher nickel content all right so\\n569 -> if you use a battery with more nickel it\\n571 -> has better energy density seems like a\\n573 -> smart thing to do so what's the problem\\n575 -> well here we're looking at two different\\n577 -> graphs with different nickel content in\\n579 -> these batteries this one has about 50%\\n582 -> for the cathode this one has about 80%\\n584 -> for the cathode so using that higher\\n586 -> nickel content you can see the voltage\\n588 -> curve looks a bit different where we\\n590 -> have this Plateau at the end for that\\n592 -> latter portion of the state of charge\\n594 -> from about 75% to 100% you've got this\\n597 -> Plateau well this plateau toe is\\n599 -> associated with a large volumetric\\n601 -> change so you want to avoid that\\n603 -> especially if you're using these uh you\\n605 -> know many small crystallites as the608 -> structure for that cathode so you avoid\\n610 -> that region you help avoid that micro\\n612 -> cracking well what if you use a single\\n615 -> crystal structure and also what if you\\n617 -> use a lower nickel content well you\\n619 -> don't have that Plateau you don't have\\n621 -> to worry about that as much no problem\\n622 -> you can charge up to 100% the same is\\n625 -> basically true for lithium iron\\n626 -> phosphate batteries which use a\\n628 -> different chemistry all right but even\\n630 -> if we're using a higher nickel content\\n632 -> as long as we're using a single crystal\\n634 -> structure we don't have to worry about\\n635 -> cracking right well yes unfortunately\\n639 -> this Plateau is also associated with a\\n641 -> very small amount of oxygen being\\n643 -> released during that portion of charging\\n646 -> so you want to avoid this even if you're\\n648 -> using a single crystal structure if you650 -> have a high nickel content battery\\n652 -> because that relates to gas formation\\n655 -> within the battery which means you're\\n656 -> going to have degradation over time all\\n658 -> right what's what's the Dr Don\\n660 -> recommendation charge to 75% that way\\n663 -> you have plenty of range daily and say\\n665 -> you have a long trip coming up well\\n667 -> charge the night before to 100% to have\\n669 -> the extra range if you need it now\\n671 -> obviously if you live in an apartment\\n673 -> without charging going out and only\\n675 -> charging up to 75% sounds very tedious\\n678 -> and repetitive and personally I'm of the\\n680 -> mindset that if you can't charge your\\n681 -> electric vehicle at home well it really\\n683 -> doesn't make sens", + "metadata": { + "tokens": 896, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "e for you yet to those\\n685 -> who do it hats off to you but it's\\n687 -> certainly not very convenient so I think\\n689 -> the simple message is don't stress about0 -> electric cars have many advantages which\\n2 -> have helped lead to their Rising\\n3 -> popularity such as requiring a lot less\\n6 -> maintenance however the battery is still\\n8 -> very expensive and if it ever needs to\\n10 -> be replaced it's a huge expense luckily\\n13 -> there are practices you can put into\\n15 -> place to make the battery last a really\\n18 -> really long time and there are things\\n20 -> you really shouldn't do which can\\n22 -> dramatically shorten that lifetime my\\n24 -> goal for this video is to not only\\n25 -> explain the best and worst practices but\\n28 -> actually explain why at the microscopic\\n31 -> level why these are good or bad ideas\\n33 -> now before we get into these practices\\n36 -> it's worth mentioning this video is\\n37 -> about nmc batteries meaning batteries\\n39 -> made up of nickel manganese and Cobalt\\n42 -> oxides it's a chemistry that gives you a\\n44 -> lot of range and it's commonly used in46 -> the automotive space now if you don't\\n48 -> know what chemistry your electric car's\\n50 -> battery uses and why would you well much\\n53 -> of these are good practices regardless\\n55 -> we'll get into exceptions later so we're\\n58 -> going to have three main rules number\\n60 -> one don't store your car's battery at\\n63 -> 100% for long periods of time especially\\n66 -> when it's hot out now leaving your\\n68 -> electric car in the hot sun for months\\n70 -> at a time sounds like an edge case and\\n72 -> it is but it helps lay the foundation\\n74 -> for this video now if you haven't yet\\n76 -> seen my video on how a lithium ion\\n78 -> battery works that is certainly worth\\n80 -> checking out but the big question here\\n82 -> is why do batteries lose capacity over\\n85 -> time and I've Illustrated many of the\\n87 -> reasons here there's a lot of reasons\\n89 -> why batteries will lose capacity over91 -> time the important thing to keep in mind\\n93 -> is that if the battery is hotter and if\\n95 -> the battery is at a higher voltage which\\n97 -> occurs when it's at a higher state of\\n99 -> charge these reactions are more\\n101 -> prominent and they happen more quickly\\n103 -> so you get more degradation when you\\n105 -> have higher temperatures and at a higher\\n107 -> voltage in other words a higher state of\\n109 -> charge so one example I want to look at\\n111 -> is called the solid electrolyte\\n113 -> interface formation which occurs on both\\n116 -> the particles in the anode as well as\\n118 -> the particles in the cathode where it is\\n120 -> then called cathode electrolyte\\n122 -> interface so very simply what happens\\n124 -> when you're originally creating the\\n126 -> battery and you add the liquid\\n127 -> electrolyte and you put it through its\\n129 -> very first charge cycle well this solid\\n132 -> electrolyte interface forms on these134 -> particles and this formation consumes\\n137 -> the electrolyte it consumes lithium it\\n139 -> consumes materials from the cathode and\\n141 -> anode and so you're consuming useful\\n143 -> materials from that battery and as a\\n145 -> result you actually lose about 10% of\\n147 -> the battery's initial capacity on that\\n149 -> very first charge now you as a consumer\\n152 -> never see this because this is done at\\n153 -> the factory long before you ever get a\\n155 -> product using this battery but it is\\n157 -> worth mentioning because this continues\\n159 -> to grow and so as long as this\\n162 -> electrolyte interface continues to grow\\n164 -> and consume other materials it means\\n165 -> it's taking away from the usefulness of\\n168 -> your battery now there was a really cool\\n170 -> study done where they found that if you\\n172 -> store a battery at a higher temperature\\n174 -> it has more degradation but they also176 -> found that if you store a battery at a\\n178 -> higher state of charge it also has more\\n180 -> degradation so what did they do well\\n182 -> they took a bunch of ba", + "metadata": { + "tokens": 981, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "tteries and they\\n184 -> stored them in a room at 50° C so very\\n188 -> warm and they stored these batteries\\n190 -> with a different state of charge so one\\n192 -> of them at 100% state of charge one at\\n194 -> 90% one at 80% and so on and what did\\n197 -> they find well the battery that was\\n199 -> stored at 100% state of charge had less\\n202 -> than 60% of its original capacity after\\n206 -> less than 200 days so it had degraded a\\n210 -> ton versus the battery stored at 30%\\n212 -> state of charge was only down to 85% of\\n216 -> its original rated capacity after about\\n219 -> 400 days so significantly more capacity\\n223 -> and much longer duration than it was in\\n225 -> the test so heat and voltage are both\\n228 -> bad for battery degradation now there's230 -> an Incredible video by Professor Jeff\\n232 -> Dawn a lithium ion battery researcher\\n235 -> with seemingly endless knowledge in this\\n237 -> space who also had a 5-year research\\n239 -> partner partnership with Tesla for\\n240 -> battery development he provides specific\\n243 -> advice so for each of these three rules\\n246 -> I'm going to share his advice for what\\n248 -> you should do all right so say you're\\n250 -> storing your electric car for a long\\n252 -> period of time and it's going to be in a\\n254 -> hot environment what should you do well\\n256 -> he says you should Target a 30% state of\\n258 -> charge for that duration now if you're\\n261 -> storing it in the cold even for a long\\n263 -> period of time there's no worries\\n265 -> because of the cold temperatures you'll\\n267 -> have very little reactivity so storing\\n269 -> it at say 70% is no big deal number two\\n272 -> don't wait until the battery is low to275 -> recharge it unless necessary now the\\n277 -> critical part here is that you have a\\n279 -> relatively low depth of discharge\\n281 -> meaning say keeping your battery at 80%\\n284 -> and only discharging to 60% before\\n286 -> charging again it's fine to use the\\n289 -> whole battery when you need it but after\\n290 -> a short trip plug it in a bunch of small\\n293 -> charges is much better than in frequent\\n296 -> F depth charges okay so why well let's\\n300 -> look at the particles that make up the\\n301 -> cathode and if we zoom in on one of\\n304 -> these electrode particles we can see\\n306 -> that it's made up of many many many\\n309 -> small crystallites and each one of these\\n311 -> small crystallites has its own structure\\n313 -> that's repeated so you've got oxygen\\n315 -> metals and lithium that's moving to and\\n317 -> from the anode back to the cathode back\\n319 -> to the anode and so as this lithium322 -> leaves this crystal structure well this\\n324 -> formation expands in One Direction and\\n327 -> it shrinks in another formation and\\n330 -> again the orientation of these are all\\n332 -> over the place so you've got a bunch of\\n334 -> different crystals all with different\\n335 -> orientation that are expanding and\\n337 -> Contracting in different ways so you can\\n340 -> imagine that as that keeps happening you\\n342 -> start to have cracks form within this\\n344 -> particle as these particles are getting\\n346 -> bigger and smaller they're creating\\n347 -> these cracks within the particle well as\\n350 -> these cracks form you have that cathode\\n353 -> electrolyte interface formation so again\\n355 -> you start consuming more materials more\\n358 -> useful materials within the battery from\\n360 -> the electrolyte the lithium things like\\n363 -> that and so you have battery degradation\\n365 -> okay so why does depth of discharge367 -> matter then well the growth of these\\n370 -> crystals is roughly proportional to the\\n373 ", + "metadata": { + "tokens": 894, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "-> depth of discharge so for example if\\n375 -> you're just going from 60% battery to\\n377 -> 40% battery well that's only 20% of your\\n380 -> total battery right versus if you're\\n382 -> going from 100% to 0% 100% of your total\\n385 -> battery so that 60 to 40 has about a\\n387 -> fifth of the effect of this growth and\\n390 -> contraction that you have Within These\\n392 -> crystals meaning if you use these\\n394 -> smaller battery ranges you have much\\n397 -> less cracking occur within these\\n398 -> particles and the battery lasts\\n400 -> significantly longer so again a really\\n403 -> cool study looked at how a battery's\\n405 -> depth of discharge impacted its\\n407 -> normalized capacity over time okay so\\n409 -> for this study they're putting the same\\n411 -> amount of energy in and out of all the\\n414 -> batteries but they're using a different416 -> percentage of the battery to do it so\\n418 -> for example if you're just going from\\n420 -> 40% to 60% well you're going to have a\\n422 -> bunch of small charges versus if you're\\n424 -> going from 0 to 100% you're going to\\n426 -> have fewer charges but the same amount\\n428 -> of energy cuz you're using the whole\\n430 -> battery and so what did they find well\\n432 -> they found that going from 0 to 100%\\n435 -> constantly the battery only had about\\n438 -> 50% of its capacity after less than a\\n441 -> 100 days versus going from 40 to 60%\\n445 -> constantly the battery was at about 85%\\n448 -> after 400 Days okay well what does this\\n451 -> mean as far as context so going from 60\\n454 -> to 40% constantly was the equivalent\\n457 -> after 400 Days of about 3,200 full\\n461 -> cycles of that battery now if you were\\n463 -> to have a battery uh on an EV that had a\\n466 -> 250 Mi range well that means this\\n468 -> battery would last about470 -> 800,000 miles before its degradation\\n473 -> reached about 85% so that's incredible\\n477 -> right now the catch is that means you're\\n479 -> only using 20% of the battery so you'd\\n481 -> be limiting yourself to 50 m trips\\n484 -> personally I don't stress about this one\\n486 -> the easiest way to think of it is to\\n488 -> just plug in your car after every trip\\n490 -> rather than waiting till the battery is\\n491 -> low to recharge it all right so what\\n493 -> does Professor Jeff Don recommend he\\n496 -> says stick to low stateof charge ranges\\n498 -> 25% is great now obviously if you can't\\n501 -> charge at home this is tough to do which\\n504 -> is fine if you follow the next rule he\\n506 -> says your battery will still very likely\\n508 -> outl last the life of the car number\\n511 -> three don't regularly charge to 100%\\n515 -> okay what the heck shouldn't this be the\\n517 -> car Maker's problem not mine yes520 -> absolutely that's why warranties exist\\n523 -> and there are real engineering solutions\\n525 -> to these problems so to understand\\n527 -> number three let's look at the\\n529 -> engineering Solutions now once again\\n531 -> looking at the particles that make up\\n532 -> our cathode there's a very clever\\n534 -> solution here we're instead of using a\\n536 -> bunch of many small crystals you use a\\n540 -> single crystal structure for the entire\\n542 -> particle so what this means is you have\\n545 -> uniform expansion and contraction of\\n547 -> that entire particle rather than having\\n549 -> a bunch of crystallites at different\\n551 -> orientations which as they grow and\\n553 -> contract they create all these cracks so\\n555 -> you avoid that cracking using this\\n557 -> single crystal structure this is used in\\n560 -> some Modern EVs and it has much longer\\n563 -> capac", + "metadata": { + "tokens": 936, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "ity retention another Trend you're565 -> tending to see is batteries that are\\n567 -> using higher nickel content all right so\\n569 -> if you use a battery with more nickel it\\n571 -> has better energy density seems like a\\n573 -> smart thing to do so what's the problem\\n575 -> well here we're looking at two different\\n577 -> graphs with different nickel content in\\n579 -> these batteries this one has about 50%\\n582 -> for the cathode this one has about 80%\\n584 -> for the cathode so using that higher\\n586 -> nickel content you can see the voltage\\n588 -> curve looks a bit different where we\\n590 -> have this Plateau at the end for that\\n592 -> latter portion of the state of charge\\n594 -> from about 75% to 100% you've got this\\n597 -> Plateau well this plateau toe is\\n599 -> associated with a large volumetric\\n601 -> change so you want to avoid that\\n603 -> especially if you're using these uh you\\n605 -> know many small crystallites as the608 -> structure for that cathode so you avoid\\n610 -> that region you help avoid that micro\\n612 -> cracking well what if you use a single\\n615 -> crystal structure and also what if you\\n617 -> use a lower nickel content well you\\n619 -> don't have that Plateau you don't have\\n621 -> to worry about that as much no problem\\n622 -> you can charge up to 100% the same is\\n625 -> basically true for lithium iron\\n626 -> phosphate batteries which use a\\n628 -> different chemistry all right but even\\n630 -> if we're using a higher nickel content\\n632 -> as long as we're using a single crystal\\n634 -> structure we don't have to worry about\\n635 -> cracking right well yes unfortunately\\n639 -> this Plateau is also associated with a\\n641 -> very small amount of oxygen being\\n643 -> released during that portion of charging\\n646 -> so you want to avoid this even if you're\\n648 -> using a single crystal structure if you650 -> have a high nickel content battery\\n652 -> because that relates to gas formation\\n655 -> within the battery which means you're\\n656 -> going to have degradation over time all\\n658 -> right what's what's the Dr Don\\n660 -> recommendation charge to 75% that way\\n663 -> you have plenty of range daily and say\\n665 -> you have a long trip coming up well\\n667 -> charge the night before to 100% to have\\n669 -> the extra range if you need it now\\n671 -> obviously if you live in an apartment\\n673 -> without charging going out and only\\n675 -> charging up to 75% sounds very tedious\\n678 -> and repetitive and personally I'm of the\\n680 -> mindset that if you can't charge your\\n681 -> electric vehicle at home well it really\\n683 -> doesn't make sense for you yet to those\\n685 -> who do it hats off to you but it's\\n687 -> certainly not very convenient so I think\\n689 -> the simple message is don't stress about0 -> electric cars have many advantages which\\n2 -> have helped lead to their Rising\\n3 -> popularity such as requiring a lot less\\n6 -> maintenance however the battery is still\\n8 -> very expensive and if it ever needs to\\n10 -> be replaced it's a huge expense luckily\\n13 -> there are practices you can put into\\n15 -> place to make the battery last a really\\n18 -> really long time and there are things\\n20 -> you really shouldn't do which can\\n22 -> dramatically shorten that lifetime my\\n24 -> goal for this video is to not only\\n25 -> explain the best and worst practices but\\n28 -> actually explain why at the microscopic\\n31 -> level why these are good or bad ideas\\n33 -> now before we get into these practices\\n36 -> it's worth mentioning this video is\\n37 -> about nmc batteries meaning batteries\\n39 -> made up of nickel manganese and Cobalt\\n42 -", + "metadata": { + "tokens": 898, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "> oxides it's a chemistry that gives you a\\n44 -> lot of range and it's commonly used in46 -> the automotive space now if you don't\\n48 -> know what chemistry your electric car's\\n50 -> battery uses and why would you well much\\n53 -> of these are good practices regardless\\n55 -> we'll get into exceptions later so we're\\n58 -> going to have three main rules number\\n60 -> one don't store your car's battery at\\n63 -> 100% for long periods of time especially\\n66 -> when it's hot out now leaving your\\n68 -> electric car in the hot sun for months\\n70 -> at a time sounds like an edge case and\\n72 -> it is but it helps lay the foundation\\n74 -> for this video now if you haven't yet\\n76 -> seen my video on how a lithium ion\\n78 -> battery works that is certainly worth\\n80 -> checking out but the big question here\\n82 -> is why do batteries lose capacity over\\n85 -> time and I've Illustrated many of the\\n87 -> reasons here there's a lot of reasons\\n89 -> why batteries will lose capacity over91 -> time the important thing to keep in mind\\n93 -> is that if the battery is hotter and if\\n95 -> the battery is at a higher voltage which\\n97 -> occurs when it's at a higher state of\\n99 -> charge these reactions are more\\n101 -> prominent and they happen more quickly\\n103 -> so you get more degradation when you\\n105 -> have higher temperatures and at a higher\\n107 -> voltage in other words a higher state of\\n109 -> charge so one example I want to look at\\n111 -> is called the solid electrolyte\\n113 -> interface formation which occurs on both\\n116 -> the particles in the anode as well as\\n118 -> the particles in the cathode where it is\\n120 -> then called cathode electrolyte\\n122 -> interface so very simply what happens\\n124 -> when you're originally creating the\\n126 -> battery and you add the liquid\\n127 -> electrolyte and you put it through its\\n129 -> very first charge cycle well this solid\\n132 -> electrolyte interface forms on these134 -> particles and this formation consumes\\n137 -> the electrolyte it consumes lithium it\\n139 -> consumes materials from the cathode and\\n141 -> anode and so you're consuming useful\\n143 -> materials from that battery and as a\\n145 -> result you actually lose about 10% of\\n147 -> the battery's initial capacity on that\\n149 -> very first charge now you as a consumer\\n152 -> never see this because this is done at\\n153 -> the factory long before you ever get a\\n155 -> product using this battery but it is\\n157 -> worth mentioning because this continues\\n159 -> to grow and so as long as this\\n162 -> electrolyte interface continues to grow\\n164 -> and consume other materials it means\\n165 -> it's taking away from the usefulness of\\n168 -> your battery now there was a really cool\\n170 -> study done where they found that if you\\n172 -> store a battery at a higher temperature\\n174 -> it has more degradation but they also176 -> found that if you store a battery at a\\n178 -> higher state of charge it also has more\\n180 -> degradation so what did they do well\\n182 -> they took a bunch of batteries and they\\n184 -> stored them in a room at 50° C so very\\n188 -> warm and they stored these batteries\\n190 -> with a different state of charge so one\\n192 -> of them at 100% state of charge one at\\n194 -> 90% one at 80% and so on and what did\\n197 -> they find well the battery that was\\n199 -> stored at 100% state of charge had less\\n202 -> than 60% of its original capacity after\\n206 -> less than 200 days so it had degraded a\\n210 -> ton versus the battery stored at 30%\\n212 -> state of charge was only down to 85% of\\n216 -> its original rated capacity after about\\n219 -> 400 days so significantly more capacity\\n223 -> and much longer duration than it was in\\n225 -> the test so heat and voltage are both\\n228 -> bad for battery degradation now there's230 -> an Incredible video by Professor Jeff\\n232 -> Dawn a lithium ion battery researcher\\n235 -> with seemingly endless knowledge in this\\n237 -> space who also had a 5-year research\\n239 -> partner partnership with Tesla for\\n240 -> battery devel", + "metadata": { + "tokens": 987, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "opment he provides specific\\n243 -> advice so for each of these three rules\\n246 -> I'm going to share his advice for what\\n248 -> you should do all right so say you're\\n250 -> storing your electric car for a long\\n252 -> period of time and it's going to be in a\\n254 -> hot environment what should you do well\\n256 -> he says you should Target a 30% state of\\n258 -> charge for that duration now if you're\\n261 -> storing it in the cold even for a long\\n263 -> period of time there's no worries\\n265 -> because of the cold temperatures you'll\\n267 -> have very little reactivity so storing\\n269 -> it at say 70% is no big deal number two\\n272 -> don't wait until the battery is low to275 -> recharge it unless necessary now the\\n277 -> critical part here is that you have a\\n279 -> relatively low depth of discharge\\n281 -> meaning say keeping your battery at 80%\\n284 -> and only discharging to 60% before\\n286 -> charging again it's fine to use the\\n289 -> whole battery when you need it but after\\n290 -> a short trip plug it in a bunch of small\\n293 -> charges is much better than in frequent\\n296 -> F depth charges okay so why well let's\\n300 -> look at the particles that make up the\\n301 -> cathode and if we zoom in on one of\\n304 -> these electrode particles we can see\\n306 -> that it's made up of many many many\\n309 -> small crystallites and each one of these\\n311 -> small crystallites has its own structure\\n313 -> that's repeated so you've got oxygen\\n315 -> metals and lithium that's moving to and\\n317 -> from the anode back to the cathode back\\n319 -> to the anode and so as this lithium322 -> leaves this crystal structure well this\\n324 -> formation expands in One Direction and\\n327 -> it shrinks in another formation and\\n330 -> again the orientation of these are all\\n332 -> over the place so you've got a bunch of\\n334 -> different crystals all with different\\n335 -> orientation that are expanding and\\n337 -> Contracting in different ways so you can\\n340 -> imagine that as that keeps happening you\\n342 -> start to have cracks form within this\\n344 -> particle as these particles are getting\\n346 -> bigger and smaller they're creating\\n347 -> these cracks within the particle well as\\n350 -> these cracks form you have that cathode\\n353 -> electrolyte interface formation so again\\n355 -> you start consuming more materials more\\n358 -> useful materials within the battery from\\n360 -> the electrolyte the lithium things like\\n363 -> that and so you have battery degradation\\n365 -> okay so why does depth of discharge367 -> matter then well the growth of these\\n370 -> crystals is roughly proportional to the\\n373 -> depth of discharge so for example if\\n375 -> you're just going from 60% battery to\\n377 -> 40% battery well that's only 20% of your\\n380 -> total battery right versus if you're\\n382 -> going from 100% to 0% 100% of your total\\n385 -> battery so that 60 to 40 has about a\\n387 -> fifth of the effect of this growth and\\n390 -> contraction that you have Within These\\n392 -> crystals meaning if you use these\\n394 -> smaller battery ranges you have much\\n397 -> less cracking occur within these\\n398 -> particles and the battery lasts\\n400 -> significantly longer so again a really\\n403 -> cool study looked at how a battery's\\n405 -> depth of discharge impacted its\\n407 -> normalized capacity over time okay so\\n409 -> for this study they're putting the same\\n411 -> amount of energy in and out of all the\\n414 -> batteries but they're using a different416 -> percentage of the battery to do it so\\n418 -> for example if you're just going from\\n420 -> ", + "metadata": { + "tokens": 893, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": "40% to 60% well you're going to have a\\n422 -> bunch of small charges versus if you're\\n424 -> going from 0 to 100% you're going to\\n426 -> have fewer charges but the same amount\\n428 -> of energy cuz you're using the whole\\n430 -> battery and so what did they find well\\n432 -> they found that going from 0 to 100%\\n435 -> constantly the battery only had about\\n438 -> 50% of its capacity after less than a\\n441 -> 100 days versus going from 40 to 60%\\n445 -> constantly the battery was at about 85%\\n448 -> after 400 Days okay well what does this\\n451 -> mean as far as context so going from 60\\n454 -> to 40% constantly was the equivalent\\n457 -> after 400 Days of about 3,200 full\\n461 -> cycles of that battery now if you were\\n463 -> to have a battery uh on an EV that had a\\n466 -> 250 Mi range well that means this\\n468 -> battery would last about470 -> 800,000 miles before its degradation\\n473 -> reached about 85% so that's incredible\\n477 -> right now the catch is that means you're\\n479 -> only using 20% of the battery so you'd\\n481 -> be limiting yourself to 50 m trips\\n484 -> personally I don't stress about this one\\n486 -> the easiest way to think of it is to\\n488 -> just plug in your car after every trip\\n490 -> rather than waiting till the battery is\\n491 -> low to recharge it all right so what\\n493 -> does Professor Jeff Don recommend he\\n496 -> says stick to low stateof charge ranges\\n498 -> 25% is great now obviously if you can't\\n501 -> charge at home this is tough to do which\\n504 -> is fine if you follow the next rule he\\n506 -> says your battery will still very likely\\n508 -> outl last the life of the car number\\n511 -> three don't regularly charge to 100%\\n515 -> okay what the heck shouldn't this be the\\n517 -> car Maker's problem not mine yes520 -> absolutely that's why warranties exist\\n523 -> and there are real engineering solutions\\n525 -> to these problems so to understand\\n527 -> number three let's look at the\\n529 -> engineering Solutions now once again\\n531 -> looking at the particles that make up\\n532 -> our cathode there's a very clever\\n534 -> solution here we're instead of using a\\n536 -> bunch of many small crystals you use a\\n540 -> single crystal structure for the entire\\n542 -> particle so what this means is you have\\n545 -> uniform expansion and contraction of\\n547 -> that entire particle rather than having\\n549 -> a bunch of crystallites at different\\n551 -> orientations which as they grow and\\n553 -> contract they create all these cracks so\\n555 -> you avoid that cracking using this\\n557 -> single crystal structure this is used in\\n560 -> some Modern EVs and it has much longer\\n563 -> capacity retention another Trend you're565 -> tending to see is batteries that are\\n567 -> using higher nickel content all right so\\n569 -> if you use a battery with more nickel it\\n571 -> has better energy density seems like a\\n573 -> smart thing to do so what's the problem\\n575 -> well here we're looking at two different\\n577 -> graphs with different nickel content in\\n579 -> these batteries this one has about 50%\\n582 -> for the cathode this one has about 80%\\n584 -> for the cathode so using that higher\\n586 -> nickel content you can see the voltage\\n588 -> curve looks a bit different where we\\n590 -> have this Plateau at the end for that\\n592 -> latter portion of the state of charge\\n594 -> from about 75% to 100% you've got this\\n597 -> Plateau well this plateau toe is\\n599 -> associated with a large volumetric\\n601 -> change so you want to avoid that\\n603 -> especially if you're using", + "metadata": { + "tokens": 914, + "headers": {}, + "urls": [], + "images": [] + } + }, + { + "text": " these uh you\\n605 -> know many small crystallites as the608 -> structure for that cathode so you avoid\\n610 -> that region you help avoid that micro\\n612 -> cracking well what if you use a single\\n615 -> crystal structure and also what if you\\n617 -> use a lower nickel content well you\\n619 -> don't have that Plateau you don't have\\n621 -> to worry about that as much no problem\\n622 -> you can charge up to 100% the same is\\n625 -> basically true for lithium iron\\n626 -> phosphate batteries which use a\\n628 -> different chemistry all right but even\\n630 -> if we're using a higher nickel content\\n632 -> as long as we're using a single crystal\\n634 -> structure we don't have to worry about\\n635 -> cracking right well yes unfortunately\\n639 -> this Plateau is also associated with a\\n641 -> very small amount of oxygen being\\n643 -> released during that portion of charging\\n646 -> so you want to avoid this even if you're\\n648 -> using a single crystal structure if you650 -> have a high nickel content battery\\n652 -> because that relates to gas formation\\n655 -> within the battery which means you're\\n656 -> going to have degradation over time all\\n658 -> right what's what's the Dr Don\\n660 -> recommendation charge to 75% that way\\n663 -> you have plenty of range daily and say\\n665 -> you have a long trip coming up well\\n667 -> charge the night before to 100% to have\\n669 -> the extra range if you need it now\\n671 -> obviously if you live in an apartment\\n673 -> without charging going out and only\\n675 -> charging up to 75% sounds very tedious\\n678 -> and repetitive and personally I'm of the\\n680 -> mindset that if you can't charge your\\n681 -> electric vehicle at home well it really\\n683 -> doesn't make sense for you yet to those\\n685 -> who do it hats off to you but it's\\n687 -> certainly not very convenient so I think\\n689 -> the simple message is don't stress about", + "metadata": { + "tokens": 475, + "headers": {}, + "urls": [], + "images": [] + } + } +] \ No newline at end of file diff --git a/text-splitter/youtube_transcript.md b/text-splitter/youtube_transcript.md new file mode 100644 index 00000000..bd3cf0e2 --- /dev/null +++ b/text-splitter/youtube_transcript.md @@ -0,0 +1 @@ +0 -> electric cars have many advantages which\n2 -> have helped lead to their Rising\n3 -> popularity such as requiring a lot less\n6 -> maintenance however the battery is still\n8 -> very expensive and if it ever needs to\n10 -> be replaced it's a huge expense luckily\n13 -> there are practices you can put into\n15 -> place to make the battery last a really\n18 -> really long time and there are things\n20 -> you really shouldn't do which can\n22 -> dramatically shorten that lifetime my\n24 -> goal for this video is to not only\n25 -> explain the best and worst practices but\n28 -> actually explain why at the microscopic\n31 -> level why these are good or bad ideas\n33 -> now before we get into these practices\n36 -> it's worth mentioning this video is\n37 -> about nmc batteries meaning batteries\n39 -> made up of nickel manganese and Cobalt\n42 -> oxides it's a chemistry that gives you a\n44 -> lot of range and it's commonly used in46 -> the automotive space now if you don't\n48 -> know what chemistry your electric car's\n50 -> battery uses and why would you well much\n53 -> of these are good practices regardless\n55 -> we'll get into exceptions later so we're\n58 -> going to have three main rules number\n60 -> one don't store your car's battery at\n63 -> 100% for long periods of time especially\n66 -> when it's hot out now leaving your\n68 -> electric car in the hot sun for months\n70 -> at a time sounds like an edge case and\n72 -> it is but it helps lay the foundation\n74 -> for this video now if you haven't yet\n76 -> seen my video on how a lithium ion\n78 -> battery works that is certainly worth\n80 -> checking out but the big question here\n82 -> is why do batteries lose capacity over\n85 -> time and I've Illustrated many of the\n87 -> reasons here there's a lot of reasons\n89 -> why batteries will lose capacity over91 -> time the important thing to keep in mind\n93 -> is that if the battery is hotter and if\n95 -> the battery is at a higher voltage which\n97 -> occurs when it's at a higher state of\n99 -> charge these reactions are more\n101 -> prominent and they happen more quickly\n103 -> so you get more degradation when you\n105 -> have higher temperatures and at a higher\n107 -> voltage in other words a higher state of\n109 -> charge so one example I want to look at\n111 -> is called the solid electrolyte\n113 -> interface formation which occurs on both\n116 -> the particles in the anode as well as\n118 -> the particles in the cathode where it is\n120 -> then called cathode electrolyte\n122 -> interface so very simply what happens\n124 -> when you're originally creating the\n126 -> battery and you add the liquid\n127 -> electrolyte and you put it through its\n129 -> very first charge cycle well this solid\n132 -> electrolyte interface forms on these134 -> particles and this formation consumes\n137 -> the electrolyte it consumes lithium it\n139 -> consumes materials from the cathode and\n141 -> anode and so you're consuming useful\n143 -> materials from that battery and as a\n145 -> result you actually lose about 10% of\n147 -> the battery's initial capacity on that\n149 -> very first charge now you as a consumer\n152 -> never see this because this is done at\n153 -> the factory long before you ever get a\n155 -> product using this battery but it is\n157 -> worth mentioning because this continues\n159 -> to grow and so as long as this\n162 -> electrolyte interface continues to grow\n164 -> and consume other materials it means\n165 -> it's taking away from the usefulness of\n168 -> your battery now there was a really cool\n170 -> study done where they found that if you\n172 -> store a battery at a higher temperature\n174 -> it has more degradation but they also176 -> found that if you store a battery at a\n178 -> higher state of charge it also has more\n180 -> degradation so what did they do well\n182 -> they took a bunch of batteries and they\n184 -> stored them in a room at 50° C so very\n188 -> warm and they stored these batteries\n190 -> with a different state of charge so one\n192 -> of them at 100% state of charge one at\n194 -> 90% one at 80% and so on and what did\n197 -> they find well the battery that was\n199 -> stored at 100% state of charge had less\n202 -> than 60% of its original capacity after\n206 -> less than 200 days so it had degraded a\n210 -> ton versus the battery stored at 30%\n212 -> state of charge was only down to 85% of\n216 -> its original rated capacity after about\n219 -> 400 days so significantly more capacity\n223 -> and much longer duration than it was in\n225 -> the test so heat and voltage are both\n228 -> bad for battery degradation now there's230 -> an Incredible video by Professor Jeff\n232 -> Dawn a lithium ion battery researcher\n235 -> with seemingly endless knowledge in this\n237 -> space who also had a 5-year research\n239 -> partner partnership with Tesla for\n240 -> battery development he provides specific\n243 -> advice so for each of these three rules\n246 -> I'm going to share his advice for what\n248 -> you should do all right so say you're\n250 -> storing your electric car for a long\n252 -> period of time and it's going to be in a\n254 -> hot environment what should you do well\n256 -> he says you should Target a 30% state of\n258 -> charge for that duration now if you're\n261 -> storing it in the cold even for a long\n263 -> period of time there's no worries\n265 -> because of the cold temperatures you'll\n267 -> have very little reactivity so storing\n269 -> it at say 70% is no big deal number two\n272 -> don't wait until the battery is low to275 -> recharge it unless necessary now the\n277 -> critical part here is that you have a\n279 -> relatively low depth of discharge\n281 -> meaning say keeping your battery at 80%\n284 -> and only discharging to 60% before\n286 -> charging again it's fine to use the\n289 -> whole battery when you need it but after\n290 -> a short trip plug it in a bunch of small\n293 -> charges is much better than in frequent\n296 -> F depth charges okay so why well let's\n300 -> look at the particles that make up the\n301 -> cathode and if we zoom in on one of\n304 -> these electrode particles we can see\n306 -> that it's made up of many many many\n309 -> small crystallites and each one of these\n311 -> small crystallites has its own structure\n313 -> that's repeated so you've got oxygen\n315 -> metals and lithium that's moving to and\n317 -> from the anode back to the cathode back\n319 -> to the anode and so as this lithium322 -> leaves this crystal structure well this\n324 -> formation expands in One Direction and\n327 -> it shrinks in another formation and\n330 -> again the orientation of these are all\n332 -> over the place so you've got a bunch of\n334 -> different crystals all with different\n335 -> orientation that are expanding and\n337 -> Contracting in different ways so you can\n340 -> imagine that as that keeps happening you\n342 -> start to have cracks form within this\n344 -> particle as these particles are getting\n346 -> bigger and smaller they're creating\n347 -> these cracks within the particle well as\n350 -> these cracks form you have that cathode\n353 -> electrolyte interface formation so again\n355 -> you start consuming more materials more\n358 -> useful materials within the battery from\n360 -> the electrolyte the lithium things like\n363 -> that and so you have battery degradation\n365 -> okay so why does depth of discharge367 -> matter then well the growth of these\n370 -> crystals is roughly proportional to the\n373 -> depth of discharge so for example if\n375 -> you're just going from 60% battery to\n377 -> 40% battery well that's only 20% of your\n380 -> total battery right versus if you're\n382 -> going from 100% to 0% 100% of your total\n385 -> battery so that 60 to 40 has about a\n387 -> fifth of the effect of this growth and\n390 -> contraction that you have Within These\n392 -> crystals meaning if you use these\n394 -> smaller battery ranges you have much\n397 -> less cracking occur within these\n398 -> particles and the battery lasts\n400 -> significantly longer so again a really\n403 -> cool study looked at how a battery's\n405 -> depth of discharge impacted its\n407 -> normalized capacity over time okay so\n409 -> for this study they're putting the same\n411 -> amount of energy in and out of all the\n414 -> batteries but they're using a different416 -> percentage of the battery to do it so\n418 -> for example if you're just going from\n420 -> 40% to 60% well you're going to have a\n422 -> bunch of small charges versus if you're\n424 -> going from 0 to 100% you're going to\n426 -> have fewer charges but the same amount\n428 -> of energy cuz you're using the whole\n430 -> battery and so what did they find well\n432 -> they found that going from 0 to 100%\n435 -> constantly the battery only had about\n438 -> 50% of its capacity after less than a\n441 -> 100 days versus going from 40 to 60%\n445 -> constantly the battery was at about 85%\n448 -> after 400 Days okay well what does this\n451 -> mean as far as context so going from 60\n454 -> to 40% constantly was the equivalent\n457 -> after 400 Days of about 3,200 full\n461 -> cycles of that battery now if you were\n463 -> to have a battery uh on an EV that had a\n466 -> 250 Mi range well that means this\n468 -> battery would last about470 -> 800,000 miles before its degradation\n473 -> reached about 85% so that's incredible\n477 -> right now the catch is that means you're\n479 -> only using 20% of the battery so you'd\n481 -> be limiting yourself to 50 m trips\n484 -> personally I don't stress about this one\n486 -> the easiest way to think of it is to\n488 -> just plug in your car after every trip\n490 -> rather than waiting till the battery is\n491 -> low to recharge it all right so what\n493 -> does Professor Jeff Don recommend he\n496 -> says stick to low stateof charge ranges\n498 -> 25% is great now obviously if you can't\n501 -> charge at home this is tough to do which\n504 -> is fine if you follow the next rule he\n506 -> says your battery will still very likely\n508 -> outl last the life of the car number\n511 -> three don't regularly charge to 100%\n515 -> okay what the heck shouldn't this be the\n517 -> car Maker's problem not mine yes520 -> absolutely that's why warranties exist\n523 -> and there are real engineering solutions\n525 -> to these problems so to understand\n527 -> number three let's look at the\n529 -> engineering Solutions now once again\n531 -> looking at the particles that make up\n532 -> our cathode there's a very clever\n534 -> solution here we're instead of using a\n536 -> bunch of many small crystals you use a\n540 -> single crystal structure for the entire\n542 -> particle so what this means is you have\n545 -> uniform expansion and contraction of\n547 -> that entire particle rather than having\n549 -> a bunch of crystallites at different\n551 -> orientations which as they grow and\n553 -> contract they create all these cracks so\n555 -> you avoid that cracking using this\n557 -> single crystal structure this is used in\n560 -> some Modern EVs and it has much longer\n563 -> capacity retention another Trend you're565 -> tending to see is batteries that are\n567 -> using higher nickel content all right so\n569 -> if you use a battery with more nickel it\n571 -> has better energy density seems like a\n573 -> smart thing to do so what's the problem\n575 -> well here we're looking at two different\n577 -> graphs with different nickel content in\n579 -> these batteries this one has about 50%\n582 -> for the cathode this one has about 80%\n584 -> for the cathode so using that higher\n586 -> nickel content you can see the voltage\n588 -> curve looks a bit different where we\n590 -> have this Plateau at the end for that\n592 -> latter portion of the state of charge\n594 -> from about 75% to 100% you've got this\n597 -> Plateau well this plateau toe is\n599 -> associated with a large volumetric\n601 -> change so you want to avoid that\n603 -> especially if you're using these uh you\n605 -> know many small crystallites as the608 -> structure for that cathode so you avoid\n610 -> that region you help avoid that micro\n612 -> cracking well what if you use a single\n615 -> crystal structure and also what if you\n617 -> use a lower nickel content well you\n619 -> don't have that Plateau you don't have\n621 -> to worry about that as much no problem\n622 -> you can charge up to 100% the same is\n625 -> basically true for lithium iron\n626 -> phosphate batteries which use a\n628 -> different chemistry all right but even\n630 -> if we're using a higher nickel content\n632 -> as long as we're using a single crystal\n634 -> structure we don't have to worry about\n635 -> cracking right well yes unfortunately\n639 -> this Plateau is also associated with a\n641 -> very small amount of oxygen being\n643 -> released during that portion of charging\n646 -> so you want to avoid this even if you're\n648 -> using a single crystal structure if you650 -> have a high nickel content battery\n652 -> because that relates to gas formation\n655 -> within the battery which means you're\n656 -> going to have degradation over time all\n658 -> right what's what's the Dr Don\n660 -> recommendation charge to 75% that way\n663 -> you have plenty of range daily and say\n665 -> you have a long trip coming up well\n667 -> charge the night before to 100% to have\n669 -> the extra range if you need it now\n671 -> obviously if you live in an apartment\n673 -> without charging going out and only\n675 -> charging up to 75% sounds very tedious\n678 -> and repetitive and personally I'm of the\n680 -> mindset that if you can't charge your\n681 -> electric vehicle at home well it really\n683 -> doesn't make sense for you yet to those\n685 -> who do it hats off to you but it's\n687 -> certainly not very convenient so I think\n689 -> the simple message is don't stress about0 -> electric cars have many advantages which\n2 -> have helped lead to their Rising\n3 -> popularity such as requiring a lot less\n6 -> maintenance however the battery is still\n8 -> very expensive and if it ever needs to\n10 -> be replaced it's a huge expense luckily\n13 -> there are practices you can put into\n15 -> place to make the battery last a really\n18 -> really long time and there are things\n20 -> you really shouldn't do which can\n22 -> dramatically shorten that lifetime my\n24 -> goal for this video is to not only\n25 -> explain the best and worst practices but\n28 -> actually explain why at the microscopic\n31 -> level why these are good or bad ideas\n33 -> now before we get into these practices\n36 -> it's worth mentioning this video is\n37 -> about nmc batteries meaning batteries\n39 -> made up of nickel manganese and Cobalt\n42 -> oxides it's a chemistry that gives you a\n44 -> lot of range and it's commonly used in46 -> the automotive space now if you don't\n48 -> know what chemistry your electric car's\n50 -> battery uses and why would you well much\n53 -> of these are good practices regardless\n55 -> we'll get into exceptions later so we're\n58 -> going to have three main rules number\n60 -> one don't store your car's battery at\n63 -> 100% for long periods of time especially\n66 -> when it's hot out now leaving your\n68 -> electric car in the hot sun for months\n70 -> at a time sounds like an edge case and\n72 -> it is but it helps lay the foundation\n74 -> for this video now if you haven't yet\n76 -> seen my video on how a lithium ion\n78 -> battery works that is certainly worth\n80 -> checking out but the big question here\n82 -> is why do batteries lose capacity over\n85 -> time and I've Illustrated many of the\n87 -> reasons here there's a lot of reasons\n89 -> why batteries will lose capacity over91 -> time the important thing to keep in mind\n93 -> is that if the battery is hotter and if\n95 -> the battery is at a higher voltage which\n97 -> occurs when it's at a higher state of\n99 -> charge these reactions are more\n101 -> prominent and they happen more quickly\n103 -> so you get more degradation when you\n105 -> have higher temperatures and at a higher\n107 -> voltage in other words a higher state of\n109 -> charge so one example I want to look at\n111 -> is called the solid electrolyte\n113 -> interface formation which occurs on both\n116 -> the particles in the anode as well as\n118 -> the particles in the cathode where it is\n120 -> then called cathode electrolyte\n122 -> interface so very simply what happens\n124 -> when you're originally creating the\n126 -> battery and you add the liquid\n127 -> electrolyte and you put it through its\n129 -> very first charge cycle well this solid\n132 -> electrolyte interface forms on these134 -> particles and this formation consumes\n137 -> the electrolyte it consumes lithium it\n139 -> consumes materials from the cathode and\n141 -> anode and so you're consuming useful\n143 -> materials from that battery and as a\n145 -> result you actually lose about 10% of\n147 -> the battery's initial capacity on that\n149 -> very first charge now you as a consumer\n152 -> never see this because this is done at\n153 -> the factory long before you ever get a\n155 -> product using this battery but it is\n157 -> worth mentioning because this continues\n159 -> to grow and so as long as this\n162 -> electrolyte interface continues to grow\n164 -> and consume other materials it means\n165 -> it's taking away from the usefulness of\n168 -> your battery now there was a really cool\n170 -> study done where they found that if you\n172 -> store a battery at a higher temperature\n174 -> it has more degradation but they also176 -> found that if you store a battery at a\n178 -> higher state of charge it also has more\n180 -> degradation so what did they do well\n182 -> they took a bunch of batteries and they\n184 -> stored them in a room at 50° C so very\n188 -> warm and they stored these batteries\n190 -> with a different state of charge so one\n192 -> of them at 100% state of charge one at\n194 -> 90% one at 80% and so on and what did\n197 -> they find well the battery that was\n199 -> stored at 100% state of charge had less\n202 -> than 60% of its original capacity after\n206 -> less than 200 days so it had degraded a\n210 -> ton versus the battery stored at 30%\n212 -> state of charge was only down to 85% of\n216 -> its original rated capacity after about\n219 -> 400 days so significantly more capacity\n223 -> and much longer duration than it was in\n225 -> the test so heat and voltage are both\n228 -> bad for battery degradation now there's230 -> an Incredible video by Professor Jeff\n232 -> Dawn a lithium ion battery researcher\n235 -> with seemingly endless knowledge in this\n237 -> space who also had a 5-year research\n239 -> partner partnership with Tesla for\n240 -> battery development he provides specific\n243 -> advice so for each of these three rules\n246 -> I'm going to share his advice for what\n248 -> you should do all right so say you're\n250 -> storing your electric car for a long\n252 -> period of time and it's going to be in a\n254 -> hot environment what should you do well\n256 -> he says you should Target a 30% state of\n258 -> charge for that duration now if you're\n261 -> storing it in the cold even for a long\n263 -> period of time there's no worries\n265 -> because of the cold temperatures you'll\n267 -> have very little reactivity so storing\n269 -> it at say 70% is no big deal number two\n272 -> don't wait until the battery is low to275 -> recharge it unless necessary now the\n277 -> critical part here is that you have a\n279 -> relatively low depth of discharge\n281 -> meaning say keeping your battery at 80%\n284 -> and only discharging to 60% before\n286 -> charging again it's fine to use the\n289 -> whole battery when you need it but after\n290 -> a short trip plug it in a bunch of small\n293 -> charges is much better than in frequent\n296 -> F depth charges okay so why well let's\n300 -> look at the particles that make up the\n301 -> cathode and if we zoom in on one of\n304 -> these electrode particles we can see\n306 -> that it's made up of many many many\n309 -> small crystallites and each one of these\n311 -> small crystallites has its own structure\n313 -> that's repeated so you've got oxygen\n315 -> metals and lithium that's moving to and\n317 -> from the anode back to the cathode back\n319 -> to the anode and so as this lithium322 -> leaves this crystal structure well this\n324 -> formation expands in One Direction and\n327 -> it shrinks in another formation and\n330 -> again the orientation of these are all\n332 -> over the place so you've got a bunch of\n334 -> different crystals all with different\n335 -> orientation that are expanding and\n337 -> Contracting in different ways so you can\n340 -> imagine that as that keeps happening you\n342 -> start to have cracks form within this\n344 -> particle as these particles are getting\n346 -> bigger and smaller they're creating\n347 -> these cracks within the particle well as\n350 -> these cracks form you have that cathode\n353 -> electrolyte interface formation so again\n355 -> you start consuming more materials more\n358 -> useful materials within the battery from\n360 -> the electrolyte the lithium things like\n363 -> that and so you have battery degradation\n365 -> okay so why does depth of discharge367 -> matter then well the growth of these\n370 -> crystals is roughly proportional to the\n373 -> depth of discharge so for example if\n375 -> you're just going from 60% battery to\n377 -> 40% battery well that's only 20% of your\n380 -> total battery right versus if you're\n382 -> going from 100% to 0% 100% of your total\n385 -> battery so that 60 to 40 has about a\n387 -> fifth of the effect of this growth and\n390 -> contraction that you have Within These\n392 -> crystals meaning if you use these\n394 -> smaller battery ranges you have much\n397 -> less cracking occur within these\n398 -> particles and the battery lasts\n400 -> significantly longer so again a really\n403 -> cool study looked at how a battery's\n405 -> depth of discharge impacted its\n407 -> normalized capacity over time okay so\n409 -> for this study they're putting the same\n411 -> amount of energy in and out of all the\n414 -> batteries but they're using a different416 -> percentage of the battery to do it so\n418 -> for example if you're just going from\n420 -> 40% to 60% well you're going to have a\n422 -> bunch of small charges versus if you're\n424 -> going from 0 to 100% you're going to\n426 -> have fewer charges but the same amount\n428 -> of energy cuz you're using the whole\n430 -> battery and so what did they find well\n432 -> they found that going from 0 to 100%\n435 -> constantly the battery only had about\n438 -> 50% of its capacity after less than a\n441 -> 100 days versus going from 40 to 60%\n445 -> constantly the battery was at about 85%\n448 -> after 400 Days okay well what does this\n451 -> mean as far as context so going from 60\n454 -> to 40% constantly was the equivalent\n457 -> after 400 Days of about 3,200 full\n461 -> cycles of that battery now if you were\n463 -> to have a battery uh on an EV that had a\n466 -> 250 Mi range well that means this\n468 -> battery would last about470 -> 800,000 miles before its degradation\n473 -> reached about 85% so that's incredible\n477 -> right now the catch is that means you're\n479 -> only using 20% of the battery so you'd\n481 -> be limiting yourself to 50 m trips\n484 -> personally I don't stress about this one\n486 -> the easiest way to think of it is to\n488 -> just plug in your car after every trip\n490 -> rather than waiting till the battery is\n491 -> low to recharge it all right so what\n493 -> does Professor Jeff Don recommend he\n496 -> says stick to low stateof charge ranges\n498 -> 25% is great now obviously if you can't\n501 -> charge at home this is tough to do which\n504 -> is fine if you follow the next rule he\n506 -> says your battery will still very likely\n508 -> outl last the life of the car number\n511 -> three don't regularly charge to 100%\n515 -> okay what the heck shouldn't this be the\n517 -> car Maker's problem not mine yes520 -> absolutely that's why warranties exist\n523 -> and there are real engineering solutions\n525 -> to these problems so to understand\n527 -> number three let's look at the\n529 -> engineering Solutions now once again\n531 -> looking at the particles that make up\n532 -> our cathode there's a very clever\n534 -> solution here we're instead of using a\n536 -> bunch of many small crystals you use a\n540 -> single crystal structure for the entire\n542 -> particle so what this means is you have\n545 -> uniform expansion and contraction of\n547 -> that entire particle rather than having\n549 -> a bunch of crystallites at different\n551 -> orientations which as they grow and\n553 -> contract they create all these cracks so\n555 -> you avoid that cracking using this\n557 -> single crystal structure this is used in\n560 -> some Modern EVs and it has much longer\n563 -> capacity retention another Trend you're565 -> tending to see is batteries that are\n567 -> using higher nickel content all right so\n569 -> if you use a battery with more nickel it\n571 -> has better energy density seems like a\n573 -> smart thing to do so what's the problem\n575 -> well here we're looking at two different\n577 -> graphs with different nickel content in\n579 -> these batteries this one has about 50%\n582 -> for the cathode this one has about 80%\n584 -> for the cathode so using that higher\n586 -> nickel content you can see the voltage\n588 -> curve looks a bit different where we\n590 -> have this Plateau at the end for that\n592 -> latter portion of the state of charge\n594 -> from about 75% to 100% you've got this\n597 -> Plateau well this plateau toe is\n599 -> associated with a large volumetric\n601 -> change so you want to avoid that\n603 -> especially if you're using these uh you\n605 -> know many small crystallites as the608 -> structure for that cathode so you avoid\n610 -> that region you help avoid that micro\n612 -> cracking well what if you use a single\n615 -> crystal structure and also what if you\n617 -> use a lower nickel content well you\n619 -> don't have that Plateau you don't have\n621 -> to worry about that as much no problem\n622 -> you can charge up to 100% the same is\n625 -> basically true for lithium iron\n626 -> phosphate batteries which use a\n628 -> different chemistry all right but even\n630 -> if we're using a higher nickel content\n632 -> as long as we're using a single crystal\n634 -> structure we don't have to worry about\n635 -> cracking right well yes unfortunately\n639 -> this Plateau is also associated with a\n641 -> very small amount of oxygen being\n643 -> released during that portion of charging\n646 -> so you want to avoid this even if you're\n648 -> using a single crystal structure if you650 -> have a high nickel content battery\n652 -> because that relates to gas formation\n655 -> within the battery which means you're\n656 -> going to have degradation over time all\n658 -> right what's what's the Dr Don\n660 -> recommendation charge to 75% that way\n663 -> you have plenty of range daily and say\n665 -> you have a long trip coming up well\n667 -> charge the night before to 100% to have\n669 -> the extra range if you need it now\n671 -> obviously if you live in an apartment\n673 -> without charging going out and only\n675 -> charging up to 75% sounds very tedious\n678 -> and repetitive and personally I'm of the\n680 -> mindset that if you can't charge your\n681 -> electric vehicle at home well it really\n683 -> doesn't make sense for you yet to those\n685 -> who do it hats off to you but it's\n687 -> certainly not very convenient so I think\n689 -> the simple message is don't stress about0 -> electric cars have many advantages which\n2 -> have helped lead to their Rising\n3 -> popularity such as requiring a lot less\n6 -> maintenance however the battery is still\n8 -> very expensive and if it ever needs to\n10 -> be replaced it's a huge expense luckily\n13 -> there are practices you can put into\n15 -> place to make the battery last a really\n18 -> really long time and there are things\n20 -> you really shouldn't do which can\n22 -> dramatically shorten that lifetime my\n24 -> goal for this video is to not only\n25 -> explain the best and worst practices but\n28 -> actually explain why at the microscopic\n31 -> level why these are good or bad ideas\n33 -> now before we get into these practices\n36 -> it's worth mentioning this video is\n37 -> about nmc batteries meaning batteries\n39 -> made up of nickel manganese and Cobalt\n42 -> oxides it's a chemistry that gives you a\n44 -> lot of range and it's commonly used in46 -> the automotive space now if you don't\n48 -> know what chemistry your electric car's\n50 -> battery uses and why would you well much\n53 -> of these are good practices regardless\n55 -> we'll get into exceptions later so we're\n58 -> going to have three main rules number\n60 -> one don't store your car's battery at\n63 -> 100% for long periods of time especially\n66 -> when it's hot out now leaving your\n68 -> electric car in the hot sun for months\n70 -> at a time sounds like an edge case and\n72 -> it is but it helps lay the foundation\n74 -> for this video now if you haven't yet\n76 -> seen my video on how a lithium ion\n78 -> battery works that is certainly worth\n80 -> checking out but the big question here\n82 -> is why do batteries lose capacity over\n85 -> time and I've Illustrated many of the\n87 -> reasons here there's a lot of reasons\n89 -> why batteries will lose capacity over91 -> time the important thing to keep in mind\n93 -> is that if the battery is hotter and if\n95 -> the battery is at a higher voltage which\n97 -> occurs when it's at a higher state of\n99 -> charge these reactions are more\n101 -> prominent and they happen more quickly\n103 -> so you get more degradation when you\n105 -> have higher temperatures and at a higher\n107 -> voltage in other words a higher state of\n109 -> charge so one example I want to look at\n111 -> is called the solid electrolyte\n113 -> interface formation which occurs on both\n116 -> the particles in the anode as well as\n118 -> the particles in the cathode where it is\n120 -> then called cathode electrolyte\n122 -> interface so very simply what happens\n124 -> when you're originally creating the\n126 -> battery and you add the liquid\n127 -> electrolyte and you put it through its\n129 -> very first charge cycle well this solid\n132 -> electrolyte interface forms on these134 -> particles and this formation consumes\n137 -> the electrolyte it consumes lithium it\n139 -> consumes materials from the cathode and\n141 -> anode and so you're consuming useful\n143 -> materials from that battery and as a\n145 -> result you actually lose about 10% of\n147 -> the battery's initial capacity on that\n149 -> very first charge now you as a consumer\n152 -> never see this because this is done at\n153 -> the factory long before you ever get a\n155 -> product using this battery but it is\n157 -> worth mentioning because this continues\n159 -> to grow and so as long as this\n162 -> electrolyte interface continues to grow\n164 -> and consume other materials it means\n165 -> it's taking away from the usefulness of\n168 -> your battery now there was a really cool\n170 -> study done where they found that if you\n172 -> store a battery at a higher temperature\n174 -> it has more degradation but they also176 -> found that if you store a battery at a\n178 -> higher state of charge it also has more\n180 -> degradation so what did they do well\n182 -> they took a bunch of batteries and they\n184 -> stored them in a room at 50° C so very\n188 -> warm and they stored these batteries\n190 -> with a different state of charge so one\n192 -> of them at 100% state of charge one at\n194 -> 90% one at 80% and so on and what did\n197 -> they find well the battery that was\n199 -> stored at 100% state of charge had less\n202 -> than 60% of its original capacity after\n206 -> less than 200 days so it had degraded a\n210 -> ton versus the battery stored at 30%\n212 -> state of charge was only down to 85% of\n216 -> its original rated capacity after about\n219 -> 400 days so significantly more capacity\n223 -> and much longer duration than it was in\n225 -> the test so heat and voltage are both\n228 -> bad for battery degradation now there's230 -> an Incredible video by Professor Jeff\n232 -> Dawn a lithium ion battery researcher\n235 -> with seemingly endless knowledge in this\n237 -> space who also had a 5-year research\n239 -> partner partnership with Tesla for\n240 -> battery development he provides specific\n243 -> advice so for each of these three rules\n246 -> I'm going to share his advice for what\n248 -> you should do all right so say you're\n250 -> storing your electric car for a long\n252 -> period of time and it's going to be in a\n254 -> hot environment what should you do well\n256 -> he says you should Target a 30% state of\n258 -> charge for that duration now if you're\n261 -> storing it in the cold even for a long\n263 -> period of time there's no worries\n265 -> because of the cold temperatures you'll\n267 -> have very little reactivity so storing\n269 -> it at say 70% is no big deal number two\n272 -> don't wait until the battery is low to275 -> recharge it unless necessary now the\n277 -> critical part here is that you have a\n279 -> relatively low depth of discharge\n281 -> meaning say keeping your battery at 80%\n284 -> and only discharging to 60% before\n286 -> charging again it's fine to use the\n289 -> whole battery when you need it but after\n290 -> a short trip plug it in a bunch of small\n293 -> charges is much better than in frequent\n296 -> F depth charges okay so why well let's\n300 -> look at the particles that make up the\n301 -> cathode and if we zoom in on one of\n304 -> these electrode particles we can see\n306 -> that it's made up of many many many\n309 -> small crystallites and each one of these\n311 -> small crystallites has its own structure\n313 -> that's repeated so you've got oxygen\n315 -> metals and lithium that's moving to and\n317 -> from the anode back to the cathode back\n319 -> to the anode and so as this lithium322 -> leaves this crystal structure well this\n324 -> formation expands in One Direction and\n327 -> it shrinks in another formation and\n330 -> again the orientation of these are all\n332 -> over the place so you've got a bunch of\n334 -> different crystals all with different\n335 -> orientation that are expanding and\n337 -> Contracting in different ways so you can\n340 -> imagine that as that keeps happening you\n342 -> start to have cracks form within this\n344 -> particle as these particles are getting\n346 -> bigger and smaller they're creating\n347 -> these cracks within the particle well as\n350 -> these cracks form you have that cathode\n353 -> electrolyte interface formation so again\n355 -> you start consuming more materials more\n358 -> useful materials within the battery from\n360 -> the electrolyte the lithium things like\n363 -> that and so you have battery degradation\n365 -> okay so why does depth of discharge367 -> matter then well the growth of these\n370 -> crystals is roughly proportional to the\n373 -> depth of discharge so for example if\n375 -> you're just going from 60% battery to\n377 -> 40% battery well that's only 20% of your\n380 -> total battery right versus if you're\n382 -> going from 100% to 0% 100% of your total\n385 -> battery so that 60 to 40 has about a\n387 -> fifth of the effect of this growth and\n390 -> contraction that you have Within These\n392 -> crystals meaning if you use these\n394 -> smaller battery ranges you have much\n397 -> less cracking occur within these\n398 -> particles and the battery lasts\n400 -> significantly longer so again a really\n403 -> cool study looked at how a battery's\n405 -> depth of discharge impacted its\n407 -> normalized capacity over time okay so\n409 -> for this study they're putting the same\n411 -> amount of energy in and out of all the\n414 -> batteries but they're using a different416 -> percentage of the battery to do it so\n418 -> for example if you're just going from\n420 -> 40% to 60% well you're going to have a\n422 -> bunch of small charges versus if you're\n424 -> going from 0 to 100% you're going to\n426 -> have fewer charges but the same amount\n428 -> of energy cuz you're using the whole\n430 -> battery and so what did they find well\n432 -> they found that going from 0 to 100%\n435 -> constantly the battery only had about\n438 -> 50% of its capacity after less than a\n441 -> 100 days versus going from 40 to 60%\n445 -> constantly the battery was at about 85%\n448 -> after 400 Days okay well what does this\n451 -> mean as far as context so going from 60\n454 -> to 40% constantly was the equivalent\n457 -> after 400 Days of about 3,200 full\n461 -> cycles of that battery now if you were\n463 -> to have a battery uh on an EV that had a\n466 -> 250 Mi range well that means this\n468 -> battery would last about470 -> 800,000 miles before its degradation\n473 -> reached about 85% so that's incredible\n477 -> right now the catch is that means you're\n479 -> only using 20% of the battery so you'd\n481 -> be limiting yourself to 50 m trips\n484 -> personally I don't stress about this one\n486 -> the easiest way to think of it is to\n488 -> just plug in your car after every trip\n490 -> rather than waiting till the battery is\n491 -> low to recharge it all right so what\n493 -> does Professor Jeff Don recommend he\n496 -> says stick to low stateof charge ranges\n498 -> 25% is great now obviously if you can't\n501 -> charge at home this is tough to do which\n504 -> is fine if you follow the next rule he\n506 -> says your battery will still very likely\n508 -> outl last the life of the car number\n511 -> three don't regularly charge to 100%\n515 -> okay what the heck shouldn't this be the\n517 -> car Maker's problem not mine yes520 -> absolutely that's why warranties exist\n523 -> and there are real engineering solutions\n525 -> to these problems so to understand\n527 -> number three let's look at the\n529 -> engineering Solutions now once again\n531 -> looking at the particles that make up\n532 -> our cathode there's a very clever\n534 -> solution here we're instead of using a\n536 -> bunch of many small crystals you use a\n540 -> single crystal structure for the entire\n542 -> particle so what this means is you have\n545 -> uniform expansion and contraction of\n547 -> that entire particle rather than having\n549 -> a bunch of crystallites at different\n551 -> orientations which as they grow and\n553 -> contract they create all these cracks so\n555 -> you avoid that cracking using this\n557 -> single crystal structure this is used in\n560 -> some Modern EVs and it has much longer\n563 -> capacity retention another Trend you're565 -> tending to see is batteries that are\n567 -> using higher nickel content all right so\n569 -> if you use a battery with more nickel it\n571 -> has better energy density seems like a\n573 -> smart thing to do so what's the problem\n575 -> well here we're looking at two different\n577 -> graphs with different nickel content in\n579 -> these batteries this one has about 50%\n582 -> for the cathode this one has about 80%\n584 -> for the cathode so using that higher\n586 -> nickel content you can see the voltage\n588 -> curve looks a bit different where we\n590 -> have this Plateau at the end for that\n592 -> latter portion of the state of charge\n594 -> from about 75% to 100% you've got this\n597 -> Plateau well this plateau toe is\n599 -> associated with a large volumetric\n601 -> change so you want to avoid that\n603 -> especially if you're using these uh you\n605 -> know many small crystallites as the608 -> structure for that cathode so you avoid\n610 -> that region you help avoid that micro\n612 -> cracking well what if you use a single\n615 -> crystal structure and also what if you\n617 -> use a lower nickel content well you\n619 -> don't have that Plateau you don't have\n621 -> to worry about that as much no problem\n622 -> you can charge up to 100% the same is\n625 -> basically true for lithium iron\n626 -> phosphate batteries which use a\n628 -> different chemistry all right but even\n630 -> if we're using a higher nickel content\n632 -> as long as we're using a single crystal\n634 -> structure we don't have to worry about\n635 -> cracking right well yes unfortunately\n639 -> this Plateau is also associated with a\n641 -> very small amount of oxygen being\n643 -> released during that portion of charging\n646 -> so you want to avoid this even if you're\n648 -> using a single crystal structure if you650 -> have a high nickel content battery\n652 -> because that relates to gas formation\n655 -> within the battery which means you're\n656 -> going to have degradation over time all\n658 -> right what's what's the Dr Don\n660 -> recommendation charge to 75% that way\n663 -> you have plenty of range daily and say\n665 -> you have a long trip coming up well\n667 -> charge the night before to 100% to have\n669 -> the extra range if you need it now\n671 -> obviously if you live in an apartment\n673 -> without charging going out and only\n675 -> charging up to 75% sounds very tedious\n678 -> and repetitive and personally I'm of the\n680 -> mindset that if you can't charge your\n681 -> electric vehicle at home well it really\n683 -> doesn't make sense for you yet to those\n685 -> who do it hats off to you but it's\n687 -> certainly not very convenient so I think\n689 -> the simple message is don't stress about0 -> electric cars have many advantages which\n2 -> have helped lead to their Rising\n3 -> popularity such as requiring a lot less\n6 -> maintenance however the battery is still\n8 -> very expensive and if it ever needs to\n10 -> be replaced it's a huge expense luckily\n13 -> there are practices you can put into\n15 -> place to make the battery last a really\n18 -> really long time and there are things\n20 -> you really shouldn't do which can\n22 -> dramatically shorten that lifetime my\n24 -> goal for this video is to not only\n25 -> explain the best and worst practices but\n28 -> actually explain why at the microscopic\n31 -> level why these are good or bad ideas\n33 -> now before we get into these practices\n36 -> it's worth mentioning this video is\n37 -> about nmc batteries meaning batteries\n39 -> made up of nickel manganese and Cobalt\n42 -> oxides it's a chemistry that gives you a\n44 -> lot of range and it's commonly used in46 -> the automotive space now if you don't\n48 -> know what chemistry your electric car's\n50 -> battery uses and why would you well much\n53 -> of these are good practices regardless\n55 -> we'll get into exceptions later so we're\n58 -> going to have three main rules number\n60 -> one don't store your car's battery at\n63 -> 100% for long periods of time especially\n66 -> when it's hot out now leaving your\n68 -> electric car in the hot sun for months\n70 -> at a time sounds like an edge case and\n72 -> it is but it helps lay the foundation\n74 -> for this video now if you haven't yet\n76 -> seen my video on how a lithium ion\n78 -> battery works that is certainly worth\n80 -> checking out but the big question here\n82 -> is why do batteries lose capacity over\n85 -> time and I've Illustrated many of the\n87 -> reasons here there's a lot of reasons\n89 -> why batteries will lose capacity over91 -> time the important thing to keep in mind\n93 -> is that if the battery is hotter and if\n95 -> the battery is at a higher voltage which\n97 -> occurs when it's at a higher state of\n99 -> charge these reactions are more\n101 -> prominent and they happen more quickly\n103 -> so you get more degradation when you\n105 -> have higher temperatures and at a higher\n107 -> voltage in other words a higher state of\n109 -> charge so one example I want to look at\n111 -> is called the solid electrolyte\n113 -> interface formation which occurs on both\n116 -> the particles in the anode as well as\n118 -> the particles in the cathode where it is\n120 -> then called cathode electrolyte\n122 -> interface so very simply what happens\n124 -> when you're originally creating the\n126 -> battery and you add the liquid\n127 -> electrolyte and you put it through its\n129 -> very first charge cycle well this solid\n132 -> electrolyte interface forms on these134 -> particles and this formation consumes\n137 -> the electrolyte it consumes lithium it\n139 -> consumes materials from the cathode and\n141 -> anode and so you're consuming useful\n143 -> materials from that battery and as a\n145 -> result you actually lose about 10% of\n147 -> the battery's initial capacity on that\n149 -> very first charge now you as a consumer\n152 -> never see this because this is done at\n153 -> the factory long before you ever get a\n155 -> product using this battery but it is\n157 -> worth mentioning because this continues\n159 -> to grow and so as long as this\n162 -> electrolyte interface continues to grow\n164 -> and consume other materials it means\n165 -> it's taking away from the usefulness of\n168 -> your battery now there was a really cool\n170 -> study done where they found that if you\n172 -> store a battery at a higher temperature\n174 -> it has more degradation but they also176 -> found that if you store a battery at a\n178 -> higher state of charge it also has more\n180 -> degradation so what did they do well\n182 -> they took a bunch of batteries and they\n184 -> stored them in a room at 50° C so very\n188 -> warm and they stored these batteries\n190 -> with a different state of charge so one\n192 -> of them at 100% state of charge one at\n194 -> 90% one at 80% and so on and what did\n197 -> they find well the battery that was\n199 -> stored at 100% state of charge had less\n202 -> than 60% of its original capacity after\n206 -> less than 200 days so it had degraded a\n210 -> ton versus the battery stored at 30%\n212 -> state of charge was only down to 85% of\n216 -> its original rated capacity after about\n219 -> 400 days so significantly more capacity\n223 -> and much longer duration than it was in\n225 -> the test so heat and voltage are both\n228 -> bad for battery degradation now there's230 -> an Incredible video by Professor Jeff\n232 -> Dawn a lithium ion battery researcher\n235 -> with seemingly endless knowledge in this\n237 -> space who also had a 5-year research\n239 -> partner partnership with Tesla for\n240 -> battery development he provides specific\n243 -> advice so for each of these three rules\n246 -> I'm going to share his advice for what\n248 -> you should do all right so say you're\n250 -> storing your electric car for a long\n252 -> period of time and it's going to be in a\n254 -> hot environment what should you do well\n256 -> he says you should Target a 30% state of\n258 -> charge for that duration now if you're\n261 -> storing it in the cold even for a long\n263 -> period of time there's no worries\n265 -> because of the cold temperatures you'll\n267 -> have very little reactivity so storing\n269 -> it at say 70% is no big deal number two\n272 -> don't wait until the battery is low to275 -> recharge it unless necessary now the\n277 -> critical part here is that you have a\n279 -> relatively low depth of discharge\n281 -> meaning say keeping your battery at 80%\n284 -> and only discharging to 60% before\n286 -> charging again it's fine to use the\n289 -> whole battery when you need it but after\n290 -> a short trip plug it in a bunch of small\n293 -> charges is much better than in frequent\n296 -> F depth charges okay so why well let's\n300 -> look at the particles that make up the\n301 -> cathode and if we zoom in on one of\n304 -> these electrode particles we can see\n306 -> that it's made up of many many many\n309 -> small crystallites and each one of these\n311 -> small crystallites has its own structure\n313 -> that's repeated so you've got oxygen\n315 -> metals and lithium that's moving to and\n317 -> from the anode back to the cathode back\n319 -> to the anode and so as this lithium322 -> leaves this crystal structure well this\n324 -> formation expands in One Direction and\n327 -> it shrinks in another formation and\n330 -> again the orientation of these are all\n332 -> over the place so you've got a bunch of\n334 -> different crystals all with different\n335 -> orientation that are expanding and\n337 -> Contracting in different ways so you can\n340 -> imagine that as that keeps happening you\n342 -> start to have cracks form within this\n344 -> particle as these particles are getting\n346 -> bigger and smaller they're creating\n347 -> these cracks within the particle well as\n350 -> these cracks form you have that cathode\n353 -> electrolyte interface formation so again\n355 -> you start consuming more materials more\n358 -> useful materials within the battery from\n360 -> the electrolyte the lithium things like\n363 -> that and so you have battery degradation\n365 -> okay so why does depth of discharge367 -> matter then well the growth of these\n370 -> crystals is roughly proportional to the\n373 -> depth of discharge so for example if\n375 -> you're just going from 60% battery to\n377 -> 40% battery well that's only 20% of your\n380 -> total battery right versus if you're\n382 -> going from 100% to 0% 100% of your total\n385 -> battery so that 60 to 40 has about a\n387 -> fifth of the effect of this growth and\n390 -> contraction that you have Within These\n392 -> crystals meaning if you use these\n394 -> smaller battery ranges you have much\n397 -> less cracking occur within these\n398 -> particles and the battery lasts\n400 -> significantly longer so again a really\n403 -> cool study looked at how a battery's\n405 -> depth of discharge impacted its\n407 -> normalized capacity over time okay so\n409 -> for this study they're putting the same\n411 -> amount of energy in and out of all the\n414 -> batteries but they're using a different416 -> percentage of the battery to do it so\n418 -> for example if you're just going from\n420 -> 40% to 60% well you're going to have a\n422 -> bunch of small charges versus if you're\n424 -> going from 0 to 100% you're going to\n426 -> have fewer charges but the same amount\n428 -> of energy cuz you're using the whole\n430 -> battery and so what did they find well\n432 -> they found that going from 0 to 100%\n435 -> constantly the battery only had about\n438 -> 50% of its capacity after less than a\n441 -> 100 days versus going from 40 to 60%\n445 -> constantly the battery was at about 85%\n448 -> after 400 Days okay well what does this\n451 -> mean as far as context so going from 60\n454 -> to 40% constantly was the equivalent\n457 -> after 400 Days of about 3,200 full\n461 -> cycles of that battery now if you were\n463 -> to have a battery uh on an EV that had a\n466 -> 250 Mi range well that means this\n468 -> battery would last about470 -> 800,000 miles before its degradation\n473 -> reached about 85% so that's incredible\n477 -> right now the catch is that means you're\n479 -> only using 20% of the battery so you'd\n481 -> be limiting yourself to 50 m trips\n484 -> personally I don't stress about this one\n486 -> the easiest way to think of it is to\n488 -> just plug in your car after every trip\n490 -> rather than waiting till the battery is\n491 -> low to recharge it all right so what\n493 -> does Professor Jeff Don recommend he\n496 -> says stick to low stateof charge ranges\n498 -> 25% is great now obviously if you can't\n501 -> charge at home this is tough to do which\n504 -> is fine if you follow the next rule he\n506 -> says your battery will still very likely\n508 -> outl last the life of the car number\n511 -> three don't regularly charge to 100%\n515 -> okay what the heck shouldn't this be the\n517 -> car Maker's problem not mine yes520 -> absolutely that's why warranties exist\n523 -> and there are real engineering solutions\n525 -> to these problems so to understand\n527 -> number three let's look at the\n529 -> engineering Solutions now once again\n531 -> looking at the particles that make up\n532 -> our cathode there's a very clever\n534 -> solution here we're instead of using a\n536 -> bunch of many small crystals you use a\n540 -> single crystal structure for the entire\n542 -> particle so what this means is you have\n545 -> uniform expansion and contraction of\n547 -> that entire particle rather than having\n549 -> a bunch of crystallites at different\n551 -> orientations which as they grow and\n553 -> contract they create all these cracks so\n555 -> you avoid that cracking using this\n557 -> single crystal structure this is used in\n560 -> some Modern EVs and it has much longer\n563 -> capacity retention another Trend you're565 -> tending to see is batteries that are\n567 -> using higher nickel content all right so\n569 -> if you use a battery with more nickel it\n571 -> has better energy density seems like a\n573 -> smart thing to do so what's the problem\n575 -> well here we're looking at two different\n577 -> graphs with different nickel content in\n579 -> these batteries this one has about 50%\n582 -> for the cathode this one has about 80%\n584 -> for the cathode so using that higher\n586 -> nickel content you can see the voltage\n588 -> curve looks a bit different where we\n590 -> have this Plateau at the end for that\n592 -> latter portion of the state of charge\n594 -> from about 75% to 100% you've got this\n597 -> Plateau well this plateau toe is\n599 -> associated with a large volumetric\n601 -> change so you want to avoid that\n603 -> especially if you're using these uh you\n605 -> know many small crystallites as the608 -> structure for that cathode so you avoid\n610 -> that region you help avoid that micro\n612 -> cracking well what if you use a single\n615 -> crystal structure and also what if you\n617 -> use a lower nickel content well you\n619 -> don't have that Plateau you don't have\n621 -> to worry about that as much no problem\n622 -> you can charge up to 100% the same is\n625 -> basically true for lithium iron\n626 -> phosphate batteries which use a\n628 -> different chemistry all right but even\n630 -> if we're using a higher nickel content\n632 -> as long as we're using a single crystal\n634 -> structure we don't have to worry about\n635 -> cracking right well yes unfortunately\n639 -> this Plateau is also associated with a\n641 -> very small amount of oxygen being\n643 -> released during that portion of charging\n646 -> so you want to avoid this even if you're\n648 -> using a single crystal structure if you650 -> have a high nickel content battery\n652 -> because that relates to gas formation\n655 -> within the battery which means you're\n656 -> going to have degradation over time all\n658 -> right what's what's the Dr Don\n660 -> recommendation charge to 75% that way\n663 -> you have plenty of range daily and say\n665 -> you have a long trip coming up well\n667 -> charge the night before to 100% to have\n669 -> the extra range if you need it now\n671 -> obviously if you live in an apartment\n673 -> without charging going out and only\n675 -> charging up to 75% sounds very tedious\n678 -> and repetitive and personally I'm of the\n680 -> mindset that if you can't charge your\n681 -> electric vehicle at home well it really\n683 -> doesn't make sense for you yet to those\n685 -> who do it hats off to you but it's\n687 -> certainly not very convenient so I think\n689 -> the simple message is don't stress about0 -> electric cars have many advantages which\n2 -> have helped lead to their Rising\n3 -> popularity such as requiring a lot less\n6 -> maintenance however the battery is still\n8 -> very expensive and if it ever needs to\n10 -> be replaced it's a huge expense luckily\n13 -> there are practices you can put into\n15 -> place to make the battery last a really\n18 -> really long time and there are things\n20 -> you really shouldn't do which can\n22 -> dramatically shorten that lifetime my\n24 -> goal for this video is to not only\n25 -> explain the best and worst practices but\n28 -> actually explain why at the microscopic\n31 -> level why these are good or bad ideas\n33 -> now before we get into these practices\n36 -> it's worth mentioning this video is\n37 -> about nmc batteries meaning batteries\n39 -> made up of nickel manganese and Cobalt\n42 -> oxides it's a chemistry that gives you a\n44 -> lot of range and it's commonly used in46 -> the automotive space now if you don't\n48 -> know what chemistry your electric car's\n50 -> battery uses and why would you well much\n53 -> of these are good practices regardless\n55 -> we'll get into exceptions later so we're\n58 -> going to have three main rules number\n60 -> one don't store your car's battery at\n63 -> 100% for long periods of time especially\n66 -> when it's hot out now leaving your\n68 -> electric car in the hot sun for months\n70 -> at a time sounds like an edge case and\n72 -> it is but it helps lay the foundation\n74 -> for this video now if you haven't yet\n76 -> seen my video on how a lithium ion\n78 -> battery works that is certainly worth\n80 -> checking out but the big question here\n82 -> is why do batteries lose capacity over\n85 -> time and I've Illustrated many of the\n87 -> reasons here there's a lot of reasons\n89 -> why batteries will lose capacity over91 -> time the important thing to keep in mind\n93 -> is that if the battery is hotter and if\n95 -> the battery is at a higher voltage which\n97 -> occurs when it's at a higher state of\n99 -> charge these reactions are more\n101 -> prominent and they happen more quickly\n103 -> so you get more degradation when you\n105 -> have higher temperatures and at a higher\n107 -> voltage in other words a higher state of\n109 -> charge so one example I want to look at\n111 -> is called the solid electrolyte\n113 -> interface formation which occurs on both\n116 -> the particles in the anode as well as\n118 -> the particles in the cathode where it is\n120 -> then called cathode electrolyte\n122 -> interface so very simply what happens\n124 -> when you're originally creating the\n126 -> battery and you add the liquid\n127 -> electrolyte and you put it through its\n129 -> very first charge cycle well this solid\n132 -> electrolyte interface forms on these134 -> particles and this formation consumes\n137 -> the electrolyte it consumes lithium it\n139 -> consumes materials from the cathode and\n141 -> anode and so you're consuming useful\n143 -> materials from that battery and as a\n145 -> result you actually lose about 10% of\n147 -> the battery's initial capacity on that\n149 -> very first charge now you as a consumer\n152 -> never see this because this is done at\n153 -> the factory long before you ever get a\n155 -> product using this battery but it is\n157 -> worth mentioning because this continues\n159 -> to grow and so as long as this\n162 -> electrolyte interface continues to grow\n164 -> and consume other materials it means\n165 -> it's taking away from the usefulness of\n168 -> your battery now there was a really cool\n170 -> study done where they found that if you\n172 -> store a battery at a higher temperature\n174 -> it has more degradation but they also176 -> found that if you store a battery at a\n178 -> higher state of charge it also has more\n180 -> degradation so what did they do well\n182 -> they took a bunch of batteries and they\n184 -> stored them in a room at 50° C so very\n188 -> warm and they stored these batteries\n190 -> with a different state of charge so one\n192 -> of them at 100% state of charge one at\n194 -> 90% one at 80% and so on and what did\n197 -> they find well the battery that was\n199 -> stored at 100% state of charge had less\n202 -> than 60% of its original capacity after\n206 -> less than 200 days so it had degraded a\n210 -> ton versus the battery stored at 30%\n212 -> state of charge was only down to 85% of\n216 -> its original rated capacity after about\n219 -> 400 days so significantly more capacity\n223 -> and much longer duration than it was in\n225 -> the test so heat and voltage are both\n228 -> bad for battery degradation now there's230 -> an Incredible video by Professor Jeff\n232 -> Dawn a lithium ion battery researcher\n235 -> with seemingly endless knowledge in this\n237 -> space who also had a 5-year research\n239 -> partner partnership with Tesla for\n240 -> battery development he provides specific\n243 -> advice so for each of these three rules\n246 -> I'm going to share his advice for what\n248 -> you should do all right so say you're\n250 -> storing your electric car for a long\n252 -> period of time and it's going to be in a\n254 -> hot environment what should you do well\n256 -> he says you should Target a 30% state of\n258 -> charge for that duration now if you're\n261 -> storing it in the cold even for a long\n263 -> period of time there's no worries\n265 -> because of the cold temperatures you'll\n267 -> have very little reactivity so storing\n269 -> it at say 70% is no big deal number two\n272 -> don't wait until the battery is low to275 -> recharge it unless necessary now the\n277 -> critical part here is that you have a\n279 -> relatively low depth of discharge\n281 -> meaning say keeping your battery at 80%\n284 -> and only discharging to 60% before\n286 -> charging again it's fine to use the\n289 -> whole battery when you need it but after\n290 -> a short trip plug it in a bunch of small\n293 -> charges is much better than in frequent\n296 -> F depth charges okay so why well let's\n300 -> look at the particles that make up the\n301 -> cathode and if we zoom in on one of\n304 -> these electrode particles we can see\n306 -> that it's made up of many many many\n309 -> small crystallites and each one of these\n311 -> small crystallites has its own structure\n313 -> that's repeated so you've got oxygen\n315 -> metals and lithium that's moving to and\n317 -> from the anode back to the cathode back\n319 -> to the anode and so as this lithium322 -> leaves this crystal structure well this\n324 -> formation expands in One Direction and\n327 -> it shrinks in another formation and\n330 -> again the orientation of these are all\n332 -> over the place so you've got a bunch of\n334 -> different crystals all with different\n335 -> orientation that are expanding and\n337 -> Contracting in different ways so you can\n340 -> imagine that as that keeps happening you\n342 -> start to have cracks form within this\n344 -> particle as these particles are getting\n346 -> bigger and smaller they're creating\n347 -> these cracks within the particle well as\n350 -> these cracks form you have that cathode\n353 -> electrolyte interface formation so again\n355 -> you start consuming more materials more\n358 -> useful materials within the battery from\n360 -> the electrolyte the lithium things like\n363 -> that and so you have battery degradation\n365 -> okay so why does depth of discharge367 -> matter then well the growth of these\n370 -> crystals is roughly proportional to the\n373 -> depth of discharge so for example if\n375 -> you're just going from 60% battery to\n377 -> 40% battery well that's only 20% of your\n380 -> total battery right versus if you're\n382 -> going from 100% to 0% 100% of your total\n385 -> battery so that 60 to 40 has about a\n387 -> fifth of the effect of this growth and\n390 -> contraction that you have Within These\n392 -> crystals meaning if you use these\n394 -> smaller battery ranges you have much\n397 -> less cracking occur within these\n398 -> particles and the battery lasts\n400 -> significantly longer so again a really\n403 -> cool study looked at how a battery's\n405 -> depth of discharge impacted its\n407 -> normalized capacity over time okay so\n409 -> for this study they're putting the same\n411 -> amount of energy in and out of all the\n414 -> batteries but they're using a different416 -> percentage of the battery to do it so\n418 -> for example if you're just going from\n420 -> 40% to 60% well you're going to have a\n422 -> bunch of small charges versus if you're\n424 -> going from 0 to 100% you're going to\n426 -> have fewer charges but the same amount\n428 -> of energy cuz you're using the whole\n430 -> battery and so what did they find well\n432 -> they found that going from 0 to 100%\n435 -> constantly the battery only had about\n438 -> 50% of its capacity after less than a\n441 -> 100 days versus going from 40 to 60%\n445 -> constantly the battery was at about 85%\n448 -> after 400 Days okay well what does this\n451 -> mean as far as context so going from 60\n454 -> to 40% constantly was the equivalent\n457 -> after 400 Days of about 3,200 full\n461 -> cycles of that battery now if you were\n463 -> to have a battery uh on an EV that had a\n466 -> 250 Mi range well that means this\n468 -> battery would last about470 -> 800,000 miles before its degradation\n473 -> reached about 85% so that's incredible\n477 -> right now the catch is that means you're\n479 -> only using 20% of the battery so you'd\n481 -> be limiting yourself to 50 m trips\n484 -> personally I don't stress about this one\n486 -> the easiest way to think of it is to\n488 -> just plug in your car after every trip\n490 -> rather than waiting till the battery is\n491 -> low to recharge it all right so what\n493 -> does Professor Jeff Don recommend he\n496 -> says stick to low stateof charge ranges\n498 -> 25% is great now obviously if you can't\n501 -> charge at home this is tough to do which\n504 -> is fine if you follow the next rule he\n506 -> says your battery will still very likely\n508 -> outl last the life of the car number\n511 -> three don't regularly charge to 100%\n515 -> okay what the heck shouldn't this be the\n517 -> car Maker's problem not mine yes520 -> absolutely that's why warranties exist\n523 -> and there are real engineering solutions\n525 -> to these problems so to understand\n527 -> number three let's look at the\n529 -> engineering Solutions now once again\n531 -> looking at the particles that make up\n532 -> our cathode there's a very clever\n534 -> solution here we're instead of using a\n536 -> bunch of many small crystals you use a\n540 -> single crystal structure for the entire\n542 -> particle so what this means is you have\n545 -> uniform expansion and contraction of\n547 -> that entire particle rather than having\n549 -> a bunch of crystallites at different\n551 -> orientations which as they grow and\n553 -> contract they create all these cracks so\n555 -> you avoid that cracking using this\n557 -> single crystal structure this is used in\n560 -> some Modern EVs and it has much longer\n563 -> capacity retention another Trend you're565 -> tending to see is batteries that are\n567 -> using higher nickel content all right so\n569 -> if you use a battery with more nickel it\n571 -> has better energy density seems like a\n573 -> smart thing to do so what's the problem\n575 -> well here we're looking at two different\n577 -> graphs with different nickel content in\n579 -> these batteries this one has about 50%\n582 -> for the cathode this one has about 80%\n584 -> for the cathode so using that higher\n586 -> nickel content you can see the voltage\n588 -> curve looks a bit different where we\n590 -> have this Plateau at the end for that\n592 -> latter portion of the state of charge\n594 -> from about 75% to 100% you've got this\n597 -> Plateau well this plateau toe is\n599 -> associated with a large volumetric\n601 -> change so you want to avoid that\n603 -> especially if you're using these uh you\n605 -> know many small crystallites as the608 -> structure for that cathode so you avoid\n610 -> that region you help avoid that micro\n612 -> cracking well what if you use a single\n615 -> crystal structure and also what if you\n617 -> use a lower nickel content well you\n619 -> don't have that Plateau you don't have\n621 -> to worry about that as much no problem\n622 -> you can charge up to 100% the same is\n625 -> basically true for lithium iron\n626 -> phosphate batteries which use a\n628 -> different chemistry all right but even\n630 -> if we're using a higher nickel content\n632 -> as long as we're using a single crystal\n634 -> structure we don't have to worry about\n635 -> cracking right well yes unfortunately\n639 -> this Plateau is also associated with a\n641 -> very small amount of oxygen being\n643 -> released during that portion of charging\n646 -> so you want to avoid this even if you're\n648 -> using a single crystal structure if you650 -> have a high nickel content battery\n652 -> because that relates to gas formation\n655 -> within the battery which means you're\n656 -> going to have degradation over time all\n658 -> right what's what's the Dr Don\n660 -> recommendation charge to 75% that way\n663 -> you have plenty of range daily and say\n665 -> you have a long trip coming up well\n667 -> charge the night before to 100% to have\n669 -> the extra range if you need it now\n671 -> obviously if you live in an apartment\n673 -> without charging going out and only\n675 -> charging up to 75% sounds very tedious\n678 -> and repetitive and personally I'm of the\n680 -> mindset that if you can't charge your\n681 -> electric vehicle at home well it really\n683 -> doesn't make sense for you yet to those\n685 -> who do it hats off to you but it's\n687 -> certainly not very convenient so I think\n689 -> the simple message is don't stress about0 -> electric cars have many advantages which\n2 -> have helped lead to their Rising\n3 -> popularity such as requiring a lot less\n6 -> maintenance however the battery is still\n8 -> very expensive and if it ever needs to\n10 -> be replaced it's a huge expense luckily\n13 -> there are practices you can put into\n15 -> place to make the battery last a really\n18 -> really long time and there are things\n20 -> you really shouldn't do which can\n22 -> dramatically shorten that lifetime my\n24 -> goal for this video is to not only\n25 -> explain the best and worst practices but\n28 -> actually explain why at the microscopic\n31 -> level why these are good or bad ideas\n33 -> now before we get into these practices\n36 -> it's worth mentioning this video is\n37 -> about nmc batteries meaning batteries\n39 -> made up of nickel manganese and Cobalt\n42 -> oxides it's a chemistry that gives you a\n44 -> lot of range and it's commonly used in46 -> the automotive space now if you don't\n48 -> know what chemistry your electric car's\n50 -> battery uses and why would you well much\n53 -> of these are good practices regardless\n55 -> we'll get into exceptions later so we're\n58 -> going to have three main rules number\n60 -> one don't store your car's battery at\n63 -> 100% for long periods of time especially\n66 -> when it's hot out now leaving your\n68 -> electric car in the hot sun for months\n70 -> at a time sounds like an edge case and\n72 -> it is but it helps lay the foundation\n74 -> for this video now if you haven't yet\n76 -> seen my video on how a lithium ion\n78 -> battery works that is certainly worth\n80 -> checking out but the big question here\n82 -> is why do batteries lose capacity over\n85 -> time and I've Illustrated many of the\n87 -> reasons here there's a lot of reasons\n89 -> why batteries will lose capacity over91 -> time the important thing to keep in mind\n93 -> is that if the battery is hotter and if\n95 -> the battery is at a higher voltage which\n97 -> occurs when it's at a higher state of\n99 -> charge these reactions are more\n101 -> prominent and they happen more quickly\n103 -> so you get more degradation when you\n105 -> have higher temperatures and at a higher\n107 -> voltage in other words a higher state of\n109 -> charge so one example I want to look at\n111 -> is called the solid electrolyte\n113 -> interface formation which occurs on both\n116 -> the particles in the anode as well as\n118 -> the particles in the cathode where it is\n120 -> then called cathode electrolyte\n122 -> interface so very simply what happens\n124 -> when you're originally creating the\n126 -> battery and you add the liquid\n127 -> electrolyte and you put it through its\n129 -> very first charge cycle well this solid\n132 -> electrolyte interface forms on these134 -> particles and this formation consumes\n137 -> the electrolyte it consumes lithium it\n139 -> consumes materials from the cathode and\n141 -> anode and so you're consuming useful\n143 -> materials from that battery and as a\n145 -> result you actually lose about 10% of\n147 -> the battery's initial capacity on that\n149 -> very first charge now you as a consumer\n152 -> never see this because this is done at\n153 -> the factory long before you ever get a\n155 -> product using this battery but it is\n157 -> worth mentioning because this continues\n159 -> to grow and so as long as this\n162 -> electrolyte interface continues to grow\n164 -> and consume other materials it means\n165 -> it's taking away from the usefulness of\n168 -> your battery now there was a really cool\n170 -> study done where they found that if you\n172 -> store a battery at a higher temperature\n174 -> it has more degradation but they also176 -> found that if you store a battery at a\n178 -> higher state of charge it also has more\n180 -> degradation so what did they do well\n182 -> they took a bunch of batteries and they\n184 -> stored them in a room at 50° C so very\n188 -> warm and they stored these batteries\n190 -> with a different state of charge so one\n192 -> of them at 100% state of charge one at\n194 -> 90% one at 80% and so on and what did\n197 -> they find well the battery that was\n199 -> stored at 100% state of charge had less\n202 -> than 60% of its original capacity after\n206 -> less than 200 days so it had degraded a\n210 -> ton versus the battery stored at 30%\n212 -> state of charge was only down to 85% of\n216 -> its original rated capacity after about\n219 -> 400 days so significantly more capacity\n223 -> and much longer duration than it was in\n225 -> the test so heat and voltage are both\n228 -> bad for battery degradation now there's230 -> an Incredible video by Professor Jeff\n232 -> Dawn a lithium ion battery researcher\n235 -> with seemingly endless knowledge in this\n237 -> space who also had a 5-year research\n239 -> partner partnership with Tesla for\n240 -> battery development he provides specific\n243 -> advice so for each of these three rules\n246 -> I'm going to share his advice for what\n248 -> you should do all right so say you're\n250 -> storing your electric car for a long\n252 -> period of time and it's going to be in a\n254 -> hot environment what should you do well\n256 -> he says you should Target a 30% state of\n258 -> charge for that duration now if you're\n261 -> storing it in the cold even for a long\n263 -> period of time there's no worries\n265 -> because of the cold temperatures you'll\n267 -> have very little reactivity so storing\n269 -> it at say 70% is no big deal number two\n272 -> don't wait until the battery is low to275 -> recharge it unless necessary now the\n277 -> critical part here is that you have a\n279 -> relatively low depth of discharge\n281 -> meaning say keeping your battery at 80%\n284 -> and only discharging to 60% before\n286 -> charging again it's fine to use the\n289 -> whole battery when you need it but after\n290 -> a short trip plug it in a bunch of small\n293 -> charges is much better than in frequent\n296 -> F depth charges okay so why well let's\n300 -> look at the particles that make up the\n301 -> cathode and if we zoom in on one of\n304 -> these electrode particles we can see\n306 -> that it's made up of many many many\n309 -> small crystallites and each one of these\n311 -> small crystallites has its own structure\n313 -> that's repeated so you've got oxygen\n315 -> metals and lithium that's moving to and\n317 -> from the anode back to the cathode back\n319 -> to the anode and so as this lithium322 -> leaves this crystal structure well this\n324 -> formation expands in One Direction and\n327 -> it shrinks in another formation and\n330 -> again the orientation of these are all\n332 -> over the place so you've got a bunch of\n334 -> different crystals all with different\n335 -> orientation that are expanding and\n337 -> Contracting in different ways so you can\n340 -> imagine that as that keeps happening you\n342 -> start to have cracks form within this\n344 -> particle as these particles are getting\n346 -> bigger and smaller they're creating\n347 -> these cracks within the particle well as\n350 -> these cracks form you have that cathode\n353 -> electrolyte interface formation so again\n355 -> you start consuming more materials more\n358 -> useful materials within the battery from\n360 -> the electrolyte the lithium things like\n363 -> that and so you have battery degradation\n365 -> okay so why does depth of discharge367 -> matter then well the growth of these\n370 -> crystals is roughly proportional to the\n373 -> depth of discharge so for example if\n375 -> you're just going from 60% battery to\n377 -> 40% battery well that's only 20% of your\n380 -> total battery right versus if you're\n382 -> going from 100% to 0% 100% of your total\n385 -> battery so that 60 to 40 has about a\n387 -> fifth of the effect of this growth and\n390 -> contraction that you have Within These\n392 -> crystals meaning if you use these\n394 -> smaller battery ranges you have much\n397 -> less cracking occur within these\n398 -> particles and the battery lasts\n400 -> significantly longer so again a really\n403 -> cool study looked at how a battery's\n405 -> depth of discharge impacted its\n407 -> normalized capacity over time okay so\n409 -> for this study they're putting the same\n411 -> amount of energy in and out of all the\n414 -> batteries but they're using a different416 -> percentage of the battery to do it so\n418 -> for example if you're just going from\n420 -> 40% to 60% well you're going to have a\n422 -> bunch of small charges versus if you're\n424 -> going from 0 to 100% you're going to\n426 -> have fewer charges but the same amount\n428 -> of energy cuz you're using the whole\n430 -> battery and so what did they find well\n432 -> they found that going from 0 to 100%\n435 -> constantly the battery only had about\n438 -> 50% of its capacity after less than a\n441 -> 100 days versus going from 40 to 60%\n445 -> constantly the battery was at about 85%\n448 -> after 400 Days okay well what does this\n451 -> mean as far as context so going from 60\n454 -> to 40% constantly was the equivalent\n457 -> after 400 Days of about 3,200 full\n461 -> cycles of that battery now if you were\n463 -> to have a battery uh on an EV that had a\n466 -> 250 Mi range well that means this\n468 -> battery would last about470 -> 800,000 miles before its degradation\n473 -> reached about 85% so that's incredible\n477 -> right now the catch is that means you're\n479 -> only using 20% of the battery so you'd\n481 -> be limiting yourself to 50 m trips\n484 -> personally I don't stress about this one\n486 -> the easiest way to think of it is to\n488 -> just plug in your car after every trip\n490 -> rather than waiting till the battery is\n491 -> low to recharge it all right so what\n493 -> does Professor Jeff Don recommend he\n496 -> says stick to low stateof charge ranges\n498 -> 25% is great now obviously if you can't\n501 -> charge at home this is tough to do which\n504 -> is fine if you follow the next rule he\n506 -> says your battery will still very likely\n508 -> outl last the life of the car number\n511 -> three don't regularly charge to 100%\n515 -> okay what the heck shouldn't this be the\n517 -> car Maker's problem not mine yes520 -> absolutely that's why warranties exist\n523 -> and there are real engineering solutions\n525 -> to these problems so to understand\n527 -> number three let's look at the\n529 -> engineering Solutions now once again\n531 -> looking at the particles that make up\n532 -> our cathode there's a very clever\n534 -> solution here we're instead of using a\n536 -> bunch of many small crystals you use a\n540 -> single crystal structure for the entire\n542 -> particle so what this means is you have\n545 -> uniform expansion and contraction of\n547 -> that entire particle rather than having\n549 -> a bunch of crystallites at different\n551 -> orientations which as they grow and\n553 -> contract they create all these cracks so\n555 -> you avoid that cracking using this\n557 -> single crystal structure this is used in\n560 -> some Modern EVs and it has much longer\n563 -> capacity retention another Trend you're565 -> tending to see is batteries that are\n567 -> using higher nickel content all right so\n569 -> if you use a battery with more nickel it\n571 -> has better energy density seems like a\n573 -> smart thing to do so what's the problem\n575 -> well here we're looking at two different\n577 -> graphs with different nickel content in\n579 -> these batteries this one has about 50%\n582 -> for the cathode this one has about 80%\n584 -> for the cathode so using that higher\n586 -> nickel content you can see the voltage\n588 -> curve looks a bit different where we\n590 -> have this Plateau at the end for that\n592 -> latter portion of the state of charge\n594 -> from about 75% to 100% you've got this\n597 -> Plateau well this plateau toe is\n599 -> associated with a large volumetric\n601 -> change so you want to avoid that\n603 -> especially if you're using these uh you\n605 -> know many small crystallites as the608 -> structure for that cathode so you avoid\n610 -> that region you help avoid that micro\n612 -> cracking well what if you use a single\n615 -> crystal structure and also what if you\n617 -> use a lower nickel content well you\n619 -> don't have that Plateau you don't have\n621 -> to worry about that as much no problem\n622 -> you can charge up to 100% the same is\n625 -> basically true for lithium iron\n626 -> phosphate batteries which use a\n628 -> different chemistry all right but even\n630 -> if we're using a higher nickel content\n632 -> as long as we're using a single crystal\n634 -> structure we don't have to worry about\n635 -> cracking right well yes unfortunately\n639 -> this Plateau is also associated with a\n641 -> very small amount of oxygen being\n643 -> released during that portion of charging\n646 -> so you want to avoid this even if you're\n648 -> using a single crystal structure if you650 -> have a high nickel content battery\n652 -> because that relates to gas formation\n655 -> within the battery which means you're\n656 -> going to have degradation over time all\n658 -> right what's what's the Dr Don\n660 -> recommendation charge to 75% that way\n663 -> you have plenty of range daily and say\n665 -> you have a long trip coming up well\n667 -> charge the night before to 100% to have\n669 -> the extra range if you need it now\n671 -> obviously if you live in an apartment\n673 -> without charging going out and only\n675 -> charging up to 75% sounds very tedious\n678 -> and repetitive and personally I'm of the\n680 -> mindset that if you can't charge your\n681 -> electric vehicle at home well it really\n683 -> doesn't make sense for you yet to those\n685 -> who do it hats off to you but it's\n687 -> certainly not very convenient so I think\n689 -> the simple message is don't stress about \ No newline at end of file diff --git a/unstructured/OpenAIService.ts b/unstructured/OpenAIService.ts new file mode 100644 index 00000000..59380be7 --- /dev/null +++ b/unstructured/OpenAIService.ts @@ -0,0 +1,111 @@ +import OpenAI from "openai"; +import type { ChatCompletionMessageParam } from "openai/resources/chat/completions"; +import { createByModelName } from '@microsoft/tiktokenizer'; + +export class OpenAIService { + private openai: OpenAI; + private tokenizers: Map>> = new Map(); + private readonly IM_START = "<|im_start|>"; + private readonly IM_END = "<|im_end|>"; + private readonly IM_SEP = "<|im_sep|>"; + + constructor() { + this.openai = new OpenAI(); + } + + private async getTokenizer(modelName: string) { + if (!this.tokenizers.has(modelName)) { + const specialTokens: ReadonlyMap = new Map([ + [this.IM_START, 100264], + [this.IM_END, 100265], + [this.IM_SEP, 100266], + ]); + const tokenizer = await createByModelName(modelName, specialTokens); + this.tokenizers.set(modelName, tokenizer); + } + return this.tokenizers.get(modelName)!; + } + + async countTokens(messages: ChatCompletionMessageParam[], model: string = 'gpt-4o'): Promise { + const tokenizer = await this.getTokenizer(model); + + let formattedContent = ''; + messages.forEach((message) => { + formattedContent += `${this.IM_START}${message.role}${this.IM_SEP}${message.content || ''}${this.IM_END}`; + }); + formattedContent += `${this.IM_START}assistant${this.IM_SEP}`; + + const tokens = tokenizer.encode(formattedContent, [this.IM_START, this.IM_END, this.IM_SEP]); + return tokens.length; + } + + async completion( + messages: ChatCompletionMessageParam[], + model: string = "gpt-4o", + stream: boolean = false, + jsonMode: boolean = false, + maxTokens: number = 4096 + ): Promise> { + try { + const chatCompletion = await this.openai.chat.completions.create({ + messages, + model, + ...(model !== 'o1-mini' && model !== 'o1-preview' && { + stream, + max_tokens: maxTokens, + response_format: jsonMode ? { type: "json_object" } : { type: "text" } + }) + }); + + if (stream) { + return chatCompletion as AsyncIterable; + } else { + return chatCompletion as OpenAI.Chat.Completions.ChatCompletion; + } + } catch (error) { + console.error("Error in OpenAI completion:", error); + throw error; + } + } + + async calculateImageTokens(width: number, height: number, detail: 'low' | 'high'): Promise { + let tokenCost = 0; + + if (detail === 'low') { + tokenCost += 85; + return tokenCost; + } + + const MAX_DIMENSION = 2048; + const SCALE_SIZE = 768; + + // Resize to fit within MAX_DIMENSION x MAX_DIMENSION + if (width > MAX_DIMENSION || height > MAX_DIMENSION) { + const aspectRatio = width / height; + if (aspectRatio > 1) { + width = MAX_DIMENSION; + height = Math.round(MAX_DIMENSION / aspectRatio); + } else { + height = MAX_DIMENSION; + width = Math.round(MAX_DIMENSION * aspectRatio); + } + } + + // Scale the shortest side to SCALE_SIZE + if (width >= height && height > SCALE_SIZE) { + width = Math.round((SCALE_SIZE / height) * width); + height = SCALE_SIZE; + } else if (height > width && width > SCALE_SIZE) { + height = Math.round((SCALE_SIZE / width) * height); + width = SCALE_SIZE; + } + + // Calculate the number of 512px squares + const numSquares = Math.ceil(width / 512) * Math.ceil(height / 512); + + // Calculate the token cost + tokenCost += (numSquares * 170) + 85; + + return tokenCost; + } +} \ No newline at end of file diff --git a/unstructured/TextService.ts b/unstructured/TextService.ts new file mode 100644 index 00000000..0e54f956 --- /dev/null +++ b/unstructured/TextService.ts @@ -0,0 +1,223 @@ +import { createByModelName } from '@microsoft/tiktokenizer'; + +export interface IDoc { + text: string; + metadata: { + tokens: number; + headers: Headers; + urls: string[]; + images: string[]; + }; +} + +interface Headers { + [key: string]: string[]; +} + +export class TextSplitter { + private tokenizer?: Awaited>; + + private readonly SPECIAL_TOKENS = new Map([ + ['<|im_start|>', 100264], + ['<|im_end|>', 100265], + ['<|im_sep|>', 100266], + ]); + + constructor(private modelName: string = 'gpt-4') {} + + private async initializeTokenizer(model?: string): Promise { + if (!this.tokenizer || model !== this.modelName) { + this.modelName = model || this.modelName; + this.tokenizer = await createByModelName(this.modelName, this.SPECIAL_TOKENS); + } + } + + private countTokens(text: string): number { + if (!this.tokenizer) { + throw new Error('Tokenizer not initialized'); + } + const formattedContent = this.formatForTokenization(text); + const tokens = this.tokenizer.encode(formattedContent, Array.from(this.SPECIAL_TOKENS.keys())); + return tokens.length; + } + + private formatForTokenization(text: string): string { + return `<|im_start|>user\n${text}<|im_end|>\n<|im_start|>assistant<|im_end|>`; + } + + async split(text: string, limit: number): Promise { + console.log(`Starting split process with limit: ${limit} tokens`); + await this.initializeTokenizer(); + const chunks: IDoc[] = []; + let position = 0; + const totalLength = text.length; + const currentHeaders: Headers = {}; + + while (position < totalLength) { + console.log(`Processing chunk starting at position: ${position}`); + const { chunkText, chunkEnd } = this.getChunk(text, position, limit); + const tokens = this.countTokens(chunkText); + console.log(`Chunk tokens: ${tokens}`); + + const headersInChunk = this.extractHeaders(chunkText); + this.updateCurrentHeaders(currentHeaders, headersInChunk); + + const { content, urls, images } = this.extractUrlsAndImages(chunkText); + + chunks.push({ + text: content, + metadata: { + tokens, + headers: { ...currentHeaders }, + urls, + images, + }, + }); + + console.log(`Chunk processed. New position: ${chunkEnd}`); + position = chunkEnd; + } + + console.log(`Split process completed. Total chunks: ${chunks.length}`); + return chunks; + } + + private getChunk(text: string, start: number, limit: number): { chunkText: string; chunkEnd: number } { + console.log(`Getting chunk starting at ${start} with limit ${limit}`); + + // Account for token overhead due to formatting + const overhead = this.countTokens(this.formatForTokenization('')) - this.countTokens(''); + + // Initial tentative end position + let end = Math.min(start + Math.floor((text.length - start) * limit / this.countTokens(text.slice(start))), text.length); + + // Adjust end to avoid exceeding token limit + let chunkText = text.slice(start, end); + let tokens = this.countTokens(chunkText); + + while (tokens + overhead > limit && end > start) { + console.log(`Chunk exceeds limit with ${tokens + overhead} tokens. Adjusting end position...`); + end = this.findNewChunkEnd(text, start, end); + chunkText = text.slice(start, end); + tokens = this.countTokens(chunkText); + } + + // Adjust chunk end to align with newlines without significantly reducing size + end = this.adjustChunkEnd(text, start, end, tokens + overhead, limit); + + chunkText = text.slice(start, end); + tokens = this.countTokens(chunkText); + console.log(`Final chunk end: ${end}`); + return { chunkText, chunkEnd: end }; + } + + private adjustChunkEnd(text: string, start: number, end: number, currentTokens: number, limit: number): number { + const minChunkTokens = limit * 0.8; // Minimum chunk size is 80% of limit + + const nextNewline = text.indexOf('\n', end); + const prevNewline = text.lastIndexOf('\n', end); + + // Try extending to next newline + if (nextNewline !== -1 && nextNewline < text.length) { + const extendedEnd = nextNewline + 1; + const chunkText = text.slice(start, extendedEnd); + const tokens = this.countTokens(chunkText); + if (tokens <= limit && tokens >= minChunkTokens) { + console.log(`Extending chunk to next newline at position ${extendedEnd}`); + return extendedEnd; + } + } + + // Try reducing to previous newline + if (prevNewline > start) { + const reducedEnd = prevNewline + 1; + const chunkText = text.slice(start, reducedEnd); + const tokens = this.countTokens(chunkText); + if (tokens <= limit && tokens >= minChunkTokens) { + console.log(`Reducing chunk to previous newline at position ${reducedEnd}`); + return reducedEnd; + } + } + + // Return original end if adjustments aren't suitable + return end; + } + + private findNewChunkEnd(text: string, start: number, end: number): number { + // Reduce end position to try to fit within token limit + let newEnd = end - Math.floor((end - start) / 10); // Reduce by 10% each iteration + if (newEnd <= start) { + newEnd = start + 1; // Ensure at least one character is included + } + return newEnd; + } + + private extractHeaders(text: string): Headers { + const headers: Headers = {}; + const headerRegex = /(^|\n)(#{1,6})\s+(.*)/g; + let match; + + while ((match = headerRegex.exec(text)) !== null) { + const level = match[2].length; + const content = match[3].trim(); + const key = `h${level}`; + headers[key] = headers[key] || []; + headers[key].push(content); + } + + return headers; + } + + private updateCurrentHeaders(current: Headers, extracted: Headers): void { + for (let level = 1; level <= 6; level++) { + const key = `h${level}`; + if (extracted[key]) { + current[key] = extracted[key]; + this.clearLowerHeaders(current, level); + } + } + } + + private clearLowerHeaders(headers: Headers, level: number): void { + for (let l = level + 1; l <= 6; l++) { + delete headers[`h${l}`]; + } + } + + private extractUrlsAndImages(text: string): { content: string; urls: string[]; images: string[] } { + const urls: string[] = []; + const images: string[] = []; + let urlIndex = 0; + let imageIndex = 0; + + const content = text + .replace(/!\[([^\]]*)\]\(([^)]+)\)/g, (_match, altText, url) => { + images.push(url); + return `![${altText}]({{$img${imageIndex++}}})`; + }) + .replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_match, linkText, url) => { + urls.push(url); + return `[${linkText}]({{$url${urlIndex++}}})`; + }); + + return { content, urls, images }; + } + + async document(text: string, model?: string, additionalMetadata?: Record): Promise { + await this.initializeTokenizer(model); + const tokens = this.countTokens(text); + const headers = this.extractHeaders(text); + const { content, urls, images } = this.extractUrlsAndImages(text); + + return { + text: content, + metadata: { + tokens, + headers, + urls, + images, + ...additionalMetadata, + }, + }; + } +} \ No newline at end of file diff --git a/unstructured/app.ts b/unstructured/app.ts new file mode 100644 index 00000000..9eae7484 --- /dev/null +++ b/unstructured/app.ts @@ -0,0 +1,72 @@ +import { join } from 'path'; +import { readFile, writeFile } from 'fs/promises'; +import { TextSplitter, type IDoc } from './TextService'; +import { OpenAIService } from "./OpenAIService"; +import type { ChatCompletion, ChatCompletionMessageParam } from "openai/resources/chat/completions"; + +// Initialize services +const splitter = new TextSplitter(); +const openaiService = new OpenAIService(); + +// Constants +const SOURCE_FILE = 'source.md'; +const OUTPUT_FILE = 'tools.json'; +const MAX_CHUNK_SIZE = 500; + +// Main function to orchestrate the process +async function main() { + try { + const sourceContent = await loadSourceFile(__dirname); + const extractedTools = await extractTools(sourceContent); + const splitDocs = await splitContent(extractedTools); + await saveOutput(splitDocs); + console.log('Process completed successfully. Check tools.json for results.'); + } catch (error) { + console.error('An error occurred:', error); + } +} + +// New splitContent function +async function splitContent(content: string): Promise { + const chunks = content.split('\n\n'); + const docs = await Promise.all(chunks.map(chunk => splitter.document(chunk))); + return docs; +} + +// ALTERNATIVE SPLITTING +// async function splitContent(content: string): Promise { +// return await splitter.split(content, MAX_CHUNK_SIZE); +// } + +// Load the source file +async function loadSourceFile(dirname: string): Promise { + const filePath = join(dirname, SOURCE_FILE); + return await readFile(filePath, 'utf-8'); +} + +// Extract tools information using OpenAI +async function extractTools(fileContent: string): Promise { + const userMessage: ChatCompletionMessageParam = { + role: 'user', + content: [{ + type: "text", + text: `${fileContent} + + Please extract all the information from the article's content related to tools, apps, or software, including links and descriptions in markdown format. Ensure the list items are unique. Always separate each tool with a double line break. Respond only with the concise content and nothing else.` + }] + }; + + const response = await openaiService.completion([userMessage], 'o1-mini', false) as ChatCompletion; + const content = response.choices[0].message.content || ''; + + return content; +} + +// Save the output to a JSON file +async function saveOutput(docs: IDoc[]) { + const outputPath = join(__dirname, OUTPUT_FILE); + await writeFile(outputPath, JSON.stringify(docs, null, 2), 'utf-8'); +} + +// Run the main function +main(); \ No newline at end of file diff --git a/unstructured/source.md b/unstructured/source.md new file mode 100644 index 00000000..e466aa85 --- /dev/null +++ b/unstructured/source.md @@ -0,0 +1,422 @@ +[![](https://substackcdn.com/image/fetch/w_96,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b0c3fd7-a216-4989-b35f-e7d5142e1dfe_400x400.png)](/) + +# [![Tech•sistence](https://substackcdn.com/image/fetch/e_trim:10:white/e_trim:10:transparent/h_72,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fb71dcf-7fce-41c3-94ea-827182af48be_1344x256.png)](/) + +SubscribeSign in + +![](https://substackcdn.com/image/fetch/w_128,h_128,c_fill,f_auto,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34779a32-c34b-4ba1-ade1-e08c4e68be66_646x646.png)![Tech•sistence](https://substackcdn.com/image/fetch/w_48,h_48,c_fill,f_auto,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b0c3fd7-a216-4989-b35f-e7d5142e1dfe_400x400.png) + +#### Discover more from Tech•sistence + +Sharing insights on technology: deep dives on AI, automation, as well as business-oriented content for founders and developers. Lessons learned from the bootstrapping journey in our various ventures. + +Over 3,000 subscribers + +Subscribe + +Continue reading + +Sign in + +# Indie Hacker's Toolstack 2024 + +### Tools, Apps, Services, and Configurations for Optimal Workflow + +[![](https://substackcdn.com/image/fetch/w_80,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29a3a05e-834d-4c48-9e18-859b7920980a_400x400.jpeg)](https://substack.com/profile/8247555-adam-gospodarczyk) + +[Adam Gospodarczyk](https://substack.com/@overment) + +May 30, 2024 + +20 + +[6](https://www.techsistence.com/p/indie-hackers-toolstack-2024/comments) + +[Share](javascript:void(0)) + +Apps and tools are essential for me. I stay aware of new releases but don't fixate on them due to my established process. In this post, I'll outline my workflow and detail the tools and configurations I use. While everyone's needs differ, you may find inspiration here. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52a28138-d687-4016-b0eb-0ea83c4b806f_1456x816.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52a28138-d687-4016-b0eb-0ea83c4b806f_1456x816.png) + +## Text editor(s) + +Writing is a crucial aspect of my work and various processes, including learning. Text appears in many areas, such as daily communication, emails, newsletters, articles, scripts, website descriptions, documentation, and documents. Reports from [Rize](https://rize.io/) show that the text editor is the application where I spend the most time (23%). Therefore, I ensure that writing experiences foster the creative process. + +I work with several text editors. They are: + +- [iA Writer](https://ia.net/topics/category/writer): In my opinion, it's the best Markdown syntax editor, with simplicity as its main advantage but it falls short in note organization and lacks related features. + + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb59c388-ed78-4f98-87a0-62dd37fb37df_2800x1774.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb59c388-ed78-4f98-87a0-62dd37fb37df_2800x1774.png) + +- [Paper](https://papereditor.app/): A great candidate to replace iA Writer, the writing experience is even better. Unfortunately, the app has some bugs and limitations, making it suitable only for simple notes. + + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ded9c02-a1f4-4c97-a916-704c90a70430_2800x1786.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ded9c02-a1f4-4c97-a916-704c90a70430_2800x1786.png) + +- [Obsidian](https://obsidian.md/): An app I rarely write in and usually just paste content from iA Writer or Paper. But it’s great for organizing content. Paired with [Vitepress](https://vitepress.vuejs.org/), I can share most of my notes online as a static website. + + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff333d1a6-7981-4001-99f9-6d4c7e24a0ad_2800x1794.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff333d1a6-7981-4001-99f9-6d4c7e24a0ad_2800x1794.png) + +- [Notion](https://www.notion.so/): It's the final app where I primarily collaborate with others to create content, share it, or leverage automation. Notion stands out as the sole editor mentioned that offers an API, enabling integration with my services. + + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd27c6227-821a-4be3-bca5-1758b9e0eae0_2800x1868.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd27c6227-821a-4be3-bca5-1758b9e0eae0_2800x1868.png) + +Using multiple text editors actually works pretty well. iA Writer is for long-form writing, Paper for quick notes, Obsidian for organizing, and Notion for sharing with others. The common thread is the Markdown syntax, which I wrote more about in [Plain Text is What You Need](https://www.techsistence.com/p/plain-text-is-what-you-need-but-why). + +When I write, GPT-4 or Claude continuously assists me. Their role is **to correct and enhance readability**, as well as make similar transformations to the content I produce. LLMs also perform well during brainstorming sessions and discussions on my current focus topic. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce9bcab2-ac34-4238-96c7-7d4f11528004_2800x1618.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce9bcab2-ac34-4238-96c7-7d4f11528004_2800x1618.png) + +While writing: + +- Editor is in full-screen mode + +- Typing on [Wooting 60HE](https://wooting.io/) keyboard + +- Listening to music on [Spotify](https://www.spotify.com/) or [Endel](https://endel.io/) + +- Taking screenshots with [Xnapper](https://xnapper.com/) + +- Generating code snippets in [ray.so](https://ray.so/) via Puppeteer automation macro + +- Optimizing images with a macro linked to [TinyPNG](https://tinypng.com/) + +- Sharing images and files using [Dropshare](https://dropshare.app/) + +- Hosting images and files on [DigitalOcean](https://www.digitalocean.com/) + +- Using converters for HTML → Markdown, Markdown → HTML, Notion → Markdown, and Markdown → Notion. This allows me to write newsletters and blogs in markdown editor, then automate conversion to the target format. Uploading files to my own hosting is key here. + +- Keyboard settings: "Key repeat rate" at maximum and "Delay until repeat" at minimum + +- Using `text expander` for frequently repeated phrases like proper names (e.g., .tech becomes Tech•sistence), URLs, email addresses, contact details + +- Navigating almost entirely with the keyboard, avoiding the mouse. Useful shortcuts include: move cursor to start/end of word ( `Command + ← or →`), start/end of line ( `Option + ← or →`), start/end of paragraph ( `Command + ↑ or ↓`), delete next/previous word ( `Option + Backspace or Option + Shift + Backspace`), select line/word/paragraph. + +- Using trackpad gestures for controlling music, managing windows/desktops, switching text editor functions, or sending selected text to AI assistant. + +- Utilizing keyboard shortcuts for actions related to screenshots, file optimization, and uploading. + +- Using clipboard manager [Paste](https://setapp.com/apps/paste) for easier text editing and returning to previously copied content (links, snippets). + + +All these activities work for each app I mentioned. Even though Notion lets you paste images right into the document, I still upload them to my server first. Direct uploads to Notion expire and need you to log in, which messes with automation. + +## General Workflow + +Tasks, emails, and events are another well-optimized area. Unlike text-writing tools, the priority here is API connectivity. This enables leveraging automation and AI for data organization. I wrote more about this in [User Interfaces may change because "AI knows what we mean"](https://www.techsistence.com/p/user-interfaces-may-change-because). + +### Managing tasks + +[Linear](https://linear.app/) is used both by our product team and myself to organize my work. All my tasks go here, and I rarely enter or edit their statuses manually. Instead, some entries appear due to automation (e.g., a new message with a label or a new file on Google Drive needing my attention). I add other entries via voice messages on Apple Watch or messages to the AI assistant on the Slack channel. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72cf5bcc-d2e9-46cf-a27c-c77ed8ceafbb_2800x1636.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72cf5bcc-d2e9-46cf-a27c-c77ed8ceafbb_2800x1636.png) + +Of all the task management tools, I've liked Todoist and Linear the most so far. Both offer APIs that allow nearly unrestricted data management. Besides the API, a clear GUI and keyboard shortcuts are crucial to me, and Linear definitely outperformed in this area. As seen in the screenshot above, you can customize views to suit your specific needs or current situation. + +So, on the topic of task management: + +- I mainly add and edit tasks via voice or simple Slack and Alice messages. The AI then assigns new entries to the appropriate categories, priorities, and deadlines. + +- The organization and updating of entries in Linear is handled by a series of GPT-4 prompts, which consider the rules I've defined. If needed, I can override them by simply stating that a given task should be assigned to a different project than indicated by the category descriptions. + +- Automation fills a large part of my tasks with various events and schedules. When possible, the AI assistant fetches additional information for the task description. + +- My priority is API availability, as automation allows me to focus on executing tasks, removing most of the organizational burden, except for planning-related activities. + + +### E-mail + +For years, I've been rocking Google Workspace with Superhuman. No surprise there—Gmail's awesome on its own and packs some serious automation power. You can set up slick scenarios on make.com or dive into advanced filters right within Gmail. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5a54336-880e-4ee5-8ece-a9700d3c2936_2800x2044.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5a54336-880e-4ee5-8ece-a9700d3c2936_2800x2044.png) + +For me, email automation means responding to new messages that Gmail labels automatically. For instance, emails with "Invoice" get the "Invoices" label. This kicks off a Make.com scenario to handle the message, like saving attachments to Google Drive or adding tasks to Linear. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F967b78a6-354a-4515-ab90-ffcab354dca6_2800x1802.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F967b78a6-354a-4515-ab90-ffcab354dca6_2800x1802.png) + +Sometimes, filter rules miss a few messages. When that happens, I manually add labels in Superhuman using keyboard shortcuts. Makes the whole process way easier. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F135df55a-19a7-420c-a61c-c6a7ee03da40_2800x1693.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F135df55a-19a7-420c-a61c-c6a7ee03da40_2800x1693.png) + +Working with email also involves an account connected to an AI assistant, which can send various messages after completing assigned tasks. I wrote more about this in the post [Personal AGI](https://www.techsistence.com/p/personal-agi-pushing-gpt-4-turbo). + +Regarding email management: + +- Superhuman's keyboard shortcuts and overall look & feel make working with email enjoyable and fast. Its high price is justified (though this is very subjective). + +- Gmail / Google Workspace is a "must-have." + +- Combining automatic filters with labels and automation greatly simplifies email management, document organization, and prioritization. + + +### Calendar + +My calendar's pretty chill, with just a couple of bi-weekly recurring meetings. This setup lets me focus and handle communication asynchronously through Slack or other channels. + +You can book a slot in my calendar through [Zencal](https://zencal.io/). These pre-set time blocks automatically disappear when a meeting is scheduled or another entry, like a trip, appears in my calendar. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffca68a39-7794-4c7c-8381-bd3d36221044_2800x1701.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffca68a39-7794-4c7c-8381-bd3d36221044_2800x1701.png) + +I can add new calendar entries via voice messages to my AI assistant, similar to a task list. The assistant can also check my availability or retrieve events from a specific range. Ultimately, I still occasionally check the calendar myself, and then I use the [Notion Calendar](https://www.notion.so/product/calendar) app. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931e3330-7cf6-48ef-81ed-39a499b9b035_2800x1633.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931e3330-7cf6-48ef-81ed-39a499b9b035_2800x1633.png) + +Notion Calendar in its own way resembles Superhuman and offers intuitive keyboard shortcuts and a minimalist interface. + +Regarding calendar management: + +- Managing entries is done either by voice or through simple messages to an AI assistant (requires custom integrations) + +- Zencal is a brilliant tool for scheduling meetings (including paid ones), which can incorporate various automations (e.g., sending forms before the meeting or notes after the meeting) + +- Notion Calendar is a good, though not perfect, client. + + +## Web Browsing + +[Arc Browser](https://arc.net/) is my main browser on both macOS and iOS. Despite the ability to organize tabs or profiles, I only use its basic functionalities. Yet, the Command Bar ( `Command + T`) and Little Arc ( `Command + Option + N`) make a significant difference for me. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b6383b3-fce1-4e44-99f9-c15cced714cc_2800x1717.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b6383b3-fce1-4e44-99f9-c15cced714cc_2800x1717.png) + +When I come across an interesting source (like an article, publication, or video) that I can’t review right then or know I’ll want to return to, I use a keyboard shortcut to send the open page to the AI assistant. The assistant then fetches available info about the page and saves the link to it in Linear and Feedly, pinning it to the appropriate board. + +Staying up-to-date and monitoring news on topics that interest me is handled through Feedly. Like with previous tools, the main factor influencing my choice here is the availability of an API. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5d48558-533a-44c7-9b20-07079b124f09_2800x1717.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5d48558-533a-44c7-9b20-07079b124f09_2800x1717.png) + +I've connected Feedly boards with [Make.com](http://make.com/) automations, so simply pinning a post triggers additional actions. For instance, it saves the link in my assistant’s long-term memory. This memory is linked with search engines (Algolia and Qdrant), making it easy to find previously saved sources without needing to remember their exact names. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5905b6-3c10-405c-a536-02f0e54f9b29_2800x2852.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc5905b6-3c10-405c-a536-02f0e54f9b29_2800x2852.png) + +So, browsing the web for me means: + +- I use the browser just for Internet browsing. I don’t save bookmarks or other info. Instead, I use macros and automation to organize knowledge in set places, all controlled by LLM (GPT-4-turbo and GPT-4o). + +- Staying updated and exploring new topics with Feedly and sites like [Product Hunt](https://www.producthunt.com/), [daily.dev](https://app.daily.dev/onboarding), [Indie Hackers](https://www.indiehackers.com/), or [HackerNews](https://news.ycombinator.com/). + +- The foundation of the whole system is my custom AI assistant and its long-term memory. Note, this isn't Alice from [heyalice.app](https://heyalice.app/), but my private app, which I'm gradually making publicly available. + + +## Graphic Design + +Designing UI and promotional materials is an integral part of my work. I mainly use [Figma](https://figma.com/) and recently returned to [Adobe Photoshop Beta](https://www.adobe.com/products/photoshop.html) due to its Generative AI features, which are excellent for editing images and assets generated in Midjourney. + +Below is an example of covers for one of my courses, which I generated in Midjourney with slight editing through Adobe Firefly. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F692b6320-4ab1-485a-88e8-24308a055598_2800x1189.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F692b6320-4ab1-485a-88e8-24308a055598_2800x1189.png) + +Figma works phenomenally for UI design, especially when using components and the auto-layout feature. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3623f2be-f47a-49cb-8fb8-5de05d6f0852_2800x1740.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3623f2be-f47a-49cb-8fb8-5de05d6f0852_2800x1740.png) + +There are creations generated according to templates, where creating new versions involves only text replacement or simple layout editing. In such cases, Webflow becomes my graphic editor. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55a0aae7-6659-49bd-9328-569371e5dbeb_2800x2123.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55a0aae7-6659-49bd-9328-569371e5dbeb_2800x2123.png) + +The AI assistant only requires information from me on generating the graphic (or graphics), plus the necessary details to create them (e.g., text, background image link). It automates Webflow contact to update the CMS entry, downloads the page as a PNG, and sends it to me. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad6a7ec4-a8d1-4eb0-a4c9-1af546da3b13_2800x6482.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad6a7ec4-a8d1-4eb0-a4c9-1af546da3b13_2800x6482.png) + +When designing creations, I always use Midjourney Alpha. I generate various graphic or asset variants there, which I often combine in Photoshop. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8071afb7-084a-42da-9a81-29f9e791e53d_2800x2123.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8071afb7-084a-42da-9a81-29f9e791e53d_2800x2123.png) + +Summarizing the topic of graphic design: + +- I use Generative AI, and currently, Midjourney or Stable Diffusion 3 works best. + +- Figma is undeniably the best available tool for interface design or creating advertisements. It's definitely worth getting to know its more advanced features, which save a lot of time. + +- Webflow combined with [HTMLCSSToImage](https://htmlcsstoimage.com/) allows for automatic generation of graphics based on templates. Alternatively, you can use the latter tool directly, where you only need an HTML template in which you replace individual elements with automation. + +- Combining LLM with a set of templates allows for easy generation of entire sets of advertisements in various variants. + + +## Programming + +Programming is the second (after writing texts) activity that takes up most of my time, and therefore I also pay a lot of attention to it in the context of optimizing the entire process. + +I use the following tools: + +- [IntelliJ IDEA](https://www.jetbrains.com/idea/): This is my main code editor. Although I don't program in JAVA, IntelliJ works great with various programming languages (for me, it's TypeScript and Rust). + +- [Supermaven](https://supermaven.com/): This is an alternative to Github Copilot that I have just started using, and it makes a great first impression by suggesting code very intelligently. + +- [iTerm](https://iterm2.com/): Although I have gone through many different terminals, iTerm won with its simplicity and the fact that it performs its task perfectly. + +- [TablePlus](https://tableplus.com/): This is a great database client for macOS. + + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F796b0f55-3b2e-444a-bebb-c7ef78411b70_2800x1683.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F796b0f55-3b2e-444a-bebb-c7ef78411b70_2800x1683.png) + +You can see my IntelliJ setup above. I've turned off all panels and extra options since I always use keyboard shortcuts. This makes sense given the IDE's extensive customization options and the inclusion of a "Command Palette" style search. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42bc915a-7b57-415c-8cf7-703943ff6c7d_2800x1785.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42bc915a-7b57-415c-8cf7-703943ff6c7d_2800x1785.png) + +For actions that do not have a keyboard shortcut, or I simply use them rarely, I use Search Menu Items, one of the options of the [Raycast](https://www.raycast.com/) application. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd2334c-d747-4ad6-bbbd-4a365da830ac_2800x1711.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dd2334c-d747-4ad6-bbbd-4a365da830ac_2800x1711.png) + +Since ChatGPT's release, large language models have been my constant programming companions. I'm not just talking about code generation or debugging but also problem discussions, design decisions, and learning new technologies. Of course, I always make the final decisions, but models like GPT-4-turbo and Claude 3 Opus are nearly perfect conversational partners. + +So, on the topic of programming: + +- I use the best available tools that work for me. For example, despite Visual Studio Code's enormous popularity, IntelliJ works far better for me. The main reason is that IntelliJ simply "understands my code" much better than VSC. + +- Generative AI takes pair programming to another level for me. In this case, such a partner is available to me all the time and often has much more knowledge than I do, although it quite frequently makes mistakes. Despite this, the overall balance of mistakes versus the value I receive is definitely positive. + +- Where justified, I use tools to automate code tasks. Application deployment is a "must-have" I always perform through GitHub Actions. + +- As seen in the previous points, I use my programming skills not only to develop products and work but also to create tools for my own needs. + + +## Macros and Automations + +I'll write a separate post about macros and automation, as it's too extensive a topic to cover in a few points. I'll just note that I work with applications: [Shortcuts](https://apps.apple.com/us/app/shortcuts/id915249334), [Keyboard Maestro](https://folivora.ai/), [Better Touch Tool](https://folivora.ai/), [Raycast](https://www.raycast.com/), and of course [make.com](https://www.make.com/). + +My system is powered by my personal API, seamlessly integrated with my AI assistant. This setup lets macros and automations communicate with me and each other. It evolves with new language models and tools. + +So, if this topic catches your eye, subscribe to Tech•sistence to see my take on it👇 + +Tech•sistence is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber. + +Subscribe + +## Fun + +Outside of work, I'm also a fan of books and games, spending my free afternoons and evenings with them. I log all the titles I've read on my Goodreads profile, often sharing highlighted passages or notes. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8474c880-9545-4cf2-a326-b59355d01821_2800x2027.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8474c880-9545-4cf2-a326-b59355d01821_2800x2027.png) + +I always read books in the [Amazon Kindle](https://play.google.com/store/apps/details) app or listen via [Audible](https://www.audible.com/). It’s very helpful that if you have both the audiobook and e-book versions, progress syncs between devices, making reading much easier. + +Lately, I’ve been diving less into books since my interests have shifted to cutting-edge stuff like Generative AI and new programming languages/tools. When I do pick up a book, it’s usually a challenging, timeless one that takes more time than your typical business, psychology, or economics bestsellers. + +For games, I’m all about the PlayStation 5 right now. Next up is Nvidia GeForce Now, streaming from my Steam account and more. On the go, I rock the Steam Deck—such an impressive device—and the Nintendo Switch. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05647f5b-8e4e-46a7-a845-59de75ab3350_2800x1657.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05647f5b-8e4e-46a7-a845-59de75ab3350_2800x1657.png) + +While gaming and reading, I also jam to music, which my AI assistant hooks up. So, having an API and cross-platform functionality is a must. Spotify nails it. + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee5133dc-c3ce-44d6-884b-32125883109f_2800x1950.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee5133dc-c3ce-44d6-884b-32125883109f_2800x1950.png) + +When I need to focus, e.g., while programming, designing, or writing longer texts, I also turn to [endel.io](https://endel.io/). + +[![](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc876205-8aa9-4a2f-90ac-e66f0f018ec6_2800x2154.png)](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc876205-8aa9-4a2f-90ac-e66f0f018ec6_2800x2154.png) + +## Summary + +I didn’t cover every tool, but I think I gave a good overview of my current setup. If you have any questions about the tools I use or how I work with them, feel free to ask in the comments! Wrapping up, my setup is always evolving. Even if some tools have been with me for years, how I use them changes. It's key to my growth and daily life. My setup isn't just about boosting productivity—it's about making each day more enjoyable and fun. + +Have fun, + +Adam + +### Subscribe to Tech•sistence + +Launched a year ago + +Sharing insights on technology: deep dives on AI, automation, as well as business-oriented content for founders and developers. Lessons learned from the bootstrapping journey in our various ventures. + +Subscribe + +[![](https://substackcdn.com/image/fetch/w_80,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34779a32-c34b-4ba1-ade1-e08c4e68be66_646x646.png)](https://substack.com/profile/177954372-greg-rog?utm_source=post-reactions-face) + +[![](https://substackcdn.com/image/fetch/w_80,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d37e479-6b67-4633-aafc-41a37e15aa3c_2656x3984.jpeg)](https://substack.com/profile/200784406-tomasz-gusciora?utm_source=post-reactions-face) + +[![](https://substackcdn.com/image/fetch/w_80,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F751da2fa-d58b-4ec5-a8a2-14a3282e6aeb_1280x853.jpeg)](https://substack.com/profile/179752705-karolina-poczwardowska?utm_source=post-reactions-face) + +[![](https://substackcdn.com/image/fetch/w_80,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F465f3b28-2d0a-4ad3-9cec-a9225ea1baa5_576x576.webp)](https://substack.com/profile/70747159-przeprogramowani?utm_source=post-reactions-face) + +[![](https://substackcdn.com/image/fetch/w_80,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9f5e6934-481a-4fc2-b573-cd144890df61_400x400.jpeg)](https://substack.com/profile/866169-dai?utm_source=post-reactions-face) + +20 Likes + +· + +[5 Restacks](https://substack.com/note/p-145134231/restacks?utm_source=substack&utm_content=facepile-restacks) + +20 + +[6](https://www.techsistence.com/p/indie-hackers-toolstack-2024/comments) + +[Share](javascript:void(0)) + +PreviousNext + +#### Discussion about this post + +Comments + +Restacks + +![](https://substackcdn.com/image/fetch/w_64,h_64,c_fill,f_auto,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack.com%2Fimg%2Favatars%2Flogged-out.png) + +| | | +| --- | --- | +| [![](https://substackcdn.com/image/fetch/w_66,h_66,c_fill,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack.com%2Fimg%2Favatars%2Flogged-out.png)](https://substack.com/profile/14315990-jan-skora) | [Jan Skora](https://substack.com/profile/14315990-jan-skora)
[Learner Mindset ✨](https://learnermindset.substack.com?utm_source=substack&utm_medium=web&utm_content=comment_metadata)
[Jun 13](https://www.techsistence.com/p/indie-hackers-toolstack-2024/comment/58958923) Liked by Adam Gospodarczyk
Inspiring setup. Thanks for sharing!
Expand full comment
[Like (1)](javascript:void(0))
Reply
Share | + +[1 reply](https://www.techsistence.com/p/indie-hackers-toolstack-2024/comment/58958923) + +| | | +| --- | --- | +| [![](https://substackcdn.com/image/fetch/w_66,h_66,c_fill,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack.com%2Fimg%2Favatars%2Flogged-out.png)](https://substack.com/profile/45896486-alex-pliutau) | [Alex Pliutau](https://substack.com/profile/45896486-alex-pliutau)
[packagemain.tech](https://packagemain.tech?utm_source=substack&utm_medium=web&utm_content=comment_metadata)
[Jun 8](https://www.techsistence.com/p/indie-hackers-toolstack-2024/comment/58507571) Liked by Adam Gospodarczyk
Great list! You've mentioned iTerm, have you tried [https://warp.dev](https://warp.dev) ? I switched to it few years ago and not coming back to iTerm.
Expand full comment
[Like (1)](javascript:void(0))
Reply
Share | + +[1 reply](https://www.techsistence.com/p/indie-hackers-toolstack-2024/comment/58507571) + +[4 more comments...](https://www.techsistence.com/p/indie-hackers-toolstack-2024/comments) + +Top + +Latest + +Discussions + +[Non-Obvious Prompt Engineering Guide](https://www.techsistence.com/p/non-obvious-prompt-engineering-guide) + +[There are many prompt writing tutorials available. In this one, I share unique insights not found elsewhere.](https://www.techsistence.com/p/non-obvious-prompt-engineering-guide) + +Jul 4• +[Adam Gospodarczyk](https://substack.com/@overment) + +12 + +[8](https://www.techsistence.com/p/non-obvious-prompt-engineering-guide/comments) + +![](https://substackcdn.com/image/fetch/w_320,h_213,c_fill,f_auto,q_auto:good,fl_progressive:steep,g_center/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6df0917-dfe9-4bb7-8ec5-95869c7db975_3408x1910.png) + +[Up to 90% of my code is now generated by AI](https://www.techsistence.com/p/up-to-90-of-my-code-is-now-generated) + +[How is programming changing due to the development of generative artificial intelligence](https://www.techsistence.com/p/up-to-90-of-my-code-is-now-generated) + +Jul 19• +[Adam Gospodarczyk](https://substack.com/@overment) + +12 + +[7](https://www.techsistence.com/p/up-to-90-of-my-code-is-now-generated/comments) + +![](https://substackcdn.com/image/fetch/w_320,h_213,c_fill,f_auto,q_auto:good,fl_progressive:steep,g_center/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42b6550b-976c-4000-97e4-acb6bb8ea7fd_2216x1242.png) + +[How to Build an AI Agent Using No-Code Tools?](https://www.techsistence.com/p/how-to-build-an-ai-agent-using-no) + +[An agent in make.com that has long-term memory (xata.io & qdrant.tech) and uses tools.](https://www.techsistence.com/p/how-to-build-an-ai-agent-using-no) + +Apr 11• +[Adam Gospodarczyk](https://substack.com/@overment) + +9 + +[2](https://www.techsistence.com/p/how-to-build-an-ai-agent-using-no/comments) + +![](https://substackcdn.com/image/fetch/w_320,h_213,c_fill,f_auto,q_auto:good,fl_progressive:steep,g_center/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45cc4ce3-838e-4962-a7d2-107c298e6bc7_1456x816.webp) + +See all + +Ready for more? + +Subscribe \ No newline at end of file diff --git a/unstructured/tools.json b/unstructured/tools.json new file mode 100644 index 00000000..0030272f --- /dev/null +++ b/unstructured/tools.json @@ -0,0 +1,543 @@ +[ + { + "text": "- [iA Writer]({{$url0}}): Best Markdown syntax editor with simplicity as its main advantage but lacks in note organization and related features.", + "metadata": { + "tokens": 42, + "headers": {}, + "urls": [ + "https://ia.net/topics/category/writer" + ], + "images": [] + } + }, + { + "text": "- [Paper]({{$url0}}): Great candidate to replace iA Writer, offering an even better writing experience but has some bugs and limitations, making it suitable only for simple notes.", + "metadata": { + "tokens": 48, + "headers": {}, + "urls": [ + "https://papereditor.app/" + ], + "images": [] + } + }, + { + "text": "- [Obsidian]({{$url0}}): Used for organizing content by pasting from iA Writer or Paper. Great for content organization and can be paired with [Vitepress]({{$url1}}) to share notes online as a static website.", + "metadata": { + "tokens": 66, + "headers": {}, + "urls": [ + "https://obsidian.md/", + "https://vitepress.vuejs.org/" + ], + "images": [] + } + }, + { + "text": "- [Notion]({{$url0}}): Primarily used for collaboration to create content, share it, or leverage automation. Notion offers an API for integration with services.", + "metadata": { + "tokens": 47, + "headers": {}, + "urls": [ + "https://www.notion.so/" + ], + "images": [] + } + }, + { + "text": "- [Vitepress]({{$url0}}): Paired with Obsidian to share notes online as a static website.", + "metadata": { + "tokens": 38, + "headers": {}, + "urls": [ + "https://vitepress.vuejs.org/" + ], + "images": [] + } + }, + { + "text": "- [Wooting 60HE]({{$url0}}): Mechanical keyboard used for typing during writing in full-screen mode.", + "metadata": { + "tokens": 35, + "headers": {}, + "urls": [ + "https://wooting.io/" + ], + "images": [] + } + }, + { + "text": "- [Spotify]({{$url0}}): Used for listening to music during activities.", + "metadata": { + "tokens": 28, + "headers": {}, + "urls": [ + "https://www.spotify.com/" + ], + "images": [] + } + }, + { + "text": "- [Endel]({{$url0}}): Used for listening to music and focusing.", + "metadata": { + "tokens": 28, + "headers": {}, + "urls": [ + "https://endel.io/" + ], + "images": [] + } + }, + { + "text": "- [Xnapper]({{$url0}}): Used for taking screenshots.", + "metadata": { + "tokens": 26, + "headers": {}, + "urls": [ + "https://xnapper.com/" + ], + "images": [] + } + }, + { + "text": "- [ray.so]({{$url0}}): Used for generating code snippets via Puppeteer automation macro.", + "metadata": { + "tokens": 30, + "headers": {}, + "urls": [ + "https://ray.so/" + ], + "images": [] + } + }, + { + "text": "- [TinyPNG]({{$url0}}): Used for optimizing images with a macro.", + "metadata": { + "tokens": 29, + "headers": {}, + "urls": [ + "https://tinypng.com/" + ], + "images": [] + } + }, + { + "text": "- [Dropshare]({{$url0}}): Used for sharing images and files.", + "metadata": { + "tokens": 27, + "headers": {}, + "urls": [ + "https://dropshare.app/" + ], + "images": [] + } + }, + { + "text": "- [DigitalOcean]({{$url0}}): Hosting images and files.", + "metadata": { + "tokens": 27, + "headers": {}, + "urls": [ + "https://www.digitalocean.com/" + ], + "images": [] + } + }, + { + "text": "- [Paste]({{$url0}}): Clipboard manager for easier text editing and managing copied content.", + "metadata": { + "tokens": 32, + "headers": {}, + "urls": [ + "https://setapp.com/apps/paste" + ], + "images": [] + } + }, + { + "text": "- [Linear]({{$url0}}): Used to organize work and tasks, with automation integrating via APIs and GPT-4 prompts.", + "metadata": { + "tokens": 37, + "headers": {}, + "urls": [ + "https://linear.app/" + ], + "images": [] + } + }, + { + "text": "- [Todoist]({{$url0}}): Preferred task management tool with API capabilities.", + "metadata": { + "tokens": 28, + "headers": {}, + "urls": [ + "https://todoist.com/" + ], + "images": [] + } + }, + { + "text": "- [Google Workspace]({{$url0}}): Used for email management.", + "metadata": { + "tokens": 25, + "headers": {}, + "urls": [ + "https://workspace.google.com/" + ], + "images": [] + } + }, + { + "text": "- [Superhuman]({{$url0}}): Email client paired with Gmail for enhanced email management.", + "metadata": { + "tokens": 30, + "headers": {}, + "urls": [ + "https://superhuman.com/" + ], + "images": [] + } + }, + { + "text": "- [Make.com]({{$url0}}): Used for email automation scenarios.", + "metadata": { + "tokens": 25, + "headers": {}, + "urls": [ + "https://make.com/" + ], + "images": [] + } + }, + { + "text": "- [Zencal]({{$url0}}): Used for booking calendar slots.", + "metadata": { + "tokens": 28, + "headers": {}, + "urls": [ + "https://zencal.io/" + ], + "images": [] + } + }, + { + "text": "- [Notion Calendar]({{$url0}}): Used as a calendar app with keyboard shortcuts and minimalist interface.", + "metadata": { + "tokens": 35, + "headers": {}, + "urls": [ + "https://www.notion.so/product/calendar" + ], + "images": [] + } + }, + { + "text": "- [Arc Browser]({{$url0}}): Main browser on macOS and iOS, appreciated for Command Bar and Little Arc features.", + "metadata": { + "tokens": 35, + "headers": {}, + "urls": [ + "https://arc.net/" + ], + "images": [] + } + }, + { + "text": "- [Feedly]({{$url0}}): Used to stay up-to-date and monitor news with API connectivity.", + "metadata": { + "tokens": 33, + "headers": {}, + "urls": [ + "https://feedly.com/" + ], + "images": [] + } + }, + { + "text": "- [Product Hunt]({{$url0}}): Used for exploring new topics.", + "metadata": { + "tokens": 27, + "headers": {}, + "urls": [ + "https://www.producthunt.com/" + ], + "images": [] + } + }, + { + "text": "- [daily.dev]({{$url0}}): Used for staying updated.", + "metadata": { + "tokens": 26, + "headers": {}, + "urls": [ + "https://app.daily.dev/onboarding" + ], + "images": [] + } + }, + { + "text": "- [Indie Hackers]({{$url0}}): Used for browsing and staying informed.", + "metadata": { + "tokens": 32, + "headers": {}, + "urls": [ + "https://www.indiehackers.com/" + ], + "images": [] + } + }, + { + "text": "- [HackerNews]({{$url0}}): Used for news and updates.", + "metadata": { + "tokens": 30, + "headers": {}, + "urls": [ + "https://news.ycombinator.com/" + ], + "images": [] + } + }, + { + "text": "- [Figma]({{$url0}}): Used for UI design and creating advertisements with components and auto-layout feature.", + "metadata": { + "tokens": 34, + "headers": {}, + "urls": [ + "https://figma.com/" + ], + "images": [] + } + }, + { + "text": "- [Adobe Photoshop Beta]({{$url0}}): Returned for its Generative AI features, excellent for editing images and assets generated in Midjourney.", + "metadata": { + "tokens": 45, + "headers": {}, + "urls": [ + "https://www.adobe.com/products/photoshop.html" + ], + "images": [] + } + }, + { + "text": "- [Midjourney]({{$url0}}): Used for generating graphic or asset variants.", + "metadata": { + "tokens": 31, + "headers": {}, + "urls": [ + "https://www.midjourney.com/" + ], + "images": [] + } + }, + { + "text": "- [Adobe Firefly]({{$url0}}): Used for slight editing of images generated in Midjourney.", + "metadata": { + "tokens": 37, + "headers": {}, + "urls": [ + "https://www.adobe.com/products/firefly.html" + ], + "images": [] + } + }, + { + "text": "- [Webflow]({{$url0}}): Used as a graphic editor in combination with [HTMLCSSToImage]({{$url1}}) for automatic generation of graphics based on templates.", + "metadata": { + "tokens": 52, + "headers": {}, + "urls": [ + "https://webflow.com/", + "https://htmlcsstoimage.com/" + ], + "images": [] + } + }, + { + "text": "- [HTMLCSSToImage]({{$url0}}): Used for automatic generation of graphics based on templates.", + "metadata": { + "tokens": 35, + "headers": {}, + "urls": [ + "https://htmlcsstoimage.com/" + ], + "images": [] + } + }, + { + "text": "- [IntelliJ IDEA]({{$url0}}): Main code editor, preferred over VS Code for better code understanding, supports TypeScript and Rust.", + "metadata": { + "tokens": 42, + "headers": {}, + "urls": [ + "https://www.jetbrains.com/idea/" + ], + "images": [] + } + }, + { + "text": "- [Supermaven]({{$url0}}): Alternative to Github Copilot, intelligently suggests code.", + "metadata": { + "tokens": 33, + "headers": {}, + "urls": [ + "https://supermaven.com/" + ], + "images": [] + } + }, + { + "text": "- [iTerm]({{$url0}}): Preferred terminal for its simplicity.", + "metadata": { + "tokens": 27, + "headers": {}, + "urls": [ + "https://iterm2.com/" + ], + "images": [] + } + }, + { + "text": "- [TablePlus]({{$url0}}): Database client for macOS.", + "metadata": { + "tokens": 25, + "headers": {}, + "urls": [ + "https://tableplus.com/" + ], + "images": [] + } + }, + { + "text": "- [Raycast]({{$url0}}): Used for searching menu items and executing actions.", + "metadata": { + "tokens": 30, + "headers": {}, + "urls": [ + "https://www.raycast.com/" + ], + "images": [] + } + }, + { + "text": "- [GitHub Actions]({{$url0}}): Used for automating code deployment.", + "metadata": { + "tokens": 27, + "headers": {}, + "urls": [ + "https://github.com/features/actions" + ], + "images": [] + } + }, + { + "text": "- [Shortcuts]({{$url0}}): Used for macros and automation.", + "metadata": { + "tokens": 34, + "headers": {}, + "urls": [ + "https://apps.apple.com/us/app/shortcuts/id915249334" + ], + "images": [] + } + }, + { + "text": "- [Keyboard Maestro]({{$url0}}): Used for macros and automation.", + "metadata": { + "tokens": 28, + "headers": {}, + "urls": [ + "https://folivora.ai/" + ], + "images": [] + } + }, + { + "text": "- [Better Touch Tool]({{$url0}}): Used for macros and automation.", + "metadata": { + "tokens": 28, + "headers": {}, + "urls": [ + "https://folivora.ai/" + ], + "images": [] + } + }, + { + "text": "- [Goodreads]({{$url0}}): Logging books read.", + "metadata": { + "tokens": 25, + "headers": {}, + "urls": [ + "https://www.goodreads.com/" + ], + "images": [] + } + }, + { + "text": "- [Amazon Kindle]({{$url0}}): Reading books.", + "metadata": { + "tokens": 25, + "headers": {}, + "urls": [ + "https://play.google.com/store/apps/details" + ], + "images": [] + } + }, + { + "text": "- [Audible]({{$url0}}): Listening to audiobooks.", + "metadata": { + "tokens": 28, + "headers": {}, + "urls": [ + "https://www.audible.com/" + ], + "images": [] + } + }, + { + "text": "- [PlayStation 5]({{$url0}}): Gaming console.", + "metadata": { + "tokens": 26, + "headers": {}, + "urls": [ + "https://www.playstation.com/" + ], + "images": [] + } + }, + { + "text": "- [Nvidia GeForce Now]({{$url0}}): Game streaming service.", + "metadata": { + "tokens": 32, + "headers": {}, + "urls": [ + "https://www.nvidia.com/en-us/geforce-now/" + ], + "images": [] + } + }, + { + "text": "- [Steam Deck]({{$url0}}): Portable gaming device.", + "metadata": { + "tokens": 26, + "headers": {}, + "urls": [ + "https://www.steamdeck.com/" + ], + "images": [] + } + }, + { + "text": "- [Nintendo Switch]({{$url0}}): Gaming console.", + "metadata": { + "tokens": 26, + "headers": {}, + "urls": [ + "https://www.nintendo.com/switch/" + ], + "images": [] + } + } +] \ No newline at end of file