[{"data":1,"prerenderedAt":3025},["ShallowReactive",2],{"notes-to-self-slugs":3,"posts":364},[4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,280,283,286,289,292,295,298,301,304,307,310,313,316,319,322,325,328,331,334,337,340,343,346,349,352,355,358,361],{"title":5,"slug":6},"3D Math/Graphics","3d-mathgraphics",{"title":8,"slug":9},"3d modeling tools and resources","3d-modeling-tools-and-resources",{"title":11,"slug":12},"3D Printing","3d-printing",{"title":14,"slug":15},"A Mathematical Expression Parser in TypeScript","a-mathematical-expression-parser-in-typescript",{"title":17,"slug":18},"Ad Hoc","ad-hoc",{"title":20,"slug":21},"AI: ChatGPT and the Nature of Intelligence","ai-chatgpt-and-the-nature-of-intelligence",{"title":23,"slug":24},"Apple ][ Stuff","apple-stuff",{"title":26,"slug":27},"Art You Like","art-you-like",{"title":29,"slug":30},"Artists","artists",{"title":32,"slug":33},"Big O (AKA Big Oh) notation","big-o-aka-big-oh-notation",{"title":35,"slug":36},"Big O Cheat Sheet","big-o-cheat-sheet",{"title":38,"slug":39},"Blender","blender",{"title":41,"slug":42},"Books about Business, Process","books-about-business-process",{"title":44,"slug":45},"Break a Concave Shape into Multiple Convex Shapes","break-a-concave-shape-into-multiple-convex-shapes",{"title":47,"slug":48},"C++","c",{"title":50,"slug":51},"C Template Library","c-template-library",{"title":53,"slug":54},"CMS","cms",{"title":56,"slug":57},"Color Tools","color-tools",{"title":59,"slug":60},"CSS: Flex, a Great Explanation","css-flex-a-great-explanation",{"title":62,"slug":63},"CSS - Line Height Unit","css-line-height-unit",{"title":65,"slug":66},"Data Editor","data-editor",{"title":68,"slug":69},"Data transformation tool","data-transformation-tool",{"title":71,"slug":72},"Deep Learning","deep-learning",{"title":74,"slug":75},"Do a Circle and a Line Intersect?","do-a-circle-and-a-line-intersect",{"title":77,"slug":78},"Dungeon Deep/Wicked Engine","dungeon-deepwicked-engine",{"title":80,"slug":81},"Electric Car","electric-car",{"title":83,"slug":84},"Fast Pseudo-random number generator","fast-pseudo-random-number-generator",{"title":86,"slug":87},"Fermi’s Paradox, the Drake Equation, and All That","fermis-paradox-the-drake-equation-and-all-that",{"title":89,"slug":90},"Fonts","fonts",{"title":92,"slug":93},"Frameworks and Libraries of Interest","frameworks-and-libraries-of-interest",{"title":95,"slug":96},"Game Dev","game-dev",{"title":98,"slug":99},"Game Idea - Lunar Lander + Motherload","game-idea-lunar-lander-motherload",{"title":101,"slug":102},"Git Cheat Sheet","git-cheat-sheet",{"title":104,"slug":105},"Godot Exploration","godot-exploration",{"title":107,"slug":108},"Google Apps for biggerplanet.com","google-apps-for-biggerplanetcom",{"title":110,"slug":111},"GUIs in Movies","guis-in-movies",{"title":113,"slug":114},"Guy Uses Blender for Classic 2001/Alien Greeble","guy-uses-blender-for-classic-2001alien-greeble",{"title":116,"slug":117},"HDHomerun Connect Duo","hdhomerun-connect-duo",{"title":119,"slug":120},"Heroku shutting down free tiers","heroku-shutting-down-free-tiers",{"title":122,"slug":123},"Home Improvement","home-improvement",{"title":125,"slug":126},"How to Promote Phone Game","how-to-promote-phone-game",{"title":128,"slug":129},"HTML Dialog Element","html-dialog-element",{"title":131,"slug":132},"Ice maker Repair","ice-maker-repair",{"title":134,"slug":135},"Illustrator => Affinity Designer","illustrator-affinity-designer",{"title":137,"slug":138},"Image, Picture, Visual Resources","image-picture-visual-resources",{"title":140,"slug":141},"Interactive Narrative Scripting Language","interactive-narrative-scripting-language",{"title":143,"slug":144},"Interview with Zachary Boerner, Branch Cut, TableRaven","interview-with-zachary-boerner-branch-cut-tableraven",{"title":146,"slug":147},"JavaScript crypto ","javascript-crypto",{"title":149,"slug":150},"Job search","job-search",{"title":152,"slug":153},"Jobs","jobs",{"title":155,"slug":156},"Keep macOS awake","keep-macos-awake",{"title":158,"slug":159},"Keyboards","keyboards",{"title":161,"slug":162},"Linear Interpolation (lerp)","linear-interpolation-lerp",{"title":164,"slug":165},"Lost Music","lost-music",{"title":167,"slug":168},"Making a Vue/Nuxt Module","making-a-vuenuxt-module",{"title":170,"slug":171},"Marketing","marketing",{"title":173,"slug":174},"Meta Tools","meta-tools",{"title":176,"slug":177},"Military Ranks","military-ranks",{"title":179,"slug":180},"Miscellaneous Digitized Manuscripts and Books for Source Material, Art","miscellaneous-digitized-manuscripts-and-books-for-source-material-art",{"title":182,"slug":183},"More ChatGPT","more-chatgpt",{"title":185,"slug":186},"Movies to Watch","movies-to-watch",{"title":188,"slug":189},"Music (for listening) and Movies/Shows to Watch","music-for-listening-and-moviesshows-to-watch",{"title":191,"slug":192},"Music (Learning, Playing)","music-learning-playing",{"title":194,"slug":195},"Music Resource","music-resource",{"title":197,"slug":198},"Mystery Theater","mystery-theater",{"title":200,"slug":201},"Numeric Input on Mobile","numeric-input-on-mobile",{"title":203,"slug":204},"Old Mac Emulation in Browser","old-mac-emulation-in-browser",{"title":206,"slug":207},"On \"Cancel Culture\"","on-cancel-culture",{"title":209,"slug":210},"On Optimism","on-optimism",{"title":212,"slug":213},"On Testing","on-testing",{"title":215,"slug":216},"Password/Passphrase Generator Idea","passwordpassphrase-generator-idea",{"title":218,"slug":219},"Patent Troll","patent-troll",{"title":221,"slug":222},"Plants","plants",{"title":224,"slug":225},"PlayKode Research","playkode-research",{"title":227,"slug":228},"Plots","plots",{"title":230,"slug":231},"Poetry, Inspirational ","poetry-inspirational",{"title":233,"slug":234},"Portable Screen/Monitor","portable-screenmonitor",{"title":236,"slug":237},"Procedural dungeon for rogue like","procedural-dungeon-for-rogue-like",{"title":239,"slug":240},"Products to Buy","products-to-buy",{"title":242,"slug":243},"Quest VR Floor Height Problem","quest-vr-floor-height-problem",{"title":245,"slug":246},"React","react",{"title":248,"slug":249},"Recipes/Techniques","recipestechniques",{"title":251,"slug":252},"Red Sea Navigation","red-sea-navigation",{"title":254,"slug":255},"Regex Tools","regex-tools",{"title":257,"slug":258},"Roche Brothers Wines","roche-brothers-wines",{"title":260,"slug":261},"Science to exploit and mangle for fiction","science-to-exploit-and-mangle-for-fiction",{"title":263,"slug":264},"SCP Tips","scp-tips",{"title":266,"slug":267},"SDL","sdl",{"title":269,"slug":270},"SETI Editorial: Probing for ETI's Probes in the Solar System","seti-editorial-probing-for-etis-probes-in-the-solar-system",{"title":272,"slug":273},"Setting up sublime to be like iA Writer","setting-up-sublime-to-be-like-ia-writer",{"title":275,"slug":276},"Shared Element Transition","shared-element-transition",{"title":278,"slug":279},"Simulation Hypothesis","simulation-hypothesis",{"title":281,"slug":282},"Solar","solar",{"title":284,"slug":285},"Songs to Sample","songs-to-sample",{"title":287,"slug":288},"Sound Effects","sound-effects",{"title":290,"slug":291},"SSH tips","ssh-tips",{"title":293,"slug":294},"Supabase","supabase",{"title":296,"slug":297},"SVG Tools","svg-tools",{"title":299,"slug":300},"SvS/NoS Reboot notes","svsnos-reboot-notes",{"title":302,"slug":303},"Swift Resources & Notes","swift-resources-notes",{"title":305,"slug":306},"The Original Spacewar!","the-original-spacewar",{"title":308,"slug":309},"The Snowflake Method For Designing A Novel","the-snowflake-method-for-designing-a-novel",{"title":311,"slug":312},"The Thirty-Seven Basic Dramatic Situations","the-thirty-seven-basic-dramatic-situations",{"title":314,"slug":315},"Three Magic Words","three-magic-words",{"title":317,"slug":318},"Three.js","threejs",{"title":320,"slug":321},"Tools & Books","tools-books",{"title":323,"slug":324},"Vector Rendering Engine (C++)","vector-rendering-engine-c",{"title":326,"slug":327},"VR","vr",{"title":329,"slug":330},"Vue 3, Nuxt, Nuxt Content, & TypeScript","vue-3-nuxt-nuxt-content-typescript",{"title":332,"slug":333},"Vue and Vue Adjacent","vue-and-vue-adjacent",{"title":335,"slug":336},"Web dev","web-dev",{"title":338,"slug":339},"WebAssembly (WASM)/Web Worker Notes","webassembly-wasmweb-worker-notes",{"title":341,"slug":342},"WebGPU","webgpu",{"title":344,"slug":345},"What God, Quantum Mechanics and Consciousness Have in Common","what-god-quantum-mechanics-and-consciousness-have-in-common",{"title":347,"slug":348},"what’s an entity component system?","whats-an-entity-component-system",{"title":350,"slug":351},"Whisper","whisper",{"title":353,"slug":354},"Whitelist websites for kid use of raspberry pi","whitelist-websites-for-kid-use-of-raspberry-pi",{"title":356,"slug":357},"Why You Will Marry the Wrong Person","why-you-will-marry-the-wrong-person",{"title":359,"slug":360},"Word order","word-order",{"title":362,"slug":363},"You are h…","you-are-h",[365,496,1359,1573,1758,1921,1946,2714,2839,2996],{"_path":366,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":5,"description":370,"slug":6,"date":371,"dateString":372,"encrypted":368,"encryptedBody":373,"body":374,"_type":490,"_id":491,"_source":492,"_file":493,"_stem":494,"_extension":495},"/notes-to-self/3d-mathgraphics","notes-to-self",false,"","An alternative to Quaternions - easier to understand but not the standard that is optimized for hardware. Via https://news.ycombinator.com/item?id=22200260",1580490000000,"January 31, 2020",null,{"type":375,"children":376,"toc":485},"root",[377,400,419,429,436,453,459,476],{"type":378,"tag":379,"props":380,"children":381},"element","p",{},[382,392,394],{"type":378,"tag":383,"props":384,"children":388},"a",{"href":385,"rel":386},"https://marctenbosch.com/quaternions/",[387],"nofollow",[389],{"type":390,"value":391},"text","An alternative to Quaternions",{"type":390,"value":393}," - easier to understand but not the standard that is optimized for hardware. Via ",{"type":378,"tag":383,"props":395,"children":398},{"href":396,"rel":397},"https://news.ycombinator.com/item?id=22200260",[387],[399],{"type":390,"value":396},{"type":378,"tag":379,"props":401,"children":402},{},[403,410,412],{"type":378,"tag":383,"props":404,"children":407},{"href":405,"rel":406},"https://liorsinai.github.io/mathematics/2021/11/05/quaternion-1-intro.html",[387],[408],{"type":390,"value":409},"Explanation of Quaternions",{"type":390,"value":411}," via ",{"type":378,"tag":383,"props":413,"children":416},{"href":414,"rel":415},"https://news.ycombinator.com/item?id=29510237",[387],[417],{"type":390,"value":418},"hacker news",{"type":378,"tag":379,"props":420,"children":421},{},[422],{"type":378,"tag":383,"props":423,"children":426},{"href":424,"rel":425},"https://news.ycombinator.com/item?id=26659295",[387],[427],{"type":390,"value":428},"Game Engine: How I Implemented Skeletal Animation",{"type":378,"tag":430,"props":431,"children":433},"h2",{"id":432},"april-25-2021",[434],{"type":390,"value":435},"April 25, 2021",{"type":378,"tag":379,"props":437,"children":438},{},[439,446,447],{"type":378,"tag":383,"props":440,"children":443},{"href":441,"rel":442},"https://github.com/lettier/3d-game-shaders-for-beginners",[387],[444],{"type":390,"value":445},"Game shaders for beginners",{"type":390,"value":411},{"type":378,"tag":383,"props":448,"children":451},{"href":449,"rel":450},"https://news.ycombinator.com/item?id=26931372",[387],[452],{"type":390,"value":418},{"type":378,"tag":430,"props":454,"children":456},{"id":455},"may-19-2021",[457],{"type":390,"value":458},"May 19, 2021",{"type":378,"tag":379,"props":460,"children":461},{},[462,468,470],{"type":378,"tag":383,"props":463,"children":466},{"href":464,"rel":465},"https://news.ycombinator.com/item?id=27214221",[387],[467],{"type":390,"value":464},{"type":390,"value":469}," ",{"type":378,"tag":383,"props":471,"children":474},{"href":472,"rel":473},"https://gamemath.com/",[387],[475],{"type":390,"value":472},{"type":378,"tag":379,"props":477,"children":478},{},[479],{"type":378,"tag":383,"props":480,"children":483},{"href":481,"rel":482},"https://gamemath.com/book/intro.html",[387],[484],{"type":390,"value":481},{"title":369,"searchDepth":486,"depth":486,"links":487},2,[488,489],{"id":432,"depth":486,"text":435},{"id":455,"depth":486,"text":458},"markdown","content:notes-to-self:3d-mathgraphics.md","content","notes-to-self/3d-mathgraphics.md","notes-to-self/3d-mathgraphics","md",{"_path":497,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":260,"description":498,"slug":261,"date":499,"dateString":500,"encrypted":368,"encryptedBody":373,"body":501,"_type":490,"_id":1356,"_source":492,"_file":1357,"_stem":1358,"_extension":495},"/notes-to-self/science-to-exploit-and-mangle-for-fiction","Gravity: You’re interested in PBS video link",1579885200000,"January 24, 2020",{"type":375,"children":502,"toc":1344},[503,522,531,542,569,579,591,601,612,649,661,672,682,696,707,717,724,736,742,751,763,769,778,784,804,815,825,830,835,840,845,852,857,862,867,872,877,882,888,893,898,903,908,913,918,924,929,934,940,945,950,955,960,965,970,975,980,986,991,996,1001,1006,1011,1016,1021,1026,1031,1036,1041,1047,1057,1062,1067,1072,1080,1084,1097,1103,1113,1119,1125,1130,1135,1140,1146,1151,1156,1161,1166,1171,1176,1181,1186,1191,1197,1202,1207,1212,1217,1222,1227,1232,1237,1243,1248,1253,1258,1263,1268,1273,1278,1283,1288,1293,1298,1303,1309,1314,1319,1324,1329,1334,1339],{"type":378,"tag":379,"props":504,"children":505},{},[506,513,515],{"type":378,"tag":383,"props":507,"children":510},{"href":508,"rel":509},"https://news.ycombinator.com/item?id=22141327",[387],[511],{"type":390,"value":512},"Gravity",{"type":390,"value":514},": You’re interested in ",{"type":378,"tag":383,"props":516,"children":519},{"href":517,"rel":518},"https://www.youtube.com/watch?v=klpDHn8viX8",[387],[520],{"type":390,"value":521},"PBS video link",{"type":378,"tag":379,"props":523,"children":524},{},[525],{"type":378,"tag":383,"props":526,"children":529},{"href":527,"rel":528},"http://www.atlasoftheuniverse.com/12lys.html",[387],[530],{"type":390,"value":527},{"type":378,"tag":379,"props":532,"children":533},{},[534,536],{"type":390,"value":535},"Wolfram, Oligons ",{"type":378,"tag":383,"props":537,"children":540},{"href":538,"rel":539},"https://www.sciencenews.org/article/stephen-wolfram-hypergraph-project-fundamental-theory-physics",[387],[541],{"type":390,"value":538},{"type":378,"tag":379,"props":543,"children":544},{},[545,547,553,554,560,562],{"type":390,"value":546},"Not really science, but the are-we-living-in-a-simulation logic refuted: ",{"type":378,"tag":383,"props":548,"children":551},{"href":549,"rel":550},"https://news.ycombinator.com/item?id=23008373",[387],[552],{"type":390,"value":549},{"type":390,"value":411},{"type":378,"tag":383,"props":555,"children":558},{"href":556,"rel":557},"https://news.ycombinator.com/item?id=23007321",[387],[559],{"type":390,"value":556},{"type":390,"value":561}," re ",{"type":378,"tag":383,"props":563,"children":566},{"href":564,"rel":565},"https://www.simulation-argument.com/simulation.pdf",[387],[567],{"type":390,"value":568},"paper",{"type":378,"tag":379,"props":570,"children":571},{},[572],{"type":378,"tag":383,"props":573,"children":576},{"href":574,"rel":575},"https://en.wikipedia.org/wiki/Baruch_Spinoza",[387],[577],{"type":390,"value":578},"Baruch Spinoza",{"type":378,"tag":379,"props":580,"children":581},{},[582,589],{"type":378,"tag":383,"props":583,"children":586},{"href":584,"rel":585},"https://uwspace.uwaterloo.ca/handle/10012/4935",[387],[587],{"type":390,"value":588},"The aesthetics of science fiction spaceship design",{"type":390,"value":590}," You have this PDF",{"type":378,"tag":379,"props":592,"children":593},{},[594],{"type":378,"tag":383,"props":595,"children":598},{"href":596,"rel":597},"https://news.ycombinator.com/item?id=23596603",[387],[599],{"type":390,"value":600},"SETI comments, talk of Dyson Swarms",{"type":378,"tag":379,"props":602,"children":603},{},[604,606],{"type":390,"value":605},"Pluto ",{"type":378,"tag":383,"props":607,"children":610},{"href":608,"rel":609},"https://solarsystem.nasa.gov/resources/933/true-colors-of-pluto/",[387],[611],{"type":390,"value":608},{"type":378,"tag":379,"props":613,"children":614},{},[615,617,624,625,632,634,641,642],{"type":390,"value":616},"Also: ",{"type":378,"tag":383,"props":618,"children":621},{"href":619,"rel":620},"https://sfdictionary.com/",[387],[622],{"type":390,"value":623},"historical dictionary of science fiction",{"type":390,"value":411},{"type":378,"tag":383,"props":626,"children":629},{"href":627,"rel":628},"https://arstechnica.com/gaming/2021/01/warp-speed-prime-directive-predate-star-trek-per-new-reference-tool/",[387],[630],{"type":390,"value":631},"ars",{"type":390,"value":633},". ",{"type":378,"tag":383,"props":635,"children":638},{"href":636,"rel":637},"https://sfdictionary.com/view/117/starship",[387],[639],{"type":390,"value":640},"Starship, 1882/1926",{"type":390,"value":633},{"type":378,"tag":383,"props":643,"children":646},{"href":644,"rel":645},"https://sfdictionary.com/view/108/shield",[387],[647],{"type":390,"value":648},"Shields as in protective force field, 1933",{"type":378,"tag":379,"props":650,"children":651},{},[652,659],{"type":378,"tag":383,"props":653,"children":656},{"href":654,"rel":655},"https://www.theatlantic.com/science/archive/2021/02/to-infinity-and-beyond/617965/",[387],[657],{"type":390,"value":658},"Scalar field energy",{"type":390,"value":660}," and other infinite universe stuff.",{"type":378,"tag":379,"props":662,"children":663},{},[664,666],{"type":390,"value":665},"Warp drives ",{"type":378,"tag":383,"props":667,"children":670},{"href":668,"rel":669},"https://boingboing.net/2021/04/01/scientists-may-have-figured-out-how-to-make-a-warp-drive-work.html",[387],[671],{"type":390,"value":668},{"type":378,"tag":379,"props":673,"children":674},{},[675],{"type":378,"tag":383,"props":676,"children":679},{"href":677,"rel":678},"https://www.youtube.com/watch?v=aB8zcAttP1E&t=4330s",[387],[680],{"type":390,"value":681},"Very credible navy pilot describing Tic Tac UFO encounter",{"type":378,"tag":379,"props":683,"children":684},{},[685,687,694],{"type":390,"value":686},"Could a super species have spread to all galaxies when they were closer together? Probably not. ",{"type":378,"tag":383,"props":688,"children":691},{"href":689,"rel":690},"https://news.ycombinator.com/item?id=26944703",[387],[692],{"type":390,"value":693},"Life was not possible 12 billion years ago",{"type":390,"value":695}," because there weren't enough heavy elements.",{"type":378,"tag":379,"props":697,"children":698},{},[699,701],{"type":390,"value":700},"Fermi paradox ",{"type":378,"tag":383,"props":702,"children":705},{"href":703,"rel":704},"https://news.ycombinator.com/item?id=27205742",[387],[706],{"type":390,"value":703},{"type":378,"tag":379,"props":708,"children":709},{},[710],{"type":378,"tag":383,"props":711,"children":714},{"href":712,"rel":713},"https://en.wikipedia.org/wiki/Green_star_(astronomy)",[387],[715],{"type":390,"value":716},"star colors",{"type":378,"tag":718,"props":719,"children":721},"h3",{"id":720},"fiction",[722],{"type":390,"value":723},"Fiction",{"type":378,"tag":379,"props":725,"children":726},{},[727,734],{"type":378,"tag":383,"props":728,"children":731},{"href":729,"rel":730},"https://en.wikipedia.org/wiki/Inertialess_drive",[387],[732],{"type":390,"value":733},"Tradition of FTL tech in fiction",{"type":390,"value":735}," linked to Spacewar! via \"Bergenholm Gyros\"",{"type":378,"tag":718,"props":737,"children":739},{"id":738},"cantharan-world-view",[740],{"type":390,"value":741},"Cantharan World View",{"type":378,"tag":743,"props":744,"children":745},"blockquote",{},[746],{"type":378,"tag":379,"props":747,"children":748},{},[749],{"type":390,"value":750},"Cartesian science – which indeed is a good science – says that the laws of physics cannot be violated and above all that such laws involve only matter and energy as we know them (and we know them extremely well). Mind and consciousness cannot interact: “res extensa” (matter) and “res cogitans” (mind) are two totally separated entities according to Cartesius. This paradigm didn’t change at all in about four centuries, and Cartesius constitutes one of the basic pillars of our fundamental science. And that is not that bad, apparently.",{"type":378,"tag":379,"props":752,"children":753},{},[754,756],{"type":390,"value":755},"Via ",{"type":378,"tag":383,"props":757,"children":760},{"href":758,"rel":759},"https://massimoteodorani.com/2020/08/12/ufo-magic-2/",[387],[761],{"type":390,"value":762},"this (Italian?) ufo guy",{"type":378,"tag":718,"props":764,"children":766},{"id":765},"worm-hole-science",[767],{"type":390,"value":768},"Worm Hole Science:",{"type":378,"tag":379,"props":770,"children":771},{},[772],{"type":378,"tag":383,"props":773,"children":776},{"href":774,"rel":775},"https://arstechnica.com/science/2022/05/how-to-build-a-wormhole-in-just-3-nearly-impossible-steps/",[387],[777],{"type":390,"value":774},{"type":378,"tag":718,"props":779,"children":781},{"id":780},"traveling-ftl-deposits-you-in-a-parallel-universe",[782],{"type":390,"value":783},"Traveling FTL Deposits You in a Parallel Universe",{"type":378,"tag":379,"props":785,"children":786},{},[787,794,795,802],{"type":378,"tag":383,"props":788,"children":791},{"href":789,"rel":790},"https://news.ycombinator.com/item?id=32045928",[387],[792],{"type":390,"value":793},"Story",{"type":390,"value":469},{"type":378,"tag":383,"props":796,"children":799},{"href":797,"rel":798},"https://news.ycombinator.com/item?id=32047337",[387],[800],{"type":390,"value":801},"Relevant Comment",{"type":390,"value":803}," - solves Fermi too.",{"type":378,"tag":718,"props":805,"children":807},{"id":806},"cosmic-strings",[808],{"type":378,"tag":383,"props":809,"children":812},{"href":810,"rel":811},"https://arstechnica.com/science/2022/09/the-big-bang-should-have-made-cracks-in-spacetime-why-havent-we-found-them/",[387],[813],{"type":390,"value":814},"Cosmic Strings",{"type":378,"tag":379,"props":816,"children":817},{},[818],{"type":378,"tag":383,"props":819,"children":822},{"href":820,"rel":821},"https://www.youtube.com/watch?v=Thw43hzXlDA",[387],[823],{"type":390,"value":824},"See this video",{"type":378,"tag":379,"props":826,"children":827},{},[828],{"type":390,"value":829},"Remember that time in the Lord of the Rings lore when the dwarves of Moria dug too greedily and too deep, unearthing the Balrog, an ancient horror not meant to roam free in the modern age?",{"type":378,"tag":379,"props":831,"children":832},{},[833],{"type":390,"value":834},"Cosmic strings are kind of like that but for physics. They are hypothetical leftovers from the momentous transformations experienced by our Universe when it was less than a second old. They are defects, flaws in space itself. They’re no wider than a proton, but they may potentially stretch across the observable volume of the Universe. They have unspeakable powers—the ability to warp space so much that circles around them never complete, and they carry enough energy to unleash planet-destroying levels of gravitational waves. They’re also the path into some of the most exotic physics known (and unknown) to science.",{"type":378,"tag":379,"props":836,"children":837},{},[838],{"type":390,"value":839},"But perhaps the greatest power cosmic strings possess is their capacity to confound physicists. According to our best understanding of the early Universe, our cosmos should be riddled with cosmic strings. And yet not a single search has found any evidence for them. Figuring out where the cosmic strings are hiding, or why they shouldn’t exist after all, will help push our understanding of cosmology and fundamental physics to new heights.",{"type":378,"tag":379,"props":841,"children":842},{},[843],{"type":390,"value":844},"And no, we won’t need a wizard.",{"type":378,"tag":846,"props":847,"children":849},"h4",{"id":848},"a-broken-universe",[850],{"type":390,"value":851},"A broken universe",{"type":378,"tag":379,"props":853,"children":854},{},[855],{"type":390,"value":856},"Let’s turn the clock back to some of the earliest moments in the history of the Universe. At that time, the cosmos was less than a fraction of a second old, and its entire observable volume, currently around 90 billion light-years across, was compressed into a space no bigger than an atom.",{"type":378,"tag":379,"props":858,"children":859},{},[860],{"type":390,"value":861},"I’ll tell you straight away that we have no firm understanding of the nature of the Universe at this time. That’s because the matter that filled the Universe was in such an extremely exotic state, with temperatures and pressures so stupidly high, that it’s not even worth typing out numbers for them. At these energies, our current knowledge of physics simply breaks down. We have no well-understood equation, no guiding principles, no experimental results that can tell us what exactly the Universe was up to when it was so young.",{"type":378,"tag":379,"props":863,"children":864},{},[865],{"type":390,"value":866},"But we do have a few sneaking suspicions. We’ve identified through our mathematical models and verified through experiments that the forces of nature aren’t always what they seem. At the normal, typical energies of everyday life, we experience four fundamental forces: gravity, electromagnetism, strong nuclear, and weak nuclear. But at high energies, things shuffle around a bit.",{"type":378,"tag":379,"props":868,"children":869},{},[870],{"type":390,"value":871},"At an energy of around 246 GeV, the electromagnetic and weak nuclear forces cease to be distinct. Instead, they merge into a single super-force known (appropriately) as the electroweak force. And here's something wild: At those energies, there are only three forces of nature, not four. Once you drop below that energy, the electroweak force breaks apart into the more familiar electromagnetic and weak nuclear forces.",{"type":378,"tag":379,"props":873,"children":874},{},[875],{"type":390,"value":876},"In physics, this splitting is called \"spontaneous symmetry breaking.\" The unified electroweak force exhibits a deep mathematical symmetry, but that symmetry can only be sustained at high energies. In our everyday experience, that symmetry is hidden (or broken), and the electroweak’s two component forces appear to be wildly different, even though they’re really manifestations of a deeper, singular force.",{"type":378,"tag":379,"props":878,"children":879},{},[880],{"type":390,"value":881},"Why stop there? Physicists suspect that at even higher energies, the strong nuclear force joins the party, creating a single force known as a GUT—a Grand Unified Theory. This isn’t mere idle speculation. The constants that define the strengths of the forces change with energy, and at high enough energies, they all have roughly the same strengths, signaling that unification is a viable option. Beyond that, at almost unfathomable energies, gravity is also thought to join with the others to create a Voltron of fundamental physics: a Theory of Everything.",{"type":378,"tag":846,"props":883,"children":885},{"id":884},"weaving-a-cosmic-string",[886],{"type":390,"value":887},"Weaving a cosmic string",{"type":378,"tag":379,"props":889,"children":890},{},[891],{"type":390,"value":892},"The main challenge is that we don’t have a GUT, let alone a Theory of Everything. We have candidate theories, like supersymmetry, to provide a GUT, but they've come up short in experimental searches. String theory goes one step above to handle everything, but we’re not even sure how to test that. This means we lack the sharp mathematical insights needed to cut through the fog of the extremely early Universe, when the symmetries governing the fundamental forces remained unbroken.",{"type":378,"tag":379,"props":894,"children":895},{},[896],{"type":390,"value":897},"Until they didn't, that is.",{"type":378,"tag":379,"props":899,"children":900},{},[901],{"type":390,"value":902},"As our Universe expanded and cooled, it went through radical phase transitions, with the four forces of nature splintering off from unification one by one. And we suspect that during one of these phase transitions, cosmic strings were born.",{"type":378,"tag":379,"props":904,"children":905},{},[906],{"type":390,"value":907},"When a physical system undergoes a phase transition, there’s a loss of symmetry. For example, a pencil balanced on its tip is in a high energy state and also beautifully symmetric—it looks the same from any angle of observation around it. But the perfectly balanced pencil is unstable; when it falls over, the symmetry breaks, with the pencil “choosing” a place to fall on the table below it. For the physics of that particular system, it doesn’t matter where the pencil falls—it could fall either to the left or the right, for example. The precise place where the pencil lands is arbitrary and doesn’t affect the larger picture, which is that the pencil is now in a more-stable, lower-energy, less-symmetric state.",{"type":378,"tag":379,"props":909,"children":910},{},[911],{"type":390,"value":912},"When our Universe underwent the phase transitions into lower-energy states, with the forces of nature split off from each other, there was a similar freedom to choose exactly how to break those symmetries. The “direction” of the symmetry breaking (accounted for by a mathematical term that doesn’t affect the underlying physics) is totally arbitrary and is chosen randomly. And for the most part, it doesn’t matter.",{"type":378,"tag":379,"props":914,"children":915},{},[916],{"type":390,"value":917},"But let’s look at another analogy to see why it sometimes might. Liquid water has more degrees of freedom—more symmetry—than a rigid block of ice. When water begins its phase transition and freezes, the molecules of water have to decide which direction to start building its crystal lattice. In other words, the water must break its fundamental symmetry when it reaches a lower-energy state, but the way that symmetry is broken is indiscriminate. The ice crystals could form in a left-right direction, for example, or just as equally in an up-down direction (I’m simplifying how ice crystals form, of course, just to move past this analogy as quickly as possible). It doesn’t matter which direction the water molecules choose; either way, you get ice.",{"type":378,"tag":846,"props":919,"children":921},{"id":920},"a-cosmic-string-is-a-flaw-in-spacetime-a-blemish-in-the-fabric-of-the-universe",[922],{"type":390,"value":923},"A cosmic string is a flaw in spacetime, a blemish in the fabric of the Universe.",{"type":378,"tag":379,"props":925,"children":926},{},[927],{"type":390,"value":928},"But what if one part of the water starts freezing in an up-down direction, while another part of the water starts freezing in a left-right fashion? Eventually, you’ll have two sets of water molecules arranged in different orientations. Where these two sets meet, there will be a domain wall, a boundary between the two regimes that appears visible to us as a crack or flaw in the ice-cube. Go ahead, open your freezer and check it out: broken symmetries made manifest.",{"type":378,"tag":379,"props":930,"children":931},{},[932],{"type":390,"value":933},"This can happen with any phase transition, including the ones in the infant Universe that triggered the splintering of the forces. Different regions of the Universe could have broken their symmetries in different ways. No matter what, throughout the Universe, you get the same fundamental forces operating in the same way, but those little mathematical terms that don’t affect the physics can take on different values from place to place. Just as in ice, when those regions meet, you get cracks. Defects. Flaws in spacetime itself.",{"type":378,"tag":846,"props":935,"children":937},{"id":936},"life-at-the-edge",[938],{"type":390,"value":939},"Life at the edge",{"type":378,"tag":379,"props":941,"children":942},{},[943],{"type":390,"value":944},"Cosmic strings can take on various hypothetical properties depending on exactly which phase transition spawned them and how that particular phase transition played out. But all cosmic strings share one thing in common: tension. A lot of it.",{"type":378,"tag":379,"props":946,"children":947},{},[948],{"type":390,"value":949},"A cosmic string is a flaw in spacetime, a blemish in the fabric of the Universe. Cosmic strings pull and pinch on spacetime all along their lengths, like creases in a piece of paper. This creasing manifests as a deficit in the usual amount of spacetime around an object. If you circumnavigate a pencil, the circle you draw will add up to 360 degrees. That’s kind of the definition of a circle. But if you circumnavigate a cosmic string, the space around it is so distorted that when you complete your journey and return to your starting point, you'll find that you traveled less than the usual 360 degrees.",{"type":378,"tag":379,"props":951,"children":952},{},[953],{"type":390,"value":954},"In general relativity, you can’t bend spacetime without a source of mass or energy. In the case of cosmic strings, this energy comes from the enormous amount of tension built into the cosmic string itself. It is, after all, pinching two regions of spacetime together.",{"type":378,"tag":379,"props":956,"children":957},{},[958],{"type":390,"value":959},"Tension is a form of energy, and if you get a lot of energy together, you get mass, so despite being made of nothing but spacetime itself, the strings have mass. The typical mass of a cosmic string depends on many theoretical factors, but a good rule of thumb is that a kilometer of cosmic string can outweigh the entire planet Earth.",{"type":378,"tag":379,"props":961,"children":962},{},[963],{"type":390,"value":964},"In terms of dimensions, cosmic strings are likely no wider than a proton, although the precise size is governed by which phase transition triggered their formation. As to their lengths, well, that can be a bit complicated, as cosmic strings can lead very interesting lives.",{"type":378,"tag":379,"props":966,"children":967},{},[968],{"type":390,"value":969},"Because cosmic strings are where two regions of the broken Universe meet, and that same Universe continually expands, at a first approximation, cosmic strings simply span the entire observable Universe. But strings are also dynamic, and if the Universe can produce one string, there’s no reason it can’t produce an entire network of them.",{"type":378,"tag":379,"props":971,"children":972},{},[973],{"type":390,"value":974},"When cosmic strings intersect, they split each other at the intersection point, breaking larger strings into smaller ones. Occasionally, a string can loop around itself—when that happens, the loop rifts off, wandering away and leaving a shorter parent string behind.",{"type":378,"tag":379,"props":976,"children":977},{},[978],{"type":390,"value":979},"So a collection of strings born in the early Universe may quickly evolve into a network of cosmos-spanning lengths, shorter segments, and free-floating loops.",{"type":378,"tag":846,"props":981,"children":983},{"id":982},"searching-for-flaws",[984],{"type":390,"value":985},"Searching for flaws",{"type":378,"tag":379,"props":987,"children":988},{},[989],{"type":390,"value":990},"In fact, it was just a few decades ago that cosmologists thought that such a cosmic string network provided the backbone for the large-scale structure of the Universe. At the very largest scales in the cosmos, galaxies form clusters and superclusters in a web-like pattern known as… well, the cosmic web. The cosmic web vaguely looks like a network of strings, so cosmologists openly wondered if the two were linked. Early in the history of the Universe, the thinking went, the cosmic strings generated the slight gravitational pull that would allow matter to accumulate near them, creating a skeletal framework that would eventually give rise to large collections of superclusters.",{"type":378,"tag":379,"props":992,"children":993},{},[994],{"type":390,"value":995},"Alas, further analysis of the cosmic web and detailed images of the cosmic microwave background—the afterglow light pattern generated when our Universe transitioned from a plasma to a neutral state when it was 380,000 years old—ruled out the contribution of cosmic strings. Those kinds of networks just didn’t have the right kind of statistical properties to explain the distribution of matter at large scales.",{"type":378,"tag":379,"props":997,"children":998},{},[999],{"type":390,"value":1000},"But there might be other ways to find cosmic strings. One is through direct, simple observation. Massive objects bend the path of light. Like looking in a funhouse mirror or through a distorted piece of glass, we can see multiple images of the same background object. Take, for instance, clusters of galaxies. We routinely see background galaxies appear in multiple places, the light from a single source twisting, contorting, and repeating in fanciful ways.",{"type":378,"tag":379,"props":1002,"children":1003},{},[1004],{"type":390,"value":1005},"Searches for giant cosmic lightsabers sweeping through the Universe haven’t found anything.\nIf a cosmic string sits between us and a distant galaxy, we will see two copies of the same image, split by the gravity of the string. Sadly, extensive efforts to find such double-images have come up empty.",{"type":378,"tag":379,"props":1007,"children":1008},{},[1009],{"type":390,"value":1010},"It likely goes without saying that you don’t want to encounter a cosmic string up close and personal; with that amount of tension, density, and energy, it could simply cut through you like a hot knife through butter. Since searches for chopped-up stars and planets will probably not be fruitful (because we have no idea what would happen and hence what to look for), we have to find other ways that strings interact with the Universe around them. There are many ways that strings can potentially couple to the Standard Model of particle physics: They might directly emit electromagnetic radiation, or they might spawn short-lived massive particles that then decay into showers of photons, neutrinos, antiparticles, and more. Depending on the theory backing them, cosmic strings may glow in all sorts of ways. But once again, searches for giant cosmic lightsabers sweeping through the Universe haven’t found anything.",{"type":378,"tag":379,"props":1012,"children":1013},{},[1014],{"type":390,"value":1015},"The last-ditch effort to find evidence for cosmic strings is through gravitational waves. A single, straight cosmic string won’t emit gravitational waves, but when two strings meet (or when a string crosses over itself), the pinch at the point of intersection forms a cusp. This cusp travels down the length of the string at nearly the speed of light, emitting a burst of gravitational waves in the process (and, in some models, a beam of radiation or high-energy particles along with it). While unbroken string segments can last basically forever, loops of strings wiggle furiously, emitting tremendous amounts of gravitational waves as they shrink and eventually disappear.",{"type":378,"tag":379,"props":1017,"children":1018},{},[1019],{"type":390,"value":1020},"Since the hypothetical string network, born in the early Universe, has undergone billions of years of pinching, looping, and wiggling, a portion of all the gravitational waves currently washing over the Earth should be caused by them. But once again, after decades of searching, there’s been no conclusive signal—not from the sharp burst of a traveling cusp, not from the general background hum from disintegrating.",{"type":378,"tag":379,"props":1022,"children":1023},{},[1024],{"type":390,"value":1025},"What’s going on? Cosmic strings appear to be a generic prediction of our (admittedly fuzzy) understanding of the early Universe. We may not know exactly what went down all those billions of years ago, but we’re fairly certain that it involved phase transitions and that those phase transitions should support the existence of topological defects like cosmic strings.",{"type":378,"tag":379,"props":1027,"children":1028},{},[1029],{"type":390,"value":1030},"And even though cosmic strings initially had nothing to do with their cousins, the strings found in string theory (which were deliberately called superstrings to set them apart from cosmic strings), recent theoretical work has found that in some cases, superstrings can grow from sub-Planckian lengths to gargantuan sizes, becoming cosmic strings in the process. A confirmed discovery of cosmic strings may well lend credence to string theory itself.",{"type":378,"tag":379,"props":1032,"children":1033},{},[1034],{"type":390,"value":1035},"So we’re in a situation where we strongly suspect that there should be cosmic strings riddled throughout the Universe. And yet decades of direct and indirect searches haven’t found any. At all. We’re left with two conclusions. Either our understanding of the physics of the early Universe is way off base and cosmic strings aren’t nearly as generic as we think they are, or we’re not understanding how cosmic strings manifest themselves in the modern-day cosmos and our observations are missing something.",{"type":378,"tag":379,"props":1037,"children":1038},{},[1039],{"type":390,"value":1040},"Or both. Both is definitely an option. Feel free to insert your own strings-twisted-in-knots pun here.",{"type":378,"tag":430,"props":1042,"children":1044},{"id":1043},"october-2022",[1045],{"type":390,"value":1046},"October 2022",{"type":378,"tag":379,"props":1048,"children":1049},{},[1050],{"type":378,"tag":383,"props":1051,"children":1054},{"href":1052,"rel":1053},"https://www.nytimes.com/2022/10/10/science/black-holes-cosmology-hologram.html",[387],[1055],{"type":390,"value":1056},"nytimes article on black holes and the holographic principle",{"type":378,"tag":379,"props":1058,"children":1059},{},[1060],{"type":390,"value":1061},"Wormholes are Eistein-Rosen bridges (Nathan Rosen).",{"type":378,"tag":379,"props":1063,"children":1064},{},[1065],{"type":390,"value":1066},"Hooft and Susskind - maybe black holes encode info like holograms.",{"type":378,"tag":379,"props":1068,"children":1069},{},[1070],{"type":390,"value":1071},"Bekenstein - Hawking rival who set limit on amount of info that can be encoded in a volume. 10^-33 (Planck length).",{"type":378,"tag":743,"props":1073,"children":1074},{},[1075],{"type":378,"tag":379,"props":1076,"children":1077},{},[1078],{"type":390,"value":1079},"“This is what we found out about Nature’s bookkeeping system,” Dr. ’t Hooft wrote in 1993. “The data can be written onto a surface, and the pen with which the data are written has a finite size.”",{"type":378,"tag":1081,"props":1082,"children":1083},"hr",{},[],{"type":378,"tag":743,"props":1085,"children":1086},{},[1087,1092],{"type":378,"tag":379,"props":1088,"children":1089},{},[1090],{"type":390,"value":1091},"Ahmed Almheiri, a physicist at N.Y.U. Abu Dhabi, noted recently that by manipulating radiation that had escaped a black hole, he could create a cat inside that black hole. “I can do something with the particles radiating from the black hole, and suddenly a cat is going to appear in the black hole,” he said.",{"type":378,"tag":379,"props":1093,"children":1094},{},[1095],{"type":390,"value":1096},"He added, “We all have to get used to this.”",{"type":378,"tag":430,"props":1098,"children":1100},{"id":1099},"january-2023",[1101],{"type":390,"value":1102},"January 2023",{"type":378,"tag":379,"props":1104,"children":1105},{},[1106],{"type":378,"tag":383,"props":1107,"children":1110},{"href":1108,"rel":1109},"https://arstechnica.com/science/2023/01/requiem-for-a-string-charting-the-rise-and-fall-of-a-theory-of-everything/?comments=1",[387],[1111],{"type":390,"value":1112},"String Theory",{"type":378,"tag":718,"props":1114,"children":1116},{"id":1115},"requiem-for-a-string-charting-the-rise-and-fall-of-a-theory-of-everything",[1117],{"type":390,"value":1118},"Requiem for a string: Charting the rise and fall of a theory of everything",{"type":378,"tag":846,"props":1120,"children":1122},{"id":1121},"string-theory-was-supposed-to-explain-all-of-physics-what-went-wrong",[1123],{"type":390,"value":1124},"String theory was supposed to explain all of physics. What went wrong?",{"type":378,"tag":379,"props":1126,"children":1127},{},[1128],{"type":390,"value":1129},"Paul Sutter - 1/27/2023, 7:30 AM",{"type":378,"tag":379,"props":1131,"children":1132},{},[1133],{"type":390,"value":1134},"Requiem for a string: Charting the rise and fall of a theory of everything\nAurich Lawson | Getty Images\nString theory began over 50 years ago as a way to understand the strong nuclear force. Since then, it’s grown to become a theory of everything, capable of explaining the nature of every particle, every force, every fundamental constant, and the existence of the Universe itself. But despite decades of work, it has failed to deliver on its promise.",{"type":378,"tag":379,"props":1136,"children":1137},{},[1138],{"type":390,"value":1139},"What went wrong, and where do we go from here?",{"type":378,"tag":846,"props":1141,"children":1143},{"id":1142},"beginning-threads",[1144],{"type":390,"value":1145},"Beginning threads",{"type":378,"tag":379,"props":1147,"children":1148},{},[1149],{"type":390,"value":1150},"Like most revolutions, string theory had humble origins. It started in the 1960s as an attempt to understand the workings of the strong nuclear force, which had only recently been discovered. Quantum field theory, which had been used successfully to explain electromagnetism and the weak nuclear force, wasn’t cutting it, so physicists were eager for something new.",{"type":378,"tag":379,"props":1152,"children":1153},{},[1154],{"type":390,"value":1155},"A group of physicists took a mathematical technique developed (and later abandoned) by quantum godfather Werner Heisenberg and expanded it. In that expansion, they found the first strings—mathematical structures that repeated themselves in spacetime. Unfortunately, this proto-string theory made incorrect predictions about the nature of the strong force and also had a variety of troublesome artifacts (like the existence of tachyons, particles that only traveled faster than light). Once another theory was developed to explain the strong force—the one we use today, based on quarks and gluons—string theory faded from the scene.",{"type":378,"tag":379,"props":1157,"children":1158},{},[1159],{"type":390,"value":1160},"But again, like most revolutions, whispers remained through the years, keeping hopes alive. In the 1970s, physicists uncovered several remarkable properties of string theory. One, the theory could support more forces than just the strong nuclear force. The strings in string theory had enormous tension, forcing them to curl up on themselves into the smallest possible volume, something around the Planck scale. Once in place, the strings could support various vibrations, just like a taut guitar string. The different vibrations led to different manifestations of forces: one note for strong nuclear, another for electromagnetism, and so on.",{"type":378,"tag":379,"props":1162,"children":1163},{},[1164],{"type":390,"value":1165},"One of the possible vibrations of the string acted like a massless spin-2 particle. This is a very special particle because that would be the quantum force carrier of the gravitational force, the holy grail of a quantized theory of gravity. The theorists at the time couldn’t believe their chalkboards: String theory naturally, elegantly included quantum gravity, and they weren’t even trying!",{"type":378,"tag":379,"props":1167,"children":1168},{},[1169],{"type":390,"value":1170},"The second big deal to come out in the 1970s was the introduction of supersymmetry, which claimed that all the particles that carry forces (called bosons, a category that includes photons and gluons) were linked to a supersymmetric partner from the collection of particles that build stuff (called fermions, like electrons and quarks), and vice versa.",{"type":378,"tag":379,"props":1172,"children":1173},{},[1174],{"type":390,"value":1175},"This symmetry doesn’t appear in everyday settings; it only manifests at extremely high energies. So if you were to go back in time to the earliest moments of the Big Bang or had enough funding to build a particle collider along the orbit of Jupiter, you wouldn’t just see the normal zoo of particles we’re familiar with; you'd see all their supersymmetric partners, too. These were given suitably stupid names, like selectrons, sneutrinos, squarks, photinos, and my personal (least) favorite, the wino boson.",{"type":378,"tag":379,"props":1177,"children":1178},{},[1179],{"type":390,"value":1180},"By making this connection, string theory could build a bridge from the bosons to the fermions, allowing it to leap from just a theory of forces to a theory of every single particle in existence. The introduction of supersymmetry also solved the nasty problem of tachyons by replacing those troublesome particles with supersymmetric partners, which was a nice flourish.",{"type":378,"tag":379,"props":1182,"children":1183},{},[1184],{"type":390,"value":1185},"At the end of the 1970s, string theory could potentially explain all the particles and all the interactions among them and provide a quantum solution to gravity.",{"type":378,"tag":379,"props":1187,"children":1188},{},[1189],{"type":390,"value":1190},"One theory to rule them all, one theory to find them, one theory to bring them all, and in the stringiness bind them.",{"type":378,"tag":846,"props":1192,"children":1194},{"id":1193},"a-string-perturbed",[1195],{"type":390,"value":1196},"A string perturbed",{"type":378,"tag":379,"props":1198,"children":1199},{},[1200],{"type":390,"value":1201},"It’s been almost half a century since physicists first realized that string theory could potentially provide a theory of everything. Despite decades of work involving hundreds of scientists over several (academic) generations and countless papers, conferences, and workshops, string theory hasn't quite lived up to that potential.",{"type":378,"tag":379,"props":1203,"children":1204},{},[1205],{"type":390,"value":1206},"One of the biggest issues involves the way that strings interact with each other. A major pain in the asymptote when it comes to quantum theory is the infinite variety of ways that particles can interact. It’s easy enough to write down the fundamental governing equations that describe an interaction, but the math tends to blow up when we actually try to use it. In string theory, fundamental particles aren’t particles at all; they’re tiny loops of vibrating… well, strings. When we see two particles bouncing off each other, for example, it’s really two strings briefly merging and then separating. That sounds super cool, but there are still an infinite number of ways that process can unfold.",{"type":378,"tag":379,"props":1208,"children":1209},{},[1210],{"type":390,"value":1211},"Unlike its quantum cousins, when it comes to string theory, we have no fundamental theory—we have only a set of approximation and perturbation methods. We’re not exactly sure if our approximations are good ones or if we’re way off the mark. We have perturbation techniques, but we’re not sure what we’re perturbing from. In other words, there’s no such thing as string theory, just approximations of what we hope string theory could be.",{"type":378,"tag":379,"props":1213,"children":1214},{},[1215],{"type":390,"value":1216},"The second major difficulty involves the vibrations of the strings themselves. Early on, physicists realized that the strings had to vibrate in more than three dimensions of space if they were to explain the full variety of forces and particles in the Universe. 3D was just too limiting; it constricted the number of potential vibrations so severely that it was no longer a theory of everything, just a theory of some things, which isn’t nearly as exciting.",{"type":378,"tag":379,"props":1218,"children":1219},{},[1220],{"type":390,"value":1221},"The earliest versions of string theory needed 26 spatial dimensions, but after supersymmetry and some dimensional layoffs, theorists were able to slim that number down to “only” 10.",{"type":378,"tag":379,"props":1223,"children":1224},{},[1225],{"type":390,"value":1226},"Now, the Universe doesn’t have 10 spatial dimensions, at least on large scales, because we would have noticed them by now. So all the extra dimensions have to be tiny and curled up on themselves. When you wave your arm in front of you, you’re traversing these tiny dimensions countless times, but they’re so small (typically at the Planck scale) that you don’t notice them.",{"type":378,"tag":379,"props":1228,"children":1229},{},[1230],{"type":390,"value":1231},"The extra dimensions give the strings enough vibrational options to explain all of physics. And the variety of shapes those dimensions can take as they curl up on themselves are known as Calabi-Yau manifolds. If you curl a piece of paper up on itself, you have a few choices: you can connect just one pair of edges (a cylinder) or both pairs (a delicious doughnut), you can introduce one flip (a Mobius strip) or two (a Klein bottle), and so on. That’s only two dimensions. With six, you have somewhere between 10,500 and 1,010,000 possible options.\nWe care about all these possible shapes because the way the extra spatial dimensions curl up determines the possible set of vibrations of the strings—each shape produces a different set of string vibrations, like different musical instruments. A tuba sounds different from a saxophone because of the way it’s structured and the kind of vibrations it can support. But our Universe is only a single instrument (an oboe, perhaps) with a single set of “notes” that correspond to our suite forces and particles.",{"type":378,"tag":379,"props":1233,"children":1234},{},[1235],{"type":390,"value":1236},"So which one of the zillions of potential Calabi-Yau structures corresponds to our reality? We don’t know. Because we don’t have a full accounting of string theory, only approximations, we don’t know how the shape of the curled-up dimensions affects the string vibrations. We have no reliable machinery that goes from a given Calabi-Yau manifold to the physics that appears in that universe, so we can’t run the reverse operation and use our unique experience of physics to discover the shape of the curled-up dimensions.",{"type":378,"tag":846,"props":1238,"children":1240},{"id":1239},"supersymmetry-super-headaches",[1241],{"type":390,"value":1242},"Supersymmetry super-headaches",{"type":378,"tag":379,"props":1244,"children":1245},{},[1246],{"type":390,"value":1247},"It gets worse. By the early 1990s, string theorists had developed not one, not two, but five different versions of string theory. The variations were based on how a fundamental string was treated. In some versions, all strings had to form closed loops; in others, they could be open. In some, the vibrations could only travel in one direction; in others, they could travel both, and so on. For the curious (and those eager for edgy names for your kids) the five string theories are Type 1, Type IIA, Type IIB, SO(32) heterotic, and E8xE8 heterotic.",{"type":378,"tag":379,"props":1249,"children":1250},{},[1251],{"type":390,"value":1252},"So now we have a slight embarrassment of riches. Five potential theories, all claiming to be the best approximation of the true string theory. That’s pretty awkward, but in the 1990s, physicist Edward Witten declared a winner: all of them.",{"type":378,"tag":379,"props":1254,"children":1255},{},[1256],{"type":390,"value":1257},"He discovered dualities, which are mathematical relationships between theories that allow you to transform one to the other. In this case, Witten tied the five string theories into a single knot. This idea has yet to be mathematically proven, but it indicates that the five string theories are really manifestations of a single, unified-for-real-this-time string theory, which Witten called M-theory. We don’t know what M-theory is—or even what the “M” stands for (my vote is “Manchego”)—but it should be the actual string theory.",{"type":378,"tag":379,"props":1259,"children":1260},{},[1261],{"type":390,"value":1262},"That’s potentially very useful since once we determine whether our approximation schemes are valid, all the five versions of string theory should converge on it, and our Universe should pop out of the math.",{"type":378,"tag":379,"props":1264,"children":1265},{},[1266],{"type":390,"value":1267},"But that was almost 30 years ago, and we still don’t know what M-theory is. We still haven’t figured out a solution for string theory.",{"type":378,"tag":379,"props":1269,"children":1270},{},[1271],{"type":390,"value":1272},"To be clear, our inability to understand string theory isn’t limited by experiment. Even if we could build a super-duper-collider experiment that achieved the energies necessary to unlock quantum gravity, we still wouldn’t be able to test string theory because we have no string theory. We have no mathematical model that can make reliable predictions, only approximations that we hope accurately represent the true physics. We can test those approximations, I guess, but it won’t help us determine the inner workings of the true model.",{"type":378,"tag":379,"props":1274,"children":1275},{},[1276],{"type":390,"value":1277},"Even so, the experiments we do have aren’t exactly helping. When supersymmetry was developed by the string theory community in the 1970s, it proved to be such a popular idea that many particle physicists took it as their own, using those techniques to develop models of high-energy physics beyond the Standard Model.",{"type":378,"tag":379,"props":1279,"children":1280},{},[1281],{"type":390,"value":1282},"Supersymmetry isn’t a single theory; it's a family of theories. They all share the same core principle: that bosons and fermions are partners of each other at high enough energies. But the details of the interactions are left as a homework exercise for each individual theorist. Some supersymmetric theories are relatively (and that’s putting a lot of work on the word) straightforward, while others are more complex. Either way, in the 1990s, physicists became so convinced the supersymmetry was super-terrific that they devised a super-powerful collider to test it out: the Large Hadron Collider.",{"type":378,"tag":379,"props":1284,"children":1285},{},[1286],{"type":390,"value":1287},"The beams of the LHC began their first test operations in 2008 with two main science goals in mind: finding the elusive Higgs boson and finding evidence of supersymmetry.",{"type":378,"tag":379,"props":1289,"children":1290},{},[1291],{"type":390,"value":1292},"Four years later, the Higgs was found. Supersymmetry was not. It’s now 15 years later, and there are still no signs of supersymmetry.",{"type":378,"tag":379,"props":1294,"children":1295},{},[1296],{"type":390,"value":1297},"In fact, all the “easy” versions of supersymmetry have been ruled out, and many of the more complicated ones, too. The dearth of evidence has slaughtered so many members of the supersymmetric family that the whole idea is on very shaky ground, with physicists beginning to have conferences with titles like “Beyond Supersymmetry” and “Oh My God, I Think I Wasted My Career.”",{"type":378,"tag":379,"props":1299,"children":1300},{},[1301],{"type":390,"value":1302},"Where does that leave string theory? Well, since (and I’ll never stop reminding you of this) there is no string theory, only approximations, it’s not quite pining-for-the-fjords dead yet. It’s possible to build a version of string theory without using supersymmetry… maybe. The math gets even thornier and the approximations even sketchier, though. Without supersymmetry, string theory isn’t gone, but it’s certainly on life support.",{"type":378,"tag":846,"props":1304,"children":1306},{"id":1305},"duality-of-the-fates",[1307],{"type":390,"value":1308},"Duality of the fates",{"type":378,"tag":379,"props":1310,"children":1311},{},[1312],{"type":390,"value":1313},"After 50 years of work on a theory of everything, we’re left with approximate theories that seem so tantalizingly close to explaining all of physics… and yet always out of reach. Work continues on finding the underlying dualities that link the different versions of string theory, trying to suss out the mysterious M-theory that might underlie them all. Improvements to perturbation theory and approximation schemes provide some hope for making a breakthrough to link the dimensional structure of the extra dimensions to predictable physics. Routes around the damage caused by the LHC’s lack of evidence for supersymmetry continue to be laid.",{"type":378,"tag":379,"props":1315,"children":1316},{},[1317],{"type":390,"value":1318},"In response to our inability to choose which Calabi-Yau manifold corresponds to our Universe—and more importantly, why our Universe has that manifold rather than any of the other ones—some string theorists appeal to what you might call the landscape. They argue that all possible configurations of compact dimensions are realized, each one with its own unique universe and set of physical laws, and we happen to live in this one because life would be impossible in most or all of the others. That’s not the strongest argument to come out of physics, but I’ll save a dissection of the idea for another day.",{"type":378,"tag":379,"props":1320,"children":1321},{},[1322],{"type":390,"value":1323},"We don’t have a string theory, so we can’t test it. But it might be possible to perform experiments on string theory-adjacent ideas, and there’s been some progress on that front. Perhaps the event of inflation, which occurred immediately after the Big Bang, can teach us about string theory (or the formation of Universe-spanning cosmic strings). And perhaps there’s more to the dualities than we initially thought.",{"type":378,"tag":379,"props":1325,"children":1326},{},[1327],{"type":390,"value":1328},"Recently, theorists have proposed another duality, the AdS/CFT correspondence. It’s not exactly string theory, but the idea is certainly sponsored by it. This correspondence proposes that you can write down a string theory in a special three-dimensional setting and connect it to a special kind of quantum theory on its two-dimensional boundary. In principle, the correspondence should allow you to transform your impossible-to-solve string theory problem into a merely really-difficult-to-solve quantum problem (or vice versa, allowing you to use some of the mathematical tools developed in string theory to solve your thorny quantum problem).",{"type":378,"tag":379,"props":1330,"children":1331},{},[1332],{"type":390,"value":1333},"The AdS/CFT correspondence has found some limited applications, but its full utility remains unclear. And while the AdS/CFT correspondence has yet to be proven, theorists claim it should be possible soon (although they said the same thing about string theory itself during the Reagan administration).",{"type":378,"tag":379,"props":1335,"children":1336},{},[1337],{"type":390,"value":1338},"Most string theorists of the modern era don’t work on string theory directly but instead mostly on the AdS/CFT correspondence and its implications, hoping that continuing to probe that mathematical relationship will unlock some hidden insight into the workings of a theory of everything.",{"type":378,"tag":379,"props":1340,"children":1341},{},[1342],{"type":390,"value":1343},"I wish them luck.",{"title":369,"searchDepth":486,"depth":486,"links":1345},[1346,1348,1349,1350,1351,1352,1353],{"id":720,"depth":1347,"text":723},3,{"id":738,"depth":1347,"text":741},{"id":765,"depth":1347,"text":768},{"id":780,"depth":1347,"text":783},{"id":806,"depth":1347,"text":814},{"id":1043,"depth":486,"text":1046},{"id":1099,"depth":486,"text":1102,"children":1354},[1355],{"id":1115,"depth":1347,"text":1118},"content:notes-to-self:science-to-exploit-and-mangle-for-fiction.md","notes-to-self/science-to-exploit-and-mangle-for-fiction.md","notes-to-self/science-to-exploit-and-mangle-for-fiction",{"_path":1360,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":152,"description":1361,"slug":153,"date":1362,"dateString":1363,"encrypted":368,"encryptedBody":373,"body":1364,"_type":490,"_id":1570,"_source":492,"_file":1571,"_stem":1572,"_extension":495},"/notes-to-self/jobs","A GitHub repo of jobs listings with bounties",1579107600000,"January 15, 2020",{"type":375,"children":1365,"toc":1568},[1366,1370,1379,1384,1389,1424,1442,1447,1452,1461,1471,1481,1498,1503,1508,1516,1537,1548,1559],{"type":378,"tag":379,"props":1367,"children":1368},{},[1369],{"type":390,"value":1361},{"type":378,"tag":379,"props":1371,"children":1372},{},[1373],{"type":378,"tag":383,"props":1374,"children":1377},{"href":1375,"rel":1376},"https://news.ycombinator.com/item?id=22055125",[387],[1378],{"type":390,"value":1375},{"type":378,"tag":379,"props":1380,"children":1381},{},[1382],{"type":390,"value":1383},"\"A place to look for a job is up statement.com\" …?",{"type":378,"tag":379,"props":1385,"children":1386},{},[1387],{"type":390,"value":1388},"Triplebyte",{"type":378,"tag":1390,"props":1391,"children":1392},"ul",{},[1393,1404,1409,1414,1419],{"type":378,"tag":1394,"props":1395,"children":1396},"li",{},[1397],{"type":378,"tag":383,"props":1398,"children":1401},{"href":1399,"rel":1400},"http://www.usds.gov/apply",[387],[1402],{"type":390,"value":1403},"www.usds.gov/apply",{"type":378,"tag":1394,"props":1405,"children":1406},{},[1407],{"type":390,"value":1408},"upwork",{"type":378,"tag":1394,"props":1410,"children":1411},{},[1412],{"type":390,"value":1413},"fiverr",{"type":378,"tag":1394,"props":1415,"children":1416},{},[1417],{"type":390,"value":1418},"solidgigs",{"type":378,"tag":1394,"props":1420,"children":1421},{},[1422],{"type":390,"value":1423},"flexjobs",{"type":378,"tag":379,"props":1425,"children":1426},{},[1427,1434,1435],{"type":378,"tag":383,"props":1428,"children":1431},{"href":1429,"rel":1430},"https://ae.studio/hiring-full-stack-developer",[387],[1432],{"type":390,"value":1433},"ae.studio",{"type":390,"value":411},{"type":378,"tag":383,"props":1436,"children":1439},{"href":1437,"rel":1438},"https://hirehackernews.com",[387],[1440],{"type":390,"value":1441},"hirehackernews",{"type":378,"tag":379,"props":1443,"children":1444},{},[1445],{"type":390,"value":1446},"Remote but React specific",{"type":378,"tag":379,"props":1448,"children":1449},{},[1450],{"type":390,"value":1451},"facet.net looks nice",{"type":378,"tag":379,"props":1453,"children":1454},{},[1455],{"type":378,"tag":383,"props":1456,"children":1459},{"href":1457,"rel":1458},"https://www.remoteimpact.io/remote-jobs?term=swift&impact=&location=",[387],[1460],{"type":390,"value":1457},{"type":378,"tag":379,"props":1462,"children":1463},{},[1464],{"type":378,"tag":383,"props":1465,"children":1468},{"href":1466,"rel":1467},"https://news.ycombinator.com/item?id=26854130",[387],[1469],{"type":390,"value":1470},"Questions to ask a hiring manager",{"type":378,"tag":379,"props":1472,"children":1473},{},[1474],{"type":378,"tag":383,"props":1475,"children":1478},{"href":1476,"rel":1477},"https://news.ycombinator.com/item?id=27097426",[387],[1479],{"type":390,"value":1480},"Ask HN: Where to find contract work as a developer?",{"type":378,"tag":379,"props":1482,"children":1483},{},[1484,1490,1492],{"type":378,"tag":383,"props":1485,"children":1488},{"href":1486,"rel":1487},"https://haseebq.com/my-ten-rules-for-negotiating-a-job-offer/",[387],[1489],{"type":390,"value":1486},{"type":390,"value":1491}," Ten Rules for Negotiating a Job Offer ",{"type":378,"tag":383,"props":1493,"children":1496},{"href":1494,"rel":1495},"https://news.ycombinator.com/item?id=27160934",[387],[1497],{"type":390,"value":1494},{"type":378,"tag":379,"props":1499,"children":1500},{},[1501],{"type":390,"value":1502},"indiehackers.com - partner finding, people looking for CTOs",{"type":378,"tag":379,"props":1504,"children":1505},{},[1506],{"type":390,"value":1507},"Devastatingly succinct version of why you are leaving your job:",{"type":378,"tag":743,"props":1509,"children":1510},{},[1511],{"type":378,"tag":379,"props":1512,"children":1513},{},[1514],{"type":390,"value":1515},"For example, let’s say you are trying to figure out “How can I have a great, fulfilling career?” Instead, ask yourself “How can I have a terrible, worthless career?” and whittle away at the choices that you know will ensure that outcome: Stay in a dying industry. Stay ignorant of emerging technology. Continue to be a rent-taker as opposed to adding value. Prioritize near-term income over long-term value. Continue working with people that treat you poorly. Continue to think like a junior team resource. Be reactive to opportunity as opposed to proactive. And so on.",{"type":378,"tag":379,"props":1517,"children":1518},{},[1519,1526,1528,1535],{"type":378,"tag":383,"props":1520,"children":1523},{"href":1521,"rel":1522},"https://historyofyesterday.com/suppose-i-wanted-to-kill-a-lot-of-pilots-f126bbc756fa",[387],[1524],{"type":390,"value":1525},"via",{"type":390,"value":1527}," which happens to be ",{"type":378,"tag":383,"props":1529,"children":1532},{"href":1530,"rel":1531},"https://news.ycombinator.com/item?id=27720912",[387],[1533],{"type":390,"value":1534},"via hacker news",{"type":390,"value":1536}," which happens to have great comments on software project estimation",{"type":378,"tag":379,"props":1538,"children":1539},{},[1540,1542],{"type":390,"value":1541},"Non full time Show HN: Side Quest – An aggregator for not full-time tech jobs ",{"type":378,"tag":383,"props":1543,"children":1546},{"href":1544,"rel":1545},"https://news.ycombinator.com/item?id=27749497",[387],[1547],{"type":390,"value":1544},{"type":378,"tag":379,"props":1549,"children":1550},{},[1551,1557],{"type":378,"tag":383,"props":1552,"children":1555},{"href":1553,"rel":1554},"https://hired.com/join",[387],[1556],{"type":390,"value":1553},{"type":390,"value":1558}," (saw via ad)",{"type":378,"tag":379,"props":1560,"children":1561},{},[1562],{"type":378,"tag":383,"props":1563,"children":1566},{"href":1564,"rel":1565},"https://www.streak.com/careers/product-engineer",[387],[1567],{"type":390,"value":1564},{"title":369,"searchDepth":486,"depth":486,"links":1569},[],"content:notes-to-self:jobs.md","notes-to-self/jobs.md","notes-to-self/jobs",{"_path":1574,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":146,"description":1575,"slug":147,"date":1576,"dateString":1577,"encrypted":368,"encryptedBody":373,"body":1578,"_type":490,"_id":1755,"_source":492,"_file":1756,"_stem":1757,"_extension":495},"/notes-to-self/javascript-crypto","You were looking for a way to incorporate libsodium, including using it in a web worker. The purpose is to be able to have concealed (secret) content on a static site (this site, Notes to Self), where the content needs to be served to anonymous visitors, but only readable by visitors with a given password.",1578934800000,"January 13, 2020",{"type":375,"children":1579,"toc":1753},[1580,1593,1598,1628,1642,1647,1659,1664,1669,1674,1685,1690,1699,1708,1717,1726,1731,1739,1744],{"type":378,"tag":379,"props":1581,"children":1582},{},[1583,1585,1591],{"type":390,"value":1584},"You were looking for a way to incorporate libsodium, including using it in a web worker. The purpose is to be able to have concealed (secret) content on a static site (this site, ",{"type":378,"tag":1586,"props":1587,"children":1588},"strong",{},[1589],{"type":390,"value":1590},"Notes to Self",{"type":390,"value":1592},"), where the content needs to be served to anonymous visitors, but only readable by visitors with a given password.",{"type":378,"tag":379,"props":1594,"children":1595},{},[1596],{"type":390,"value":1597},"However, you believe that the last time you incorporated libsodium (~4 years ago?) it may have been more complex. For some reason you were not using/able to use an npm package.",{"type":378,"tag":1390,"props":1599,"children":1600},{},[1601,1610,1619],{"type":378,"tag":1394,"props":1602,"children":1603},{},[1604],{"type":378,"tag":383,"props":1605,"children":1608},{"href":1606,"rel":1607},"https://www.npmjs.com/package/libsodium-wrappers",[387],[1609],{"type":390,"value":1606},{"type":378,"tag":1394,"props":1611,"children":1612},{},[1613],{"type":378,"tag":383,"props":1614,"children":1617},{"href":1615,"rel":1616},"https://stackoverflow.com/questions/47833222/generating-key-pair-from-passphrase-in-libsodium",[387],[1618],{"type":390,"value":1615},{"type":378,"tag":1394,"props":1620,"children":1621},{},[1622],{"type":378,"tag":383,"props":1623,"children":1626},{"href":1624,"rel":1625},"https://blog.patricktriest.com/building-an-encrypted-messenger-with-javascript/",[387],[1627],{"type":390,"value":1624},{"type":378,"tag":379,"props":1629,"children":1630},{},[1631,1633,1640],{"type":390,"value":1632},"Your initial naïve impulse was to use a password to generate a symmetric key — but somehow having that decoded symmetric key sitting in the client's possession seemed reckless. Eventually you realized that libsodium can do exactly what you want — indeed is designed to — and calls this ",{"type":378,"tag":383,"props":1634,"children":1637},{"href":1635,"rel":1636},"https://libsodium.gitbook.io/doc/public-key_cryptography/authenticated_encryption",[387],[1638],{"type":390,"value":1639},"Authenticated Encryption",{"type":390,"value":1641},".",{"type":378,"tag":379,"props":1643,"children":1644},{},[1645],{"type":390,"value":1646},"The example code (in C, copied below) does not quite match the description they provide.",{"type":378,"tag":1648,"props":1649,"children":1653},"pre",{"className":1650,"code":1652,"language":48,"meta":369},[1651],"language-c","#define MESSAGE (const unsigned char *) \"test\"\n#define MESSAGE_LEN 4\n#define CIPHERTEXT_LEN (crypto_box_MACBYTES + MESSAGE_LEN)\n\nunsigned char alice_publickey[crypto_box_PUBLICKEYBYTES];\nunsigned char alice_secretkey[crypto_box_SECRETKEYBYTES];\ncrypto_box_keypair(alice_publickey, alice_secretkey);\n\nunsigned char bob_publickey[crypto_box_PUBLICKEYBYTES];\nunsigned char bob_secretkey[crypto_box_SECRETKEYBYTES];\ncrypto_box_keypair(bob_publickey, bob_secretkey);\n\nunsigned char nonce[crypto_box_NONCEBYTES];\nunsigned char ciphertext[CIPHERTEXT_LEN];\nrandombytes_buf(nonce, sizeof nonce);\nif (crypto_box_easy(ciphertext, MESSAGE, MESSAGE_LEN, nonce,\n                    bob_publickey, alice_secretkey) != 0) {\n    /* error */\n}\n\nunsigned char decrypted[MESSAGE_LEN];\nif (crypto_box_open_easy(decrypted, ciphertext, CIPHERTEXT_LEN, nonce,\n                         alice_publickey, bob_secretkey) != 0) {\n    /* message for Bob pretending to be from Alice has been forged! */\n}\n",[1654],{"type":378,"tag":1655,"props":1656,"children":1657},"code",{"__ignoreMap":369},[1658],{"type":390,"value":1652},{"type":378,"tag":379,"props":1660,"children":1661},{},[1662],{"type":390,"value":1663},"What that code shows is Alice encoding a message for Bob. Alice uses her private key and Bob's public to encrypt it. Bob uses Alice's public key and his private to decrypt it.",{"type":378,"tag":379,"props":1665,"children":1666},{},[1667],{"type":390,"value":1668},"The key pairs can be generated from a seed value, so a password can be hashed to create a seed pair. That's in the client. The client will necessarily possess a private and public key, as well as the generator's public key. But the client keys don't exist until the user types in a password — any password. Only the correct pair, the pair with the public key that matches the public key used to encrypt the content, will allow the client to decrypt the content.",{"type":378,"tag":379,"props":1670,"children":1671},{},[1672],{"type":390,"value":1673},"Your JavaScript version looked like this:",{"type":378,"tag":1648,"props":1675,"children":1680},{"className":1676,"code":1678,"language":1679,"meta":369},[1677],"language-javascript","// create password hashes (to create deterministic key pairs)\nconst clientPasswordHash = sodium.crypto_pwhash(\n  sodium.crypto_box_SEEDBYTES,\n  'client-passw0rd',\n  sodium.from_base64(this.salt),\n  sodium.crypto_pwhash_OPSLIMIT_INTERACTIVE,\n  sodium.crypto_pwhash_MEMLIMIT_INTERACTIVE,\n  sodium.crypto_pwhash_ALG_DEFAULT\n)\nconst generatorPasswordHash = sodium.crypto_pwhash(\n  sodium.crypto_box_SEEDBYTES,\n  'generator-passw0rd',\n  sodium.from_base64(this.salt),\n  sodium.crypto_pwhash_OPSLIMIT_INTERACTIVE,\n  sodium.crypto_pwhash_MEMLIMIT_INTERACTIVE,\n  sodium.crypto_pwhash_ALG_DEFAULT\n)\nconst client = sodium.crypto_box_seed_keypair(clientPasswordHash)\nconst generator = sodium.crypto_box_seed_keypair(generatorPasswordHash)\nconst nonce = sodium.randombytes_buf(sodium.crypto_box_NONCEBYTES)\nconst box = sodium.crypto_box_detached(\n  'the text to encrypt and keep secret,\n  nonce,\n  client.publicKey,\n  generator.privateKey\n)\nconst opened = sodium.crypto_box_open_detached(\n  box.ciphertext,\n  box.mac,\n  nonce,\n  generator.publicKey,\n  client.privateKey,\n  'text'\n)\n","javascript",[1681],{"type":378,"tag":1655,"props":1682,"children":1683},{"__ignoreMap":369},[1684],{"type":390,"value":1678},{"type":378,"tag":379,"props":1686,"children":1687},{},[1688],{"type":390,"value":1689},"Why are you using the \"detached\" flavor of the function instead of \"easy?\" You want to pack the nonce, mac, and encrypted text yourself. The final version looked like this:",{"type":378,"tag":379,"props":1691,"children":1692},{},[1693],{"type":378,"tag":1655,"props":1694,"children":1696},{"className":1695},[],[1697],{"type":390,"value":1698},"generator.js",{"type":378,"tag":1648,"props":1700,"children":1703},{"className":1701,"code":1702,"language":1679,"meta":369},[1677],"function concatBuffers(b1, b2) {\n  const tmp = new Uint8Array(b1.byteLength + b2.byteLength)\n  tmp.set(new Uint8Array(b1), 0)\n  tmp.set(new Uint8Array(b2), b1.byteLength)\n  return tmp\n}\n\nconst salt = sodium.from_base64(config.salt)\nconst generatorPasswordHash = sodium.crypto_pwhash(\n  sodium.crypto_box_SEEDBYTES,\n  config.generatorPassword,\n  salt,\n  sodium.crypto_pwhash_OPSLIMIT_INTERACTIVE,\n  sodium.crypto_pwhash_MEMLIMIT_INTERACTIVE,\n  sodium.crypto_pwhash_ALG_DEFAULT\n)\nconst generator = sodium.crypto_box_seed_keypair(generatorPasswordHash)\nconst clientKey = sodium.from_base64(config.clientPublicKey)\n// ... later: for each post, p\nconst nonce = sodium.randombytes_buf(sodium.crypto_box_NONCEBYTES)\n\nconst box = sodium.crypto_box_detached(\n  p.html,\n  nonce,\n  clientKey,\n  generator.privateKey\n)\nconst header = concatBuffers(nonce, box.mac)\np.encryptedBody = sodium.to_base64(concatBuffers(header, box.ciphertext))\n",[1704],{"type":378,"tag":1655,"props":1705,"children":1706},{"__ignoreMap":369},[1707],{"type":390,"value":1702},{"type":378,"tag":379,"props":1709,"children":1710},{},[1711],{"type":378,"tag":1655,"props":1712,"children":1714},{"className":1713},[],[1715],{"type":390,"value":1716},"decrypt.js",{"type":378,"tag":1648,"props":1718,"children":1721},{"className":1719,"code":1720,"language":1679,"meta":369},[1677],"// for some post p\nlet value = sodium.from_base64(p.encryptedBody)\nconst nonce = value.slice(0, sodium.crypto_box_NONCEBYTES)\nconst mac = value.slice(\n  sodium.crypto_box_NONCEBYTES,\n  sodium.crypto_box_NONCEBYTES + sodium.crypto_box_MACBYTES\n)\nvalue = value.slice(\n  sodium.crypto_box_NONCEBYTES + sodium.crypto_box_MACBYTES\n)\ntry {\n  const opened = sodium.crypto_box_open_detached(\n    value,\n    mac,\n    nonce,\n    // generator public key\n    generator.publicKey,\n    this.privateKey,\n    'text'\n  )\n  // opened is now the decrypted password\n} catch (e) {\n  // something went wrong; bad params or wrong key\n}\n",[1722],{"type":378,"tag":1655,"props":1723,"children":1724},{"__ignoreMap":369},[1725],{"type":390,"value":1720},{"type":378,"tag":379,"props":1727,"children":1728},{},[1729],{"type":390,"value":1730},"With the buffer concat function, and subsequent slicing, we are just putting all the pieces together in a single blob to make it easier to pass around.",{"type":378,"tag":379,"props":1732,"children":1733},{},[1734],{"type":378,"tag":1586,"props":1735,"children":1736},{},[1737],{"type":390,"value":1738},"Not Related to Above Solution, But Still Useful",{"type":378,"tag":379,"props":1740,"children":1741},{},[1742],{"type":390,"value":1743},"Symmetric, \"Secret-key\" cryptography: encrypting and decrypting with a single secret key:",{"type":378,"tag":1648,"props":1745,"children":1748},{"className":1746,"code":1747,"language":1679,"meta":369},[1677],"symmetricEncrypt(value, key) {\n  const nonce = sodium.randombytes_buf(sodium.crypto_box_NONCEBYTES)\n  const encrypted = sodium.crypto_box_easy_afternm(\n    value,\n    nonce,\n    sodium.from_base64(key)\n  )\n  return sodium.to_base64(this.concatBuffers(nonce, encrypted))\n},\nsymmetricDecrypt(value, key) {\n  value = sodium.from_base64(value)\n  const nonce = value.slice(0, sodium.crypto_box_NONCEBYTES)\n  value = value.slice(sodium.crypto_box_NONCEBYTES)\n  return sodium.to_string(\n    sodium.crypto_box_open_easy_afternm(\n      value,\n      nonce,\n      sodium.from_base64(key)\n    )\n  )\n},\n",[1749],{"type":378,"tag":1655,"props":1750,"children":1751},{"__ignoreMap":369},[1752],{"type":390,"value":1747},{"title":369,"searchDepth":486,"depth":486,"links":1754},[],"content:notes-to-self:javascript-crypto.md","notes-to-self/javascript-crypto.md","notes-to-self/javascript-crypto",{"_path":1759,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":179,"description":1760,"slug":180,"date":1761,"dateString":1762,"encrypted":368,"encryptedBody":373,"body":1763,"_type":490,"_id":1918,"_source":492,"_file":1919,"_stem":1920,"_extension":495},"/notes-to-self/miscellaneous-digitized-manuscripts-and-books-for-source-material-art","Specimens of the plants and fruits of the island ... v.3+. Wollstonecraft, Anne Kingsbury. C.1826\nhttps://hdl.handle.net/2027/coo.31924100271489",1568462580000,"9/14/19 8:03AM",{"type":375,"children":1764,"toc":1912},[1765,1776,1789,1808,1814,1823,1834,1840,1849,1855,1864,1869,1874,1897,1903],{"type":378,"tag":379,"props":1766,"children":1767},{},[1768,1770],{"type":390,"value":1769},"Specimens of the plants and fruits of the island ... v.3+. Wollstonecraft, Anne Kingsbury. C.1826\n",{"type":378,"tag":383,"props":1771,"children":1774},{"href":1772,"rel":1773},"https://hdl.handle.net/2027/coo.31924100271489",[387],[1775],{"type":390,"value":1772},{"type":378,"tag":379,"props":1777,"children":1778},{},[1779,1781,1787],{"type":390,"value":1780},"From ",{"type":378,"tag":383,"props":1782,"children":1785},{"href":1783,"rel":1784},"https://www.hathitrust.org",[387],[1786],{"type":390,"value":1783},{"type":390,"value":1788}," - seems to allow download of full manuscripts",{"type":378,"tag":379,"props":1790,"children":1791},{},[1792,1794,1800,1802],{"type":390,"value":1793},"Beetles: ",{"type":378,"tag":383,"props":1795,"children":1798},{"href":1796,"rel":1797},"https://archive.org/details/mobotbca_12_06_01s/page/1",[387],[1799],{"type":390,"value":1796},{"type":390,"value":1801},"\nVia ",{"type":378,"tag":383,"props":1803,"children":1806},{"href":1804,"rel":1805},"https://www.cunicode.com/works/confusing-coleopterists",[387],[1807],{"type":390,"value":1804},{"type":378,"tag":430,"props":1809,"children":1811},{"id":1810},"archive-of-6000-historical-childrens-books-all-digitized-they-are-all-free-and-legal",[1812],{"type":390,"value":1813},"Archive of 6,000 Historical Children's Books, All Digitized - they are all free and legal",{"type":378,"tag":379,"props":1815,"children":1816},{},[1817],{"type":378,"tag":383,"props":1818,"children":1821},{"href":1819,"rel":1820},"https://www.reddit.com/r/books/comments/c63iho/archive_of_6000_historical_childrens_books_all/?utm_source=share&utm_medium=ios_app&utm_name=ios_share_flow_optimization&utm_term=control_1",[387],[1822],{"type":390,"value":1819},{"type":378,"tag":379,"props":1824,"children":1825},{},[1826,1828],{"type":390,"value":1827},"Goes to ",{"type":378,"tag":383,"props":1829,"children":1832},{"href":1830,"rel":1831},"http://www.openculture.com/2016/08/enter-an-archive-of-6000-historical-childrens-books-all-digitized-and-free-to-read-online.html",[387],[1833],{"type":390,"value":1830},{"type":378,"tag":430,"props":1835,"children":1837},{"id":1836},"art-books-from-the-met-free",[1838],{"type":390,"value":1839},"Art Books from the Met, Free",{"type":378,"tag":379,"props":1841,"children":1842},{},[1843],{"type":378,"tag":383,"props":1844,"children":1847},{"href":1845,"rel":1846},"https://www.metmuseum.org/art/metpublications/titles-with-full-text-online?searchtype=F",[387],[1848],{"type":390,"value":1845},{"type":378,"tag":430,"props":1850,"children":1852},{"id":1851},"astronomical-drawings",[1853],{"type":390,"value":1854},"Astronomical Drawings",{"type":378,"tag":379,"props":1856,"children":1857},{},[1858],{"type":378,"tag":383,"props":1859,"children":1862},{"href":1860,"rel":1861},"https://publicdomainreview.org/collections/the-trouvelot-astronomical-drawings-1882/",[387],[1863],{"type":390,"value":1860},{"type":378,"tag":379,"props":1865,"children":1866},{},[1867],{"type":390,"value":1868},"Cellarius is also a great name",{"type":378,"tag":379,"props":1870,"children":1871},{},[1872],{"type":390,"value":1873},"Publicdomainreview.org in general seems great, right up your alley",{"type":378,"tag":379,"props":1875,"children":1876},{},[1877,1883,1884,1890,1891],{"type":378,"tag":383,"props":1878,"children":1881},{"href":1879,"rel":1880},"https://www.oldbookillustrations.com/",[387],[1882],{"type":390,"value":1879},{"type":390,"value":411},{"type":378,"tag":383,"props":1885,"children":1888},{"href":1886,"rel":1887},"http://www.openculture.com/2020/02/old-book-illustrations-download.html",[387],[1889],{"type":390,"value":1886},{"type":390,"value":411},{"type":378,"tag":383,"props":1892,"children":1895},{"href":1893,"rel":1894},"https://news.ycombinator.com/item?id=22315694",[387],[1896],{"type":390,"value":1893},{"type":378,"tag":430,"props":1898,"children":1900},{"id":1899},"smithsonian",[1901],{"type":390,"value":1902},"Smithsonian",{"type":378,"tag":379,"props":1904,"children":1905},{},[1906],{"type":378,"tag":383,"props":1907,"children":1910},{"href":1908,"rel":1909},"https://www.si.edu/openaccess",[387],[1911],{"type":390,"value":1908},{"title":369,"searchDepth":486,"depth":486,"links":1913},[1914,1915,1916,1917],{"id":1810,"depth":486,"text":1813},{"id":1836,"depth":486,"text":1839},{"id":1851,"depth":486,"text":1854},{"id":1899,"depth":486,"text":1902},"content:notes-to-self:miscellaneous-digitized-manuscripts-and-books-for-source-material-art.md","notes-to-self/miscellaneous-digitized-manuscripts-and-books-for-source-material-art.md","notes-to-self/miscellaneous-digitized-manuscripts-and-books-for-source-material-art",{"_path":1922,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":323,"description":1923,"slug":324,"date":1924,"dateString":1925,"encrypted":368,"encryptedBody":373,"body":1926,"_type":490,"_id":1943,"_source":492,"_file":1944,"_stem":1945,"_extension":495},"/notes-to-self/vector-rendering-engine-c","Includes reference to one for games with intensity modulation? Which I interpret as glowiness.",1554468480000,"April 5, 2019 8:48AM",{"type":375,"children":1927,"toc":1941},[1928,1932],{"type":378,"tag":379,"props":1929,"children":1930},{},[1931],{"type":390,"value":1923},{"type":378,"tag":379,"props":1933,"children":1934},{},[1935],{"type":378,"tag":383,"props":1936,"children":1939},{"href":1937,"rel":1938},"https://news.ycombinator.com/item?id=19580647",[387],[1940],{"type":390,"value":1937},{"title":369,"searchDepth":486,"depth":486,"links":1942},[],"content:notes-to-self:vector-rendering-engine-c.md","notes-to-self/vector-rendering-engine-c.md","notes-to-self/vector-rendering-engine-c",{"_path":1947,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":101,"description":369,"slug":102,"date":1948,"dateString":1949,"encrypted":368,"encryptedBody":373,"body":1950,"_type":490,"_id":2711,"_source":492,"_file":2712,"_stem":2713,"_extension":495},"/notes-to-self/git-cheat-sheet",1476288000000,"2016-10-12",{"type":375,"children":1951,"toc":2677},[1952,1958,1963,1974,1980,1989,1994,2003,2009,2017,2023,2031,2043,2049,2058,2070,2079,2085,2094,2100,2108,2114,2122,2131,2137,2146,2152,2161,2167,2176,2181,2189,2195,2203,2216,2222,2227,2233,2239,2248,2254,2263,2269,2275,2284,2289,2298,2304,2313,2318,2327,2330,2335,2344,2349,2355,2361,2370,2375,2384,2390,2399,2405,2414,2419,2428,2434,2443,2449,2454,2467,2476,2482,2493,2499,2508,2514,2523,2528,2537,2543,2552,2557,2566,2572,2581,2586,2592,2601,2607,2616,2622,2631,2637,2642,2653,2661,2667],{"type":378,"tag":718,"props":1953,"children":1955},{"id":1954},"make-a-new-repository-locally-remote",[1956],{"type":390,"value":1957},"Make a new repository, locally & remote",{"type":378,"tag":846,"props":1959,"children":1961},{"id":1960},"locally",[1962],{"type":390,"value":1960},{"type":378,"tag":1648,"props":1964,"children":1969},{"code":1965,"language":1966,"meta":369,"className":1967},"cd /Users/nathan/myProject\ngit init\ngit add .\ngit commit -m \"initial commit\"\n","shell",[1968],"language-shell",[1970],{"type":378,"tag":1655,"props":1971,"children":1972},{"__ignoreMap":369},[1973],{"type":390,"value":1965},{"type":378,"tag":846,"props":1975,"children":1977},{"id":1976},"remote-server",[1978],{"type":390,"value":1979},"remote server",{"type":378,"tag":1648,"props":1981,"children":1984},{"code":1982,"language":1966,"meta":369,"className":1983},"ssh -p 8022 git@colossus.biggerplanet.net\ncd /Users/git/Repositories\nmkdir myProject.git && cd myProject.git\ngit --bare init\nexit\n",[1968],[1985],{"type":378,"tag":1655,"props":1986,"children":1987},{"__ignoreMap":369},[1988],{"type":390,"value":1982},{"type":378,"tag":846,"props":1990,"children":1992},{"id":1991},"locally-1",[1993],{"type":390,"value":1960},{"type":378,"tag":1648,"props":1995,"children":1998},{"code":1996,"language":1966,"meta":369,"className":1997},"git remote add origin ssh://git@yoursecret.domain.com:8022/Users/git/Repositories/myProject.git\ngit push origin master\nClone remote repository:\ngit clone ssh://git@yoursecret.domain.com:8022/Users/git/Repositories/myProject.git\n",[1968],[1999],{"type":378,"tag":1655,"props":2000,"children":2001},{"__ignoreMap":369},[2002],{"type":390,"value":1996},{"type":378,"tag":718,"props":2004,"children":2006},{"id":2005},"add-all-untracked-new-files",[2007],{"type":390,"value":2008},"Add All Untracked (new) files:",{"type":378,"tag":1648,"props":2010,"children":2012},{"code":2011},"git add .\n",[2013],{"type":378,"tag":1655,"props":2014,"children":2015},{"__ignoreMap":369},[2016],{"type":390,"value":2011},{"type":378,"tag":718,"props":2018,"children":2020},{"id":2019},"commit-changes-remove-all-deleted-files",[2021],{"type":390,"value":2022},"Commit changes & remove all deleted files:",{"type":378,"tag":1648,"props":2024,"children":2026},{"code":2025},"git commit -a\n",[2027],{"type":378,"tag":1655,"props":2028,"children":2029},{"__ignoreMap":369},[2030],{"type":390,"value":2025},{"type":378,"tag":718,"props":2032,"children":2034},{"id":2033},"useful-one-time-things-fromhttparthurkozielcom20080502git-configuration",[2035,2037],{"type":390,"value":2036},"Useful (one time) things from ",{"type":378,"tag":383,"props":2038,"children":2041},{"href":2039,"rel":2040},"http://arthurkoziel.com/2008/05/02/git-configuration/",[387],[2042],{"type":390,"value":2039},{"type":378,"tag":846,"props":2044,"children":2046},{"id":2045},"global-ignore",[2047],{"type":390,"value":2048},"Global ignore",{"type":378,"tag":1648,"props":2050,"children":2053},{"code":2051,"language":1966,"meta":369,"className":2052},"echo \".DS_Store\">> ~/.gitignore\ngit config --global core.excludesfile ~/.gitignore\n",[1968],[2054],{"type":378,"tag":1655,"props":2055,"children":2056},{"__ignoreMap":369},[2057],{"type":390,"value":2051},{"type":378,"tag":846,"props":2059,"children":2061},{"id":2060},"make-a-new-branch-see-httpbookgit-scmcom3_basic_branching_and_merginghtml",[2062,2064],{"type":390,"value":2063},"Make a new branch see ",{"type":378,"tag":383,"props":2065,"children":2068},{"href":2066,"rel":2067},"http://book.git-scm.com/3_basic_branching_and_merging.html",[387],[2069],{"type":390,"value":2066},{"type":378,"tag":1648,"props":2071,"children":2074},{"code":2072,"language":1966,"meta":369,"className":2073},"git branch experimental\n",[1968],[2075],{"type":378,"tag":1655,"props":2076,"children":2077},{"__ignoreMap":369},[2078],{"type":390,"value":2072},{"type":378,"tag":846,"props":2080,"children":2082},{"id":2081},"make-a-new-branch-and-check-it-out",[2083],{"type":390,"value":2084},"Make a new branch and check it out",{"type":378,"tag":1648,"props":2086,"children":2089},{"code":2087,"language":1966,"meta":369,"className":2088},"git checkout -b experimental\n",[1968],[2090],{"type":378,"tag":1655,"props":2091,"children":2092},{"__ignoreMap":369},[2093],{"type":390,"value":2087},{"type":378,"tag":846,"props":2095,"children":2097},{"id":2096},"list-branches",[2098],{"type":390,"value":2099},"List branches",{"type":378,"tag":1648,"props":2101,"children":2103},{"code":2102},"git branch\n",[2104],{"type":378,"tag":1655,"props":2105,"children":2106},{"__ignoreMap":369},[2107],{"type":390,"value":2102},{"type":378,"tag":846,"props":2109,"children":2111},{"id":2110},"switch-to-branch",[2112],{"type":390,"value":2113},"Switch to branch",{"type":378,"tag":379,"props":2115,"children":2116},{},[2117],{"type":378,"tag":1586,"props":2118,"children":2119},{},[2120],{"type":390,"value":2121},"make sure you commit your first branch before you go crazy with new branch!",{"type":378,"tag":1648,"props":2123,"children":2126},{"code":2124,"language":1966,"meta":369,"className":2125},"git checkout experimental\n",[1968],[2127],{"type":378,"tag":1655,"props":2128,"children":2129},{"__ignoreMap":369},[2130],{"type":390,"value":2124},{"type":378,"tag":846,"props":2132,"children":2134},{"id":2133},"make-changes-switch-back-to-main-branch-eg",[2135],{"type":390,"value":2136},"Make changes, switch back to main branch, e.g.",{"type":378,"tag":1648,"props":2138,"children":2141},{"code":2139,"language":1966,"meta":369,"className":2140},"git commit -a\ngit checkout master\n",[1968],[2142],{"type":378,"tag":1655,"props":2143,"children":2144},{"__ignoreMap":369},[2145],{"type":390,"value":2139},{"type":378,"tag":846,"props":2147,"children":2149},{"id":2148},"branches-diverged-merge-them-with",[2150],{"type":390,"value":2151},"Branches diverged; merge them with",{"type":378,"tag":1648,"props":2153,"children":2156},{"code":2154,"language":1966,"meta":369,"className":2155},"git merge experimental\n",[1968],[2157],{"type":378,"tag":1655,"props":2158,"children":2159},{"__ignoreMap":369},[2160],{"type":390,"value":2154},{"type":378,"tag":846,"props":2162,"children":2164},{"id":2163},"conflicts",[2165],{"type":390,"value":2166},"Conflicts?",{"type":378,"tag":1648,"props":2168,"children":2171},{"code":2169,"language":1966,"meta":369,"className":2170},"git diff\n",[1968],[2172],{"type":378,"tag":1655,"props":2173,"children":2174},{"__ignoreMap":369},[2175],{"type":390,"value":2169},{"type":378,"tag":379,"props":2177,"children":2178},{},[2179],{"type":390,"value":2180},"or to use filemerge (which should be set up it .gitconfig)",{"type":378,"tag":1648,"props":2182,"children":2184},{"code":2183},"git mergetool\n",[2185],{"type":378,"tag":1655,"props":2186,"children":2187},{"__ignoreMap":369},[2188],{"type":390,"value":2183},{"type":378,"tag":718,"props":2190,"children":2192},{"id":2191},"delete-a-branch",[2193],{"type":390,"value":2194},"Delete a branch",{"type":378,"tag":1648,"props":2196,"children":2198},{"code":2197},"git branch -d experimental\n",[2199],{"type":378,"tag":1655,"props":2200,"children":2201},{"__ignoreMap":369},[2202],{"type":390,"value":2197},{"type":378,"tag":379,"props":2204,"children":2205},{},[2206,2208,2214],{"type":390,"value":2207},"If a branch has changes that have not been merged into your current branch, this will complain. If you're certain you want to delete the branch anyway, use capital D flag ",{"type":378,"tag":1655,"props":2209,"children":2211},{"className":2210},[],[2212],{"type":390,"value":2213},"-D",{"type":390,"value":2215}," instead.",{"type":378,"tag":718,"props":2217,"children":2219},{"id":2218},"diff-a-particular-file-on-a-particular-commit",[2220],{"type":390,"value":2221},"diff a particular file on a particular commit",{"type":378,"tag":379,"props":2223,"children":2224},{},[2225],{"type":390,"value":2226},"???",{"type":378,"tag":430,"props":2228,"children":2230},{"id":2229},"remotes",[2231],{"type":390,"value":2232},"Remotes",{"type":378,"tag":718,"props":2234,"children":2236},{"id":2235},"list-remotes",[2237],{"type":390,"value":2238},"List remotes",{"type":378,"tag":1648,"props":2240,"children":2243},{"code":2241,"language":1966,"meta":369,"className":2242},"git remote -v\n",[1968],[2244],{"type":378,"tag":1655,"props":2245,"children":2246},{"__ignoreMap":369},[2247],{"type":390,"value":2241},{"type":378,"tag":718,"props":2249,"children":2251},{"id":2250},"rename-remote",[2252],{"type":390,"value":2253},"Rename remote",{"type":378,"tag":1648,"props":2255,"children":2258},{"code":2256,"language":1966,"meta":369,"className":2257},"git remote rename origin destination\n",[1968],[2259],{"type":378,"tag":1655,"props":2260,"children":2261},{"__ignoreMap":369},[2262],{"type":390,"value":2256},{"type":378,"tag":430,"props":2264,"children":2266},{"id":2265},"submodules",[2267],{"type":390,"value":2268},"Submodules",{"type":378,"tag":718,"props":2270,"children":2272},{"id":2271},"create-a-submodule",[2273],{"type":390,"value":2274},"Create a Submodule",{"type":378,"tag":1648,"props":2276,"children":2279},{"code":2277,"language":1966,"meta":369,"className":2278},"mkdir mysubmoduledir\ncd mysubmoduledir\ngit init\n",[1968],[2280],{"type":378,"tag":1655,"props":2281,"children":2282},{"__ignoreMap":369},[2283],{"type":390,"value":2277},{"type":378,"tag":379,"props":2285,"children":2286},{},[2287],{"type":390,"value":2288},"make files in submodule",{"type":378,"tag":1648,"props":2290,"children":2293},{"code":2291,"language":1966,"meta":369,"className":2292},"git commit -m \"initial commit for mysubmodule\"\ncd ..\ngit submodule add mysubmoduledir mysubmodule\ngit commit -m \"added submodule mysubmodule\"\n",[1968],[2294],{"type":378,"tag":1655,"props":2295,"children":2296},{"__ignoreMap":369},[2297],{"type":390,"value":2291},{"type":378,"tag":718,"props":2299,"children":2301},{"id":2300},"clone-project-with-submodule",[2302],{"type":390,"value":2303},"Clone project with submodule",{"type":378,"tag":1648,"props":2305,"children":2308},{"code":2306,"language":1966,"meta":369,"className":2307},"git clone cloned\ncd cloned\ngit submodule init\ngit submodule update\n",[1968],[2309],{"type":378,"tag":1655,"props":2310,"children":2311},{"__ignoreMap":369},[2312],{"type":390,"value":2306},{"type":378,"tag":379,"props":2314,"children":2315},{},[2316],{"type":390,"value":2317},"Always publish the submodule change before publishing the change to the superproject that references",{"type":378,"tag":1648,"props":2319,"children":2322},{"code":2320,"language":1966,"meta":369,"className":2321},"cd mysubmoduledir\n[update files]\ngit commit -am \"changes to mysubmodule\"\ngit push\ncd ..\ngit commit -am \"updated mysubmodule\"\ngit push\n",[1968],[2323],{"type":378,"tag":1655,"props":2324,"children":2325},{"__ignoreMap":369},[2326],{"type":390,"value":2320},{"type":378,"tag":718,"props":2328,"children":2329},{"id":369},[],{"type":378,"tag":379,"props":2331,"children":2332},{},[2333],{"type":390,"value":2334},"Pulling submodule changes",{"type":378,"tag":1648,"props":2336,"children":2339},{"code":2337,"language":1966,"meta":369,"className":2338},"git pull origin master\ngit submodule update\n",[1968],[2340],{"type":378,"tag":1655,"props":2341,"children":2342},{"__ignoreMap":369},[2343],{"type":390,"value":2337},{"type":378,"tag":379,"props":2345,"children":2346},{},[2347],{"type":390,"value":2348},"If you get \"fatal: reference is not a tree\" error, you may not have pushed the commit of the submodule. Go to the \"source\" submodule, commit and push the submodule, then commit and push the parent repository, then try \"git pull origin master,\" and \"git submodule update\" again on the \"destination\" parent repository.",{"type":378,"tag":430,"props":2350,"children":2352},{"id":2351},"fixing-things",[2353],{"type":390,"value":2354},"Fixing Things",{"type":378,"tag":718,"props":2356,"children":2358},{"id":2357},"forgot-to-add-a-file-to-gitignore-before-changing-it",[2359],{"type":390,"value":2360},"Forgot to add a file to .gitignore before changing it?",{"type":378,"tag":1648,"props":2362,"children":2365},{"code":2363,"language":1966,"meta":369,"className":2364},"git update-index --assume-unchanged dir-im-removing/\n",[1968],[2366],{"type":378,"tag":1655,"props":2367,"children":2368},{"__ignoreMap":369},[2369],{"type":390,"value":2363},{"type":378,"tag":379,"props":2371,"children":2372},{},[2373],{"type":390,"value":2374},"or a specific file",{"type":378,"tag":1648,"props":2376,"children":2379},{"code":2377,"language":1966,"meta":369,"className":2378},"git update-index --assume-unchanged path/to/file.txt\n",[1968],[2380],{"type":378,"tag":1655,"props":2381,"children":2382},{"__ignoreMap":369},[2383],{"type":390,"value":2377},{"type":378,"tag":718,"props":2385,"children":2387},{"id":2386},"forgot-to-add-a-file-to-gitignore-before-adding-but-not-committing-it",[2388],{"type":390,"value":2389},"Forgot to add a file to .gitignore before adding (but not committing) it?",{"type":378,"tag":1648,"props":2391,"children":2394},{"code":2392,"language":1966,"meta":369,"className":2393},"git reset HEAD dir-im-removing/\n",[1968],[2395],{"type":378,"tag":1655,"props":2396,"children":2397},{"__ignoreMap":369},[2398],{"type":390,"value":2392},{"type":378,"tag":718,"props":2400,"children":2402},{"id":2401},"forgot-to-add-a-file-to-gitignore-before-adding-and-committing-it-appears-to-work-does-not-delete-files-on-disk",[2403],{"type":390,"value":2404},"Forgot to add a file to .gitignore before adding and committing it (appears to work, does not delete files on disk)?",{"type":378,"tag":1648,"props":2406,"children":2409},{"code":2407,"language":1966,"meta":369,"className":2408},"git rm --cached -r dir-im-removing/\n",[1968],[2410],{"type":378,"tag":1655,"props":2411,"children":2412},{"__ignoreMap":369},[2413],{"type":390,"value":2407},{"type":378,"tag":379,"props":2415,"children":2416},{},[2417],{"type":390,"value":2418},"or for a file",{"type":378,"tag":1648,"props":2420,"children":2423},{"code":2421,"language":1966,"meta":369,"className":2422},"git rm --cached path/to/file.txt\n",[1968],[2424],{"type":378,"tag":1655,"props":2425,"children":2426},{"__ignoreMap":369},[2427],{"type":390,"value":2421},{"type":378,"tag":718,"props":2429,"children":2431},{"id":2430},"fix-not-currently-on-any-branch",[2432],{"type":390,"value":2433},"Fix \"Not Currently on Any Branch\"",{"type":378,"tag":1648,"props":2435,"children":2438},{"code":2436,"language":1966,"meta":369,"className":2437},"git commit -a -m “any changes” commit any changes you've made\ngit checkout -b temp create a new branch at current head\ngit checkout master checkout master (or whatever branch you want to be on)\ngit merge temp merge with the temp branch you made with your changes\ngit branch -d temp delete the temp branch\n",[1968],[2439],{"type":378,"tag":1655,"props":2440,"children":2441},{"__ignoreMap":369},[2442],{"type":390,"value":2436},{"type":378,"tag":718,"props":2444,"children":2446},{"id":2445},"fix-fatal-empty-ident",[2447],{"type":390,"value":2448},"Fix \"fatal: empty ident\"",{"type":378,"tag":379,"props":2450,"children":2451},{},[2452],{"type":390,"value":2453},"(if setting git config per instructions doesn't work)",{"type":378,"tag":379,"props":2455,"children":2456},{},[2457,2459,2465],{"type":390,"value":2458},"... then add the following parameters to your ",{"type":378,"tag":1655,"props":2460,"children":2462},{"className":2461},[],[2463],{"type":390,"value":2464},"~/.bashrc",{"type":390,"value":2466}," file and source it with . ~/.bashrc (or relogin, alternatively):",{"type":378,"tag":1648,"props":2468,"children":2471},{"code":2469,"language":1966,"meta":369,"className":2470}," export GIT_AUTHOR_NAME=\"Nathan Lamont\"\n export GIT_COMMITTER_NAME=\"Nathan Lamont\"\n",[1968],[2472],{"type":378,"tag":1655,"props":2473,"children":2474},{"__ignoreMap":369},[2475],{"type":390,"value":2469},{"type":378,"tag":718,"props":2477,"children":2479},{"id":2478},"fix-reference-is-not-a-tree",[2480],{"type":390,"value":2481},"Fix \"reference is not a tree\"",{"type":378,"tag":379,"props":2483,"children":2484},{},[2485,2487],{"type":390,"value":2486},"See ",{"type":378,"tag":383,"props":2488,"children":2491},{"href":2489,"rel":2490},"http://stackoverflow.com/questions/2155887/git-submodule-head-reference-is-not-a-tree-error",[387],[2492],{"type":390,"value":2489},{"type":378,"tag":718,"props":2494,"children":2496},{"id":2495},"colorized-output",[2497],{"type":390,"value":2498},"Colorized Output",{"type":378,"tag":1648,"props":2500,"children":2503},{"code":2501,"language":1966,"meta":369,"className":2502},"git config --global color.branch auto\ngit config --global color.diff auto\ngit config --global color.interactive auto\ngit config --global color.status auto\nTextMate as the default editor:gitgit config --global core.editor \"mate -w\"\nOpendiff (FileMerge) to resolve merge conflicts:\ngit config --global merge.tool opendiff\n",[1968],[2504],{"type":378,"tag":1655,"props":2505,"children":2506},{"__ignoreMap":369},[2507],{"type":390,"value":2501},{"type":378,"tag":718,"props":2509,"children":2511},{"id":2510},"check-out-a-specific-file-from-another-branch",[2512],{"type":390,"value":2513},"Check out a specific file from another branch",{"type":378,"tag":1648,"props":2515,"children":2518},{"code":2516,"language":1966,"meta":369,"className":2517},"git checkout \u003Cbranch> -- \u003Cpath>\n",[1968],[2519],{"type":378,"tag":1655,"props":2520,"children":2521},{"__ignoreMap":369},[2522],{"type":390,"value":2516},{"type":378,"tag":379,"props":2524,"children":2525},{},[2526],{"type":390,"value":2527},"E.g.",{"type":378,"tag":1648,"props":2529,"children":2532},{"code":2530,"language":1966,"meta":369,"className":2531},"git checkout develop -- foo.json\n",[1968],[2533],{"type":378,"tag":1655,"props":2534,"children":2535},{"__ignoreMap":369},[2536],{"type":390,"value":2530},{"type":378,"tag":718,"props":2538,"children":2540},{"id":2539},"to-see-whats-different-in-a-particular-file-between-two-commits",[2541],{"type":390,"value":2542},"To see what's different in a particular file between two commits:",{"type":378,"tag":1648,"props":2544,"children":2547},{"code":2545,"language":1966,"meta":369,"className":2546},"git diff \u003Crevision_1>:\u003Cfile_1> \u003Crevision_2>:\u003Cfile_2>\n",[1968],[2548],{"type":378,"tag":1655,"props":2549,"children":2550},{"__ignoreMap":369},[2551],{"type":390,"value":2545},{"type":378,"tag":379,"props":2553,"children":2554},{},[2555],{"type":390,"value":2556},"Between branches:",{"type":378,"tag":1648,"props":2558,"children":2561},{"code":2559,"language":1966,"meta":369,"className":2560},"git diff mybranch master -- myfile.cs\n",[1968],[2562],{"type":378,"tag":1655,"props":2563,"children":2564},{"__ignoreMap":369},[2565],{"type":390,"value":2559},{"type":378,"tag":718,"props":2567,"children":2569},{"id":2568},"filesdirectories-present-that-havent-been-added-and-you-want-to-delete-this-deletes-them",[2570],{"type":390,"value":2571},"Files/directories present that haven't been added and you want to delete? This deletes them.",{"type":378,"tag":1648,"props":2573,"children":2576},{"code":2574,"language":1966,"meta":369,"className":2575},"git clean -f -d\n",[1968],[2577],{"type":378,"tag":1655,"props":2578,"children":2579},{"__ignoreMap":369},[2580],{"type":390,"value":2574},{"type":378,"tag":379,"props":2582,"children":2583},{},[2584],{"type":390,"value":2585},"Omit -d to exclude directories from the operation.",{"type":378,"tag":718,"props":2587,"children":2589},{"id":2588},"list-branches-sorted-by-last-commit-in-reverse-chronological-order",[2590],{"type":390,"value":2591},"List branches sorted by last commit in reverse chronological order:",{"type":378,"tag":1648,"props":2593,"children":2596},{"code":2594,"language":1966,"meta":369,"className":2595},"git branch -v\n",[1968],[2597],{"type":378,"tag":1655,"props":2598,"children":2599},{"__ignoreMap":369},[2600],{"type":390,"value":2594},{"type":378,"tag":846,"props":2602,"children":2604},{"id":2603},"fancier-with-date-and-committer",[2605],{"type":390,"value":2606},"Fancier, with date and committer",{"type":378,"tag":1648,"props":2608,"children":2611},{"code":2609,"language":1966,"meta":369,"className":2610}," git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'\n",[1968],[2612],{"type":378,"tag":1655,"props":2613,"children":2614},{"__ignoreMap":369},[2615],{"type":390,"value":2609},{"type":378,"tag":718,"props":2617,"children":2619},{"id":2618},"git-diff-but-exclude-files-by-extension",[2620],{"type":390,"value":2621},"git diff but exclude files by extension",{"type":378,"tag":1648,"props":2623,"children":2626},{"code":2624,"language":1966,"meta":369,"className":2625},"git diff -- . ':!*.md'\n# additional types can be listed\ngit diff -- . ':!*.md' ':!*.foo*'\n",[1968],[2627],{"type":378,"tag":1655,"props":2628,"children":2629},{"__ignoreMap":369},[2630],{"type":390,"value":2624},{"type":378,"tag":718,"props":2632,"children":2634},{"id":2633},"tagging",[2635],{"type":390,"value":2636},"Tagging",{"type":378,"tag":379,"props":2638,"children":2639},{},[2640],{"type":390,"value":2641},"New release? Add a tag.",{"type":378,"tag":1648,"props":2643,"children":2648},{"code":2644,"language":2645,"meta":369,"className":2646},"# add a tag\ngit tag -a v1.0.0 -m \"Initial release\"\n# push current branch with tag\ngit push origin master --tags\n# or push just the tag\ngit push origin v1.0.0\n# list tags\ngit tag\n","sh",[2647],"language-sh",[2649],{"type":378,"tag":1655,"props":2650,"children":2651},{"__ignoreMap":369},[2652],{"type":390,"value":2644},{"type":378,"tag":1648,"props":2654,"children":2656},{"code":2655},"## GitHub\n\nHave an existing project and want to make it into a GitHub repo?\n\nMake the repo in github then:\n\n```shell\ngit remote add origin git@github.com:beepy/my-new-project.git\ngit push -u -f origin main\n",[2657],{"type":378,"tag":1655,"props":2658,"children":2659},{"__ignoreMap":369},[2660],{"type":390,"value":2655},{"type":378,"tag":430,"props":2662,"children":2664},{"id":2663},"other-links",[2665],{"type":390,"value":2666},"Other Links",{"type":378,"tag":379,"props":2668,"children":2669},{},[2670],{"type":378,"tag":383,"props":2671,"children":2674},{"href":2672,"rel":2673},"https://jwiegley.github.io/git-from-the-bottom-up/1-Repository/3-blobs-are-stored-in-trees.html",[387],[2675],{"type":390,"value":2676},"Git from the bottom up",{"title":369,"searchDepth":486,"depth":486,"links":2678},[2679,2680,2681,2682,2684,2685,2686,2690,2695,2710],{"id":1954,"depth":1347,"text":1957},{"id":2005,"depth":1347,"text":2008},{"id":2019,"depth":1347,"text":2022},{"id":2033,"depth":1347,"text":2683},"Useful (one time) things from http://arthurkoziel.com/2008/05/02/git-configuration/",{"id":2191,"depth":1347,"text":2194},{"id":2218,"depth":1347,"text":2221},{"id":2229,"depth":486,"text":2232,"children":2687},[2688,2689],{"id":2235,"depth":1347,"text":2238},{"id":2250,"depth":1347,"text":2253},{"id":2265,"depth":486,"text":2268,"children":2691},[2692,2693,2694],{"id":2271,"depth":1347,"text":2274},{"id":2300,"depth":1347,"text":2303},{"id":369,"depth":1347,"text":369},{"id":2351,"depth":486,"text":2354,"children":2696},[2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709],{"id":2357,"depth":1347,"text":2360},{"id":2386,"depth":1347,"text":2389},{"id":2401,"depth":1347,"text":2404},{"id":2430,"depth":1347,"text":2433},{"id":2445,"depth":1347,"text":2448},{"id":2478,"depth":1347,"text":2481},{"id":2495,"depth":1347,"text":2498},{"id":2510,"depth":1347,"text":2513},{"id":2539,"depth":1347,"text":2542},{"id":2568,"depth":1347,"text":2571},{"id":2588,"depth":1347,"text":2591},{"id":2618,"depth":1347,"text":2621},{"id":2633,"depth":1347,"text":2636},{"id":2663,"depth":486,"text":2666},"content:notes-to-self:git-cheat-sheet.md","notes-to-self/git-cheat-sheet.md","notes-to-self/git-cheat-sheet",{"_path":2715,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":263,"description":2716,"slug":264,"date":1948,"dateString":1949,"encrypted":2717,"encryptedBody":2718,"body":2719,"_type":490,"_id":2836,"_source":492,"_file":2837,"_stem":2838,"_extension":495},"/notes-to-self/scp-tips","Copy the file \"foobar.txt\" from a remote host to the local host",true,"IgpTGEADP3J65dqKXThndXqCpujKAvc-KbxkwfwvgOobPNMsEGe2duE5UvAOg2TlV7DAGrzlkS4Gvy1gdL9fvdBOBLzl92C0hDA5CWeIcX1MiA6YQwIxwZMsz9hQ0OUQ8if-JKSM7dsnH2nhOnYo6Ex1aumqte5enCzKFrAJGq8JZpY6HhN3gSrIA-klkrRhh6AV382zMTPBCiwnFf6SlYr88XeYv2ASo_cCXHJPZiGyrEqVvO-hD5CYHBX8Ucd38wympZwqvIA89dbtOh0XBHmUtZusHfCxK48mFWy9HcKmHLFXSC-zSKNfxAnaeFgjD7sb01rnMTARAONe2xjb4KuIsPzvjcjjeqvuxn6C2tBCaNtXLPfNnj0iHVDVJkvPuyz57tp-vHUT6cnonsjrthqqoxIs4cZDayjSXjoJNd-28NRQ6OdFZWwYvNvBZmFe8VoVFayGW4CIk97SfS2IBVHTqMzMNsrR5CUCzlrLhbkU2zGhvpAfq5th8LeuN6ou6J1ko-fG4u3iCK8d3N3pX7mRkKnvsv2j2uM-IM4hG16j4rGJKjz9GuXDyH8BqTgWBcVA2SRwyu5fNWF7dl8TNwjLoXquPNCpyS-VUVCmIMA5OgbLf6M8LW31uji7XPD1pXhbOlrjjKYK8z8Wkzbfnpw7cav6WxQtKYYVgPU0zHXfOyo1ZgdYNmasMjkIb1ZRRww6fTdDCzijWuWOSeBQIA-BzOrsieZ1w29xSEgC2ZOgF-oZ-WkULgmSXoW0PXdzanH2Ev9gYToAAf0dwCJ9EUosLrXnuJCZ4E21qE4bDg",{"type":375,"children":2720,"toc":2834},[2721,2725,2733,2738,2746,2751,2759,2764,2772,2777,2785,2790,2798,2803,2811,2816,2824,2829],{"type":378,"tag":379,"props":2722,"children":2723},{},[2724],{"type":390,"value":2716},{"type":378,"tag":1648,"props":2726,"children":2728},{"code":2727},"$ scp your_username@remotehost.edu:foobar.txt /some/local/directory\n",[2729],{"type":378,"tag":1655,"props":2730,"children":2731},{"__ignoreMap":369},[2732],{"type":390,"value":2727},{"type":378,"tag":379,"props":2734,"children":2735},{},[2736],{"type":390,"value":2737},"Copy the file \"foobar.txt\" from the local host to a remote host",{"type":378,"tag":1648,"props":2739,"children":2741},{"code":2740},"$ scp foobar.txt your_username@remotehost.edu:/some/remote/directory\n",[2742],{"type":378,"tag":1655,"props":2743,"children":2744},{"__ignoreMap":369},[2745],{"type":390,"value":2740},{"type":378,"tag":379,"props":2747,"children":2748},{},[2749],{"type":390,"value":2750},"Copy the directory \"foo\" from the local host to a remote host's directory \"bar\"",{"type":378,"tag":1648,"props":2752,"children":2754},{"code":2753},"$ scp -r foo your_username@remotehost.edu:/some/remote/directory/bar\n",[2755],{"type":378,"tag":1655,"props":2756,"children":2757},{"__ignoreMap":369},[2758],{"type":390,"value":2753},{"type":378,"tag":379,"props":2760,"children":2761},{},[2762],{"type":390,"value":2763},"Copy the file \"foobar.txt\" from remote host \"rh1.edu\" to remote host \"rh2.edu\"",{"type":378,"tag":1648,"props":2765,"children":2767},{"code":2766},"$ scp your_username@rh1.edu:/some/remote/directory/foobar.txt \\\nyour_username@rh2.edu:/some/remote/directory/\n",[2768],{"type":378,"tag":1655,"props":2769,"children":2770},{"__ignoreMap":369},[2771],{"type":390,"value":2766},{"type":378,"tag":379,"props":2773,"children":2774},{},[2775],{"type":390,"value":2776},"Copying the files \"foo.txt\" and \"bar.txt\" from the local host to your home directory on the remote host",{"type":378,"tag":1648,"props":2778,"children":2780},{"code":2779},"$ scp foo.txt bar.txt your_username@remotehost.edu:~\n",[2781],{"type":378,"tag":1655,"props":2782,"children":2783},{"__ignoreMap":369},[2784],{"type":390,"value":2779},{"type":378,"tag":379,"props":2786,"children":2787},{},[2788],{"type":390,"value":2789},"Copy the file \"foobar.txt\" from the local host to a remote host using port 2264",{"type":378,"tag":1648,"props":2791,"children":2793},{"code":2792},"$ scp -P 2264 foobar.txt your_username@remotehost.edu:/some/remote/directory\n",[2794],{"type":378,"tag":1655,"props":2795,"children":2796},{"__ignoreMap":369},[2797],{"type":390,"value":2792},{"type":378,"tag":379,"props":2799,"children":2800},{},[2801],{"type":390,"value":2802},"Copy multiple files from the remote host to your current directory on the local host",{"type":378,"tag":1648,"props":2804,"children":2806},{"code":2805},"$ scp your_username@remotehost.edu:/some/remote/directory/\\{a,b,c\\} .\n$ scp your_username@remotehost.edu:~/\\{foo.txt,bar.txt\\} .\n",[2807],{"type":378,"tag":1655,"props":2808,"children":2809},{"__ignoreMap":369},[2810],{"type":390,"value":2805},{"type":378,"tag":379,"props":2812,"children":2813},{},[2814],{"type":390,"value":2815},"Copy a file from a remote host with 1 hop to local",{"type":378,"tag":1648,"props":2817,"children":2819},{"code":2818},"scp -o ProxyCommand=\"ssh [server-you-can-reach] nc [server-you-cannot-reach] 22\" [server-you-cannot-reach]:[path-to-remote-file] [path-to-local-directory]\n",[2820],{"type":378,"tag":1655,"props":2821,"children":2822},{"__ignoreMap":369},[2823],{"type":390,"value":2818},{"type":378,"tag":379,"props":2825,"children":2826},{},[2827],{"type":390,"value":2828},"Has trouble with spaces in paths - enclose in quotes and double escape with a backslash, e.g. \"~/Downloads/foo\\ bar/file.txt\"",{"type":378,"tag":379,"props":2830,"children":2831},{},[2832],{"type":390,"value":2833},"Example usage:",{"title":369,"searchDepth":486,"depth":486,"links":2835},[],"content:notes-to-self:scp-tips.md","notes-to-self/scp-tips.md","notes-to-self/scp-tips",{"_path":2840,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":254,"description":2841,"slug":255,"date":2842,"dateString":2843,"encrypted":368,"encryptedBody":373,"body":2844,"_type":490,"_id":2993,"_source":492,"_file":2994,"_stem":2995,"_extension":495},"/notes-to-self/regex-tools","Your standby regex101",1370707200000,"2013-06-08",{"type":375,"children":2845,"toc":2990},[2846,2855,2873,2883,2899,2910,2916,2938,2959,2964,2969],{"type":378,"tag":379,"props":2847,"children":2848},{},[2849],{"type":378,"tag":383,"props":2850,"children":2853},{"href":2851,"rel":2852},"https://regex101.com",[387],[2854],{"type":390,"value":2841},{"type":378,"tag":379,"props":2856,"children":2857},{},[2858,2865,2867],{"type":378,"tag":383,"props":2859,"children":2862},{"href":2860,"rel":2861},"http://ihateregex.io",[387],[2863],{"type":390,"value":2864},"Visualizer",{"type":390,"value":2866}," cheatsheet is good too; via ",{"type":378,"tag":383,"props":2868,"children":2871},{"href":2869,"rel":2870},"https://news.ycombinator.com/item?id=22200584",[387],[2872],{"type":390,"value":2869},{"type":378,"tag":379,"props":2874,"children":2875},{},[2876],{"type":378,"tag":383,"props":2877,"children":2880},{"href":2878,"rel":2879},"https://www.debuggex.com",[387],[2881],{"type":390,"value":2882},"debuggex.com",{"type":378,"tag":379,"props":2884,"children":2885},{},[2886,2892,2893],{"type":378,"tag":383,"props":2887,"children":2890},{"href":2888,"rel":2889},"https://www.janmeppe.com/blog/regex-for-noobs/",[387],[2891],{"type":390,"value":2888},{"type":390,"value":469},{"type":378,"tag":383,"props":2894,"children":2897},{"href":2895,"rel":2896},"https://news.ycombinator.com/item?id=20608032",[387],[2898],{"type":390,"value":2895},{"type":378,"tag":379,"props":2900,"children":2901},{},[2902,2904],{"type":390,"value":2903},"Another visualizer from the above: ",{"type":378,"tag":383,"props":2905,"children":2908},{"href":2906,"rel":2907},"https://regexr.com/",[387],[2909],{"type":390,"value":2906},{"type":378,"tag":430,"props":2911,"children":2913},{"id":2912},"alternate-syntaxes",[2914],{"type":390,"value":2915},"Alternate Syntaxes",{"type":378,"tag":379,"props":2917,"children":2918},{},[2919,2921,2928,2929,2936],{"type":390,"value":2920},"You were at first excited by ",{"type":378,"tag":383,"props":2922,"children":2925},{"href":2923,"rel":2924},"https://rulex-rs.github.io/",[387],[2926],{"type":390,"value":2927},"Rulex",{"type":390,"value":411},{"type":378,"tag":383,"props":2930,"children":2933},{"href":2931,"rel":2932},"https://news.ycombinator.com/item?id=31690878",[387],[2934],{"type":390,"value":2935},"this hacker news post",{"type":390,"value":2937},". A small improvement, mostly seeming to add named capture groups and \"variables\" (really more like macros).",{"type":378,"tag":379,"props":2939,"children":2940},{},[2941,2948,2950,2957],{"type":378,"tag":383,"props":2942,"children":2945},{"href":2943,"rel":2944},"https://github.com/oilshell/oil/wiki/Alternative-Regex-Syntax",[387],[2946],{"type":390,"value":2947},"This page",{"type":390,"value":2949}," tracks a bunch of alternative syntaxes. ",{"type":378,"tag":383,"props":2951,"children":2954},{"href":2952,"rel":2953},"https://github.com/yoav-lavi/melody",[387],[2955],{"type":390,"value":2956},"Melody",{"type":390,"value":2958}," looks more like what you were thinking?",{"type":378,"tag":379,"props":2960,"children":2961},{},[2962],{"type":390,"value":2963},"Both Melody and Rulex have playgrounds, but neither has a playground that shows the results on sample text.",{"type":378,"tag":379,"props":2965,"children":2966},{},[2967],{"type":390,"value":2968},"Both appear written in Rust.",{"type":378,"tag":379,"props":2970,"children":2971},{},[2972,2979,2981,2988],{"type":378,"tag":383,"props":2973,"children":2976},{"href":2974,"rel":2975},"https://github.com/francisrstokes/super-expressive",[387],[2977],{"type":390,"value":2978},"Super Expressive",{"type":390,"value":2980}," lets you programmatically create regex and is written in js. You could create a language on top of it? ",{"type":378,"tag":383,"props":2982,"children":2985},{"href":2983,"rel":2984},"https://sepg.netlify.app",[387],[2986],{"type":390,"value":2987},"Its playground",{"type":390,"value":2989}," does include sample text.",{"title":369,"searchDepth":486,"depth":486,"links":2991},[2992],{"id":2912,"depth":486,"text":2915},"content:notes-to-self:regex-tools.md","notes-to-self/regex-tools.md","notes-to-self/regex-tools",{"_path":2997,"_dir":367,"_draft":368,"_partial":368,"_locale":369,"title":74,"description":2998,"slug":75,"date":2999,"dateString":3000,"encrypted":2717,"encryptedBody":3001,"body":3002,"_type":490,"_id":3022,"_source":492,"_file":3023,"_stem":3024,"_extension":495},"/notes-to-self/do-a-circle-and-a-line-intersect","If E is the starting point of the ray,\n.. and L is the end point of the ray,\n.. and C is the center of sphere you're testing against.\n.. and r is the radius of that sphere.",1336320000000,"2012-05-06 1:26P","KDPXfCTE20kbF0aIHXB6qJDGCrW5mi4Qzb_I_0qBm99q1OgswpM2wN91GZ9SMlvwGjY-qZpq9MKYLTSHR5JDLWrIvn3IJJ_F9dzZcSWvPUYdt5eoOQEGIGRNNXFsh0k8wI6wVqo85Y1bcS_F6INNIUhutj1ENPLm__ZdOyW_f4TvX_OC1l06ANLSD8tyF7AZIjtc_aoE90m-JHe2jMiri0MWDxxoj_tgb42nAN3Wm89rIRdRukYX0y-GZhZz_Xhk4mJsdN6xhOidBOil50M3EKqPUWzEK6o0CUP6oki5_K9P9OaS-vRKrWrBDQ9IVlE-_hSRzgZ6YXQ0Uc3wsUGU501BubGGJ8smdmfpADC5W-7bvIdpl2kfhp66dPrCoO3K5J3vVWJV9_4jDWM8ZYM8Jr-bMiLUV5PIs5qfK5cdAIDV-gWSFiz78Kvvg5jyYSBWDjqZs1wblgDnJExJkB2cQ8hLq2A3hXDxYzd2GqKgIFgDkOEvyPKtjtdnAwMrzVNQXrMogNGl25eDHe8riU4dzx-zInvaYDbY1SwPbtudK5kujo3MpzUynq_xTFfyrsiGiMd37VMdeXUfoNBHNOgSAzee9vKd-dTTKeISl2ty2dbwEVzd4KAXh9AN5JbhUjJeJH1jlQW5-WFISagSVvWhp75USJrFTHm4z9B-I59_TUlET_oaelaj9rEnDFcdlbj-Iua52wfewyd6LC6x1Z04rk76sZiSV0FnQHPXZOkTktOySDzSqhuo4la6YEWSj9y3nNyW9Qt_M92iBfeNCI9CsBZ3yoWGkWw8S8TP47-mGkBabkfkNfbSBxB0RLD5QaKrCaWJjVevGUWkkDwBjAP7_caa5wMtGUwDQ4yv5saDexiagD80VcA17-EEQvQ2ti2hRqjc7YlCQxnVVf8T2V4Jptwxi8ySIYrhtOlZ3LJhs-3_rW03BJBSKVG1Se7yVgrMPXtn5jWP56dQ7sqXMpO4_dXmf1TdSP6s2TMg3Wu1QFkEz7GpP4xZOmx6E1Wccjc02o15BK6L3iXanRiBBWmscp_tqnrsgU8-pA9D3Gcrdjx--FLtzAfCw14Dy_1-wspRSbgOfdw-vPB8YoIpGvrGxBIIgCnLO_y_-dQSFygvuLk9co883jANqeVjRA4jMCwWKp2EyIPN-mKVf8OwL-73phqAy0kLrS1CSaICKoAb7Umz4zSApP2Tw6xss3xCwAemjKguWBKo6q0RIIEcPFD_0OroSrnPgOV1EWM0NZ3V6HA30e3Hrb4VAvz0fgQyp7q6jmM130fZbl7Ee-2BFJgVz3oAiYc1iTGaF4MZt1gKZ8tuh5dXqtSGXpAuIBbHz4soCDDsiLZ8d14malHFLspzXTIO0_d03lw722V3xLRakljDVPKtNmVL2-qFsg8ob760Ey2JDn97BXFW6fyiRwgSvTJwusrAFBk69wGVOj1xf0deAeiainES-MxaROnsy5RTfdf_2NdEdyTfoEXa54SUTwl4pnUkp29XUu6FZ8-QvU3mnQvhOU6dC1FaRNp2ToZCi4GWs5KzazDJivGWZFDLJ-wJH-XszjftHrpaKH6wi5adBso1QgWDwC0yBfrzfiTx9ERHDBgRked2y9c_AwsnPKmcQSjqdKpeN-sapoctSu6MaIR4BOOJb4eAZ8JDUTSAH3Zskj-ZBvq_4OSDlLWfTyfHUqazgGoJb0AjSZABhj5diPq-aCPXmlM41fCXVcSkQZXBTkzKJLaZyEBbFRMq6j6pxBTH-39IKc0IF1ufO-S4WUsuDrv78Nn3K0rsncbMtRWVX50feSlz0B0b1xA6y3CdCy7q8uQ8eWR5-T9os7RF6DhaliF7ISQ3iYnncULHrBPIhpZmV2kYWJsaXtrmtggJnfruwtNLlI1c6ygAyGB7yXjS-GTG_3CzrbNMzAnFeDq6l7JkgPgh1yDxJetcy3MTQ33857zYa2ZdtGLggQ_Hdsbjcy9it6eEFdLxpZFte88bQLUE_UXTlFi32aTQ6sqAuPaVO3funuii23nEFavIu72znbgz8cQdHcyDiCzboZmYY4ulDXGthRzIaiCQYx17z9sZRw8H8eTDfwvfQqH4EwU-KguuN-aLR5ieiigH0LevvUpGzlSCislySXvObLmhVysJR3C01e4nCJxx-IhpwsvQm0N4cRfpWLQ27q00VJb0clxZN4X0t68Ep16_a-zj_aWL5lYuJsgW3qPN_ps2qXuAwiwBQ2avX0ZOgs0HRIo0DH-s0Hqrw0tXtmw-qQuwEVbah6cKycK0ZsecsuOVO3SyozNZLnIpuXNN_UkVyilp4mAGlqXdDqsyKN5mhw1Eh5mAw362MAPuDSIh54XLoSOeG7uB2uNx9iFKrAPo5NyozZaOVsN0UyaBWBWeOoVuur9YzQNQAKHfE1ceAb_J8rLTvVDnz9ALFLhZnb1EoMGIve-6xjnjpDB9toH3j8--IanwWK3hkMlTr4Ax-3Lcf6CdBPmdwDf6x_J4htm_vtshvAv0kyk9VwZQF-RqiArPi_O7TLKbkNahMNvLbtH0afbdaW8FIzpp_Br65897pavSOJPFoi__Y1MBPGFWuw4cwU1JzSmC8F5bhyfvTMQp1mETLixliGuP9SLvK7eHzUn1RsX93IccZzmVoveYxP_nvs_DxIhDOZWCeJxqppmexXNfxZ4Spg6z5bpqRbNTPa4ykbGjl4ztFXkIprn06tJFMihMJRCCYXrkGBGmW-7yMbdm7El93UoD9guhwYzA_Ww0JLHhgHJWcOcaTvlxl7WbuAX1wSWyT5NLbeXjORn-_u7b4-rCWjNlwJ-eAyxnJdR1C0jPp-ea4NVVNdY3AirluI0FWgMHm1ihggR26PNbd2i0igjmgRkqVxdV3mlI854aCHN-3x_isH-uVFSLQGPBwtiPRAiFjuh0hOlMzSc_ilsSGtXViBVhqE8BMM0bpammPd7dhBgyRRFw2c82_Rk_L4CgdoNbcNA85LE-i1SPDCtACbjC5t-YGfLPAjobdUX5AuSlauTvl6tULqDA68Ds_HTbIpjlFxgzIWMPtLXMK9pCNFZ-08manISyYLcyygYLs6dOnD72Sxk4xAadPmrMGtuA8ASveLeMSW1PRAcwt8-UYjL46Hx26QTsZ1bZlu4GYxsz1DvVbTqyx-Q3w1zQYpPol8EENaYgeHNOdJG4GlN0dNM8Ce3MkooDEi7QWXTB5gQtPUyxMtdiT9lx0xyDQQ7mkDGCW2WVLIZ-c_cBlv2LHKE0yuYm5KHsnCjLkMPYhXtMR0d8wMuZDPyWg5_5J5XQhjYB_To9Tlk76n0owNM1df7cnvDbV-WcmommeCwhH7fXZJbLCJTgeXCPcdLZQux9f7_Q_By76FQXz5eRxq2_xD67g-msRBtsWfc0OwmK6cpECoZPh5hmGYAtGd6aWXMPnhNV89z6S041ur2E4VvoDtm2zhsqQkB7JJiZSs4cY7PNRzSI2U7sOTh695OsARNInxc1L1Ttu8OOVS0DBqXI-460Ap0Fas87ciNlhM-d6FA8jeaoWVS88-v9_odKWcRnVQ-aBvEINeOblIVIlzeKv_YCVGkT-l7FAC7MQ1il2UpexNSnn5rGiiKxCnhDLcgdyvksvEjloUhgrVP_ufPmGoI9aV2KTwQhJNyhXxKbhbGpfMVlQH9gsNsfSXzMmKR_uMVcSEIwM7xGmlmvg4D7eHkUmbuud-JuTUCSv1MLvS1CHSutBFaKs27-VHpyx0rZaSTgQ_C1_XRY-2EJPW8TLdzs9nA-kUCWSox_irxpY93wdFfjKIdm9zQFOwh_JYt0Ivv_MoHDkO1CEjALDRDcekKh2oMV09RhbBIy1rFPRnAEuwju55WVx9Ub67rHJkOQafW3-1r7BziNOmH7dDFd9v2XcTWGk9FnuZQ0sM7wxkECmLPjvWasqOaTyNCekq0rQYM-3ATfoF29SX0i6tdcuxxDrOXcSK2c_8emcaCIGXpLwdJ42S1elTVSQzMqRSXrWdp57yIvfKZHfzTzN36KNTbUSQ-rlnKOGMeWXu-JfcMxTIa-Q6kCEAHUwkWra7Wvszg5eyJRmWixmmqQ8unsjLAz3xifVwF0pwPcTdSafVCHfiTtVZTFcD4_3MhQemogud6Z4ulgJqbUic75LGKJDaooVoBMXwG033_KXlxbhC6dDK6HKdEvhu9EWR1hUKJI6TeZvT8A6goRZfENB-Hbu1AUam1Fgim6ccKEQXvCm9PKVvhzksHSYNuV0BNnFWIbUIxByovUzuenUrN027BmAU1iyhDC0vayYny4-yBuIcW9MOLq_Bn9CZ78vkEnkcZiN_OcFUFMGmCpbBNu_gzPVWAvdPnNsSVCNk65R23G3lwmralRTQFczZa1MIML4201jMz28OqKaAz1Ya3loHhcC3kly-J3A5zaNy9gNsVsYCCGGjDprY5ID3ReUkV9Qo2LgAH9foC1K-FhIe9TWF5a33fUEf1rcPOzwZIM2xtcuvb3tuWhYSPUhS0NIWcCiYFcwkqEyzszZFZcFDYEgQcbGXm-hZk4fHI-1ek_1WZnAvJguhZ4t_-BUrL1yxVf_iyNoyYBJawusd8_u_GfQeX-hwDq3koGT-gLb0qH29H3wJ3Ms0VeNVBQ6Xb-c1UWsjE2AvBmjUVsq5LcDAoFNfryFeKKJGjowicqIFqRMWS23NR7cFUJLv46RNdmDCJ940BDTxxc7M5wi2sYcqCfg_lN0VK_ppYzR_Pq5bqnyh1QEbsRGmMgBBcbfTReWqFZxk73xjBpSKe244n1RiSssfTmaY-iJSleYVDCct_-sHllFM5YCEusjwBaQIX-o6k8oFKhy0SpXVz8pOLROIPOeRdxJfKyYWyb1FI-3yCp3U4wG8kpnMT3H2k8YlfQdWS9zwK3g0ZuTOmgUICa10zOa-RIw4nd13rFzhx7Qw3K-f6B1BTVmykyRkSaoSKCgdvLjPu1X3Sf_0Tcpqmj8PMQam9ED6vulHpOyO6wg9gvTfp--_gG1NWvR_5IBynO-CueHERnglkkJGcjnPCPBCf7bLFZwHHiPY_YNwwqWzdHrA1s7kFSQ2DtQ1aQBd2JgjttF-6CtihepOL9aBS3tMj9uD3k14aaiu5oyTYFiLLmX-WKStMuqEQcINZ_7VfmmbumBa9VJtAUCUqfUkMuB8ZEo3YNVtm39pCMMLxQXplRYnrLv3HrORc8Av4T5n4NlcpiODFOMcrEckaeO-NiXOIu9bpeiD8YuJrriYfTO8ZGoJJe7CQsfAtm6hty0LiM-9_uQOZlzsPZ4gz7pVMBbW2SgEe4yo2jC7NM-3oLakuE5izpIQq6orwIVCFv72KGTwGlvsk-dNbUp0YPe-vbuNHrOvFzHUr-C_rVWbJtaJFfPVXCrFnA716W4Hs9jAfhtmLxm7l9Uv5wy3J6FNZ9bJ7qPK5AYh9kre9isc5DhznZx2hrW8lzLmBzVx6iN0UBSNgLDwVuCPMz9V6RUVjdvZw_erTPZ7p1Rr3yngxDnDUkzfg1hSBXh8wHTjgoWiTzEacKKQ62-RE8J7TLL3CmgIq5mEYFCCimbF8RUzZ-I8fGYvR0Palj0U1dcFju0KE3in3JTdpQIy92q57b11BVVfwwnJ0x8KG8pYk4ob-ukP585uKyCP35g4Qee5EYLbNXEbwo-SqWkXqAVClUoRIRMBz4F5nBSUokglMzyB3-xomyiFhq4HO1MmK3fYZ4wVyaGJdnPSp6xBospiGV3eO46o4JcOz1grC3xJMx7GMNRa4aVE0F-rpkiS8UXnuEUjhlShlbEuUamrEHMQLzyjomaMw5p29DUUa9Syf8VYv61VrwC2V0kwTZqET7YqW5D6DfaFsAun8DF-MMjWgbXDjUsolwAz7ttVTtjAy208wwRRjTtCrs0VP7nfHhfQZN7PWs4aEycB2j_Na5tk1Jy0JPmS1u1TyFaSyrpVq9gJ9xdLvx0_8eRjii_crZ45NTnGeO4mo2o1n7WfFn1HbFy6orRWDMe_7YeMhghPIqWQosQCo0LeHPfhhy56oDCujzR5qBOgL0Dn1_9VH6UiMVnFe6WKQRT7hqagNuGX-bpaLCnTH40GsKpIc_-711Hv9SfDupAC-aFHVLZwoukPLW0eJTNbPw_CPV0UvU9AUCoesFz1Aod0yup-SI2Kj0v4jfU9iF_UVlwUyl8dxo-I_EJtckpAauVa_9jgTQ96yTQSISEkhJ49lCfkqBEupAD5_r9iNTnpWVdmIWuCxpAr8YFDVb4R6HBmtbIF0OAoR2X4qBgDEC2phhgel0h9ibhTN5niYE4vsAsMJWf6w9V-UGw2E9AOrSLL6_5y9BpdzOwfYO7PiF25J-E-bJ4xYMF_iY6dT0qGuEDy5K070GFRghgs3diNB4FMWSfhBDHsO9hZIbvm0OaAzefNsWY7f1idhcX6IPC7OV7ph30i38k5U3bdeHOZfpPLXEEyRk8W3tVF31jXftpiqO8QmCvP9QdP-fFIA9rWoPyYmFAYXnzYjSwzRCdQoyBtgugohk5TMQC-8dHAv2xC-93tGH4GIe2Ngy8Rq9ek8Eour_2C7KVtbKoxwBuSzZ1wc78Zgms5ClxiU1Mh3Eb5xnajkr5le754wE5XWlh7t_hEDRn1-VE5x2ZEjWE_rIVIeEcDC_aHiJK5UHM8qMQp6HZ9mxw9Yfpdd9Ov5rnG0JdRonP7MVegJSN_16IUdd2q3yDnJLJAhpBceMc8PWLjJgCgewKMYrAtJCBY9fSNSFdGVopFBXKBe0QloazSlQs5ZKYnWnYG14wGUTmEEQ6gaZ-H94GXICZxNQ84MvhjQWpy0JkOExjZ8KBxZlEsBpdiyyJYWNl9fRTHVTH4FCkuCIikcRdWZRfQwynkAyreVuMavA53H6H5K7XRq96517fGnAdug-9VK7oTawIp10E00i2j_mP496YgQNW5W5o4Y4M9HTqpDTYmtIWgt4LH9O4pP7KdiYTqE37l8OcFzuDeAGjn9qsnRuubaVqJ9m9dAmy7H-QfutL9ZcCF_guVVwaVkL4sSz-RE-jepGbqHrffhkOYA1MF0f3AL4HNBwEjz4ihMUokr1Tw7wZRIdN0sREiQaCMaNOo9HL36lRNrq7q5PxlyitAnieIQvxkAIR_XhSmPJoNjemQMc9OguaESN4hGDu97La7jYbYHgMcMSY-LtWLG52feUorVDJztEyvSIIbvfnrDnt_8iZt_pj9Ce5Vg2c20aEfqqTI_NMEGqudkmNuWbVNWVTOTU-IUcBiY1Ri_ab-hpb4pLJFcOiMDpYjPxbvQR_qnKIQCrUQrn22bDjVI7JT70OvUY0Un-OmLrLfCucROg3e99E4YqYgR9N1SDKOh0mmrJu89Izmhuhs_0tCBQ4lAGwuJMgLlYuJv7LT1UgRpIjImmIfRu5oaW-La0qVUxP63CsM057flUKvdM6cUdLlxajgLcZShDCFbpoEx2x-qR-au5xFxeejHIGhc2YHy89fiD9Kf-tttCwrC6KlDfBlJFH8E9-iS_MsyUyVBd7DRGIU84OvTLl8GUeLpU0mgeXOeMg7HQGYiqyMhzf6XDFJkjVYDSrikYpo1patbsKyrdPZXB9Ph8BdEoyMDwh28clQkvWCK9ClnZiaViS6Hx04nH58g4S-osZ9vdGigAU4nzx4iHQ2HzTmJODxOB1KExEY1URozJQJQvgCCwSD8HxmzIr-BlCKtnd5p327jGPFq7p9GyngF60lXZMyBEIDYvCbWrjxP-Cx5O3ICKFEazzYotE-KURTVv7WX6lL8XDO1RoWKwv_umJ7aczGZ5kdOdaeROxCsEhAfcnkwL5QCfCxl8kG5oQEZ_HbI6DgABK2h1iFZcZpYd-QF54H4dFvmG1bwgHIVO_ngVs3cLWK_WBWIZ0e8RyOXTcC-v1TCk9vmAzHd1Yljp4DfgDGkeUu8i_HvbJF7XuJYeJgt26hQJv1bRP-XbH2V67FI0f-Q4-dwj67Vb8lbRnp1lcAZ7npMJZjl9Jeo7xJH2tAfSCgrW4LYXrm8KRJgDVE0j-WUfk8mN-TBEyMwP9Pmyr1zgxlsPyDkGxxYLqeM2Ab6e5lJBp9EzsSo-KliRcnmAtkuRNI9gbxC3vXQPvXfIUqb-ctDIkmSIsECe8aGLAgNwAE3_5uD_cnmCxB-RuhUvnqTR_3rXD75co-jW7nBnBXu5hpdTHRsboQQoA_NVZAHwofndNO9uz66YwwX4FGVh1Qkx_7evwMrK0_rDd-OrbuY1ZhRcm0r3g0sbLAKORukuc40AmTnCgopPuhSeCsE2EjL7na9w4g1INPtMRMVT2G2ZBr6ktYq9GZZ66CGRrAy1jfJIHhwKJ7pnDrn6XMsHAm1zTi1pNuGJbAMAdaZjfVb-kJhxFaZ6x5PLPLf0t3xKPMoUT5PVOo8UaVmmd7sHyFN7AGquyujmsZ4M5ghgoDNGBN4ppQNRoZbpihSY5gdoabW__x6kfDE8t3wmocr6fzyJu6jn2nH93t6A1NT9ofvAv8TpPwjZun_A_DgweVNM02KbxShQPE5WFr6tg8pkXEaF6eCjdaQMMiPQPehRD0XVOyAzyrRIGTCjteW0ksJWbo8r7XrLYvt5YGlIHPCItBtQXwV_Vxj5qEb9QooQ7VcrD-PKtVDjkpywtCTA17faKVG_ohhqkiG_RcH6cCA3x9jCwYnX2aLZSY58WbxEF5ryvMMNFLgvIZ8ObyLNSyOx19ozhrjJRJ04HcwofiCz7uFfkyGM-rVxPPrOuUvNuOU50wgYfTFa3yuMo54yA1025uwLofQ9c_BHd0OrEUP5Mw5WnnfUTOLTwyDHKVaUNHD1HAqseiN3z0IGejaPHWDbpJgkZN1xMaE5Ja7ECFoY-a9y7aPqJpFbuQHeFBCtbWBJzBO93OjfZvGk2OzgN_yCxcXtuNo-Pd3_mNesLRX5sBjn6UHxSXci8BlWwbxVJDstprQT1QV4fXesYm5nEokb-RT4Zb2j1jqrxzq-Tjystf4YyUdDm5qFJuEUXKuAreLp4GOx8znMkyp6jz63G0iMX-vffKp5NA5p_DAkcNef1ES0HaCa62lsZPWo0JeN3g4Devf5NtWzFyy_TRlhydF94VVDgKbBclDF_B_3dzTtmt4eICTrxVYWbm0srbasT_Ut73RPsio80-KX5VWzFV--QUXNguXPxlUAILBLvUcJtLUk6l9tlBqyrbpLpVm4cAaPxjtvz_tuLpZel7PL7OFjoLLfZXOBElO7Kwq-aVvSdBJ4p8r_8RjZ2BuXN5WMJfWd36WkulLqsOQSzanhixscdwEk8RTRrZqJLJAe2hT8osWbcrhZFyhUGAOnNXSFzLQP_llDrIz4szJUiuTykKCbHIGsjlgyDan-ZLCHFaC2m1zb4k8G7cmzSnfJXdHzmBCporsKZLRBppRo-wAzAyaPfyGqAkg9f39cF4FMx4_nqauBXjE-XpXVMium3X5cZWVADqjF36R3UzAg4-kcSNrJtKiWY1Io6CPaEHDjkH_YWgRJlHKBe_fkuAJ5_26tiGUQ72mkV1PCZSzJtl9rn9S9pvnCRodQgwpCW3nnCvngD-vBeVs0gxAuOZynaT-pBUOOXsK609F-CbqfqczLK_jXDAwRXrggKwEAPuemngkezKELh8QLJ_bfMABqsPVLzKDrxY3ByTtVakrSmFWYNGxGqi4DhBc2kp2f285CLgja2Aq4wnosG495Ou4p-WdHPvoFg6C0aBVfKstu-Hky7eTd_54LO_adCiAqU9xh6NDRf0QR2M_lOqROIussTy91RiTM0561QvWYsbaw7eRrYixruuxYdFffjV3c0kdtob-u8n4oXkVULGH1OIALYIaWfRZh_w4KuYN6jvd8Eb-cF7S4_nxfo-lcQiETzaYct25Hwb2rr1UVKjbrkTHU_17sGcT90Y87O0nyby3rH6IkJmTIEp5Lg2rwD1pDDje1Vm7NTU5dGx4eZeSipZhEUQpJJslRrdESFVCC-cn82fZpOva_kOFand0pk8WYu8DkgJmXCQUdLTvqSG4n4DqfuMrYUyRqGxG84cqsbsExWsJxN-09VnD2M7NPzN9xkbDr9zdCfLR3j4Gpum7pjn8CkkwZn0ROHeVGhqeQtiqgJdYp8mQMP2yvM0WMCap92QGoR0pn-zKEiGuKuhSGnH0AOJKjVYJlQsJDXFT_M7gtS8Yz9-_wAe1EXkwW0MigcvwCt8U16eccceQHoskmW8cEM7Dfuv836scYWi7i7S5TIbiQNUBj8NC04uTD7uzmwRIJmupq72Bht3ysvsCFbuTgnUyNc2Tp8zDd4aTfKYVtts9I7y4DF-po0ahskMbODIGQ8ANzZbBBt-Fbp8dC3Y1RsmR2VSaCKWFNDXMuVGfCzzvYOJCM8o2umhvhfoXEv-AfkhenTxUcJLCmSvMEEiqP2JBK4KtTC6m1E7RdxPR7mkCbn5sehCDJ5VyOiYJ9rH3v2N7x3fPbQvVjfUYWPhrCK6szH_T17xSJRpg8c9QPhOu_HjJ2i_iy7xud0GTolIq31GA0uD3fjOCOkLEXAqzDKla9XgM76StJeZN4q0k6xzjsroPB_qQ-ktricRa1GbyHePaZ3vLrA7bRvQRnO1fj5PkrSPyRunnbT3IuFSBnMKDPwGIWbQpNEOydGQzoi5MbBrw72mHUXvG5N8SLdCezL93eO92GRCb4VuDrVeSm2KpbMJxrgww25IpMt7XIU6fr7K-i2oXitOJTafyUUngFgs079cv_etB1Tou2-jyY3A0UUnlbmfK-GLVgmA8Lyp6GnOrwlFSHYgAdvRN1ZIcWH2A3oXvPZ99bJoyUx-ZUoCCCsIQ1aTrheTu0GTVNFZDYe-9S9tRlv8st_L6PnpaYJA5UM7kp_JfQtz_P1nOHu0fea1nkMkR-KfNrG9-W4-jmwPJqHHgM1lPyW_LorutBS-wL4mro8mLTlybMk3l6IfWwGDi9lWPvJdICHf3eASAoH0Nc5snwyaAXkRuJJVPI5O9SKJVTmepF06FZfh_fOon9zpirFCnrDMiBM0or5xxiYVwuWqwVl587fvjVgJXmEP5qDJ5bmjW10M8zII58V8eZp8i9RG-HJPTxgiS-_crDCP4w_Rv4u6JJtxvoxl6walmJHSoSwftMtxQ_2UfoTckXPTWumo7rmQ4rjgaYDBVnl9KSzS4z2Hm1jvnI8T0e1eYr7YgY2JK-nAGDWZowtKxkCdE6HoDIC7RIIfUSGaTInQM7KDM-hDKskvtgL63WsvXdxHc_I6zgkir2C65Zell446fltIejho9e3iKHVlkuFG9aoOvaiT9gtEGyuscNF3UYnGJ-Bp8L_aXzRKc5bJ1_tORJQSoPJ-RDzSUYXCQ8bcRHzpChwFq8qLB4WGBVEVlUkL1xd0X0SJ2a90zrWvMbNl51N_4wgmkUI5jtdgxz0ooXuak8TBRzxR2QsWpFFqdpwgSJHSvVwINHCSr6VB7DZeVlcWKzBbJmjFc9ltKoqNUNr_ouD_EjSeM7bjomNgxAVnE4Uq_dpVB737tzbxFr5oslhj8Cs4eOQ2R1FO13wdqQ636lRauzjaBD6asDS_1g_1taKoxH0st_1luKKp4-9HIsuZwSmw6kpxSMZprLUaozZbJTkh7x_IodWxJN3dgpAzeH7gJiTuwAMONYB8eVWZjIJJYNo7mUlx5G8pnOceiNjDrPHtmifgjSFnCnNx9QV8HXDXxeK8sABKhKe7M8WH-9Ry9r_y71GeOh_ZaMwCouW-sDYQVN4Zs4xP-xZw28lEdMq1eHaLDwjBjTGWNfGl4JVpiL3wwOx_FH9AAx5UdY6yzVR3RMIOIstw6t95giKHbrn9YyDqN9_0OZYaSNH2lppe8oAujdrbaa6_I6AlrMlNPjndS0mcAr4SmBgu2gvWUCatH824uqcyTNOQIORIAcWQhCHf1ClQIr7VAhwCKckXHxbZzf-u8PhXI0levB-2hZ8KNrYKJf0lhcHnj3YCYl_rySWbnGjBPcADRTrn6TPAUDjUlRHJ629cT6f3UQC68ASOE9R0xsedWK1IP6fjOUqRazGZNr4LpULKZcEWuWLrQ9BeMOALCS9JMNQmdFNNQ42pfWb0dTWaZkDR1qTlsFKtOokM_BUQRRNn2BEPZrptuJrxJjz7CoufmkpG5Yi_ds_o16EVSPx-vaia0pnl1QXtv1tHYdRCHsLUjkf2IGhCizlTLAAg01sqOcrgEJiC8KXPCsqOpggO6er3205Lpm1D3uyxTPGzvO-0rNsFHgVS7vlNYp_P0hxDgdx-JpDCabNV2sWj6YLHej4mu5LeVJ-W4Focepdudv5DWDOwvykyvywmoUjBV3dZkHno3dip-z2zn0kqWSK5JnHgZ0KHdwvtxbkkzNirPHd4PUI5MNSVsC2a0h94LIUVm9Q7SAXZpjzCAurdXoOWzuN2KzFMYjZpqS4bNW3TBZLFmgLiPEkhNCF19_Gsi8NqYAzvQ96cYBrzVZ8oD1mVHQ2btk7LG2MaLZ2E5tAbn1O8pay5b6d6u0FEFhT4R4Hwe8KR2Dc8q62ulx9DJjNBF4CvJ7Yg24Z74_O-EA0N7ajumB19Kql9DdH-5FuYwUzyfTWI_yinb0Xi0g7Dt6mtw6xGQDaXhN6c6RGG9ny_WBF80rMTu9sPkIsY2hRgxgtUIIlQi5uBVxJ8cBacuOSHPJAG1gjlf54OwkCsOFfOUmFjLNysgwaK384hPoAsjiT6I3rEcXfTKzcstU0X_YO9DuGyOo1YRJrFOjoEzX1nWjSOs79nuuSXBoTBPfMZKI5AcKQBr9Y_5gU0J7aYrYcAcpG2XUw6x8atG8h7Eo9y7YtfOj_V5EkLe3ZMRYSqGAMAE-Znkul_fFAiuabywixo5Er3lztBPGYUtgiiVhgXtyGRHJT1yiH0oLTOu9mDkUhfr_BCtFpq9NSTZDk9CHX5iD6fEEAFLCXHZLBpgg7wUaqjC52zXRLj8D8bPmPNFMGPBtiKEU01N4zovQhmSX7HLr-7wfDRJkj0nmP4Ukn_4Ks2kzHc_p1KLOcnn-_su4fJcyrLIAOHHJrOPCev2jLS5lec7XVs0wKXatm2yIA7COopEs6HxchMZq2DcdflH2YMQRjErtZMEh7Ng7-TBO4lV-gnFlXE9vHiluF8B_1kyMlmcuHh4QU0XgGxgWTfccOXtcr8sArHQjjNr8U0R8z79UwfAJH-ru0b7A3FuE_kF2EjJbMZ6P0E79kWiCQ4n4ePE3lpGg5fR4FV_uKLDPubMYJ7HbpfEVGjdWR734WV_MZ6JNTLr9U_iv8krMjAZfH3Vl0AOmckOGxQ2SkUVXZ95L1ct7cJxB6mgblx1Cajw7oQI5rlT51Sh4v6iWtupMGX_lSgWtEXdxtiGKI7lrBxpHlVG0wYzaWFztLcSxW6jOokLIrQjT78865SX-Py79bUsPM1cupNJsOajY-JVaIHT4IPswC-8NWYWgguKLU90lTeR843XeWnRsKtlmwDUq8Vyyw20IpWiGn-6BBRPE4Cwd39HSd7HRigBzjnQNUO22ODNhWZunecrti5zgZeOTCCx_kqjGa6-IRK8niOJZptseNH5xaAd-zOz6MZSS2MIzFJsi4dX6I6haKUz8NRuJ7Xj3huFiwgMXs6VbBP1st8kLTdxf2MJu6Pz6BiQB0jAiu-ZGhPEUNtweAKZ5gPkkoMY25YaD1ut5Mx_luxJ_37Y2dcRlFo2IBcxuD3nTIvSb-FbWeKUEAp-5vSGw-HJb84iJ6MCskhiycrKmSjbd3a43Di9V2Xi0g4cFpPLAazR04ndjSNpEdyrVKfn7JV8_39Z41ATHBaGJa41qRtUVZrHveAVmqblEfZ6uU8Zwbb0kDAXXPMHtJcRbOYOWHYeUpdTWaAerVgEw9WzcZqku4_jegsQ6WdhbjF8_As1qI2SGsQHB58vH7s7q8OFmpI_rkz_UGraHStSb4vEwpf-HS9ELJvuB5A18_H15DdzEj0_FIw0akoK1OZ8pqljS1fL_obKECoDSlWun_GH0zDb0HB5baWurAbvK4fqdtMxCHT-TD0KxLCHMORdScLLGq56w7t3EMXXP3g4sJST992mVjo9z28kSUQDxmpYblAiVBa8euUqS13XmyiZA2zNqqIJMKbUd2ICtjvS8k9CyPQsB0--bQggO21fuh5_hCMsWm-VDyeYIbPBoFb5-DGvOt6fBHVRvheEPqbE5b_hKa_oDIfcoFqDQY1hjW2S3tsxR-WrJi1vVfGPy0VL_bPZRJv6VlHZ6_PPMm505SQBQVhq6cfZ1XWO9nSkLMRJwlHpb4UKRPLvFbK3TZOu3ch4GUAqT5x6vDXFbvFqJCZvjTQz8PpGzdPzw2ouFvIyDpPZi5VulfYmcikRkZ49CwLffRJQtOMAt-t8xP9CxctPFw0X_CuGoQGafhvfGp7e0-rIcDsytIE1ohzRIZgzicg2tIIX6bxeWWoE3Np-Ipa2t_4baMBJtZ3B7GF0x9p80vQw0G-S1oSNm9M1pEVuYvmDcFWZ2iLPXB8NyJJBxLy9u1YQMxUZrEurqhH6vnx56KMMnVaH5utQvpCUHFCB6JWjy7epC_1gKRVg_sm49XNdJ3LslUbh8pgV-NE_killAmmkVa_YPG3B5LyQHL5riQsjNr2KcP1Tc41hbD8BpLtiTdbYPZ6Vrx9DbMVcksd6rMUeWoG98heBFQqSzzhdkedcB6DLWeef5OkvjNsF92Bia85ric2i71743NhEEagYTkWQRpR2x8NfYt2QANbM_jw3ovMzXDOyEylBH381OCqkJwoE78a0aGVsMuDiTP6rz1okkEpUnyYQlD9J5JR38Smve4xUI4xXMXHWqDKqSYvhvLAFzLG-NWYmlg26CW34ndLj3uXxRkIm5b_N3VCM5QjkghO-PFR8mWFNR2xtn1vmJ-PtrzmqjrhoQ7AX2uaLZYfRoyo-rBteVij_kXpg4WFzIZbRCvfNChD4u_iUAxtISKE0XoNXxkl5dPluTN-vilNpnrZT7uaKiC1kepVmqaxPVFlf02H4xbA7v1KhvIokcHoCkCim_ggrcVEwF6Zisdup9nQm5cIHmLovxqWKWyogN5cbYGV17V0xVgSIAHPD7rKmV-y43_eIASG3SkvTuTXx8o1WmLpkSJ7r3XLwunzmSisehyw7QLDQYu-aY7PVyOc08oydlmopf-TaqQolh-kfvgseKAV80Vv9Fi2F-hwhLZF2zlV8OS3ReyK7WF1QloaxdDpL3XxQBPNDRUxy6WhWHHrkr_yaXB2bZjHrFWueozZPzHMsyCh5LMPRRXCF_HtFXlYRQ9TsGgJZhx8oCOfO1nR4QEwAdU_cpt0vVs25iemq4Pbf4nhMG10JprlJZ1D3kFUoyEDNih-TxMs4lLjiXLYbI_DKt1yEEmzvuICtdoqLNdxQzO3fOzGPVj0hP9vgep9-OlaymPgOfGnk5eUFz_MOnQdBZbLDH4A5MwUI1dGD2Od4oF7vhEsHM1Es4FXiFV1i9oHaaghdR7bKvfIzm9jl_iaETYftAvYXE_pnsY_kd38jLd5EHYt67tZ0jjeAcfn-NNu9YheS8HYuzIZpLmDnjOG_hrwrDRKo8pdnbUgeJ_csRUBzRU_yOrQxgMeyUdxrPqtOltFzDlUbQeIEF8thsVVSrLTthjIH5EaUGLtONa7zPeOJweeWRKGS6H-_hGNrIyarAcw8IcM8tER_dJ0unDte3Ac6MkWQ6z_4I0Eg3BzL6dSnBHAwg2JUz4yiGp92eF4QO-ykbTJiQIxYpKytfWsEgSTklq_rr9Y9h-05IsCM48S5gyBos0EzIMfQH2PO331hEtZ3yvRGhpWlwqcXzz07AETjcnNw_31nW12JuEkZgcTe7Q_R0cFIrpuDnykSsx8qUmIrCtuzk_U6dFaO8pmME8kFtrhGSIwPVduC7gXljUHjmA1Dn6ZSiWsLMLYlhYz-bYECOfr_lKL6DaOSraypV0uK3YfIQDXbyADSCj5a7dXsxEH4u64kW1t38L77mAI7szIqFa64A1TR8vd9BHjZbGXXQoVnE8lbVN6iix7tOK1Nl5ogANByKxURq_a76VCBYD7clOL068TRIU5_rBVLuvSdFEm-pXwNZVPVUd-8dDxKoJ1MUVKpwf0kbHnNfUuYFlpcoxE_jxcv1DyOYu64qfvEIgH34rzid0TTgg7k9cv9CA-t9BjUs4ysnnXMCyjx_8vE08IyluTru9QcTTgnzJVyEZz36szgR75E6RB9H0ywftizrpAD-J9_6OjPg4FUdrSU6u9K-53rJtlCeAaxhgze6gd9RUSVY02fPuIVgxRZ-QnAKuMXG4cBdOqJdtiYvi4TBtAGbyWFeiQvulzTbKZZY_r-eV5bNToDULxBwuOOtSlHqU0EVwFn-l26tvMHPiKd7uZuJJbnCNjKH3bf6fI_sm-AUvNsUoVEveLGNIls0vL2i1E_jvPvicD8fl9OBrX8cXM9SrnyXJZX1pyk0PoNKRu4Ve5W7ip_zjH67B3ZkMxFCSaiV0mS5r4-PP47MlkJmUSDdPDOCc3n1RiqIjUktw9Id8NIWVlh3uUk4dv-vT8zARQ1VChEWAiQCjVBxz1jXvz903CRALnk3cnjGZRQhbV3-iviL5iiEY4kJv86WDdcQvpssVpRA-N70e_kgbVGK3ytP80FlIegkbV7Havr2MbtcZvxgHWmE8eC-aPrWAOI6yggjwkPpJYXz0mP2LruCUQNL9rtK8pf5ARkg_-3cgvJ52-95IApPJRXwyT6qYh0sCBtdpavjWlWN80XKDO4lpE5RKyLe57ERGigSbx-j24ZhAMjfQ8uK9WMc7eKSx1LhI3bB9eGX3Al-YxfmPJDcuAdGcvc0-FnFLZ6N1KSupnDLTYc4p1xOnk4AL6IMd6JNMHGc0MxOXHS6mCOFzw_OVSLSkZi-MOBGfz_11EBzEGz1j72laEOLn5p-R15HXYTU5hpAeaqotu20LEihi32gtb6RPhzRcDQoPbfWfuggsl_kA51HJiXYRyDuesNk9aIcZZqcQoMJkVawxrXvQXTKw1LhUmre5IwdKORwUhdhdj-19fWi2ZnK8U5ksTH8zpV0BCHFJRS2jVup0SHYc2YFvXUOrTZycARhoyOrJQb6_d3OWZinZJXIyvhP92R9mNhLCqgdcLm91kNwdkeSGA7aggFxUUnY9lWQjWkuVLISoJ8c9bSPAL6JCZrgdcoP9PLhb7wHMrmQ_tN75_awNDpccjboKJ_K8mk1ZZ7L0OtVK09T4OnlIyLkSq3tPzcIRY05O8zzZCiHmt9tA0T11dGiX9nrwiYU1A6rNp7gIDu_TDZESaVyjLvjWdp0L3BjyMglZ9KuQTjh09C0vyOQwbCgS-owDWTsZj4Vpmsxo8Bawtah0H2W_2IKExb94hAHXoyjvgyddumHdPEoqbeSPu-_cY2iWwsZB6XHCD6b4DYS6NGZXs1IaVBLfpsh2qBuWCdskjO2KG0MxQ7uzn2ag1lDuQ9fx6CfE0gU3iWucnhPql04MoF6NURuj5vfs3O4BZPWB_eHHSPwFJqp7_DomwvRUS8-ToNv4kSOpMOdcH4URhzVC8KUufAkXIiLdkMYuk9lIoxxN6tdUlBtlbfWjzJ1wVjxYlW7P9JNLxwWsV-U5AqnWj8nA9upJQYK4LS4PvsrnZ9rSYxw-K7O-DwpfvaSKPd75TM-QyMmcHTTDc8YCaZ5m-J1jR2uiGbMc1ZdwMBsI9RvS4T8H7S9v4zpyBA8B674s1nnaVDXDBTrygsGrjskKZGZqSs7uqnl9ZWfOdUEpZvxL3uAtlQbcuFVIhY0LhfulMTcg8W4IHtWTBXnfDIya8jkeFiOe-ln4KGz3kLGU6M9LyMsM58tu_dyBfR-hCr5GC_ZqYYphTEpgF3-LuG06U_RToixGv32VXOtYSoGGgTq4KtCfCbBKDjrAGzhDTz7gqO7h1rzMY5BI-83d8gribh60bEefYH_ykiiV_zMMywMfLQp5cGSFGlq1i5XmxTG-vKbRD65INyrU4g77mrgvfIxQ217kJKsED2ZPA3t0ysPqdrwc0ykeJVgm8OZzQderwY4Kv0NFP7z8uXB7X_0ztF0b5ybJR0_yO3TXYAgZVAAbXzmPfYXQZqRnok6mL5fkfOlFiZVaYH7EDtKv8yLm60t0wyHCwUm_5Xe4QjgbFItTdtBaExlReVg0b9nc5ZGfPt9KWU8jDEOp-cbOssCsBGkPWOMTjskgGNzXqHZSStA6U1eKIFd6_XvkqwsdNqBfGJ-56Np2QC0DdX9q4G9INEhlwgxWc-bQiFu-mkVGX_f-f12oRXHoY22oNGCBcAA4tEvdItsypiq6m_kakaMRaiKohu4lTTna-sacyS5ehOdumcsOVKVKOoUrZGtT2T7jvO8oSi7yXPh3QmDEGrCV4N2mFJ317FJDSw7gUEc9o9G1Yk1-uL1Gkzu3hnENhXkGsxseM5rtZPs0trgYfu09yI6mUW0atbJtYVN1LhhNopVldT8th-K036lC2kSA6sCpkghZbHiNHACFG-a9tN77QjxWmcsr4esg01TbW-4mG6mvH4pzSefZJIuAR0fcmUSwAwM0I_cuQckQUbr5APPQk9aFtkNb4xVGLMBfjZlhEhAk0zDjqZX70oXsLs337earFrP-nARv_PMZA1tZRhH2f5OeCJGFA6LBJw1UQX7VSK5iBIRW1VgPuQNfgI_kd49c6eX7Z3ns4yr2FbSBIph7w6Er7Ngi_tIurce0O5JyGqTVOyUz6cn3A_2ec0T0JLXywb_AXA3W64PbAHsyqOs9kIBATaQkbccmpjKA_zEpz7UuLE5JvDPCqEgCp9hnKRq9GD-LxF8FDFnWXsb8R52RIrc6KLWG5jLwhe0TQAy6CAiQKurD96rZo-Sf6-wsWM1W3NwyWrglTCvcb6ZbWKxGkC8rCjCBpXGkHP_sL8a7aryxNsWvQkJTmG1LxWQ5hbXpplCYmGALVbyoKwTvZWCnDrXlg5hSdtDkaoXErmZ52xILh7Mmz37ZdEL_ptXUEIVYXjZ0Qg86WvFHWbRGsDA9G5LK91e4MQn4T61CCOfXQ8wtgD1_WY_FGPLASpSFp0Uc45fgYcUKA8vSUqLml4P0e3hKR-8hZlSDN4cCqbf2Cs7AY4BSa-e_7kav5edNORxzSI8beEXCsK7fjadW1Zs21v78V7rAPmLUouSC1Q5mw_o1qzHZY1XEeV3BafPGXiIETxNG0U1q8NH9RSVsTpmOMrakFFNJrugRp4QAl5vlmGxLDjupyKcrGtCot_vIxCIa66oQV014j-Ax0iJlpFlxuZKPbNDzT_w71V3XPATHgXW1y6nNYtnQBu_Cvmq1Na_d3l_eHKJhZCyMPvrd_FKT58wlE0lGrlRTsEmYe1sD74VYyNh3HcPIB88_zmA_hU7zRJWOZuZvrwdHfXxWRCSbFxdX5H5dfoMHveOIQNMJ-otJIh5KDWJMXd0uMPgGTs8O-48tI_SoMWgMbtbCGAQvMMUEL-Dme_ZzSGJlI4NZpSLfTrCRMg8lrLnW2ATrAKcdpdCVMEbEiGXhKsBkGACD_l5us0ckwgTKAoT31yIsSUN_-bk6danBSxLt3NUXr7To0r9iKYgWw67eyXp8sfFkdUzx-SUXzN5BllTDE26mLYYv_rlKFPJv_72YQb7-bFAfSLugBk4XzZGG53h0BYJYFlwps-5jPT7dwNYCuaQi2GNfUl3nouawMdQeuygVnSNYLDhNWSSrPqlMAX1vYv0BMIy6457_z-66F-oqelozh6d4LRlBlIy9v0Zshp_Iisgx4r1CNLdZS5_-vx1ky3PAo5xzydyfhLvhNWxwqlNLwoYeUOl043htIBE_il411lvWp3ZV5XLz8iG27ISHN-kVqX-JmbuzY5fSUG7TQtKX5DHJQoS3DMr2twRNSS_4MdEaXJaH7OpOF60qBRjM2qZHZDcDVEIwWw3T6rHjC1vm299Uz0yKe6F8HqsbkfYtONN3d0UqYNexmP1BDfotzpt_jYyRubSib1n8X7Er6W-TSaPlvHbMtcQeZSWr-igIX4ZNcDG_mDdbNvlrktnJ0Vl6Qny8K43khswJgeWK5D7MCrHvUsk_LZ63sW7XHKko9yI1nnrCFZyWwQ1sUb7fVa31lz8lkosRKicKIyuV86prQWgsmB40KB69wcaaS4uPF3xqBAOjYvFl0F0vMgEnQpFXhojNxqp7JVyLbTuSwUs0Huhxv5CIS-WUr8US-EpsrzdyUGBix7ud_z5lW1A23aQcEWqf1Z07UUovpVDzJhE0OLcc9WSbsbGATKaSyqEaeZW35PtMEfsRvKwKgNPxWYd1Rus3t7fbSBVzm3zvFVtUH5tmdVKCJqsFzRAc3xPFjy73zNQtsXkPOTwEbaLzVRn1VY7Nxh4u2F4F1YP2rNBBnSX3AG872EcCPuKBld8OwLLgwL8WEHoyyv0Y2EgUiAPy5gG9HkGqAa15Q1_f3FpnTOXbwVXGZZhtWbi3s-QXwqTFckj4tdRrnyPUwN5sHiDMRBb23BnlfKKnc5xZXJEAzh-CtSnm6zLAy_mTWigp72zmpYbDSBOmG4Z6ZXUhpjQpFDIJY2-czM2yl-5B7GaBCLgITCtus-2CM7V4lFN2z2KVBZ-vYWccg97uQuNnXx7f5bXE_GJfxxUxcAitjBNJlIYxZ1V6n5Kx--JAFrAnQ8JEobPWypEWvnxIl1iL9qji82GezHM4CinzrDdnRJkNikSG7aTh7h4mmFnpfqxtTakXKZ6neFpxAQ3J4xYH7tPFyXjGn5R1KpeJqz5Zk-i1KlVrOCs0YaAxpS1p1edEcPRLzaJSh-cqRuyEwHIb2KCf5pvTx0G-0z4Ydot8r2aWM21Onc5OTtvCZF4lTtqQ57N-8HSfQHCdlDWX8TKY31kogvO-pHwof2ujKwoaHV1siznvcXJ2ms02fSFeQNGlmuVhObzEiw858Cd_L0_VldWEpG83Y9QmGPCTZC_1sVfk7QKv5sR-cZeooWTZ8IiAq7075UY_n1k1uALUYz9fdXp71udHkNgMN38Eb9it8f0hR84YKNj2wB5VoYzAcq6iFeun7iARTWT2IjAIyjm8gb26oq3LGXlJfa94PAwYa9Vo6VrIfEQu9Gx62bmMH1zj5beggasbiJdJF-yVPwQzIX1q5hN9maKF_IQ4P8AFXHoBYmE7WX-CkZ68usx0YUSpd2INaQJMIXyjiVoK5KVvUEiHeA3MqISWpM5bZJbyR8rWban-tErw_ET90euDWWCskcokJ_RMdti1xrufEtLmk3rg7GbvqEHIWapK2f8Z1k7gvi5VMUY_AeZQIuho7iNXWnXHOH4hCgKCmmJwL0A5Y71hjOKo4JVYwXkWrfcd9z9vMXdaMf2ILDfBbH_e_Eqi9RttjkSenQdx_ppqHtme2vWDw3sv5rKhUkSLnawXVt_pp_wIxNNGYpe_gsH1YalJ7yDGmCFh3wyMpcvQWnheOoLPNvBrLnokVbPxfPdPmOnTzjQnyuehrUoxi-ghYo3wk1w7vU0JRTBKDyOIJdmzxCd8Zy5nkqgZrR2Xi7WRCKGkjCpkLRLs-OOEQOpXihyFDeaft5h4WicizaurFL8hlE5GthgFtdtGDJiyeFW69VTVxhsWPlNb9berJoVoeMbXuyRqlabQfSOmskXNskwjegs5NgxO9eml9wUn4to_xhYvYAg2IM32gG4nqeRJs0FNW49PwCew-FivM1qpyJx50DlVkurxZ5W6FF3Q7KULQGs2j7TaeF39ZsJjjfY8X3xEJEmwKzBJ6Zmg4Ls6wmEXa9ide_XwKBL5wZixHRqgIHjJJdN6SlaApa8nrSJ4U2J12TflTmFQXnoZl2y_HBQxE3sH_QI0qcYmTBA4VXMs7zha_5WMhEGCGeyhWCV8AE8JFiuqqDWW03UEmhAfWVgjoOlAh8Hq4ruW6PCM9bAjjbVzf2shKU-ewKpPtd46sbvuwceU5a5LUJaaqOv3BDYzt44heWWIR3AYPIFGV4qBGcPFhN3IYUxPcFT6vCtwyZCYaE7mBC3IAcsDmMs3ajnhCL4i79i0msJ4PeRziBEIQ2wvI5qxC3TEj3nR8tOkUZm1FxRyOCw2qnWy2SblJIq7GEKAo4T-jA0HwLtvxBIeWdtrawMBv7jOJfQ-kDJ7_vYFB2sRGlsxAhT4FSnIz-RLjvYBLJ4obXx_bPuqGLW8FFpIoa48oiCM0UpZe8dKAnR16W3gLgeh1J7V680JnvIuu69ObD-M-V71yEpsW8IBEqy2kOgJKkMvXCnh2B1SahVs6Ysf9pHNfScINewYyQyhbZ7z82CDjnz0ApludJSc2FXsrCwHfLwYMll2KLZ-0tjEn-36wMu2AW4XL3fQVo3IJkqvbCk187jY7mNsZuxc3wOocg3wA2Gp-JVcdfYSHb1ZITZHxl0Kdab5uHrrECbm5GZuAf3xkmBhrKCicZcDL3Hgvs6uVl8WOsI-f76jI1GHSyALFaBg0seJB4MqCf8KPH6hRAhftGu14UfaImu9eEESD9kx6DN1uMa61J1H0RK7kQObvRnNW6Jrj2OsUOSsJT8L41wZkRG7qyQ92Reku5O3wdhuk65q5y3TvQTJoDGwp_pUgdW1CqVRMZTLCJfY4xr-3MnnXeZLHFIVDCmUZtqGQdX7D6lGMpEbz3q2zfvUbRwnZVB9C4LZEOX7Bt1doGb0s3rcRHe53AKXraK_Rd2wz3ultA0_uC1uQ1aAWlYTpyHuG4SiNVd3c0WTp9Zivd8u1qOAo0YWWRuM5xC-rfo7MsmIpp17AoryNmHvCuNPKDq_foGCAUB7s8wH0VMecQZj8JSYqWtWzVvVN2T4I9h1jGCaFOyL1nQTFX7vLELKXGrWX2T7zpXO0cmEWro1fPQy_QLExe_i_Sot4PJIHXvOqqKfgOyqRauq3-WuGoyKpNqHi4cHuwetVTspJvVk3tZRMs3uLkmG1CMSfdCopNyce3rozB9HTNH_6AB-cFtDOz0v8r68_9WKwu6YHUi_jdRttdi12LYW4JiLgTBV2VjOlyc6jBryh250-ef5rW3TQQuTphzT5darUOQz0qsSVOskMqMy8n_tBoiXLEn1FxIkv9QojN3nux5jN-o2XYqyE9GGUlFWeOtp9YJU4diaS6dZNE9ZPGwab7IzqS1zetpq5NaLVTqBrHUSru1ABnDKhnxrozxVkyy8YQtuOCi39UhXAFU_1kvZlqsVSgqHzHv8y9hAiGN34CbdxEPJ3HbGqdoC_wBuNkwYCZRIl5gUN0Ox2xx0oA3KoOfrFxM6hIL2Y-UN_xvL4gQKJxUL39bpG49KqhzGn-JDYwDba7yq39q9GmYUU7meFohAn5UEPi_c4KZqdyg_p0ZQuX7Iv2DvRSQfP6uLo_cqNgJaqbgeA9W3k9gFi9YnE9EnsPKbKN5_aDdSe6cMcufMBWulygL1f2-5kVw4Jxuo_GIQZ1vBf9WmiGXOadm10-tJgmNQeCmLTjxvSEWoH2jlWC7pqrbiZZbCuxN30zLlwFq5Alve2Mxm-xpODSijSOV59Sh_BQ2Ptt4o2eIvaMcFKK2TtG2B05BUc84w9C_SrIOJgB-Vu1C17mozc3buNPSxJFY8TYie2R7dNOliBULX_kVuawfayKrMd8Q9vmA-4h06gk1raSSvVVJe4x-Vi4sABiCLunCIPG0a3EvNmHkANayBB9OwZNZtyC1Xnf4XaNSbdAEEsmwyT3mSps-k9PE92QMLkcMAW3ZiZSyIiM18q6JhhmumHfhepwAqKNrxjaRSK1MgCa5a5T3DJUpUPtkRO0hB8kKUNnk8uLDBzseYZFpkuG-wW9EKwL2b23dM22wu-4U7guyLOH8UIqX1SVMFPD0XB81fm276SyxODC_Jk-iF8qRCKjx6qGaTOxu1UzZK1EQq00SF6X9gTSTCmhFwVWadlySQDsgwLV_F4w4ZvIWPIxrlCCuoG37xcztetvXqPmjIxNKKV7ASYa_hlfMLozTQiZxvfWrA72QH-d5iySEeMpRuA7KMqgSIH4ToDAzV5g4Z2B_3rRZEc-4XsmbNC_2hY8m5Sj_ETzMF9m5o-PzZ3VHPguOxMFTs2gJldbxAU-HrFi65UjBS6romNN0qfCnjc30R2UZ3DNuBFpm_32p7qaVxAdRPL02mRcpiUmDDSXaZlG8peG1zWX2DvC04lx1Jhcuq597zLf8RjV3WZ_LFhfowUqUDGnvpaltKU9YShcRV9ET7IPdvh8xzQcidBL4LBXPxGBmcEm5IG3EG-bdtdWwdoKXWm-iCgEKxK10Dtz4pr-bJZIRDXlub1G7Wp3brdCnZkqYAnO-83yiL0RnEKBQLTjypxvmsBPRtYuR1reEsjWnUY_rGwE2NCO8Vckg2DMEdDTt8x-fkxSAT9xOVgjlwtEWqdhGCir33gJKHwn-2iQfDWTPh-jpG4icR2CCMiyqnrVGg7m0uklEGRzceXh6kDEo2ltxAFPI0ypmWhCX2vLKITzjpxfInTgfQi5jyPa-a3ZcJbQVmHbRU5pdQtpQmsGBkM5zob7_-vr_ilhr3SAXnGZ8hbU80wtcAdozW_OygmI_D1qluh5I9TGfdn-l7reB1bDnXnz1heL8ItEMjGtAiPNZCqshIvdDeGe_GCygaKcI2SFatPDu5uN3ACOtcI_DyXPfqP4JAHTLebQHHx58L2OyKLr-Ez3xRuuBVBpsWM3zQbQnlfjgSvHc0aTK1U8MX_wBP_wneg8kmuNLtg9feEP3P1m9pIUKJ2uZS84WD41InWEbLj0R3IehqDsXxohf6K_z4lBmhl6tVBAxO_XqZXxUgvfX9bSm6gzxzAGH0u0NEZkegPRjW405e7vAX8DUh3NM0WGyOzd23USS4qnBOW8IODHcJWLrpMsyUi7CRrIfJrVgk7SQWh_VXFW2HQhpZRhLLuSHO-58aHqezYuofbjm-4cQ3G2gGB3wXPe6YUPQoXiyS_gYKRc0XHb6N-d3RtdEPDBPsrTlhcZk2yrIFW9Z2L0kX_RuGQFrybOsffxSZ0vbYTkTLJ9NE_qcfn6rIMyucz_HwR3DVRdUE9k5_xX-4TQEmY6GkipDySNy5roJpUvp1h9tru_TQRZtnk1HoJm5V2PINtBUrHKqVh32Vm9xuF9fTRlLXQbguOkdVSTh7V6By1m7Pt_jzERt5275tXrxR-VYnA8SqjTKEZkBGv3XKUqYzSR5cg14QrU3mt_tclG0WrSeBzhx5uELkeL5m2ixeBjJQuhuAeBEONFncQXhjKr7_5u-cbr4tmtnzKwIk7anCIBXQF6RTyW9tpRRQh7NZxrt_TbvrfF_ZmmNNQaE_074llLpF7T9uaNo63BHggMG7_j3feu445dM1ny-CVwpLgRxdTq1pC5TaT9hRJXuZ3kIfkhPY6gYAU41f5Pk6fsH5mlpBYP04MJOtvmOjAIsQQbWcQbqll7N6IqAP05s5AHnoBiZg6LqPgTT5TUv8vAJ2RKkin0W7F5geEVccWHVDDPDtDvD-bpKKQPrOH3efwUvwlQCFwoeP8ovjKSB1-2eyjAY9L_NBR-9IixsqiZ8K2KFRTEUY3Izza7O8vnscg6QVv7MLoUUmy0gSxe5gf5sGJN6Le2EOhzPxfQFXPnvgZ5duuzNcy4TaHzV4Tl9suoJ8z5Fdg1oZrNij_ve3JhLrXX9mQ2U4HRBB5zwHAKpJ7npzNwDEZu0AAJbotonJVyCYcDwGAMtT2h3fz-6yLPMMFziF1CkjDAmZD1vLnjzNggnKi6_fYgc5jFz6hsB_5bq-mbq6yaIRQhLxIzsLc4rxg1JUdg0P-v23BugGomHdLqah8Khg-WDaWJ4ql-kSM_Bjb5vznZMPJUhhFrrCA17J1NMGXW_fF9FG7YVz-mzubCXRgBdMxrC2VjoaK-PX7LSYu-CgTkcX1yTM0zBPDTPTGzsQ4PeJmOvqlkIn5jbFx1WojrJ8m8EWc0kx3v8JPqrhVpNMZXIZXGvHqyc9emK0B0kwp2MkjUBAejTiIvpWq96pLfYdv7RCB8dki4E6RmqW_R15bIV_A5JTJ29zBmFM4BgwG0zGYCUFg2F0IJHu85rl9H54VgaofhgrSPfqGWPms1sIlF3VSpoGxslGpvqXdAwhUy3Qpy7DjztwWOrGxxt80TqL_DH24v90H5VPAZkciQrBqvcbI-2uamJhZ2INjHOQ4uf7Bmac-UEUU6TyGqm8uNO4alaR4wlBgA89_5lCV2kwxzUEnE6BaiMdzx1cU2rg_1U1n9Q6Oqw3WCJOHZdUe0DgnXh1akzNaWsVNAh-V-fxFtzsB9wKAunovU4_kJ-8D-8nBnT77kBQUZkWoKAHVo7GdmcqPaaM5iqstbC825rYWZ192coc5cYh9sVpTCh4ISTct2waTjMXnsbt_4GOsCT6LXHsWJRvUu0scrThzYbSg4jhhWV_-WF_X3ZPAZGeEJ51YDreYpBT-UDrAz1T9uXYccdhStzRb-ytFiIEE4KTidTt9QAxeAawcsQBRj1KilZ965QGolrUIIPpLPyXThVWKVsHHuuySoNHYzskJt3rvie8MhUEBLWGHGYKe51d0oGLHOqEYPOKDe4wQy27kZrDvK-xWUCsq0QVsTS0G18MRaZOKtNmV5dznic5SOE4B-mseZKP9ibRv_H7AgqmXAAHmjVsSVTi2ZUaFz4B0MsWMN027sGsTO_85P1PBnsbpvEeqPgFDFHMfKXq2rx1Mvj2aVpLEzY9Vl5DJNiEgQMrwU_lSRgAM5reBu1nIz8nzVnEhYH-VTyPL6vYMCa1oedu4AouAwWBUchlUGTltn8-axuofGVDh_E_HLVfSljX1hq1ST12zev9nofzWiRErB48i-LkIbj755P8pHjH-yIOF21kExpKhd6pwFkP7KMK4BustPb5gEtdw3pVd-4CyP9GuOTUc6xSYPpd7-4Ue4PITdOFKavv78WD5z4Klia9UanQ739puakmy2vBQ2JR9Vn5JuGFTP6Q18hNE7Qmnfg2COU-vR4Eqes1mfAEEJcYv0mZC4YE2U2R-YGYWYhujM3hh8p6vsDydNL-Hkp2Zcb9Bjo5cIgmO_IOt_9HWYxJg5ldTqdbcEVhPa5YVHqOO4QWKymbXWRmkDVY-KP4o2ZEKiuaVXa4dlxsZNThOQblr48pTCfPrZ6FTWozBq8_KjAXstG307E9GrsZyV2bg-XHZ57YmeuBsNVmNoI-BZD4hvc9vfhR9PvZsVuJ6gbJVjCoPk2kD5MjtoDicVWz4y6jCl9CEZOpegbF9jYkmJ7UCWJGVpmx_vQCrs1kG9IkQYLK1K3YyYIv0yC2m57v3SwEgE6DwBf_t6I7sF6-gig-COZb-UnzvbmMKmqXOcVkkeAmo9WaH2cPCUKvYPGPkrircAGeP7LWNUAd2_ely6eTfGoKpZC-wqe06ueACsUcMJ90UWDuSs11R3Y_jbshUg_NFTTN-mc877J8wANkVisFuLlBiqKZ95U5F4gHMHKZuKBFmj3k-zrOtmcrDezfyPp1NzHaKqdI5JiIoBvwQS-69MbhjMbE9RuE67TZs7WfMvoyxRI0F5M4J2ZmHGnIlR7kqQpHD6U9bXZ8AKhK58rOU6fYbwFC4mAm0nuM7kQW6Ktv4GKPkMGl1HiQkTEfXBi8oeFlVcu4gZP-HwyCBG6vst_T-S4dYu2Vuf4EPJEOGBH8apRNM9S2rOfrWTtL1OajQr9196rjYdygPO5jVJzJNF03LqX7kGTIRF7p-q_idDH2w85lvDo0TBqjef5adk9JeAQrbS8DcUGPNHP9f9isK20vpPQRfhnhqTX2SZ99-K1ig5d-m3VxvlfXuwYKANrySv_VT3c9ASKjaAyo4GM7ZuxEE6QJcRW5I4XEQo3p5HrcJf11WxjPQjeVkqAAyCwcp8zS0hqn2a7Omocd1a8KR-J3fRwjQqPxqyXQdgJ-V8O8zUNyoEhqq52d4AVeyf1GjpGE6VvCwCTqnKUYkZmK5fdMuVamdkWgAMVY9VNwfavDYt8YJkmtP-xU2paK7labLROR_qP5nfGnTG6FkqnJKjQ6JxtSJnWLz4QmFHYvz44zxhMBCuqrJDJp1bMvB9Ghrz-y8jhDRW8jiFD78Bo14zfZC8Y_1yTLzTjN3NhOCcB8HS9OljQsJCIwVT40KgE9V0GkAATRShMW-ApNsiDml9TGOgPnLfTRLB2zccQxSEDs7ZdGTjGJMUcqJ2n0Vqf_ItApYYtVjwnZTfcSlguXO1Kme_blGgToEep3mqsTaolHeMDCYDmIB_9tgmYmK8F_NcU556VfyiKcK00KkoIMmESQc-eSm2Z8QfNkjyCon0Wp4wTqcIMdxs1Wpg5nlRxgyqmAL6f4Bk1gqeZM7k4_tN7FSaCR9_syqR5tWb35zlPPu2gMP1FwTPNwxGWRlj2HJI9uXo8LzsdgcMlNowvVODRUr-rGi0o31uCiwOyjYq1UPCo6lNBAXiiAZtlPlq1NpWi4ZizMw4zd8Bl7cRUA546U9Si6Ir0WTJBoYuje2R2AUMowWm8403U5ZSmZw",{"type":375,"children":3003,"toc":3020},[3004],{"type":378,"tag":379,"props":3005,"children":3006},{},[3007,3009,3013,3015,3018],{"type":390,"value":3008},"If E is the starting point of the ray,",{"type":378,"tag":3010,"props":3011,"children":3012},"br",{},[],{"type":390,"value":3014},"\n.. and L is the end point of the ray,",{"type":378,"tag":3010,"props":3016,"children":3017},{},[],{"type":390,"value":3019},"\n.. and C is the center of sphere you're testing against.\n.. and r is the radius of that sphere.",{"title":369,"searchDepth":486,"depth":486,"links":3021},[],"content:notes-to-self:do-a-circle-and-a-line-intersect.md","notes-to-self/do-a-circle-and-a-line-intersect.md","notes-to-self/do-a-circle-and-a-line-intersect",1776608492470]