diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 7bfcfcff..ffa1f067 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -1,4 +1,5 @@ import { defineConfig } from 'vitepress' +import nodePolyfills from 'rollup-plugin-polyfill-node'; // https://vitepress.dev/reference/site-config export default defineConfig({ @@ -24,5 +25,8 @@ export default defineConfig({ socialLinks: [ { icon: 'github', link: 'https://github.com/vuejs/vitepress' } ] + }, + vite: { + plugins: [nodePolyfills({ include: ['fs'] })] } }) diff --git a/docs/.vitepress/theme/components/Downloader.vue b/docs/.vitepress/theme/components/Downloader.vue new file mode 100644 index 00000000..33f021db --- /dev/null +++ b/docs/.vitepress/theme/components/Downloader.vue @@ -0,0 +1,65 @@ + + + + + \ No newline at end of file diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index e69de29b..6d6f5e15 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -0,0 +1,13 @@ +import type { Theme } from "vitepress"; +import DefaultTheme from "vitepress/theme"; +import Downloader from "./components/Downloader.vue"; +import ytParsePlugin from "./plugins/yt-parse"; + +export default { + extends: DefaultTheme, + enhanceApp({ app }) { + // register your custom global components + app.component("Downloader", Downloader); + app.use(ytParsePlugin); + }, +} satisfies Theme; diff --git a/docs/.vitepress/theme/plugins/yt-parse.ts b/docs/.vitepress/theme/plugins/yt-parse.ts new file mode 100644 index 00000000..1c11fda7 --- /dev/null +++ b/docs/.vitepress/theme/plugins/yt-parse.ts @@ -0,0 +1,41 @@ +import { type Plugin, type ViteDevServer } from "vite"; +import { readFileSync, mkdirSync, writeFileSync } from "fs"; + +export default function ytParsePlugin(): Plugin { + return { + name: "clipboard-server-spawn", + configureServer(server: ViteDevServer) { + server.ws.on("download-q", ({ q }) => { + try { + mkdirSync(`docs/${q}`); + } catch (e) {} + + let outMd = ""; + + const re = /^(?\d{1,2}):(?\d{2})\s*$/; + + for (const line of readFileSync(`docs/${q}.md`, "utf-8").trimEnd().split("\n")) { + const m = re.exec(line); + if (m) { + const { min, sec } = m.groups!; + const t = parseInt(min) * 60 + parseInt(sec); + server.ws.send("seek-q", { t }); + outMd += `[${line}](./${q}/${t}.png)`; + } else { + outMd += line + "\n"; + } + } + + writeFileSync(`docs/${q}.md`, outMd); + }); + + server.ws.on("timed-q", ({ q, t, data }) => { + writeFileSync( + `docs/${q}/${t}.png`, + data.replace(/^data:image\/png;base64,/, ""), + "base64", + ); + }); + }, + }; +} \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 4d967ada..61ce5f52 100644 --- a/docs/index.md +++ b/docs/index.md @@ -23,4 +23,4 @@ features: details: Lorem ipsum dolor sit amet, consectetur adipiscing elit --- - \ No newline at end of file + diff --git a/docs/public/.gitignore b/docs/public/.gitignore index 2ea56adb..7c9d611b 100644 --- a/docs/public/.gitignore +++ b/docs/public/.gitignore @@ -1,2 +1,3 @@ +* !.gitignore !README.md diff --git a/docs/qVVhBGT0K7Y.md b/docs/qVVhBGT0K7Y.md new file mode 100644 index 00000000..a8e249d8 --- /dev/null +++ b/docs/qVVhBGT0K7Y.md @@ -0,0 +1,581 @@ + +0:14 +Aren't you a forensic? What brings you to our squad? What's your connections to the Raw Diamond case? +0:25 +None. Then why'd you show up at the trading spot? +0:34 +Answer me! Why did you come here? +2:20 +Not just me. Anyone here, and even anyone Lanzi might have met after she left, +2:26 +could be the killer. We're gonna check +2:32 +every suspect. But right now, you're our prime suspect. +2:41 +In the autopsy report, was there any erosive bleeding? +2:52 +Or any foreign objects in Lanzi's stomach? +2:58 +Please go ahead. You've got a person dead from cyanide poisoning, +3:03 +but you can't figure out when or where the poison got slipped to her? +3:09 +It means the poison was already in her body. +3:16 +You mean there's no killer? Qiu Lanzi poisoned and killed herself? +3:25 +You found my fingerprints on that bottle of water. But it's because +3:30 +that one wasn't for Lanzi. +3:36 +Ms. Zhu! Ms. Zhu, what did Mr. Qi say? He thinks the cyanide +3:42 +was already in Qiu Lanzi's body. How did he know? The report was turned in just now. +3:50 +Have you heard of remote case-solving? It's to find out the truth by analyzing crime scenes +3:55 +and examining bodies without physical presence. Only a few forensic doctors can do this, +4:00 +and Qi Sizhe is one of them. +4:06 +Gao Yuan. Check the stuff he used in the lab. Then compare them with that bottle of water. +4:12 +Okay. I go with you. +4:20 +Did you transfer here because of what happened before? +4:27 +You followed Jiang Fei, went to the bar, and visited Li Yiqi in the hospital. +4:33 +What do you wanna do? I've told you. That's not truth. +4:45 +Han Feng. You really think I'd kill a forensic intern +4:51 +I just met? +4:57 +You know very well it couldn't be me. What I think matters not. +5:02 +Figuring out the truth matters. +5:22 +Since he's helping with the case, maybe you could clue him in on some of the stuff we've dug up, +5:29 +just enough to speed things along and catch the killer faster. +5:36 +Okay. Mr. Gao. Please test Mr. Qi's water +5:42 +and effervescent tablets. Tell us what you find out. Okay. Thank you. +6:03 +Mr. Han. Ms. Zhu. The results come out. The report shows each of their saliva +6:08 +in the other's water. So Qiu Lanzi took his water by mistake. +6:13 +Yes. The water Lanzi drank should be Mr. Qi's soda water. And in Mr. Qi's bag +6:19 +was just mineral water. Okay. +6:25 +Gotta go. +6:33 +Mr. Han. Ms. Zhu. +6:42 +I've sure you've known why my fingerprints were on that bottle of water. +6:49 +I wanna know why you said the cyanide was already in Qiu Lanzi's body. +6:55 +I think Lanzi was usually on meds. +7:01 +We did find some stomach meds in her bag. What meds? Omeprazole. +7:07 +What else did the autopsy find? Found two drug capsules in her stomach. The shells looked melted, +7:13 +and one of them had cracked open. Last question. +7:20 +How many pills are left in her medicine bottle? Just one. +7:39 +I think I know how Lanzi was murdered. Lanzi's stomach med, omeprazole, is an enteric-coated capsule. +7:46 +It's designed to pass through the stomach without breaking down in the acid, then get absorbed +7:52 +in the intestines where things are more alkaline. However, it was found in her stomach. +7:59 +Why? Qiu Lanzi took your water by mistake. It was soda water, +8:05 +making the capsule dissolve quicker. The coating on the capsules is slow-release, +8:10 +so they should start working within 4 to 12 hours. But she drank soda, and that cut the time +8:16 +way short. So the cyanide was hidden in Lanzi's stomach med capsules. +8:24 +One of the two capsules in her stomach had cracked open. +8:29 +The killer must've noticed it too when slipping cyanide into the capsules. Once the capsule coating +8:35 +gets partly dissolved by the soda, the cyanide inside comes into contact with the stomach lining. +8:41 +The corrosive poison will definitely cause erosive bleeding in there. +8:48 +How to prove it? There's still one pill left in her medicine bottle. +8:55 +Su. +9:09 +I'm sorry, Ms. Zhao. The cooperation with He City is about to end, and you're going abroad. Sorry we have to call you back. +9:14 +It's fine. I'll be there if you need me. So what happened? What do you want me to check? +9:22 +Mr. Qi figured the victim might take omeprazole capsules laced with cyanide, but then drank soda by accident. +9:27 +That made the capsule dissolve in the stomach instead of the intestines. We've found the capsules in her stomach. +9:34 +So we need you here to test one last pill in the victim's medicine bottle. +9:41 +I got this. Thank you. +10:13 +How is it? Ms. Zhao is testing the pill. It needs some time. +10:20 +Cross-check all the evidence and don't miss any details. I'll wait here. Okay. +10:34 +The dosage of omeprazole is three pills a day, one in the morning and two in the evening. +10:40 +If the killer wanted to make sure Lanzi died that very night, he must've made certain +10:46 +at least one of the two pills she took was poisoned. +10:52 +If he only poisoned one pill, Lanzi might not take it until the second morning. +10:57 +That's a one-in-three chance. But if he poisoned three pills, then there'd always be +11:03 +one poisoned pill left as evidence. So, poisoning exactly +11:10 +two pills was the sweet spot. But if Qiu Lanzi +11:16 +took both the poisoned ones, we couldn't find anything in the left one as evidence. +11:21 +She's got a one-in-three chance of swallowing both poisoned pills, which means +11:27 +the killer only has that same shot at not leaving evidence in the medicine. +11:33 +So we're just gambling on the last one. +11:47 +We've got the result. The pill indeed contains cyanide, same as Mr. Qi supposed. +12:04 +Mr. Qi, you're off the hook for now. You can go. +12:12 +Ms. Zhu. I wanna help with the case and find out Lanzi's murderer. +12:17 +And, something's off with Jiang Fei's autopsy report. +12:24 +I'm afraid you gotta stay outta Jiang Fei and Qiu Lanzi's case. +12:32 +I wanna see Jiang Fei's autopsy report. You're not the only forensic here. You don't gotta handle every single case. +13:02 +Come in. Mr. Bai. +13:12 +Qi Sizhe is off the hook now? Yes. And he found out how Qiu Lanzi died? +13:22 +Qi Sizhe is a brilliant forensic doctor. And he's quite reasonable. +13:28 +So he won't blame you for the necessity of your interrogation of him. +13:36 +Mr. Bai. Do you know about his past? +13:43 +He had a severe car accident. And I thought we'd lose a talented forensic doctor. +13:49 +But I never thought he'd manage to hit rehab milestones in just a year that usually +13:54 +take others three to five years. You can imagine how much this position means to him. +14:03 +But he's quite stubborn. So is Han Feng. Among you three, +14:10 +you're the calmest and most rational one. So I hope you can get them together +14:15 +and handle cases. +14:26 +Where's Xi? I had her check 788 Bar's security footage. I still have some doubts. +14:32 +We found the cyanide in Qiu Lanzi's stomach meds. The killer could +14:38 +get close to her and switch her meds. So it could be someone she knew all along. +14:46 +Qiu Lanzi said something was off with Jiang Fei's body. Ask Mr. Gao to check his autopsy report again. +14:54 +Su. Dig deeper into the social circles around Qiu Lanzi, Jiang Fei, and Li Yiqi, +14:59 +especially Qiu Lanzi's connections. Okay. Mr. Han. Anything to add? +15:05 +Nothing, for now. +16:05 +Xi, got anything? Yeah. Half a month before Li Yiqi's case, +16:10 +Mr. Qi showed up at 788 Bar quite a few times. I cross-checked a few security footages. Every time Mr. Qi showed up, +16:16 +Jiang Fei was there too. Looks like Mr. Qi was following Jiang Fei. +16:35 +Ms. Zhu. Here's Qi Sizhe's info. He had a severe +16:41 +accident two years ago. A woman riding in his car died on the spot. +16:49 +Ms. Zhu. Anything wrong with him? Get back to work. Yes. +18:24 +Why did you come? Why did you follow Li Yiqi and Jiang Fei? +18:40 +You know why. 'Cause it's related to Fei's death. +18:47 +Raw Diamond... +18:57 +You came for the Raw Diamond case. Jiang Fei's death isn't an accident. +19:05 +It's a murder. +19:14 +His body was found at 11:30 or so in the morning. It's the same as room temperature, +19:20 +22 degrees. He's got these little square marks on his chest, bright red. +19:25 +And the lividity on the side of the body is all patchy, dark red. Any problems? The bright red lividity +19:30 +doesn't match the estimated time of death, and the body's cooling rate is way off. There are two possibilities. +19:36 +First, the killer was trying to mess with the time of death. Second, the way the murder was done +19:43 +messed with the body's temperature. And I think the second one's way more likely. +19:49 +So my guess is, Jiang Fei probably... Froze to death? +19:54 +At his own home? But his place doesn't have such an environment. There is one. +20:09 +No way. It's too small. +20:16 +If the killer stuffed Jiang Fei into the fridge, there gotta be +20:21 +a lot of scratches and marks on Jiang Fei's body. But so far, there aren't any +20:27 +such marks on the body. Only lividity. Lividity is the marks formed by blood +20:33 +due to gravity at the dripping points. Jiang Fei was lying on his side when he died. +20:38 +So, the lividity should only have formed on the side. But look here. +20:45 +There are bright red marks on Jiang Fei's chest. Also, when Jiang Fei died, +20:51 +his clothes were all wrinkled. His clothes look like they got wet and then dried off... +20:58 +His fingers and toes were all wrinkled, a result of prolonged soaking in water +21:04 +and osmosis. Jiang Fei was always a slob, so it's no wonder his clothes were wrinkled. +21:11 +When we found the body, there was water at the bottom of the bathtub. The wrinkles on his skin were probably caused by soaking in the water. +21:17 +Well, going by your logic, his fingers and toes shouldn't have gotten wrinkly since they haven't touched +21:23 +the water at the bottom of the tub. But turns out that's not what happened. +21:35 +So Jiang Fei didn't freeze to death in a freezer, but in the... +21:40 +In the bathtub. +21:49 +The window in Jiang Fei's bathroom has always been open. +22:13 +When the body was found, the ice had already melted, but there were frostbite +22:18 +marks on the body. The bright red mark on his chest is +22:23 +the best proof. This is also caused by the failure of +22:29 +various organs at low temperatures. +22:34 +Judging from the traces at the scene, everything matches what Mr. Qi said. +22:39 +Got it. Han Feng. +22:45 +Are you buying that Jiang Fei's death wasn't an accident but murder now? +23:02 +If Mr. Qi's reasoning holds up, we gotta check this place for any signs of +23:07 +a second person. Search more thoroughly. +24:07 +I wanna learn more from you and become a great forensic doctor like you! +24:30 +Ms. Zhu. Any progress in Jiang Fei's case? +24:37 +You've been cleared of suspicion. So why still look into Jiang Fei? I know you're really concerned about Jiang Fei's case +24:43 +and Li Yiqi's case. I also know you can lead us closer to the truth. +24:49 +But so far, you haven't explained the coincidences of your appearance +24:55 +in these two cases. And this time, +25:00 +why did you go to investigate Jiang Fei alone? +25:06 +I want you to answer my question. And I'm not gonna answer any questions related to this case +25:12 +until I trust you. Ms. Zhu. +25:18 +I'm a forensic doctor. When someone dies, only forensic doctors can tell what they +25:26 +went through before they died. And I believe whoever it is, +25:33 +even drug dealers like Jiang Fei, they all deserve the truth. +25:39 +I saw the possibility of homicide in Jiang Fei's case. So I gotta figure out the truth. +25:48 +But he's quite stubborn. So is Han Feng. +25:54 +So I hope you can get them together and handle cases. +26:03 +So Jiang Fei died a little after 4 am? Yes. +26:08 +If he froze to death, his body temperature was lower than normal. So the time it takes to cool down +26:13 +would be shorter. Mr. Han. +26:19 +Mr. Qi inferred that Jiang Fei froze to death. Let him tell us about it. +26:33 +All we know is that Jiang Fei was frozen to death by the killer, but there aren't any clues +26:39 +to find the killer. The killer made Jiang Fei +26:45 +take cephalosporin when he was drunk, causing a disulfiram-like reaction. +26:50 +Then, when he was unconscious, the killer froze his body with ice, which led to the failure of all his +26:56 +internal organs, especially his heart, and he died. It shows that the killer has some knowledge human physiology. +27:02 +Mr. Gao, after the first autopsy and test, what was in his stomach as food residue? +27:09 +Wine and sausage, no cephalosporin. But the cephalosporin on his table was already opened, +27:15 +and the pharmacological test detected it. The sausage wasn't digested, which means the last thing +27:22 +the victim ate was the sausage. +27:33 +Have you found a knife there? No. There are cuts on the sausage +27:39 +but no knife around. Could someone have taken it? Jiang Fei's body didn't have +27:45 +a scratch on it. The knife couldn't be the murder weapon. So why'd the killer take it away? +27:52 +Did you guys do luminol at the scene? +28:02 +There are no cuts on the body, but the killer had to take the knife from the scene. +28:07 +That means... The knife wasn't used on the victim. But on the killer. +28:48 +If this isn't Jiang Fei's blood, then it gotta be the killer's. +29:01 +Why didn't you ask Mr. Qi to do the bloodstain comparison? +29:06 +The results are out. No records matching in the database. Thank you. +29:24 +So here's the timeline of these cases. On the evening of the 7th, Qiu Lanzi joined us investigating +29:29 +the 788 Bar assault case. Then she teamed up with Mr. Gao and Mr. Qi +29:35 +for the Li Yiqi's blood sample analysis until the next day. We found Jiang Fei's body at noon the next day, +29:42 +and Qiu Lanzi showed up later. That night, she, Mr. Qi and Mr. Gao dissected Jiang Fei's body. +29:49 +We found the remains of stomach meds in Qiu Lanzi's stomach. Based on the dissolution rate of the meds +29:55 +and the timeline, Qiu Lanzi should've taken the stomach meds between the time +30:00 +after the dissection of Jiang Fei's body and her death. The first time Qiu Lanzi left the station +30:06 +and met me was around 9 pm. Two hours later, I got a call from Qiu Lanzi. +30:12 +She said she'd found a lead on Jiang Fei's body. Ten minutes later, when Mr. Han and I got to the forensic office, +30:19 +we found her body. The stomach medicine was found among her belongings. +30:24 +She usually kept her stuff in the locker in the changing room. Got anything from the surveillance over there? +30:29 +No cameras on the floor. There are just people going to and from work there. And Mr. Bai means we shouldn't +30:35 +expand the investigation for now. He wants us to narrow down the suspects first. +30:46 +So the most likely time for Qiu Lanzi to take the pills is between the time +30:51 +she left the station and came back. We just don't know where she went and who she met. +31:04 +What about Jiang Fei? Don't forget Qiu Lanzi said she had info about +31:10 +Jiang Fei's cause of death before she died. Jiang Fei went home after getting drunk. +31:16 +Where did he drink and who did he drink with? Have you found out? He didn't use mobile payment or cards. He always used cash, +31:22 +so it's hard to find his consumption records. People like him are always afraid of leaving any clues. +31:31 +Wan, let's go to the bar to check Jiang Fei's movements before he drank. +31:36 +Xi, go and find out who Qiu Lanzi met after she left the station. Let's split up. +31:42 +Okay. Do as Mr. Han says. +32:04 +It's here, Mr. Han. +32:10 +No, Mr. Han... +32:46 +You're in charge here? This is legit business. Legit business? Then why so serious, +32:52 +needing a guide to find here? Oh, come on! This is a gimmick. More people will wanna come in +32:58 +if they need someone to bring them in. That's smart. Since it's so complicated to get here, +33:04 +you should know who came here the day before yesterday, right? Sir. How the heck can I remember +33:10 +all these guests every day? Take us to the security room. Sir. You need a warrant to do so. +33:17 +A warrant, huh? I'm gonna call my buddies from Public Security Brigade and let them check it out. +33:28 +Sir. You can check whatever you want. +33:35 +We checked Jiang Fei's social circles. Super complicated. He's lived in cities all over the country. A drug dealer like him's gonna +33:41 +have a lot of enemies. If we just look at the motives for murder, there are a bunch of suspects. +33:46 +Here's his hidden ledger we found. There are up to 40 drug addicts listed in it, not to mention those +33:53 +who bought imitation guns, plasma, and illegal drugs. Ms. Zhu. This is Qiu Lanzi's phone. +33:59 +Got anything? I checked Qiu Lanzi's call records. After she left at 9 o'clock, +34:05 +she made four consecutive calls within five minutes, and they were all to the same person. Who? +34:11 +It's a chemical factory's lab. But it was off-work time then, and she called the switchboard, +34:16 +so we still can't find out who she contacted. We gotta find out what relationship this factory has with Qiu Lanzi. +34:22 +Okay. Ms. Zhu. Have you checked Qiu Lanzi's phone? +34:28 +Xi just gave it to me. I watched the videos of Qiu Lanzi before and after she left here. She never stopped checking her phone. +34:36 +I remembered that Mr. Han told me when he saw Qiu Lanzi that day, she was also anxiously checking her phone. +34:43 +There must be some clues on her phone. She just didn't have time to tell us then. +34:54 +Stop. Who's the girl drinking with Jiang Fei? +35:01 +Jiang Fei had introduced her to us. Zhang Lu, I remember. She's into Lolita fashion, close to Jiang Fei. +35:08 +She took photos of Jiang Fei's body? But phones are forbidden in the dissection room... +35:14 +Maybe she had some reason. Check out these last three photos. +35:20 +The first two are of the tattoo on Jiang Fei's arm, one taken without a black light, +35:26 +and the other with a black light. And the last one is of the skin on his wrist. +35:32 +Also, the first two were taken at the same time. But there's a gap of over 20 minutes before the last one. +35:38 +Why did she wait over 20 minutes to take a photo of the skin on the wrist +35:44 +without a black light? What did she find out? +35:51 +I saw some illegal stuff in the bar near Ruixi Building. I just saw it when working. +35:57 +It's fine. You're welcome. Treat me to dinner then. +36:05 +Wan. Thank you. It's nothing. +36:11 +Ms. Zhu asked me to investigate with you. No need to say that. +36:24 +I saw Qiu Lanzi taking those photos, but I just glanced and left. +36:30 +I was in the next room with Ms. Zhao taking samples for toxicology testing. If you also left, +36:37 +then Lanzi was the only one left in the autopsy room. But when she was taking the photos, +36:45 +she asked me what this was. What is this? It should be an old injury +36:51 +or a mark left after having a tattoo removed. No. It seems to be a fluorescent tattoo. +37:10 +There are two photos of the tattoo on the left forearm, one in natural color and the other under a black light. +37:17 +If we follow the logic of the previous two photos, there should be another black-light photo. +37:28 +There are lots of group photos of Jiang Fei with different girls on his phone, and one of them is Zhang Lu, the girl we've been looking for. +37:35 +Zhang Lu, 24 years old, living in Xinhua Road, He City, an intern researcher at an inorganic chemistry institute, +37:40 +majored in chemistry. She knows Qiu Lanzi. They were high school classmates, so they rented an room +37:46 +and were roommates shortly. In the call records we retrieved, the last call Qiu Lanzi made +37:52 +was to Zhang Lu's workplace. +38:08 +You said you saw Zhang Lu and Qiu Lanzi arguing that day, right? Yeah. +38:15 +I did see them arguing. But I didn't catch what they were arguing about. +38:25 +When I left, I saw that girl wasn't feeling well and took some medicine. +38:32 +Are you sure Qiu Lanzi took medicine at that time? I'm sure. +38:46 +Where's Zhang Lu? Mr. Han. We've been searching for her with your info. +39:00 +Excuse me. Your ID card and driving license please. Please open your trunk. +39:12 +You're Zhang Lu, right? Zhang Lu. Please cooperate with us. +39:34 +Zhang Lu, 24 years old. A researcher of the chemistry institute in He City. Were you at the basement bar +39:41 +in Yunjin Building with Jiang Fei on the evening of August 7th? Yeah. +39:47 +Then did you go home with him? No. I just had a few drinks and went back to my own place. +39:53 +Is there anyone who can prove it? Prove it? Why? I live alone. +39:59 +How can there be a witness? So no one can prove you stayed at your own place that night. +40:09 +What was Jiang Fei's state when you saw him for the last time? He... +40:17 +He seemed to catch cold. You're out drinking with a cold? +40:26 +Do you even know that mixing antibiotics with alcohol could kill you? +40:32 +But I just really wanted to have a drink with you. +40:41 +How'd you hurt your finger? Cut it during an experiment. +40:46 +What did Qiu Lanzi say when she came to the lab? What'd she tell you guys? +40:52 +Isn't she interning here? Call her over! I'll confront her! Qiu Lanzi's dead. +40:59 +Did you kill her? Dead... How... How come... +41:12 +Zhang Lu, now we suspect you're the prime suspect in the murder cases of Qiu Lanzi and Jiang Fei. Got anything to say? +41:20 +If Zhang Lu's blood sample matches the one we took from Jiang Fei's place, she's most likely +41:26 +the killer. I didn't! I never killed anyone! +41:31 +I didn't... I really didn't! Then just answer our questions! What did she say to you? +41:37 +She... She told me Jiang Fei was dead, +41:44 +and she saw my name on the body... +41:59 +How is it? Wait a moment. +42:17 +Ms. Zhu. The result is out. +42:23 +Mr. Han. It matches. +42:30 +Su. Arrest her. Xi, untie her. It's her. +42:36 +No... Not me! I didn't kill them! I didn't! +42:42 +It's not me! It's really not me! I never killed anyone! It's not me! I didn't! +42:47 +Don't arrest me! Please! It's not me! You got the wrong person! It's not me! Not me! +42:52 +Really not! I didn't kill them! You got the wrong person! It's not me! Not me! +43:06 +We got the wrong person. It's not her. +43:33 +Raw Diamond case is over! You just can't deal with reality! You never figured out Fei's death! +43:39 +Li Yiqi. Jiang Fei. They're the clue from the case! Hey! Stop! +43:45 +There's an opening here. The kidnapped girl was probably taken inside. +43:50 +The killer set this up to throw us off about the cause of death. He knows way too much about +43:56 +forensic, autopsies, even our police procedures. Wait, are you saying... The killer is one of us? diff --git a/package.json b/package.json index 528f702e..7f96f166 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,11 @@ "main": "index.js", "license": "MIT", "devDependencies": { - "vitepress": "2.0.0-alpha.15" + "@types/node": "^20.19.30", + "rollup-plugin-polyfill-node": "^0.13.0", + "vite": "^7.3.1", + "vitepress": "2.0.0-alpha.15", + "vue": "^3.5.27" }, "scripts": { "dev": "vitepress dev docs", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28c873bb..9babbfe4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,21 @@ importers: .: devDependencies: + '@types/node': + specifier: ^20.19.30 + version: 20.19.30 + rollup-plugin-polyfill-node: + specifier: ^0.13.0 + version: 0.13.0(rollup@4.55.2) + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@20.19.30) vitepress: specifier: 2.0.0-alpha.15 - version: 2.0.0-alpha.15(@algolia/client-search@5.46.3)(postcss@8.5.6)(react@19.2.3)(search-insights@2.17.3) + version: 2.0.0-alpha.15(@algolia/client-search@5.46.3)(@types/node@20.19.30)(postcss@8.5.6)(react@19.2.3)(search-insights@2.17.3) + vue: + specifier: ^3.5.27 + version: 3.5.27 packages: @@ -336,6 +348,24 @@ packages: '@rolldown/pluginutils@1.0.0-beta.53': resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.55.2': resolution: {integrity: sha512-21J6xzayjy3O6NdnlO6aXi/urvSRjm6nCI6+nF6ra2YofKruGixN9kfT+dt55HVNwfDmpDHJcaS3JuP/boNnlA==} cpu: [arm] @@ -506,6 +536,9 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/node@20.19.30': + resolution: {integrity: sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -792,6 +825,11 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rollup-plugin-polyfill-node@0.13.0: + resolution: {integrity: sha512-FYEvpCaD5jGtyBuBFcQImEGmTxDTPbiHjJdrYIp+mFIwgXiXabxvKUK7ZT9P31ozu2Tqm9llYQMRWsfvTMTAOw==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + rollup@4.55.2: resolution: {integrity: sha512-PggGy4dhwx5qaW+CKBilA/98Ql9keyfnb7lh4SR6shQ91QQQi1ORJ1v4UinkdP2i87OBs9AQFooQylcrrRfIcg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -840,6 +878,9 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -1207,6 +1248,22 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.53': {} + '@rollup/plugin-inject@5.0.5(rollup@4.55.2)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.55.2) + estree-walker: 2.0.2 + magic-string: 0.30.21 + optionalDependencies: + rollup: 4.55.2 + + '@rollup/pluginutils@5.3.0(rollup@4.55.2)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.55.2 + '@rollup/rollup-android-arm-eabi@4.55.2': optional: true @@ -1341,6 +1398,10 @@ snapshots: '@types/mdurl@2.0.0': {} + '@types/node@20.19.30': + dependencies: + undici-types: 6.21.0 + '@types/unist@3.0.3': {} '@types/web-bluetooth@0.0.21': {} @@ -1349,10 +1410,10 @@ snapshots: '@vercel/oidc@3.1.0': {} - '@vitejs/plugin-vue@6.0.3(vite@7.3.1)(vue@3.5.27)': + '@vitejs/plugin-vue@6.0.3(vite@7.3.1(@types/node@20.19.30))(vue@3.5.27)': dependencies: '@rolldown/pluginutils': 1.0.0-beta.53 - vite: 7.3.1 + vite: 7.3.1(@types/node@20.19.30) vue: 3.5.27 '@vue/compiler-core@3.5.27': @@ -1648,6 +1709,11 @@ snapshots: rfdc@1.4.1: {} + rollup-plugin-polyfill-node@0.13.0(rollup@4.55.2): + dependencies: + '@rollup/plugin-inject': 5.0.5(rollup@4.55.2) + rollup: 4.55.2 + rollup@4.55.2: dependencies: '@types/estree': 1.0.8 @@ -1724,6 +1790,8 @@ snapshots: trim-lines@3.0.1: {} + undici-types@6.21.0: {} + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -1761,7 +1829,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@7.3.1: + vite@7.3.1(@types/node@20.19.30): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -1770,9 +1838,10 @@ snapshots: rollup: 4.55.2 tinyglobby: 0.2.15 optionalDependencies: + '@types/node': 20.19.30 fsevents: 2.3.3 - vitepress@2.0.0-alpha.15(@algolia/client-search@5.46.3)(postcss@8.5.6)(react@19.2.3)(search-insights@2.17.3): + vitepress@2.0.0-alpha.15(@algolia/client-search@5.46.3)(@types/node@20.19.30)(postcss@8.5.6)(react@19.2.3)(search-insights@2.17.3): dependencies: '@docsearch/css': 4.4.0 '@docsearch/js': 4.4.0(@algolia/client-search@5.46.3)(react@19.2.3)(search-insights@2.17.3) @@ -1781,7 +1850,7 @@ snapshots: '@shikijs/transformers': 3.21.0 '@shikijs/types': 3.21.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 6.0.3(vite@7.3.1)(vue@3.5.27) + '@vitejs/plugin-vue': 6.0.3(vite@7.3.1(@types/node@20.19.30))(vue@3.5.27) '@vue/devtools-api': 8.0.5 '@vue/shared': 3.5.27 '@vueuse/core': 14.1.0(vue@3.5.27) @@ -1790,7 +1859,7 @@ snapshots: mark.js: 8.11.1 minisearch: 7.2.0 shiki: 3.21.0 - vite: 7.3.1 + vite: 7.3.1(@types/node@20.19.30) vue: 3.5.27 optionalDependencies: postcss: 8.5.6