### Fresh Installation Script Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/RELEASE_NOTES.md Executes the Ragnar installation script for a fresh setup on capable hardware. Advanced tools are installed automatically. ```bash wget https://raw.githubusercontent.com/PierreGode/Ragnar/main/install_ragnar.sh sudo chmod +x install_ragnar.sh && sudo ./install_ragnar.sh # Advanced tools automatically installed on capable hardware # No user interaction required ``` -------------------------------- ### Install Git and RaspyJack Source: https://github.com/7h30th3r0n3/raspyjack/wiki/Installation Installs Git, switches to root user, clones the RaspyJack repository, renames it, makes the install script executable, and runs the installation. A reboot is required afterward. ```bash sudo apt install git sudo su cd /root git clone https://github.com/7h30th3r0n3/raspyjack.git mv raspyjack Raspyjack cd Raspyjack chmod +x install_raspyjack.sh sudo ./install_raspyjack.sh sudo reboot ``` -------------------------------- ### GET /api/airsnitch/install-log Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/docs/airsnitch.md Retrieves the live log output of the AirSnitch installation process. ```APIDOC ## GET /api/airsnitch/install-log ### Description Retrieves the live log output of the AirSnitch installation process. ### Method GET ### Endpoint /api/airsnitch/install-log ### Parameters (No parameters required) ### Response #### Success Response (200) (Response details not explicitly provided in source, but typically returns the installation log stream) #### Response Example (No specific example provided in source) ``` -------------------------------- ### Quick Install Ragnar Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/INSTALL.md Downloads and executes the automatic installation script for Ragnar. This is the fastest method and requires a reboot upon completion. ```bash # Download and run the installer wget https://raw.githubusercontent.com/PierreGode/Ragnar/main/install_ragnar.sh sudo chmod +x install_ragnar.sh && sudo ./install_ragnar.sh # Choose the choice 1 for automatic installation. It may take a while as a lot of packages and modules will be installed. You must reboot at the end. ``` -------------------------------- ### Install Pwnagotchi Helper Script Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/README.md Installs Pwnagotchi alongside Ragnar. The script clones the Pwnagotchi repository, installs dependencies, configures settings, and sets up the service. ```bash cd /home/ragnar/Ragnar sudo ./scripts/install_pwnagotchi.sh ``` -------------------------------- ### USB Gadget Script Setup Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/INSTALL.md This script handles the initial setup of the USB gadget, including creating symlinks, ensuring the device is not busy, and configuring the usb0 interface. ```bash # Check for existing symlink and remove if necessary if [ -L configs/c.1/ecm.usb0 ]; then rm configs/c.1/ecm.usb0 fi ln -s functions/ecm.usb0 configs/c.1/ # Ensure the device is not busy before listing available USB device controllers max_retries=10 retry_count=0 while ! ls /sys/class/udc > UDC 2>/dev/null; do if [ $retry_count -ge $max_retries ]; then echo "Error: Device or resource busy after $max_retries attempts." exit 1 fi retry_count=$((retry_count + 1)) sleep 1 done # Check if the usb0 interface is already configured if ! ip addr show usb0 | grep -q "172.20.2.1"; then ifconfig usb0 172.20.2.1 netmask 255.255.255.0 else echo "Interface usb0 already configured." fi ``` -------------------------------- ### POST /api/pwnagotchi/install Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/docs/spec.md Initiates the Pwnagotchi installer script. ```APIDOC ## POST /api/pwnagotchi/install ### Description Initiates the Pwnagotchi installer script. ### Method POST ### Endpoint /api/pwnagotchi/install ### Parameters ### Request Example ### Response #### Success Response (200) - **message** (string) - Confirmation message that the installer has started. #### Response Example { "message": "Pwnagotchi installation script initiated." } ``` -------------------------------- ### Verify Installed Tools Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/docs/RELEASE_NOTES.md After installation, use these commands to check if the required security tools (nuclei, nikto, sqlmap, tcpdump, tshark) are available in the system's PATH. ```bash # Check installed tools which nuclei nikto sqlmap tcpdump tshark ``` -------------------------------- ### GET /api/pwnagotchi/status Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/docs/spec.md Retrieves the current installation and switch state of Pwnagotchi. ```APIDOC ## GET /api/pwnagotchi/status ### Description Retrieves the current installation and switch state of Pwnagotchi. ### Method GET ### Endpoint /api/pwnagotchi/status ### Parameters ### Request Example ### Response #### Success Response (200) - **pwnagotchi_installed** (boolean) - Indicates if Pwnagotchi is installed. - **current_mode** (string) - The current active mode (e.g., 'Ragnar', 'Pwnagotchi'). #### Response Example { "pwnagotchi_installed": true, "current_mode": "Ragnar" } ``` -------------------------------- ### POST /api/airsnitch/install Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/docs/airsnitch.md Initiates the background installation process for AirSnitch. ```APIDOC ## POST /api/airsnitch/install ### Description Initiates the background installation process for AirSnitch. ### Method POST ### Endpoint /api/airsnitch/install ### Parameters (No parameters required) ### Response #### Success Response (200) (Response details not explicitly provided in source, but typically indicates the installation has started) #### Response Example (No specific example provided in source) ``` -------------------------------- ### Dual-Display Configuration Example Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/README.md Example JSON configuration to switch between different LCD screen types in RaspyJack. The 'type' value should match the connected display's chip. ```json "DISPLAY": { "type": "ST7789_240" } ``` -------------------------------- ### Install PiSugar Server Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/INSTALL.md Installs the PiSugar server for battery monitoring and hardware button support. This script is executed with curl and bash. ```bash curl http://cdn.pisugar.com/release/pisugar-power-manager.sh | sudo bash ``` -------------------------------- ### Install Ragnar Script Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/README.md This script installs Ragnar on various hardware. Follow the on-screen prompts for deployment on Raspberry Pi or other hardware. A reboot is required after installation. ```bash wget https://raw.githubusercontent.com/PierreGode/Ragnar/main/install_ragnar.sh sudo chmod +x install_ragnar.sh && sudo ./install_ragnar.sh ``` -------------------------------- ### Nmap Useful Combination Examples Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/loot/DeadDrop/files/Nmap_Cheatsheet.txt Provides examples of combining multiple Nmap options for common reconnaissance tasks. ```bash nmap -sS -sV -O -T4 target ``` ```bash nmap -sS -p- -T4 target ``` ```bash nmap --script vuln target ``` ```bash nmap -sU -sV --top-ports 100 target ``` ```bash nmap -Pn -sS -sV -p 21,22,80,443 target ``` ```bash nmap -sn 192.168.1.0/24 ``` -------------------------------- ### Install Ragnar on WiFi Pineapple Pager (Option A) Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/README.md Installs Ragnar on the WiFi Pineapple Pager using the main installer script. Select option 3 when prompted. ```bash sudo ./install_ragnar.sh # Choose: 3. Install on WiFi Pineapple Pager ``` -------------------------------- ### POST /api/bluetooth/scan/start Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/spec.md Starts Bluetooth discovery scans. ```APIDOC ## POST /api/bluetooth/scan/start ### Description Start discovery scans. ### Method POST ### Endpoint /api/bluetooth/scan/start ``` -------------------------------- ### Process Copilot Resources and Setup Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/DNSSpoof/sites/amazon/login.html Processes loaded Copilot resources, including CSS and JS URLs. It dynamically creates and appends link and script tags to the document's head, and executes setup functions upon resource loading. ```javascript r=function(a){var c=amzn.copilot.jQuery,e=function(){amzn.copilot.setup(c.extend({isContinuedSession:!0},a))};a.CSSUrls&& c.each(a.CSSUrls[0],function(a,c){var b=f.createElement("link");b.type="text/css";b.rel="stylesheet";b.href=c;h.appendChild(b)});a.CSSTag&&s(a.CSSTag);if(a.JSUrls){var d=l("forceSynchronousJS"),b=a.JSUrls[0];c.each(b,function(a,c){a===b.length-1?p(c,d,e):p(c,d)})}a.JSTag&&(t(a.JSTag),P.when("CSCoPilotPresenterAsset").execute(function(){e()}))} ``` -------------------------------- ### GET /api/pwnagotchi/logs Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/docs/spec.md Streams the logs generated by the Pwnagotchi installer and service. ```APIDOC ## GET /api/pwnagotchi/logs ### Description Streams the logs generated by the Pwnagotchi installer and service. ### Method GET ### Endpoint /api/pwnagotchi/logs ### Parameters ### Request Example ### Response #### Success Response (200) - **log_stream** (string) - A stream of log messages. #### Response Example (Log stream output) "2023-10-27 10:00:00 INFO: Pwnagotchi service started." "2023-10-27 10:01:00 DEBUG: Processing handshake." ``` -------------------------------- ### Setup USB Gadget Script Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/docs/INSTALL.md Initializes the USB gadget by checking and removing existing symlinks, then creating a new one. It also ensures the device is not busy before configuring the usb0 interface. ```bash if [ -L configs/c.1/ecm.usb0 ]; then rm configs/c.1/ecm.usb0 fi ln -s functions/ecm.usb0 configs/c.1/ ``` ```bash max_retries=10 retry_count=0 while ! ls /sys/class/udc > UDC 2>/dev/null; do if [ $retry_count -ge $max_retries ]; then echo "Error: Device or resource busy after $max_retries attempts." exit 1 fi retry_count=$((retry_count + 1)) sleep 1 done if ! ip addr show usb0 | grep -q "172.20.2.1"; then ifconfig usb0 172.20.2.1 netmask 255.255.255.0 else echo "Interface usb0 already configured." fi ``` -------------------------------- ### GET /api/airsnitch/status Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/docs/airsnitch.md Retrieves the current installation status of AirSnitch and the results of the latest test run. ```APIDOC ## GET /api/airsnitch/status ### Description Retrieves the current installation status of AirSnitch and the results of the latest test run. ### Method GET ### Endpoint /api/airsnitch/status ### Parameters (No parameters required) ### Response #### Success Response (200) (Response details not explicitly provided in source, but typically includes installation status and latest test results) #### Response Example (No specific example provided in source) ``` -------------------------------- ### Initiate Fingerprint Login Process Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/DNSSpoof/sites/paypal/login.html Starts the fingerprint login process by making a service request to get UAF messages. Handles 'login' or 'lookup' proceed states. ```javascript function h(){ var e=window.PAYPAL&&window.PAYPAL.ulData||{},t=login.utils,n=2,r=3,i=document.querySelector(".fpLogin"),s=document.querySelector(".footer"),o=$("body").data("fpLoginError"),u,a,f,l={evt:"state_name",data:"begin_fp_login",instrument:!0}; e.fingerprintProceed==="login"&&navigator.uaf&&(h(),p(),fingerprint.utils.makeServiceRequest({path:"/challenge/uaf"},g,y))} ``` -------------------------------- ### JavaScript Single Worker Cracking Setup Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/web/pcap-analyzer.html Initializes and starts a single JavaScript worker for password cracking. It sets up message and error handlers, and revokes the object URL after worker creation. ```javascript function startSingleWorkerCrack(payload) { const runId = payload.runId; const blob = new Blob([WORKER_SRC], { type: 'application/javascript' }); const url = URL.createObjectURL(blob); singleWorker = new Worker(url); crackWorkers.push(singleWorker); const lineCount = wordlistText.split('\n').length; addLog(`Starting single worker for ${lineCount} passwords...`, 'info'); singleWorker.postMessage(payload); let startTime = Date.now(); singleWorker.onmessage = e => { if (!crackActive || runId !== crackRunId) return; const d = e.data; if (d.type === 'found') { addLog(`PASSWORD FOUND: ${d.password}`, 'success'); handleCrackResult({ type: 'found', password: d.password, tried: d.tried, total: d.total, elapsed: (Date.now() - startTime) / 1000 }); } else if (d.type === 'progress') { setProgress(d.tried, d.total, startTime); } else if (d.type === 'done') { addLog(`All passwords checked. Password not found.`, 'warn'); handleCrackResult({ type: 'done', tried: d.tried, total: d.total, elapsed: (Date.now() - startTime) / 1000 }); } }; singleWorker.onerror = err => { if (!crackActive || runId !== crackRunId) return; document.getElementById('pbar-text').textContent = `Worker error: ${err.message}`; addLog(`Worker error: ${err.message}`, 'error'); crackFinish(); }; URL.revokeObjectURL(url); } ``` -------------------------------- ### Nmap OS and Service Detection Examples Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/loot/DeadDrop/files/Nmap_Cheatsheet.txt Demonstrates Nmap options for detecting operating systems and service versions. ```bash nmap -O target ``` ```bash nmap -sV target ``` ```bash nmap -A target ``` ```bash nmap --script=vuln target ``` -------------------------------- ### Install RaspyJack Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/README.md Installs RaspyJack on a fresh Raspberry Pi OS Lite system. Requires git and a reboot after installation. ```bash sudo apt update sudo apt install -y git sudo -i git clone https://github.com/7h30th3r0n3/raspyjack.git Raspyjack cd Raspyjack chmod +x install_raspyjack.sh ./install_raspyjack.sh reboot ``` -------------------------------- ### Start Responder Script Source: https://github.com/7h30th3r0n3/raspyjack/wiki/Responder Launches the Responder script with specified options. Ensure you replace '' with the actual network interface name. ```bash python3 /root/Raspyjack/Responder/Responder.py -Q -I ``` -------------------------------- ### Existing Installation Upgrade Script Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/RELEASE_NOTES.md Upgrades an existing Ragnar installation by running the advanced tools installation script and restarting the service. ```bash cd /home/ragnar/Ragnar sudo ./install_advanced_tools.sh sudo systemctl restart ragnar ``` -------------------------------- ### Initialize Environment and Load Login Button Plugin Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/DNSSpoof/sites/pinterest/login_files/login_button.html This snippet initializes the environment with specific configurations and then adds a task to the ServerJSQueue to load the Bootloader with various modules required for the login button functionality. ```javascript function envFlush(a){function b(b){for(var c in a)b[c]=a[c]}window.requireLazy?window.requireLazy("Env",b):(window.Env=window.Env||{},b(window.Env))}envFlush({"ajaxpipe_token":"AXhxPtC9ugaN1fDx","no_cookies":1});ServerJSQueue.add(function(){requireLazy("Bootloader", function(Bootloader) {Bootloader.enableBootload({"ExceptionDialog":{"resources":[],"module":1},"React":{"resources":[],"module":1},"AsyncDOM":{"resources":[],"module":1},"ConfirmationDialog":{"resources":[],"module":1},"Dialog":{"resources":[],"module":1},"QuickSandSolver":{"resources":[],"module":1},"ReactDOM":{"resources":[],"module":1},"KeyEventTypedLogger":{"resources":[],"module":1},"BanzaiODS":{"resources":[],"module":1},"SimpleXUIDialog":{"resources":[],"module":1},"XUIButton.react":{"resources":[],"module":1},"XUIDialogButton.react":{"resources":[],"module":1},"CSSFade":{"resources":[],"module":1},"Banzai":{"resources":[],"module":1},"PerfXSharedFields":{"resources":[],"module":1},"BanzaiStream":{"resources":[],"module":1},"ResourceTimingBootloaderHelper":{"resources":[],"module":1},"SnappyCompressUtil":{"resources":[],"module":1},"TimeSliceHelper":{"resources":[],"module":1},"ErrorSignal":{"resources":[],"module":1},"TimeSliceInteractionsLiteTypedLogger":{"resources":[],"module":1},"WebSpeedInteractionsTypedLogger":{"resources":[],"module":1}});});}); ``` -------------------------------- ### Install Advanced Tools for Ragnar Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/RELEASE_NOTES.md Follow these steps to update Ragnar and install advanced security tools for enhanced features. Restart the Ragnar service after installation. ```bash cd /home/ragnar/Ragnar git pull # Get latest code sudo ./install_advanced_tools.sh sudo systemctl restart ragnar ``` -------------------------------- ### Page Initialization and Event Handling Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/DNSSpoof/sites/amazon/login.html Handles the initial setup of the page, including DOM readiness triggers and window resize event handling for responsive adjustments. ```javascript function ba(){h.body?n.trigger("a-bodyBegin"):setTimeout(ba,20)}function z(a,b){if(b){for(var c=a.className.split(" "),e=c.length;e--;)if(c[e]===b)return;a.className+=" "+b}}function ca(a,b){for(var c=a.className.split(" "),e=[],g;void 0!==(g=c.pop());)g&&g!==b&&e.push(g);a.className=e.join(" ")}function da(a){try{return a()}catch(b){return!1}}function E(){if(F){var a={w:f.innerWidth?f.innerWidth:k.clientWidth,h:f.innerHeight?f.innerHeight:k.clientHeight};5a.h:1250<=a.w)?z(k,"a-ws"):ca(k,"a-ws")):Q--&&(ea=setTimeout(E,16))}function pa(a){(F=void 0===a?!F:!!a)&&E()}function qa(){return F}"use strict";var G=I.now=I.now||function(){return+new I},y=function(a){return a&&a.now?a.now.bind(a):G}(f.performance);ka=y();var p=f.AmazonUIPageJS||f.P;if(p&&p.when&&p.register)throw Error("A copy of P has already been loaded on this page.");var r=f.ue;r&&r.tag&&(r.tag("aui"),r.tag("aui:aui_build_date:3.17.8.3-2018-06-19")); var K=[],L=!1,U;U=function(){for(var a=J(),b=G();K.length;)if(K.shift()(),50 idVendor echo 0x0104 > idProduct echo 0x0100 > bcdDevice echo 0x0200 > bcdUSB mkdir -p strings/0x409 echo "fedcba9876543210" > strings/0x409/serialnumber echo "Raspberry Pi" > strings/0x409/manufacturer echo "Pi Zero USB" > strings/0x409/product mkdir -p configs/c.1/strings/0x409 echo "Config 1: ECM network" > configs/c.1/strings/0x409/configuration echo 250 > configs/c.1/MaxPower mkdir -p functions/ecm.usb0 ``` -------------------------------- ### Start ncat Listener Source: https://github.com/7h30th3r0n3/raspyjack/wiki/Reverse-Shell Use this command to start a netcat listener on the target machine, waiting for incoming reverse shell connections on port 4444. ```bash nc -lvnp 4444 ``` -------------------------------- ### Verify Ragnar Installation and Capabilities Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/RELEASE_NOTES.md Check if essential security tools are installed and accessible in your PATH. Verify the Ragnar service status and view recent logs. ```bash # Check installed tools which nuclei nikto sqlmap tcpdump tshark # Check Ragnar capabilities systemctl status ragnar journalctl -u ragnar -n 50 ``` -------------------------------- ### Reload and Enable Services Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/INSTALL.md Applies systemd configuration changes, enables the necessary services, and starts them. ```bash sudo systemctl daemon-reload sudo systemctl enable systemd-networkd sudo systemctl enable usb-gadget sudo systemctl start systemd-networkd sudo systemctl start usb-gadget ``` -------------------------------- ### Install Advanced Tools Script Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/vendor/ragnar/docs/RELEASE_NOTES.md Execute this bash script to install the necessary advanced security tools for Ragnar. This includes vulnerability scanners and traffic analysis utilities. ```bash cd /home/ragnar/Ragnar git pull # Get latest code sudo ./scripts/install_advanced_tools.sh sudo systemctl restart ragnar ``` -------------------------------- ### Nmap Port Specification Examples Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/loot/DeadDrop/files/Nmap_Cheatsheet.txt Shows how to define specific ports or ranges for Nmap scans. ```bash nmap -p 22 target ``` ```bash nmap -p 22,80,443 target ``` ```bash nmap -p 1-1024 target ``` ```bash nmap -p- target ``` ```bash nmap -F target ``` ```bash nmap --top-ports 1000 target ``` -------------------------------- ### Nmap Timing Template Examples Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/loot/DeadDrop/files/Nmap_Cheatsheet.txt Illustrates Nmap's timing templates for controlling scan speed and stealth. ```bash nmap -T0 target ``` ```bash nmap -T1 target ``` ```bash nmap -T2 target ``` ```bash nmap -T3 target ``` ```bash nmap -T4 target ``` ```bash nmap -T5 target ``` -------------------------------- ### Install Ragnar Port Dependencies Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/README.md Installs optional Python dependencies required for the Ragnar port if the launcher reports missing packages. This script is used for integrating Ragnar with RaspyJack. ```bash ./scripts/install_ragnar_port.sh ``` -------------------------------- ### Nmap Target Specification Examples Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/loot/DeadDrop/files/Nmap_Cheatsheet.txt Demonstrates various ways to specify target hosts or networks for Nmap scans. ```bash nmap 192.168.1.1 ``` ```bash nmap 192.168.1.0/24 ``` ```bash nmap 192.168.1.1-254 ``` ```bash nmap -iL targets.txt ``` -------------------------------- ### One-Touch Login Initialization and AJAX Request Source: https://github.com/7h30th3r0n3/raspyjack/blob/main/DNSSpoof/sites/paypal/login.html Handles the initialization and execution of the one-touch login flow. It prepares client log data, makes an AJAX POST request to '/signin/ot-token' to obtain a token, and redirects or displays notifications based on the response. ```javascript login.oneTouchLogin=function(){ function s(){var n=[],s=document.querySelector('input[name="locale.x"]');n.push({evt:"state_name",data:"Login_UL_RM",instrument:!0}),n.push({evt:"transition_name",data:"prepare_login_UL_RM",instrument:!0}),n.push({evt:"design",data:e.isInContextIntegration()?'in-context':'full-context',instrument:!0}),s&&n.push({evt:"page_lang",data:s.value,instrument:!0}),n.push({evt:r,data:"PREPARE_PAGE_"+i.toUpperCase(),calEvent:!0}),t.clientLog(n,null)} function o(e,t){var n=document.querySelector(".notifications"),r,i;n&&(r=document.createElement("p"),i=document.createTextNode(e),r.setAttribute("class","notification "+t),r.setAttribute("role","alert"),r.appendChild(i),n.appendChild(r))} function u(){ var t=document.querySelectorAll("form[name=login] input[type=hidden]"),n=document.querySelector("input[name=login_email]"),r=$("body").data("oneTouchUser"),i=$("body").data("cookieBannerEnabled"),u={ _csrf:1, intent:1, flowId:1, ctxId:1, returnUri:1, state:1, "locale.x":1 },a={}; for(var f=0;f