[{"data":1,"prerenderedAt":1792},["ShallowReactive",2],{"docs-navigation:de":3,"content-page:docs:KOxIR_l0R_YmNMSOw8Ub04oPIXaQi9wkkWlYYb7Ayec":197,"content-page-surround:docs:KOxIR_l0R_YmNMSOw8Ub04oPIXaQi9wkkWlYYb7Ayec":1784,"i-lucide:file":1786,"i-lucide:clipboard":1790},[4,54,74],{"title":5,"page":6,"canonicalKey":7,"locale":8,"id":9,"draft":6,"icon":10,"sidebar":11,"children":12},"Ableitungen",false,"1","de","content:de:1.dokumentation:1.anleitungen:.navigation.yml","lucide:route","section",[13,19,26,33,40,47],{"title":14,"id":15,"canonicalKey":16,"locale":8,"draft":6,"icon":17,"path":18},"Guild Wars auf dem Mac installieren","content:de:1.dokumentation:1.anleitungen:1.installation.md","1\u002F1","lucide:download","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Finstallation",{"title":20,"id":21,"canonicalKey":22,"locale":8,"draft":6,"navigation":23,"icon":24,"path":25},"Konten & Mobile-Verknüpfung","content:de:1.dokumentation:1.anleitungen:2.konten.md","1\u002F2",{"title":20},"lucide:key-round","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fkonten",{"title":27,"id":28,"canonicalKey":29,"locale":8,"draft":6,"navigation":30,"icon":31,"path":32},"Auf dem Mac spielen: Optionen","content:de:1.dokumentation:1.anleitungen:3.guild-wars-auf-dem-mac-spielen.md","1\u002F3",{"title":27},"lucide:scale","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fguild-wars-auf-dem-mac-spielen",{"title":34,"id":35,"canonicalKey":36,"locale":8,"draft":6,"navigation":37,"icon":38,"path":39},"Leistung","content:de:1.dokumentation:1.anleitungen:4.leistung.md","1\u002F4",{"title":34},"lucide:gauge","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Fleistung",{"title":41,"id":42,"canonicalKey":43,"locale":8,"draft":6,"navigation":44,"icon":45,"path":46},"Templates","content:de:1.dokumentation:1.anleitungen:5.templates.md","1\u002F5",{"title":41},"lucide:bookmark","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Ftemplates",{"title":48,"id":49,"canonicalKey":50,"locale":8,"draft":6,"navigation":51,"icon":52,"path":53},"Fehlerbehebung","content:de:1.dokumentation:1.anleitungen:6.fehlerbehebung.md","1\u002F6",{"title":48},"lucide:wrench","\u002Fde\u002Fdokumentation\u002Fanleitungen\u002Ffehlerbehebung",{"title":55,"page":6,"canonicalKey":56,"locale":8,"id":57,"draft":6,"icon":58,"sidebar":59,"children":60},"Projekt","2","content:de:1.dokumentation:2.projekt:.navigation.yml","lucide:shield-check","group",[61,67],{"title":62,"id":63,"canonicalKey":64,"locale":8,"draft":6,"navigation":65,"icon":58,"path":66},"Sicherheit & Kontorisiko","content:de:1.dokumentation:2.projekt:1.sicherheit.md","2\u002F1",{"title":62},"\u002Fde\u002Fdokumentation\u002Fprojekt\u002Fsicherheit",{"title":68,"id":69,"canonicalKey":70,"locale":8,"draft":6,"navigation":71,"icon":72,"path":73},"Über & Credits","content:de:1.dokumentation:2.projekt:2.ueber.md","2\u002F2",{"title":68},"lucide:users","\u002Fde\u002Fdokumentation\u002Fprojekt\u002Fueber",{"title":75,"page":6,"canonicalKey":76,"locale":77,"id":78,"draft":6,"icon":79,"sidebar":11,"fallback":80,"children":81},"For ArenaNet","3","en","content:en:1.docs:3.upstream:.navigation.yml","lucide:send",true,[82,89,96,122,148,160,179],{"title":83,"id":84,"canonicalKey":85,"locale":77,"draft":6,"navigation":86,"icon":87,"fallback":80,"path":88},"Introduction","content:en:1.docs:3.upstream:1.introduction.md","3\u002F1",{"title":83},"lucide:book-open-check","\u002Fde\u002Fdokumentation\u002Fupstream\u002Fintroduction",{"title":90,"id":91,"canonicalKey":92,"locale":77,"draft":6,"navigation":93,"icon":94,"fallback":80,"path":95},"Request summary","content:en:1.docs:3.upstream:2.request-summary.md","3\u002F2",{"title":90},"lucide:list-checks","\u002Fde\u002Fdokumentation\u002Fupstream\u002Frequest-summary",{"title":97,"page":6,"canonicalKey":98,"locale":77,"id":99,"draft":6,"icon":100,"sidebar":59,"fallback":80,"children":101},"File system","3\u002F3","content:en:1.docs:3.upstream:3.filesystem:.navigation.yml","lucide:folder-x",[102,108,115],{"title":103,"id":104,"canonicalKey":105,"locale":77,"draft":6,"navigation":106,"icon":100,"fallback":80,"path":107},"File routines (UR-01…04)","content:en:1.docs:3.upstream:3.filesystem:1.unimplemented-routines.md","3\u002F3\u002F1",{"title":103},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Funimplemented-routines",{"title":109,"id":110,"canonicalKey":111,"locale":77,"draft":6,"navigation":112,"icon":113,"fallback":80,"path":114},"RemoveExtension (UR-05)","content:en:1.docs:3.upstream:3.filesystem:2.path-remove-extension.md","3\u002F3\u002F2",{"title":109},"lucide:scissors","\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Fpath-remove-extension",{"title":116,"id":117,"canonicalKey":118,"locale":77,"draft":6,"navigation":119,"icon":120,"fallback":80,"path":121},"File::Open mode (UR-06)","content:en:1.docs:3.upstream:3.filesystem:3.file-open-mode.md","3\u002F3\u002F3",{"title":116},"lucide:file-plus-2","\u002Fde\u002Fdokumentation\u002Fupstream\u002Ffilesystem\u002Ffile-open-mode",{"title":123,"page":6,"canonicalKey":124,"locale":77,"id":125,"draft":6,"icon":126,"sidebar":59,"fallback":80,"children":127},"Input","3\u002F4","content:en:1.docs:3.upstream:4.input:.navigation.yml","lucide:mouse-pointer-click",[128,134,141],{"title":129,"id":130,"canonicalKey":131,"locale":77,"draft":6,"navigation":132,"icon":126,"fallback":80,"path":133},"Double-click (UR-07)","content:en:1.docs:3.upstream:4.input:1.double-click-flag.md","3\u002F4\u002F1",{"title":129},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fdouble-click-flag",{"title":135,"id":136,"canonicalKey":137,"locale":77,"draft":6,"navigation":138,"icon":139,"fallback":80,"path":140},"Key labels (UR-08)","content:en:1.docs:3.upstream:4.input:2.key-labels.md","3\u002F4\u002F2",{"title":135},"lucide:keyboard","\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fkey-labels",{"title":142,"id":143,"canonicalKey":144,"locale":77,"draft":6,"navigation":145,"icon":146,"fallback":80,"path":147},"Cursor re-test (UR-09)","content:en:1.docs:3.upstream:4.input:3.cursor-re-evaluation.md","3\u002F4\u002F3",{"title":142},"lucide:pointer","\u002Fde\u002Fdokumentation\u002Fupstream\u002Finput\u002Fcursor-re-evaluation",{"title":149,"page":6,"canonicalKey":150,"locale":77,"id":151,"draft":6,"icon":152,"sidebar":59,"fallback":80,"children":153},"Runtime","3\u002F5","content:en:1.docs:3.upstream:5.runtime:.navigation.yml","lucide:cpu",[154],{"title":155,"id":156,"canonicalKey":157,"locale":77,"draft":6,"navigation":158,"icon":152,"fallback":80,"path":159},"Heap maximum (UR-10)","content:en:1.docs:3.upstream:5.runtime:1.heap-maximum.md","3\u002F5\u002F1",{"title":155},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Fruntime\u002Fheap-maximum",{"title":161,"page":6,"canonicalKey":162,"locale":77,"id":163,"draft":6,"icon":164,"sidebar":59,"fallback":80,"children":165},"Interface proposals","3\u002F6","content:en:1.docs:3.upstream:6.proposals:.navigation.yml","lucide:plug",[166,173],{"title":167,"id":168,"canonicalKey":169,"locale":77,"draft":6,"navigation":170,"icon":171,"fallback":80,"path":172},"Build identity (UR-11)","content:en:1.docs:3.upstream:6.proposals:1.build-identification.md","3\u002F6\u002F1",{"title":167},"lucide:fingerprint","\u002Fde\u002Fdokumentation\u002Fupstream\u002Fproposals\u002Fbuild-identification",{"title":174,"id":175,"canonicalKey":176,"locale":77,"draft":6,"navigation":177,"icon":164,"fallback":80,"path":178},"Host interface (UR-12)","content:en:1.docs:3.upstream:6.proposals:2.platform-host-interface.md","3\u002F6\u002F2",{"title":174},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Fproposals\u002Fplatform-host-interface",{"title":180,"page":6,"canonicalKey":181,"locale":77,"id":182,"draft":6,"icon":183,"sidebar":59,"fallback":80,"children":184},"Reference","3\u002F7","content:en:1.docs:3.upstream:7.reference:.navigation.yml","lucide:microscope",[185,191],{"title":186,"id":187,"canonicalKey":188,"locale":77,"draft":6,"navigation":189,"icon":52,"fallback":80,"path":190},"Our workarounds","content:en:1.docs:3.upstream:7.reference:1.our-workarounds.md","3\u002F7\u002F1",{"title":186},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Freference\u002Four-workarounds",{"title":192,"id":193,"canonicalKey":194,"locale":77,"draft":6,"navigation":195,"icon":183,"fallback":80,"path":196},"Verification method","content:en:1.docs:3.upstream:7.reference:2.verification-method.md","3\u002F7\u002F2",{"title":192},"\u002Fde\u002Fdokumentation\u002Fupstream\u002Freference\u002Fverification-method",{"title":198,"ref":199,"description":200,"icon":100,"updated":201,"navigation":202,"body":203,"type":1765,"id":104,"canonicalKey":105,"draft":6,"partial":6,"locale":77,"collection":1766,"navigationFile":6,"file":1767,"resolvedRefs":1773,"route":1774,"resolution":1781},"UR-01 to UR-04: unimplemented Emscripten file routines","docs\u002Fupstream\u002Ffilesystem\u002Funimplemented-routines","Four routines in Base\u002FOs\u002FEmscripten ship as stubs. They disable template save and list, screenshots, and chat logs. One of them aborts the client.","2026-08-04",{"title":103},{"type":204,"children":205,"toc":1732},"root",[206,236,395,407,414,526,530,536,560,570,577,582,595,613,632,637,751,770,776,794,812,818,890,893,899,916,925,930,948,953,963,975,1098,1103,1108,1131,1153,1166,1171,1251,1254,1260,1276,1285,1290,1294,1302,1318,1343,1354,1359,1384,1412,1417,1461,1464,1470,1492,1501,1506,1511,1519,1531,1536,1541,1546,1561,1566,1595,1624,1627,1633,1638,1707,1713,1718],{"type":207,"tag":208,"props":209,"children":210},"element","p",{},[211,214,220,222,227,229,234],{"type":212,"value":213},"text","Four routines in ",{"type":207,"tag":215,"props":216,"children":217},"code",{},[218],{"type":212,"value":219},"Base\u002FOs\u002FEmscripten",{"type":212,"value":221}," ship without an implementation. Three\nreturn a constant; one calls ",{"type":207,"tag":215,"props":223,"children":224},{},[225],{"type":212,"value":226},"assert",{"type":212,"value":228}," and then ",{"type":207,"tag":215,"props":230,"children":231},{},[232],{"type":212,"value":233},"unreachable",{"type":212,"value":235},". Between them they\ndisable skill and equipment templates, the template list, screenshots, and chat\nlogs — and the fourth one aborts the client.",{"type":207,"tag":237,"props":238,"children":239},"table",{},[240,269],{"type":207,"tag":241,"props":242,"children":243},"thead",{},[244],{"type":207,"tag":245,"props":246,"children":247},"tr",{},[248,254,259,264],{"type":207,"tag":249,"props":250,"children":251},"th",{},[252],{"type":212,"value":253},"ID",{"type":207,"tag":249,"props":255,"children":256},{},[257],{"type":212,"value":258},"Routine",{"type":207,"tag":249,"props":260,"children":261},{},[262],{"type":212,"value":263},"Today",{"type":207,"tag":249,"props":265,"children":266},{},[267],{"type":212,"value":268},"Fix",{"type":207,"tag":270,"props":271,"children":272},"tbody",{},[273,303,332,358],{"type":207,"tag":245,"props":274,"children":275},{},[276,285,290,295],{"type":207,"tag":277,"props":278,"children":279},"td",{},[280],{"type":207,"tag":215,"props":281,"children":282},{},[283],{"type":212,"value":284},"UR-01",{"type":207,"tag":277,"props":286,"children":287},{},[288],{"type":212,"value":289},"Directory creation",{"type":207,"tag":277,"props":291,"children":292},{},[293],{"type":212,"value":294},"Returns error 2 unconditionally",{"type":207,"tag":277,"props":296,"children":297},{},[298],{"type":207,"tag":215,"props":299,"children":300},{},[301],{"type":212,"value":302},"FS.mkdirTree",{"type":207,"tag":245,"props":304,"children":305},{},[306,314,319,324],{"type":207,"tag":277,"props":307,"children":308},{},[309],{"type":207,"tag":215,"props":310,"children":311},{},[312],{"type":212,"value":313},"UR-02",{"type":207,"tag":277,"props":315,"children":316},{},[317],{"type":212,"value":318},"Directory enumeration",{"type":207,"tag":277,"props":320,"children":321},{},[322],{"type":212,"value":323},"Empty body, every directory reads as empty",{"type":207,"tag":277,"props":325,"children":326},{},[327],{"type":207,"tag":215,"props":328,"children":329},{},[330],{"type":212,"value":331},"FS.readdir",{"type":207,"tag":245,"props":333,"children":334},{},[335,343,348,353],{"type":207,"tag":277,"props":336,"children":337},{},[338],{"type":207,"tag":215,"props":339,"children":340},{},[341],{"type":212,"value":342},"UR-03",{"type":207,"tag":277,"props":344,"children":345},{},[346],{"type":212,"value":347},"Entry-name derivation",{"type":207,"tag":277,"props":349,"children":350},{},[351],{"type":212,"value":352},"Returns 0, writes nothing",{"type":207,"tag":277,"props":354,"children":355},{},[356],{"type":212,"value":357},"Path arithmetic",{"type":207,"tag":245,"props":359,"children":360},{},[361,369,374,387],{"type":207,"tag":277,"props":362,"children":363},{},[364],{"type":207,"tag":215,"props":365,"children":366},{},[367],{"type":212,"value":368},"UR-04",{"type":207,"tag":277,"props":370,"children":371},{},[372],{"type":212,"value":373},"File deletion",{"type":207,"tag":277,"props":375,"children":376},{},[377,381,383],{"type":207,"tag":215,"props":378,"children":379},{},[380],{"type":212,"value":226},{"type":212,"value":382}," and ",{"type":207,"tag":215,"props":384,"children":385},{},[386],{"type":212,"value":233},{"type":207,"tag":277,"props":388,"children":389},{},[390],{"type":207,"tag":215,"props":391,"children":392},{},[393],{"type":212,"value":394},"FS.unlink",{"type":207,"tag":208,"props":396,"children":397},{},[398,400,405],{"type":212,"value":399},"Build used for the measurements below:\n",{"type":207,"tag":215,"props":401,"children":402},{},[403],{"type":212,"value":404},"b0319704f3072d6948a66026a35af5eb0af12b48d70986783c293e7c77e98483",{"type":212,"value":406},".",{"type":207,"tag":408,"props":409,"children":411},"h2",{"id":410},"what-the-player-sees",[412],{"type":212,"value":413},"What the player sees",{"type":207,"tag":237,"props":415,"children":416},{},[417,433],{"type":207,"tag":241,"props":418,"children":419},{},[420],{"type":207,"tag":245,"props":421,"children":422},{},[423,428],{"type":207,"tag":249,"props":424,"children":425},{},[426],{"type":212,"value":427},"Action",{"type":207,"tag":249,"props":429,"children":430},{},[431],{"type":212,"value":432},"Result today",{"type":207,"tag":270,"props":434,"children":435},{},[436,453,466,482,495,513],{"type":207,"tag":245,"props":437,"children":438},{},[439,444],{"type":207,"tag":277,"props":440,"children":441},{},[442],{"type":212,"value":443},"Save a skill template",{"type":207,"tag":277,"props":445,"children":446},{},[447],{"type":207,"tag":448,"props":449,"children":450},"em",{},[451],{"type":212,"value":452},"\"The attempt to save the Skills Template named … failed because the file could not be created\u002Fwritten to\"",{"type":207,"tag":245,"props":454,"children":455},{},[456,461],{"type":207,"tag":277,"props":457,"children":458},{},[459],{"type":212,"value":460},"Open \"Load from Skills Template\"",{"type":207,"tag":277,"props":462,"children":463},{},[464],{"type":212,"value":465},"The list is always empty, also after a successful save",{"type":207,"tag":245,"props":467,"children":468},{},[469,474],{"type":207,"tag":277,"props":470,"children":471},{},[472],{"type":212,"value":473},"Rename a template",{"type":207,"tag":277,"props":475,"children":476},{},[477],{"type":207,"tag":448,"props":478,"children":479},{},[480],{"type":212,"value":481},"\"The attempt to rename the Skills Template named … failed\"",{"type":207,"tag":245,"props":483,"children":484},{},[485,490],{"type":207,"tag":277,"props":486,"children":487},{},[488],{"type":212,"value":489},"Delete a template",{"type":207,"tag":277,"props":491,"children":492},{},[493],{"type":212,"value":494},"The client stops",{"type":207,"tag":245,"props":496,"children":497},{},[498,503],{"type":207,"tag":277,"props":499,"children":500},{},[501],{"type":212,"value":502},"Take a screenshot",{"type":207,"tag":277,"props":504,"children":505},{},[506,508],{"type":212,"value":507},"No file appears in ",{"type":207,"tag":215,"props":509,"children":510},{},[511],{"type":212,"value":512},"Screens\u002F",{"type":207,"tag":245,"props":514,"children":515},{},[516,521],{"type":207,"tag":277,"props":517,"children":518},{},[519],{"type":212,"value":520},"Write a chat log",{"type":207,"tag":277,"props":522,"children":523},{},[524],{"type":212,"value":525},"No file appears",{"type":207,"tag":527,"props":528,"children":529},"hr",{},[],{"type":207,"tag":408,"props":531,"children":533},{"id":532},"ur-01-directory-creation-always-fails",[534],{"type":212,"value":535},"UR-01 — directory creation always fails",{"type":207,"tag":208,"props":537,"children":538},{},[539,545,547,552,554,559],{"type":207,"tag":540,"props":541,"children":542},"strong",{},[543],{"type":212,"value":544},"Function 404",{"type":212,"value":546},", signature ",{"type":207,"tag":215,"props":548,"children":549},{},[550],{"type":212,"value":551},"(wchar_t* path, int recursive) -> int",{"type":212,"value":553},", in\n",{"type":207,"tag":215,"props":555,"children":556},{},[557],{"type":212,"value":558},"Base\u002FOs\u002FEmscripten\u002FEmscriptenPath.cpp",{"type":212,"value":406},{"type":207,"tag":208,"props":561,"children":562},{},[563,568],{"type":207,"tag":540,"props":564,"children":565},{},[566],{"type":212,"value":567},"Fix:",{"type":212,"value":569}," low effort, small blast radius — one clear task with a working\nWindows equivalent, and four call sites that all expect this behaviour\nalready.",{"type":207,"tag":571,"props":572,"children":574},"h3",{"id":573},"ur-01-directory-creation-always-fails-what-the-client-does-now",[575],{"type":212,"value":576},"What the client does now",{"type":207,"tag":208,"props":578,"children":579},{},[580],{"type":212,"value":581},"The complete function body is two instructions:",{"type":207,"tag":583,"props":584,"children":588},"pre",{"language":585,"class":586,"tabindex":587},"wasm","shiki dark:dark-plus","0",[589],{"type":207,"tag":215,"props":590,"children":592},{"class":591},"language-wasm",[593],{"type":212,"value":594},"i32.const 2\nend",{"type":207,"tag":208,"props":596,"children":597},{},[598,600,604,606,611],{"type":212,"value":599},"It returns ",{"type":207,"tag":215,"props":601,"children":602},{},[603],{"type":212,"value":56},{"type":212,"value":605}," (",{"type":207,"tag":215,"props":607,"children":608},{},[609],{"type":212,"value":610},"ERROR_FILE_NOT_FOUND",{"type":212,"value":612},") every time, without touching the\nEmscripten file system. We called the shipped function directly:",{"type":207,"tag":583,"props":614,"children":616},{"language":212,"class":615,"tabindex":587},"shiki shiki-themes light-plus dark-plus dark:dark-plus",[617],{"type":207,"tag":215,"props":618,"children":620},{"class":619},"language-text",[621],{"type":207,"tag":622,"props":623,"children":626},"span",{"class":624,"style":625},"line","display: inline",[627],{"type":207,"tag":622,"props":628,"children":629},{},[630],{"type":212,"value":631},"func_404(L\"Templates\u002FSkills\u002F\", 1) = 2",{"type":207,"tag":208,"props":633,"children":634},{},[635],{"type":212,"value":636},"All callers treat a non-zero result as a failure of the whole operation:",{"type":207,"tag":237,"props":638,"children":639},{},[640,656],{"type":207,"tag":241,"props":641,"children":642},{},[643],{"type":207,"tag":245,"props":644,"children":645},{},[646,651],{"type":207,"tag":249,"props":647,"children":648},{},[649],{"type":212,"value":650},"Caller",{"type":207,"tag":249,"props":652,"children":653},{},[654],{"type":212,"value":655},"Purpose",{"type":207,"tag":270,"props":657,"children":658},{},[659,691,715,733],{"type":207,"tag":245,"props":660,"children":661},{},[662,672],{"type":207,"tag":277,"props":663,"children":664},{},[665,667],{"type":212,"value":666},"9757, ",{"type":207,"tag":215,"props":668,"children":669},{},[670],{"type":212,"value":671},"Gw\u002FAccount\u002FCli\u002FAcctCliTemplate.cpp",{"type":207,"tag":277,"props":673,"children":674},{},[675,677,682,684,689],{"type":212,"value":676},"Create ",{"type":207,"tag":215,"props":678,"children":679},{},[680],{"type":212,"value":681},"Templates\u002FSkills",{"type":212,"value":683}," or ",{"type":207,"tag":215,"props":685,"children":686},{},[687],{"type":212,"value":688},"Templates\u002FEquipment",{"type":212,"value":690}," before a write",{"type":207,"tag":245,"props":692,"children":693},{},[694,704],{"type":207,"tag":277,"props":695,"children":696},{},[697,699],{"type":212,"value":698},"12433, ",{"type":207,"tag":215,"props":700,"children":701},{},[702],{"type":212,"value":703},"Gw\u002FUi\u002FUiScreen.cpp",{"type":207,"tag":277,"props":705,"children":706},{},[707,708,713],{"type":212,"value":676},{"type":207,"tag":215,"props":709,"children":710},{},[711],{"type":212,"value":712},"Screens",{"type":212,"value":714}," before a screenshot",{"type":207,"tag":245,"props":716,"children":717},{},[718,728],{"type":207,"tag":277,"props":719,"children":720},{},[721,723],{"type":212,"value":722},"11744, ",{"type":207,"tag":215,"props":724,"children":725},{},[726],{"type":212,"value":727},"CtChatLog.cpp",{"type":207,"tag":277,"props":729,"children":730},{},[731],{"type":212,"value":732},"Create the chat-log directory",{"type":207,"tag":245,"props":734,"children":735},{},[736,746],{"type":207,"tag":277,"props":737,"children":738},{},[739,741],{"type":212,"value":740},"11460, ",{"type":207,"tag":215,"props":742,"children":743},{},[744],{"type":212,"value":745},"ActDlgLogin.cpp",{"type":207,"tag":277,"props":747,"children":748},{},[749],{"type":212,"value":750},"The result is discarded",{"type":207,"tag":208,"props":752,"children":753},{},[754,756,761,763,768],{"type":212,"value":755},"The template save path checks this result before opening the file, so\n",{"type":207,"tag":215,"props":757,"children":758},{},[759],{"type":212,"value":760},"AcctCliTemplate.cpp:1020",{"type":212,"value":762}," stores error 2 and the client reports that it can't\ncreate the file — without ever reaching the file system. We confirmed this:\nthe save failure occurs with zero ",{"type":207,"tag":215,"props":764,"children":765},{},[766],{"type":212,"value":767},"openat",{"type":212,"value":769}," activity.",{"type":207,"tag":571,"props":771,"children":773},{"id":772},"ur-01-directory-creation-always-fails-expected-behaviour",[774],{"type":212,"value":775},"Expected behaviour",{"type":207,"tag":208,"props":777,"children":778},{},[779,781,786,788,792],{"type":212,"value":780},"Create the directory, including parent directories when ",{"type":207,"tag":215,"props":782,"children":783},{},[784],{"type":212,"value":785},"recursive",{"type":212,"value":787}," is set.\nReturn ",{"type":207,"tag":215,"props":789,"children":790},{},[791],{"type":212,"value":587},{"type":212,"value":793}," on success and the matching error code on failure.",{"type":207,"tag":208,"props":795,"children":796},{},[797,799,804,806,810],{"type":212,"value":798},"The module imports no ",{"type":207,"tag":215,"props":800,"children":801},{},[802],{"type":212,"value":803},"mkdir",{"type":212,"value":805},". ",{"type":207,"tag":215,"props":807,"children":808},{},[809],{"type":212,"value":302},{"type":212,"value":811}," in the Emscripten file-system\nAPI is the direct equivalent.",{"type":207,"tag":571,"props":813,"children":815},{"id":814},"ur-01-directory-creation-always-fails-acceptance-criteria",[816],{"type":212,"value":817},"Acceptance criteria",{"type":207,"tag":819,"props":820,"children":821},"ul",{},[822,846,857,868,880],{"type":207,"tag":823,"props":824,"children":825},"li",{},[826,831,833,837,839,844],{"type":207,"tag":215,"props":827,"children":828},{},[829],{"type":212,"value":830},"func_404(L\"Templates\u002FSkills\u002F\", 1)",{"type":212,"value":832}," returns ",{"type":207,"tag":215,"props":834,"children":835},{},[836],{"type":212,"value":587},{"type":212,"value":838}," on a mount where\n",{"type":207,"tag":215,"props":840,"children":841},{},[842],{"type":212,"value":843},"Templates\u002F",{"type":212,"value":845}," does not exist yet.",{"type":207,"tag":823,"props":847,"children":848},{},[849,851,855],{"type":212,"value":850},"After the call, ",{"type":207,"tag":215,"props":852,"children":853},{},[854],{"type":212,"value":681},{"type":212,"value":856}," exists and is a directory.",{"type":207,"tag":823,"props":858,"children":859},{},[860,862,866],{"type":212,"value":861},"A second call on the same path returns ",{"type":207,"tag":215,"props":863,"children":864},{},[865],{"type":212,"value":587},{"type":212,"value":867}," and changes nothing.",{"type":207,"tag":823,"props":869,"children":870},{},[871,873,878],{"type":212,"value":872},"A call with ",{"type":207,"tag":215,"props":874,"children":875},{},[876],{"type":212,"value":877},"recursive = 0",{"type":212,"value":879}," on a path whose parent is absent returns a\nnon-zero error code.",{"type":207,"tag":823,"props":881,"children":882},{},[883,885,889],{"type":212,"value":884},"A screenshot creates a file in ",{"type":207,"tag":215,"props":886,"children":887},{},[888],{"type":212,"value":512},{"type":212,"value":406},{"type":207,"tag":527,"props":891,"children":892},{},[],{"type":207,"tag":408,"props":894,"children":896},{"id":895},"ur-02-directory-enumeration-does-nothing",[897],{"type":212,"value":898},"UR-02 — directory enumeration does nothing",{"type":207,"tag":208,"props":900,"children":901},{},[902,907,909,914],{"type":207,"tag":540,"props":903,"children":904},{},[905],{"type":212,"value":906},"Function 405",{"type":212,"value":908},", signature\n",{"type":207,"tag":215,"props":910,"children":911},{},[912],{"type":212,"value":913},"(FileList* out, const wchar_t* pattern, int flags) -> void",{"type":212,"value":915},", same translation\nunit.",{"type":207,"tag":208,"props":917,"children":918},{},[919,923],{"type":207,"tag":540,"props":920,"children":921},{},[922],{"type":212,"value":567},{"type":212,"value":924}," medium effort — the pattern match and the allocation contract need\ncare. Small blast radius: the callers already handle a list of any length.",{"type":207,"tag":571,"props":926,"children":928},{"id":927},"ur-02-directory-enumeration-does-nothing-what-the-client-does-now",[929],{"type":212,"value":576},{"type":207,"tag":208,"props":931,"children":932},{},[933,935,940,942,946],{"type":212,"value":934},"The function body is empty — it returns without writing to ",{"type":207,"tag":215,"props":936,"children":937},{},[938],{"type":212,"value":939},"out",{"type":212,"value":941},". The caller\nzeroes ",{"type":207,"tag":215,"props":943,"children":944},{},[945],{"type":212,"value":939},{"type":212,"value":947}," before the call, so every directory reads as empty.",{"type":207,"tag":208,"props":949,"children":950},{},[951],{"type":212,"value":952},"The output structure, taken from the call sites:",{"type":207,"tag":583,"props":954,"children":956},{"language":955,"class":586,"tabindex":587},"c",[957],{"type":207,"tag":215,"props":958,"children":960},{"class":959},"language-c",[961],{"type":212,"value":962},"struct FileList {          \u002F\u002F 16 bytes, the caller zeroes this\n    Entry*   entries;      \u002F\u002F +0   the caller frees this with free()\n    uint32_t _pad;         \u002F\u002F +4\n    uint32_t count;        \u002F\u002F +8\n    uint32_t _pad2;        \u002F\u002F +12\n};\n\nstruct Entry {             \u002F\u002F 544 bytes, stride confirmed at every call site\n    uint8_t  header[24];   \u002F\u002F +0   no caller reads this\n    wchar_t  name[260];    \u002F\u002F +24  file name, with extension\n};",{"type":207,"tag":208,"props":964,"children":965},{},[966,968,973],{"type":212,"value":967},"The ",{"type":207,"tag":215,"props":969,"children":970},{},[971],{"type":212,"value":972},"flags",{"type":212,"value":974}," parameter selects the entry kind. We observed these values:",{"type":207,"tag":237,"props":976,"children":977},{},[978,997],{"type":207,"tag":241,"props":979,"children":980},{},[981],{"type":207,"tag":245,"props":982,"children":983},{},[984,988,993],{"type":207,"tag":249,"props":985,"children":986},{},[987],{"type":212,"value":650},{"type":207,"tag":249,"props":989,"children":990},{},[991],{"type":212,"value":992},"Pattern",{"type":207,"tag":249,"props":994,"children":995},{},[996],{"type":212,"value":972},{"type":207,"tag":270,"props":998,"children":999},{},[1000,1026,1051,1074],{"type":207,"tag":245,"props":1001,"children":1002},{},[1003,1013,1021],{"type":207,"tag":277,"props":1004,"children":1005},{},[1006,1008],{"type":212,"value":1007},"9747, ",{"type":207,"tag":215,"props":1009,"children":1010},{},[1011],{"type":212,"value":1012},"AcctCliTemplate.cpp",{"type":207,"tag":277,"props":1014,"children":1015},{},[1016],{"type":207,"tag":215,"props":1017,"children":1018},{},[1019],{"type":212,"value":1020},"Templates\u002FSkills\u002F*.txt",{"type":207,"tag":277,"props":1022,"children":1023},{},[1024],{"type":212,"value":1025},"17 — files",{"type":207,"tag":245,"props":1027,"children":1028},{},[1029,1038,1046],{"type":207,"tag":277,"props":1030,"children":1031},{},[1032,1034],{"type":212,"value":1033},"9746, ",{"type":207,"tag":215,"props":1035,"children":1036},{},[1037],{"type":212,"value":1012},{"type":207,"tag":277,"props":1039,"children":1040},{},[1041],{"type":207,"tag":215,"props":1042,"children":1043},{},[1044],{"type":212,"value":1045},"Templates\u002FSkills\u002F*",{"type":207,"tag":277,"props":1047,"children":1048},{},[1049],{"type":212,"value":1050},"18 — directories",{"type":207,"tag":245,"props":1052,"children":1053},{},[1054,1062,1070],{"type":207,"tag":277,"props":1055,"children":1056},{},[1057,1058],{"type":212,"value":722},{"type":207,"tag":215,"props":1059,"children":1060},{},[1061],{"type":212,"value":727},{"type":207,"tag":277,"props":1063,"children":1064},{},[1065],{"type":207,"tag":215,"props":1066,"children":1067},{},[1068],{"type":212,"value":1069},"\u003Cdir>\u002Fgw???.txt",{"type":207,"tag":277,"props":1071,"children":1072},{},[1073],{"type":212,"value":7},{"type":207,"tag":245,"props":1075,"children":1076},{},[1077,1086,1094],{"type":207,"tag":277,"props":1078,"children":1079},{},[1080,1081],{"type":212,"value":698},{"type":207,"tag":215,"props":1082,"children":1083},{},[1084],{"type":212,"value":1085},"UiScreen.cpp",{"type":207,"tag":277,"props":1087,"children":1088},{},[1089],{"type":207,"tag":215,"props":1090,"children":1091},{},[1092],{"type":212,"value":1093},"Screens\u002Fgw???.???",{"type":207,"tag":277,"props":1095,"children":1096},{},[1097],{"type":212,"value":7},{"type":207,"tag":208,"props":1099,"children":1100},{},[1101],{"type":212,"value":1102},"Bit 0 selects files, bit 1 selects directories. Bit 4 shows up only in the\ntemplate scans; we didn't determine its meaning.",{"type":207,"tag":571,"props":1104,"children":1106},{"id":1105},"ur-02-directory-enumeration-does-nothing-expected-behaviour",[1107],{"type":212,"value":775},{"type":207,"tag":208,"props":1109,"children":1110},{},[1111,1113,1117,1119,1124,1125,1130],{"type":212,"value":1112},"Write the matching entries into ",{"type":207,"tag":215,"props":1114,"children":1115},{},[1116],{"type":212,"value":939},{"type":212,"value":1118},", setting ",{"type":207,"tag":215,"props":1120,"children":1121},{},[1122],{"type":212,"value":1123},"entries",{"type":212,"value":382},{"type":207,"tag":215,"props":1126,"children":1127},{},[1128],{"type":212,"value":1129},"count",{"type":212,"value":406},{"type":207,"tag":208,"props":1132,"children":1133},{},[1134,1135,1140,1142,1146,1147,1152],{"type":212,"value":798},{"type":207,"tag":215,"props":1136,"children":1137},{},[1138],{"type":212,"value":1139},"getdents",{"type":212,"value":1141},". Use ",{"type":207,"tag":215,"props":1143,"children":1144},{},[1145],{"type":212,"value":331},{"type":212,"value":382},{"type":207,"tag":215,"props":1148,"children":1149},{},[1150],{"type":212,"value":1151},"FS.stat",{"type":212,"value":406},{"type":207,"tag":1154,"props":1155,"children":1157},"warning",{"title":1156},"Allocation contract",[1158,1160,1164],{"type":212,"value":1159},"The caller frees ",{"type":207,"tag":215,"props":1161,"children":1162},{},[1163],{"type":212,"value":1123},{"type":212,"value":1165},", so the block has to come from the client's own\nallocator. Don't allocate it in the host or in a different heap.",{"type":207,"tag":571,"props":1167,"children":1169},{"id":1168},"ur-02-directory-enumeration-does-nothing-acceptance-criteria",[1170],{"type":212,"value":817},{"type":207,"tag":819,"props":1172,"children":1173},{},[1174,1185,1196,1201,1218,1234,1246],{"type":207,"tag":823,"props":1175,"children":1176},{},[1177,1179,1184],{"type":212,"value":1178},"A directory with three matching files gives ",{"type":207,"tag":215,"props":1180,"children":1181},{},[1182],{"type":212,"value":1183},"count = 3",{"type":212,"value":406},{"type":207,"tag":823,"props":1186,"children":1187},{},[1188,1190,1195],{"type":212,"value":1189},"Each entry holds the file name with its extension at offset ",{"type":207,"tag":215,"props":1191,"children":1192},{},[1193],{"type":212,"value":1194},"+24",{"type":212,"value":406},{"type":207,"tag":823,"props":1197,"children":1198},{},[1199],{"type":212,"value":1200},"The entry stride is 544 bytes.",{"type":207,"tag":823,"props":1202,"children":1203},{},[1204,1209,1211,1216],{"type":207,"tag":215,"props":1205,"children":1206},{},[1207],{"type":212,"value":1208},"flags = 1",{"type":212,"value":1210}," returns files only. ",{"type":207,"tag":215,"props":1212,"children":1213},{},[1214],{"type":212,"value":1215},"flags = 2",{"type":212,"value":1217}," returns directories only.",{"type":207,"tag":823,"props":1219,"children":1220},{},[1221,1226,1227,1232],{"type":207,"tag":215,"props":1222,"children":1223},{},[1224],{"type":212,"value":1225},"*",{"type":212,"value":382},{"type":207,"tag":215,"props":1228,"children":1229},{},[1230],{"type":212,"value":1231},"?",{"type":212,"value":1233}," match inside one path component.",{"type":207,"tag":823,"props":1235,"children":1236},{},[1237,1239,1244],{"type":212,"value":1238},"The caller can call ",{"type":207,"tag":215,"props":1240,"children":1241},{},[1242],{"type":212,"value":1243},"free(out->entries)",{"type":212,"value":1245}," without a fault.",{"type":207,"tag":823,"props":1247,"children":1248},{},[1249],{"type":212,"value":1250},"\"Load from Skills Template\" lists a template that the player saved before.",{"type":207,"tag":527,"props":1252,"children":1253},{},[],{"type":207,"tag":408,"props":1255,"children":1257},{"id":1256},"ur-03-entry-name-derivation-writes-nothing",[1258],{"type":212,"value":1259},"UR-03 — entry-name derivation writes nothing",{"type":207,"tag":208,"props":1261,"children":1262},{},[1263,1268,1269,1274],{"type":207,"tag":540,"props":1264,"children":1265},{},[1266],{"type":212,"value":1267},"Function 416",{"type":212,"value":908},{"type":207,"tag":215,"props":1270,"children":1271},{},[1272],{"type":212,"value":1273},"(wchar_t* dst, int, const wchar_t* baseDir, int, const wchar_t* path, int dstChars) -> int",{"type":212,"value":1275},",\nsame translation unit.",{"type":207,"tag":208,"props":1277,"children":1278},{},[1279,1283],{"type":207,"tag":540,"props":1280,"children":1281},{},[1282],{"type":212,"value":567},{"type":212,"value":1284}," low effort. Medium blast radius — the two model paths flip from\ntheir fallback branch to the main branch after the fix; test them together\nwith this change.",{"type":207,"tag":571,"props":1286,"children":1288},{"id":1287},"ur-03-entry-name-derivation-writes-nothing-what-the-client-does-now",[1289],{"type":212,"value":576},{"type":207,"tag":208,"props":1291,"children":1292},{},[1293],{"type":212,"value":581},{"type":207,"tag":583,"props":1295,"children":1296},{"language":585,"class":586,"tabindex":587},[1297],{"type":207,"tag":215,"props":1298,"children":1299},{"class":591},[1300],{"type":212,"value":1301},"i32.const 0\nend",{"type":207,"tag":208,"props":1303,"children":1304},{},[1305,1306,1310,1312,1317],{"type":212,"value":599},{"type":207,"tag":215,"props":1307,"children":1308},{},[1309],{"type":212,"value":587},{"type":212,"value":1311}," and writes nothing to ",{"type":207,"tag":215,"props":1313,"children":1314},{},[1315],{"type":212,"value":1316},"dst",{"type":212,"value":406},{"type":207,"tag":208,"props":1319,"children":1320},{},[1321,1323,1327,1329,1334,1336,1341],{"type":212,"value":1322},"Callers: 9746 and 9747 (",{"type":207,"tag":215,"props":1324,"children":1325},{},[1326],{"type":212,"value":1012},{"type":212,"value":1328},", both template scans), 4463\n(",{"type":207,"tag":215,"props":1330,"children":1331},{},[1332],{"type":212,"value":1333},"MdlDecomp.cpp",{"type":212,"value":1335},"), and 4532 (",{"type":207,"tag":215,"props":1337,"children":1338},{},[1339],{"type":212,"value":1340},"MdlTex.cpp",{"type":212,"value":1342},").",{"type":207,"tag":208,"props":1344,"children":1345},{},[1346,1348,1352],{"type":212,"value":1347},"In the template scans the client drops the result and then reads ",{"type":207,"tag":215,"props":1349,"children":1350},{},[1351],{"type":212,"value":1316},{"type":212,"value":1353}," anyway,\nso it ends up cleaning and registering uninitialised stack memory as the\ntemplate name. The two model paths test the result and take their fallback\nbranch.",{"type":207,"tag":571,"props":1355,"children":1357},{"id":1356},"ur-03-entry-name-derivation-writes-nothing-expected-behaviour",[1358],{"type":212,"value":775},{"type":207,"tag":208,"props":1360,"children":1361},{},[1362,1364,1369,1371,1376,1378,1382],{"type":212,"value":1363},"Write ",{"type":207,"tag":215,"props":1365,"children":1366},{},[1367],{"type":212,"value":1368},"path",{"type":212,"value":1370}," relative to ",{"type":207,"tag":215,"props":1372,"children":1373},{},[1374],{"type":212,"value":1375},"baseDir",{"type":212,"value":1377}," into ",{"type":207,"tag":215,"props":1379,"children":1380},{},[1381],{"type":212,"value":1316},{"type":212,"value":1383}," and return the number of\ncharacters written.",{"type":207,"tag":208,"props":1385,"children":1386},{},[1387,1389,1393,1395,1400,1401,1405,1407,1411],{"type":212,"value":1388},"In the template scans, ",{"type":207,"tag":215,"props":1390,"children":1391},{},[1392],{"type":212,"value":1375},{"type":212,"value":1394}," is ",{"type":207,"tag":215,"props":1396,"children":1397},{},[1398],{"type":212,"value":1399},"Templates\u002FSkills\u002F",{"type":212,"value":382},{"type":207,"tag":215,"props":1402,"children":1403},{},[1404],{"type":212,"value":1368},{"type":212,"value":1406}," is an entry\nname from ",{"type":207,"tag":215,"props":1408,"children":1409},{},[1410],{"type":212,"value":313},{"type":212,"value":406},{"type":207,"tag":571,"props":1413,"children":1415},{"id":1414},"ur-03-entry-name-derivation-writes-nothing-acceptance-criteria",[1416],{"type":212,"value":817},{"type":207,"tag":819,"props":1418,"children":1419},{},[1420,1444,1456],{"type":207,"tag":823,"props":1421,"children":1422},{},[1423,1425,1430,1431,1436,1438,1442],{"type":212,"value":1424},"With ",{"type":207,"tag":215,"props":1426,"children":1427},{},[1428],{"type":212,"value":1429},"baseDir = L\"Templates\u002FSkills\u002F\"",{"type":212,"value":382},{"type":207,"tag":215,"props":1432,"children":1433},{},[1434],{"type":212,"value":1435},"path = L\"Templates\u002FSkills\u002FMy.txt\"",{"type":212,"value":1437},",\n",{"type":207,"tag":215,"props":1439,"children":1440},{},[1441],{"type":212,"value":1316},{"type":212,"value":1443}," holds the relative name and the return value is non-zero.",{"type":207,"tag":823,"props":1445,"children":1446},{},[1447,1449,1454],{"type":212,"value":1448},"The function writes at most ",{"type":207,"tag":215,"props":1450,"children":1451},{},[1452],{"type":212,"value":1453},"dstChars",{"type":212,"value":1455}," characters.",{"type":207,"tag":823,"props":1457,"children":1458},{},[1459],{"type":212,"value":1460},"The two model paths keep their current behaviour when the derivation fails.",{"type":207,"tag":527,"props":1462,"children":1463},{},[],{"type":207,"tag":408,"props":1465,"children":1467},{"id":1466},"ur-04-file-deletion-stops-the-client",[1468],{"type":212,"value":1469},"UR-04 — file deletion stops the client",{"type":207,"tag":208,"props":1471,"children":1472},{},[1473,1478,1479,1484,1485,1490],{"type":207,"tag":540,"props":1474,"children":1475},{},[1476],{"type":212,"value":1477},"Function 552",{"type":212,"value":546},{"type":207,"tag":215,"props":1480,"children":1481},{},[1482],{"type":212,"value":1483},"(const wchar_t* path) -> int",{"type":212,"value":553},{"type":207,"tag":215,"props":1486,"children":1487},{},[1488],{"type":212,"value":1489},"Base\u002FOs\u002FEmscripten\u002FExe\u002FEmscriptenExeFile.cpp",{"type":212,"value":1491},", line 840.",{"type":207,"tag":208,"props":1493,"children":1494},{},[1495,1499],{"type":207,"tag":540,"props":1496,"children":1497},{},[1498],{"type":212,"value":567},{"type":212,"value":1500}," low effort, small blast radius — one live call path.",{"type":207,"tag":571,"props":1502,"children":1504},{"id":1503},"ur-04-file-deletion-stops-the-client-what-the-client-does-now",[1505],{"type":212,"value":576},{"type":207,"tag":208,"props":1507,"children":1508},{},[1509],{"type":212,"value":1510},"The complete function body is an assertion and a trap:",{"type":207,"tag":583,"props":1512,"children":1513},{"language":585,"class":586,"tabindex":587},[1514],{"type":207,"tag":215,"props":1515,"children":1516},{"class":591},[1517],{"type":212,"value":1518},"i32.const \"not implemented\"\ni32.const \"..\u002F..\u002F..\u002F..\u002FBase\u002FOs\u002FEmscripten\u002FExe\u002FEmscriptenExeFile.cpp\"\ni32.const 840\ncall \u003Cassert>\nunreachable",{"type":207,"tag":208,"props":1520,"children":1521},{},[1522,1524,1529],{"type":212,"value":1523},"The call path is ",{"type":207,"tag":215,"props":1525,"children":1526},{},[1527],{"type":212,"value":1528},"File::Delete",{"type":212,"value":1530}," → 730 → 678 → 552. The caller reads a non-zero\nresult as success and reports error 4 otherwise.",{"type":207,"tag":208,"props":1532,"children":1533},{},[1534],{"type":212,"value":1535},"A delete therefore stops the client. A rename stops it too, because a rename is\ntwo steps — write the new name, then delete the old one. When the write step\nfails first, the client reports a rename failure instead.",{"type":207,"tag":571,"props":1537,"children":1539},{"id":1538},"ur-04-file-deletion-stops-the-client-expected-behaviour",[1540],{"type":212,"value":775},{"type":207,"tag":208,"props":1542,"children":1543},{},[1544],{"type":212,"value":1545},"Delete the file. Return non-zero on success, zero on failure.",{"type":207,"tag":208,"props":1547,"children":1548},{},[1549,1550,1555,1556,1560],{"type":212,"value":798},{"type":207,"tag":215,"props":1551,"children":1552},{},[1553],{"type":212,"value":1554},"unlink",{"type":212,"value":1141},{"type":207,"tag":215,"props":1557,"children":1558},{},[1559],{"type":212,"value":394},{"type":212,"value":406},{"type":207,"tag":571,"props":1562,"children":1564},{"id":1563},"ur-04-file-deletion-stops-the-client-acceptance-criteria",[1565],{"type":212,"value":817},{"type":207,"tag":819,"props":1567,"children":1568},{},[1569,1574,1579,1584],{"type":207,"tag":823,"props":1570,"children":1571},{},[1572],{"type":212,"value":1573},"A delete of an existing template removes the file and returns non-zero.",{"type":207,"tag":823,"props":1575,"children":1576},{},[1577],{"type":212,"value":1578},"A delete of an absent file returns zero and does not stop the client.",{"type":207,"tag":823,"props":1580,"children":1581},{},[1582],{"type":212,"value":1583},"A rename of a template completes, and the old file is gone.",{"type":207,"tag":823,"props":1585,"children":1586},{},[1587,1589,1593],{"type":212,"value":1588},"No ",{"type":207,"tag":215,"props":1590,"children":1591},{},[1592],{"type":212,"value":226},{"type":212,"value":1594}," call remains on this path.",{"type":207,"tag":1596,"props":1597,"children":1599},"info",{"title":1598},"Ten more unimplemented bodies nearby",[1600,1619],{"type":207,"tag":208,"props":1601,"children":1602},{},[1603,1605,1610,1612,1617],{"type":212,"value":1604},"The same translation unit holds eight more ",{"type":207,"tag":215,"props":1606,"children":1607},{},[1608],{"type":212,"value":1609},"assert(\"not implemented\")",{"type":212,"value":1611}," bodies:\nfunctions 526, 527, 532, 533, 534, 535, 538, and 539, at lines 490, 601, 608,\nand 634. ",{"type":207,"tag":215,"props":1613,"children":1614},{},[1615],{"type":212,"value":1616},"Net\u002FDiagLib\u002FEmscripten\u002FEmscriptenDiagLib.cpp",{"type":212,"value":1618}," holds two more, at\nlines 23 and 28.",{"type":207,"tag":208,"props":1620,"children":1621},{},[1622],{"type":212,"value":1623},"None of them is reachable today — the eight are vtable slots with no live\ncaller, and the DiagLib pair sits behind a disabled flag. We list them in case\nthey're useful for planning.",{"type":207,"tag":527,"props":1625,"children":1626},{},[],{"type":207,"tag":408,"props":1628,"children":1630},{"id":1629},"how-to-reproduce",[1631],{"type":212,"value":1632},"How to reproduce",{"type":207,"tag":208,"props":1634,"children":1635},{},[1636],{"type":212,"value":1637},"These steps need a stock client. No host change is needed.",{"type":207,"tag":1639,"props":1640,"children":1642},"steps",{"mode":1641},"numbered",[1643,1649,1659,1665,1681,1686],{"type":207,"tag":571,"props":1644,"children":1646},{"id":1645},"how-to-reproduce-save-a-template",[1647],{"type":212,"value":1648},"Save a template",{"type":207,"tag":208,"props":1650,"children":1651},{},[1652,1654,1658],{"type":212,"value":1653},"Log in and open the skills panel. Save a build under any name. The save fails.\nThis is ",{"type":207,"tag":215,"props":1655,"children":1656},{},[1657],{"type":212,"value":284},{"type":212,"value":406},{"type":207,"tag":571,"props":1660,"children":1662},{"id":1661},"how-to-reproduce-open-the-template-list",[1663],{"type":212,"value":1664},"Open the template list",{"type":207,"tag":208,"props":1666,"children":1667},{},[1668,1670,1674,1676,1680],{"type":212,"value":1669},"Open \"Load from Skills Template\". The list is empty. This is ",{"type":207,"tag":215,"props":1671,"children":1672},{},[1673],{"type":212,"value":313},{"type":212,"value":1675}," and\n",{"type":207,"tag":215,"props":1677,"children":1678},{},[1679],{"type":212,"value":342},{"type":212,"value":406},{"type":207,"tag":571,"props":1682,"children":1684},{"id":1683},"how-to-reproduce-delete-a-template",[1685],{"type":212,"value":489},{"type":207,"tag":208,"props":1687,"children":1688},{},[1689,1691,1695,1696,1700,1702,1706],{"type":212,"value":1690},"This step needs a build in which ",{"type":207,"tag":215,"props":1692,"children":1693},{},[1694],{"type":212,"value":284},{"type":212,"value":382},{"type":207,"tag":215,"props":1697,"children":1698},{},[1699],{"type":212,"value":313},{"type":212,"value":1701}," work. Delete a listed\ntemplate. The client stops. This is ",{"type":207,"tag":215,"props":1703,"children":1704},{},[1705],{"type":212,"value":368},{"type":212,"value":406},{"type":207,"tag":408,"props":1708,"children":1710},{"id":1709},"our-workaround-today",[1711],{"type":212,"value":1712},"Our workaround today",{"type":207,"tag":208,"props":1714,"children":1715},{},[1716],{"type":212,"value":1717},"The host rewrites the module before starting the client: it appends five\nforwarder functions and repoints the stub call sites at them. Each forwarder\ncalls out to the host through a marker value on an existing syscall import,\nand the host does the actual file work in the Emscripten file system.",{"type":207,"tag":208,"props":1719,"children":1720},{},[1721,1723,1730],{"type":212,"value":1722},"That rewrite has to be re-certified for every new client build. Implementing\nthese four routines makes it unnecessary —\n",{"type":207,"tag":1724,"props":1725,"children":1727},"a",{"href":1726},"$docs\u002Fupstream\u002Freference\u002Four-workarounds",[1728],{"type":212,"value":1729},"our workarounds",{"type":212,"value":1731}," has the detail.",{"title":1733,"searchDepth":1734,"depth":1734,"links":1735},"",4,[1736,1738,1744,1749,1754,1759,1764],{"id":410,"depth":1737,"text":413},2,{"id":532,"depth":1737,"text":535,"children":1739},[1740,1742,1743],{"id":573,"depth":1741,"text":576},3,{"id":772,"depth":1741,"text":775},{"id":814,"depth":1741,"text":817},{"id":895,"depth":1737,"text":898,"children":1745},[1746,1747,1748],{"id":927,"depth":1741,"text":576},{"id":1105,"depth":1741,"text":775},{"id":1168,"depth":1741,"text":817},{"id":1256,"depth":1737,"text":1259,"children":1750},[1751,1752,1753],{"id":1287,"depth":1741,"text":576},{"id":1356,"depth":1741,"text":775},{"id":1414,"depth":1741,"text":817},{"id":1466,"depth":1737,"text":1469,"children":1755},[1756,1757,1758],{"id":1503,"depth":1741,"text":576},{"id":1538,"depth":1741,"text":775},{"id":1563,"depth":1741,"text":817},{"id":1629,"depth":1737,"text":1632,"children":1760},[1761,1762,1763],{"id":1645,"depth":1741,"text":1648},{"id":1661,"depth":1741,"text":1664},{"id":1683,"depth":1741,"text":489},{"id":1709,"depth":1737,"text":1712},"markdown","docs",{"source":1768,"path":1769,"stem":1770,"dir":1771,"extension":1772},"content","en\u002F1.docs\u002F3.upstream\u002F3.filesystem\u002F1.unimplemented-routines.md","en\u002F1.docs\u002F3.upstream\u002F3.filesystem\u002F1.unimplemented-routines","filesystem","md",{"$docs\u002Fupstream\u002Freference\u002Four-workarounds":190},{"requestedPath":107,"resolvedPath":1775,"alternates":1776},"\u002Fdocs\u002Fupstream\u002Ffilesystem\u002Funimplemented-routines",[1777,1779],{"locale":77,"path":1775,"source":1778},"variant",{"locale":8,"path":107,"source":1780,"resolvedLocale":77},"fallback",{"requested":1782,"resolved":1783,"usedFallback":80},{"locale":8},{"locale":77},{"previous":1785,"next":1785},null,{"left":1787,"top":1787,"width":1788,"height":1788,"rotate":1787,"vFlip":6,"hFlip":6,"body":1789},0,24,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"\u002F>\u003Cpath d=\"M14 2v5a1 1 0 0 0 1 1h5\"\u002F>\u003C\u002Fg>",{"left":1787,"top":1787,"width":1788,"height":1788,"rotate":1787,"vFlip":6,"hFlip":6,"body":1791},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"8\" height=\"4\" x=\"8\" y=\"2\" rx=\"1\" ry=\"1\"\u002F>\u003Cpath d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"\u002F>\u003C\u002Fg>",1786362943899]