spinny:~/writing $ less webassembly-wasm-complete-guide.md
12WebAssembly (WASM) की शुरुआत ब्राउज़र में C++ चलाने के एक तरीके के रूप में हुई थी। 2026 में, यह हर जगह चलता है - ब्राउज़र, सर्वर, एज नेटवर्क, एम्बेडेड डिवाइस - और वेब पर सबसे अधिक मांग वाले कुछ एप्लिकेशन को शक्ति प्रदान करता है। Figma का रेंडरिंग इंजन, वेब पर Adobe Photoshop, Google Meet की वीडियो प्रोसेसिंग, और Cloudflare का एज कंप्यूट प्लेटफॉर्म सभी WebAssembly पर चलते हैं।34Chrome Platform Status के अनुसार 2026 की शुरुआत में WASM सभी Chrome पेज लोड का लगभग 5.5% है, जो पिछले वर्ष 4.5% से बढ़ा है। WASM 3.0 के W3C मानक बनने और WASI के 1.0 की ओर परिपक्व होने के साथ, पारिस्थितिकी तंत्र एक निर्णायक मोड़ पर पहुंच गया है।56यह गाइड WebAssembly के साथ निर्माण शुरू करने के लिए आपको जो कुछ भी जानने की आवश्यकता है उसे कवर करती है।78## WebAssembly क्या है?910WebAssembly एक बाइनरी इंस्ट्रक्शन फॉर्मेट है जिसे एक compilation target के रूप में डिज़ाइन किया गया है। आप एक उच्च-स्तरीय भाषा (Rust, C, C++, Go, Kotlin) में कोड लिखते हैं, इसे `.wasm` में कंपाइल करते हैं, और इसे किसी भी ऐसे वातावरण में चलाते हैं जिसमें WASM रनटाइम है - ब्राउज़र, Node.js, Cloudflare Workers, Wasmtime, या Wasmer।1112```mermaid13graph LR14 Rust[Rust / C / C++] --> Compiler[Compiler]15 Compiler --> WASM[.wasm Binary]16 WASM --> Browser[Browser V8/SpiderMonkey]17 WASM --> Server[Server Wasmtime]18 WASM --> Edge[Edge Cloudflare Workers]19 WASM --> Embedded[Embedded WAMR]20```2122### यह कैसे काम करता है2324WASM एक **stack-based virtual machine** है। फंक्शन एक operand stack पर वैल्यू push और pop करते हैं। होस्ट रनटाइम (Chrome में V8, Firefox में SpiderMonkey) WASM बाइटकोड को नेटिव मशीन कोड में JIT-कंपाइल करता है, यही कारण है कि प्रदर्शन लगभग नेटिव स्तर का होता है।2526मुख्य विशेषताएं:2728- **Sandboxed execution**: WASM मॉड्यूल केवल उन संसाधनों तक पहुंच सकते हैं जो होस्ट स्पष्ट रूप से प्रदान करता है। बिना अनुमति के कोई फाइलसिस्टम एक्सेस नहीं, कोई नेटवर्क नहीं, कोई OS एक्सेस नहीं। यह नेटिव कोड से मौलिक रूप से अलग है।29- **Linear memory**: WASM और होस्ट के बीच साझा एक एकल सतत `ArrayBuffer`। जटिल डेटा (स्ट्रिंग्स, स्ट्रक्ट्स) मेमोरी में लिखकर और पॉइंटर साझा करके पास किया जाता है।30- **Type-limited**: WASM मूल रूप से केवल चार प्रकारों का समर्थन करता है: `i32`, `i64`, `f32`, `f64`। बाकी सब कुछ (स्ट्रिंग्स, ऐरे, ऑब्जेक्ट्स) को linear memory या Component Model के माध्यम से एन्कोडिंग की आवश्यकता होती है।31- **Portable**: वही `.wasm` बाइनरी WASM रनटाइम वाले किसी भी प्लेटफॉर्म पर बिना पुनः कंपाइलेशन के चलती है।3233### WASM बनाम JavaScript3435WASM JavaScript को प्रतिस्थापित नहीं करता। यह इसका पूरक है।3637| पहलू | JavaScript | WebAssembly |38|--------|-----------|-------------|39| **Parsing** | रनटाइम पर Parse + compile | पूर्व-संकलित बाइनरी, केवल decode |40| **Execution speed** | JIT-अनुकूलित, परिवर्तनशील | लगभग-नेटिव, सुसंगत |41| **Startup** | छोटी स्क्रिप्ट के लिए तेज़ | तेज़ decode, अनुमानित |42| **DOM access** | प्रत्यक्ष | अप्रत्यक्ष (JS ग्लू के माध्यम से) |43| **Best for** | UI, DOM manipulation, event handling | CPU-गहन गणना |44| **Garbage collection** | बिल्ट-इन | WasmGC (नया), या मैनुअल |4546UI और DOM कार्य के लिए JavaScript का उपयोग करें। भारी गणना के लिए WASM का उपयोग करें: इमेज प्रोसेसिंग, वीडियो एन्कोडिंग, फिजिक्स सिमुलेशन, क्रिप्टोग्राफी, डेटा पार्सिंग।4748## WASM 3.0: नया क्या है4950WebAssembly 3.0 सितंबर 2025 में W3C मानक बना, जिसने नौ ऐसी सुविधाओं को मानकीकृत किया जो वर्षों से विकास में थीं।5152| सुविधा | यह क्या सक्षम करती है |53|---------|----------------|54| **WasmGC** | WASM में नेटिव garbage collection। मैनेज्ड भाषाएं (Java, Kotlin, Dart) अपना खुद का GC रनटाइम शिप किए बिना WASM में कंपाइल हो सकती हैं। Chrome 119+, Firefox 120+, Safari 18.2+ में समर्थित। |55| **Exception Handling** | WASM में नेटिव `try`/`catch`। पहले, exceptions के लिए JavaScript तक महंगे roundtrips की आवश्यकता होती थी। |56| **Tail Calls** | स्टैक ओवरफ्लो के बिना कुशल recursion को सक्षम करता है। फंक्शनल भाषाओं के लिए महत्वपूर्ण। |57| **Relaxed SIMD** | समानांतर डेटा प्रोसेसिंग के लिए 128-बिट वेक्टर इंस्ट्रक्शन। हार्डवेयर-विशिष्ट अनुकूलन को सक्षम करता है। |58| **Memory64** | 4GB linear memory सीमा को तोड़ता है। बड़े पैमाने के डेटा प्रोसेसिंग के लिए आवश्यक। |59| **Multi-memory** | एक मॉड्यूल में कई स्वतंत्र मेमोरी क्षेत्र। |6061सबसे प्रभावशाली **WasmGC** है। इससे पहले, Java या Kotlin को WASM में कंपाइल करने का मतलब था बाइनरी के हिस्से के रूप में एक पूरे garbage collector को शिप करना, जो फाइल साइज़ को बढ़ा देता था। अब ब्राउज़र का अपना GC WASM मॉड्यूल के लिए मेमोरी प्रबंधन संभालता है, ठीक वैसे ही जैसे यह JavaScript के लिए करता है।6263## WASI: ब्राउज़र से परे WebAssembly6465ब्राउज़र में WASM शक्तिशाली है, लेकिन **WASI (WebAssembly System Interface)** वह है जो WASM को एक सार्वभौमिक रनटाइम बनाता है। WASI सिस्टम संसाधनों - फाइलें, नेटवर्किंग, घड़ियां, रैंडम नंबर - के लिए मानकीकृत इंटरफेस प्रदान करता है, जो WASM मॉड्यूल को ब्राउज़र के बाहर चलने की अनुमति देता है।6667```mermaid68graph TD69 subgraph "Browser"70 B[WASM Module] --> Web[Web APIs\nDOM, Fetch, Canvas]71 end7273 subgraph "Server / Edge / Embedded"74 S[WASM Module] --> WASI[WASI Interfaces]75 WASI --> FS[wasi:filesystem]76 WASI --> Net[wasi:sockets]77 WASI --> HTTP[wasi:http]78 WASI --> Clock[wasi:clocks]79 WASI --> Rand[wasi:random]80 end81```8283WASI Preview 2 (वर्तमान स्थिर रिलीज़) इन इंटरफेस को परिभाषित करता है:8485- `wasi:filesystem` - capability handles के माध्यम से फाइल ऑपरेशन (पारंपरिक file descriptors नहीं)86- `wasi:sockets` - TCP/UDP नेटवर्किंग87- `wasi:http` - HTTP request/response हैंडलिंग88- `wasi:clocks` - wall clock, monotonic clock89- `wasi:random` - क्रिप्टोग्राफिक रैंडमनेस90- `wasi:cli` - कमांड-लाइन आर्ग्यूमेंट्स, एनवायरनमेंट वेरिएबल्स, stdio9192मुख्य सिद्धांत **capability-based security** है: एक WASM मॉड्यूल फाइलसिस्टम तक तब तक नहीं पहुंच सकता जब तक कि होस्ट स्पष्ट रूप से किसी विशिष्ट डायरेक्टरी के लिए हैंडल प्रदान नहीं करता। यह WASI को नेटिव executables चलाने की तुलना में मौलिक रूप से अधिक सुरक्षित बनाता है।9394### WASI 1.0 का मार्ग9596WASI 0.3.0 (async/concurrency primitives जोड़ना) 2026 में अपेक्षित है, जिसके बाद WASI 1.0 आएगा। मुख्य अतिरिक्त सुविधा language-integrated async है जिसमें zero-copy streaming I/O है।9798## Component Model99100कोर WASM मॉड्यूल केवल संख्याओं का आदान-प्रदान कर सकते हैं। **Component Model** WASM के ऊपर एक समृद्ध type system और composability परत जोड़कर इस सीमा को हल करता है।101102### WIT (WebAssembly Interface Types)103104WIT एक Interface Definition Language है जो components को अपने imports और exports को समृद्ध प्रकारों के साथ घोषित करने देता है - strings, records, lists, variants, enums - न कि केवल `i32` और `f64`।105106```wit107// calculator.wit108package myorg:calculator@1.0.0;109110interface operations {111 record calculation {112 expression: string,113 result: f64,114 timestamp: u64,115 }116117 add: func(a: f64, b: f64) -> f64;118 multiply: func(a: f64, b: f64) -> f64;119 history: func() -> list<calculation>;120}121122world calculator {123 export operations;124}125```126127`wit-bindgen` जैसे टूलचेन WIT फाइलों से भाषा-विशिष्ट बाइंडिंग्स जनरेट करते हैं। एक Rust component और एक Python component WIT अनुबंधों के माध्यम से strings, records, और lists का आदान-प्रदान कर सकते हैं बिना किसी पक्ष को दूसरे की implementation भाषा जाने।128129## Rust के साथ अपना पहला WASM मॉड्यूल बनाना130131Rust में सबसे परिपक्व WASM टूलिंग है। आइए एक व्यावहारिक उदाहरण बनाएं: एक इमेज प्रोसेसिंग मॉड्यूल जो ब्राउज़र में चलता है।132133### सेटअप134135```bash136# Install the WASM target for Rust137rustup target add wasm32-unknown-unknown138139# Install wasm-pack (builds Rust to WASM + generates JS bindings)140cargo install wasm-pack141142# Create a new library project143cargo new --lib image-processor144cd image-processor145```146147### Cargo.toml कॉन्फ़िगर करें148149```toml150[package]151name = "image-processor"152version = "0.1.0"153edition = "2021"154155[lib]156crate-type = ["cdylib"]157158[dependencies]159wasm-bindgen = "0.2"160```161162### Rust कोड लिखें163164```rust165// src/lib.rs166use wasm_bindgen::prelude::*;167168/// Convert an image buffer to grayscale.169/// Input: RGBA pixel data as a flat u8 array (4 bytes per pixel).170/// Output: Modified in place for zero-copy performance.171#[wasm_bindgen]172pub fn grayscale(pixels: &mut [u8]) {173 for chunk in pixels.chunks_exact_mut(4) {174 let r = chunk[0] as f32;175 let g = chunk[1] as f32;176 let b = chunk[2] as f32;177 // ITU-R BT.709 luminance coefficients178 let gray = (0.2126 * r + 0.7152 * g + 0.0722 * b) as u8;179 chunk[0] = gray;180 chunk[1] = gray;181 chunk[2] = gray;182 // chunk[3] is alpha, leave unchanged183 }184}185186/// Adjust brightness of an image.187/// factor > 1.0 brightens, < 1.0 darkens.188#[wasm_bindgen]189pub fn adjust_brightness(pixels: &mut [u8], factor: f32) {190 for chunk in pixels.chunks_exact_mut(4) {191 chunk[0] = ((chunk[0] as f32 * factor).min(255.0)) as u8;192 chunk[1] = ((chunk[1] as f32 * factor).min(255.0)) as u8;193 chunk[2] = ((chunk[2] as f32 * factor).min(255.0)) as u8;194 }195}196197/// Invert all colors in the image.198#[wasm_bindgen]199pub fn invert(pixels: &mut [u8]) {200 for chunk in pixels.chunks_exact_mut(4) {201 chunk[0] = 255 - chunk[0];202 chunk[1] = 255 - chunk[1];203 chunk[2] = 255 - chunk[2];204 }205}206207/// Calculate the average brightness of an image (0-255).208#[wasm_bindgen]209pub fn average_brightness(pixels: &[u8]) -> f32 {210 let mut total: f64 = 0.0;211 let pixel_count = pixels.len() / 4;212 for chunk in pixels.chunks_exact(4) {213 let luminance = 0.2126 * chunk[0] as f64214 + 0.7152 * chunk[1] as f64215 + 0.0722 * chunk[2] as f64;216 total += luminance;217 }218 (total / pixel_count as f64) as f32219}220```221222### बिल्ड223224```bash225wasm-pack build --target web226```227228यह एक `pkg/` डायरेक्टरी बनाता है जिसमें:229- `image_processor_bg.wasm` - कंपाइल्ड WASM बाइनरी230- `image_processor.js` - TypeScript definitions के साथ JavaScript ग्लू कोड231- `package.json` - npm पर प्रकाशित करने के लिए तैयार232233### JavaScript में उपयोग करें234235```html236<!DOCTYPE html>237<html>238<head><title>WASM Image Processor</title></head>239<body>240 <canvas id="canvas" width="800" height="600"></canvas>241 <button onclick="applyGrayscale()">Grayscale</button>242 <button onclick="applyBrightness()">Brighten</button>243 <button onclick="applyInvert()">Invert</button>244245 <script type="module">246 import init, { grayscale, adjust_brightness, invert } from "./pkg/image_processor.js";247248 let ctx;249 let imageData;250251 async function setup() {252 await init();253 const canvas = document.getElementById("canvas");254 ctx = canvas.getContext("2d");255256 // Load an image onto the canvas257 const img = new Image();258 img.onload = () => {259 ctx.drawImage(img, 0, 0);260 imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);261 };262 img.src = "photo.jpg";263 }264265 window.applyGrayscale = () => {266 grayscale(imageData.data);267 ctx.putImageData(imageData, 0, 0);268 };269270 window.applyBrightness = () => {271 adjust_brightness(imageData.data, 1.3);272 ctx.putImageData(imageData, 0, 0);273 };274275 window.applyInvert = () => {276 invert(imageData.data);277 ctx.putImageData(imageData, 0, 0);278 };279280 setup();281 </script>282</body>283</html>284```285286मुख्य अंतर्दृष्टि: `imageData.data` एक `Uint8ClampedArray` है जो एक `ArrayBuffer` द्वारा समर्थित है। जब WASM को पास किया जाता है, तो यह एक ही मेमोरी साझा करता है - कोई कॉपी नहीं। Rust फंक्शन पिक्सेल को in place संशोधित करता है, और JavaScript पक्ष तुरंत परिवर्तन देखता है।287288## निचला स्तर: मैनुअल WASM Instantiation289290यदि आप `wasm-bindgen` का उपयोग नहीं करना चाहते, तो आप सीधे WASM मॉड्यूल को instantiate कर सकते हैं:291292```javascript293const response = await fetch("calculator.wasm");294const { instance } = await WebAssembly.instantiateStreaming(response, {295 env: {296 // Functions the WASM module can call297 log_result: (value) => console.log("Result:", value),298 },299});300301// Call exported functions302const { add, multiply } = instance.exports;303console.log(add(5, 3)); // 8304console.log(multiply(4, 7)); // 28305```306307यह तब उपयोगी है जब आप न्यूनतम ओवरहेड चाहते हैं और समृद्ध type interop की आवश्यकता नहीं है।308309## प्रदर्शन: WASM बनाम JavaScript310311वास्तविक बेंचमार्क CPU-गहन कार्यों के लिए महत्वपूर्ण स्पीडअप दिखाते हैं:312313| कार्य | JavaScript | WASM | स्पीडअप |314|------|-----------|------|---------|315| 4K इमेज प्रोसेसिंग | 180ms | 8ms (SIMD के साथ) | 22x |316| इमेज resize (4K) | 250ms | 45ms | 5.5x |317| फिजिक्स सिमुलेशन (10K entities) | फ्रेम ड्रॉप | स्मूथ 60fps | ~10x |318| JSON पार्सिंग (बड़ा payload) | 12ms | 3ms | 4x |319| क्रिप्टोग्राफिक हैशिंग | 45ms | 6ms | 7.5x |320321WASM नेटिव कोड की लगभग 95% गति पर चलता है। सबसे बड़े लाभ इनसे आते हैं:322- अनुमानित प्रदर्शन (कोई JIT warmup नहीं, कोई GC pauses नहीं)323- समानांतर डेटा प्रोसेसिंग के लिए SIMD instructions324- garbage collector हस्तक्षेप के बिना direct memory access325326जहां WASM तेज़ नहीं है: DOM manipulation, छोटी गणनाएं, I/O-bound कार्य। इनके लिए JavaScript पहले से अनुकूलित है।327328## प्रोडक्शन उपयोग के मामले329330### Figma: रियल-टाइम वेक्टर रेंडरिंग331332Figma का कोर रेंडरिंग इंजन C++ है जो WASM में कंपाइल किया गया है। हर shape, gradient, और effect WASM में गणना किया जाता है और एक Canvas element पर ड्रॉ किया जाता है। यह Figma को ब्राउज़र में हजारों layers वाले जटिल डिज़ाइनों को 60fps पर संभालने की अनुमति देता है - एक ऐसा प्रदर्शन जो शुद्ध JavaScript में असंभव होगा।333334### वेब पर Adobe Photoshop335336Adobe ने Rust का उपयोग करके प्रमुख Photoshop फिल्टर और टूल्स को WASM में पोर्ट किया। उनके बेंचमार्क WASM SIMD के साथ 22ms में 4K इमेज प्रोसेसिंग दिखाते हैं बनाम JavaScript में 180ms - 8x सुधार जो रियल-टाइम फिल्टर प्रीव्यू को संभव बनाता है।337338### Cloudflare Workers339340Cloudflare 330+ एज लोकेशनों पर V8 isolates में WASM मॉड्यूल चलाता है। Cold starts 1-5ms हैं (container-based serverless के लिए 100-500ms की तुलना में)। फरवरी 2026 में, उन्होंने WASM का उपयोग करके अपने एज नेटवर्क पर Llama-3-8b inference को तैनात किया।341342### Google Meet343344Google Meet में बैकग्राउंड ब्लर और वर्चुअल बैकग्राउंड रियल-टाइम वीडियो प्रोसेसिंग के लिए SIMD के साथ WASM का उपयोग करते हैं। WASM मॉड्यूल प्रत्येक वीडियो फ्रेम को इतनी तेज़ी से प्रोसेस करता है कि 30fps पर स्मूथ वीडियो बनाए रखा जा सके।345346## ब्राउज़र समर्थन (2026)347348| सुविधा | Chrome | Firefox | Safari | Edge |349|---------|--------|---------|--------|------|350| Core WASM | पूर्ण | पूर्ण | पूर्ण | पूर्ण |351| Threads | हां | हां | हां | हां |352| SIMD (128-bit) | हां | हां | हां | हां |353| WasmGC | 119+ | 120+ | 18.2+ | हां |354| Exception Handling | हां | हां | हां | हां |355| Memory64 | हां | हां | आंशिक | हां |356357सभी प्रमुख ब्राउज़र WASM को पूरी तरह से सपोर्ट करते हैं। नई सुविधाएं (WasmGC, Exception Handling) व्यापक उपलब्धता तक पहुंच चुकी हैं।358359## टूलिंग संदर्भ360361| टूल | उद्देश्य | इंस्टॉल |362|------|---------|---------|363| **wasm-pack** | Rust को WASM में बिल्ड करें, npm पैकेज जनरेट करें | `cargo install wasm-pack` |364| **wasm-bindgen** | Rust/JS interop bindings (wasm-pack द्वारा उपयोग) | Cargo.toml में Dependency |365| **wasm-opt** | बाइनरी साइज़ अनुकूलन (50%+ कमी) | Binaryen का हिस्सा: `brew install binaryen` |366| **wit-bindgen** | WIT फाइलों से bindings जनरेट करें | `cargo install wit-bindgen-cli` |367| **Wasmtime** | सर्वर-साइड WASM रनटाइम (संदर्भ WASI implementation) | `brew install wasmtime` |368| **Wasmer** | WASI समर्थन के साथ वैकल्पिक WASM रनटाइम | `curl https://get.wasmer.io -sSfL \| sh` |369| **wasm-feature-detect** | रनटाइम ब्राउज़र फीचर डिटेक्शन | `npm install wasm-feature-detect` |370371### बाइनरी साइज़ का अनुकूलन372373WASM बाइनरी बड़ी हो सकती हैं। इन्हें छोटा करने का तरीका:374375```toml376# Cargo.toml377[profile.release]378opt-level = "z" # Optimize for size379lto = true # Link-time optimization380codegen-units = 1 # Better optimization, slower compile381strip = true # Strip debug symbols382```383384```bash385# Build in release mode386wasm-pack build --release --target web387388# Further optimize with wasm-opt389wasm-opt -Oz pkg/image_processor_bg.wasm -o pkg/image_processor_bg.wasm390```391392एक सामान्य Rust WASM मॉड्यूल इन अनुकूलन के साथ 500KB से 50KB से कम हो जाता है।393394## शुरू करने का रोडमैप395396```mermaid397flowchart TD398 A[Week 1: Basics] --> B[Week 2: Real Project]399 B --> C[Week 3: WASI and Server-side]400 C --> D[Month 2+: Production]401402 A --> A1[Install Rust + wasm-pack]403 A --> A2[Build hello-world WASM module]404 A --> A3[Call WASM functions from JavaScript]405406 B --> B1[Build image processor or game physics]407 B --> B2[Use wasm-bindgen for rich types]408 B --> B3[Benchmark against pure JS]409410 C --> C1[Run WASM with Wasmtime]411 C --> C2[Explore WASI interfaces]412 C --> C3[Try Component Model with WIT]413414 D --> D1[Optimize binary size]415 D --> D2[Use SIMD for parallelism]416 D --> D3[Deploy to Cloudflare Workers or browser]417```418419## निष्कर्ष420421WebAssembly अब प्रयोगात्मक नहीं है। यह एक प्रोडक्शन तकनीक है जिसका उपयोग वेब पर सबसे अधिक मांग वाले कुछ एप्लिकेशन करते हैं। लगभग-नेटिव प्रदर्शन, sandboxed सुरक्षा, और सार्वभौमिक पोर्टेबिलिटी - कोई अन्य compilation target आपको ये तीनों नहीं देता।422423आपको WASM में अपना पूरा एप्लिकेशन फिर से लिखने की आवश्यकता नहीं है। एक एकल CPU-गहन फंक्शन से शुरू करें - एक इमेज फिल्टर, एक डेटा पार्सर, एक फिजिक्स कैलकुलेशन - इसे WASM में कंपाइल करें, और JavaScript से कॉल करें। अंतर मापें। फिर तय करें कि WASM और कहां मदद कर सकता है।424425टूलिंग परिपक्व है, ब्राउज़र समर्थन सार्वभौमिक है, और पारिस्थितिकी तंत्र बढ़ रहा है। यदि आप Rust लिखते हैं, तो आप पहले से ही ब्राउज़र से एक कमांड दूर हैं।426427> **शुरुआत करने की चेकलिस्ट:**428>429> - [x] Rust और wasm-pack इंस्टॉल किए गए430> - [x] पहला WASM मॉड्यूल बनाया और ब्राउज़र में चल रहा है431> - [x] JavaScript interop काम कर रहा है (JS से WASM कॉल करना)432> - [x] साइज़ अनुकूलन के साथ release build लागू433> - [x] शुद्ध JavaScript समकक्ष के विरुद्ध प्रदर्शन बेंचमार्क किया434> - [x] सर्वर-साइड उपयोग के मामलों के लिए Wasmtime के साथ WASI खोजा435
:वेब डेवलपर्स के लिए WebAssembly: शून्य से प्रोडक्शन तकlines 1-435 (END) — press q to close