# NASA Exoplanet Archive Scraper (`compute-edge/nasa-exoplanet-scraper`) Actor

Extract confirmed exoplanet data from NASA Exoplanet Archive TAP API. Filter by discovery method and year. Returns orbital period, mass, radius, equilibrium temp, and stellar data.

- **URL**: https://apify.com/compute-edge/nasa-exoplanet-scraper.md
- **Developed by:** [Compute Edge](https://apify.com/compute-edge) (community)
- **Categories:** Lead generation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## NASA Exoplanet Archive Scraper

**Extract confirmed exoplanet data from the NASA Exoplanet Archive** — Query the world's most comprehensive confirmed exoplanet dataset via the Table Access Protocol (TAP) API. This Actor retrieves exoplanet discovery data, orbital parameters, and stellar information for over 5,500 confirmed planets without any authentication required.

### What data can you scrape from NASA Exoplanet Archive?

| Field | Description |
|-------|-------------|
| **pl_name** | Exoplanet name (e.g., "Kepler-1167 b") |
| **hostname** | Host star name (e.g., "Kepler-1167") |
| **disc_year** | Year of discovery (integer) |
| **discoverymethod** | Discovery method (Transit, Radial Velocity, Direct Imaging, etc.) |
| **pl_orbper** | Orbital period in days (float) |
| **pl_bmasse** | Planet mass in Earth masses (float) |
| **pl_rade** | Planet radius in Earth radii (float) |
| **pl_eqt** | Equilibrium temperature in Kelvin (integer) |
| **sy_snum** | Number of stars in the system (integer) |
| **sy_pnum** | Number of planets in the system (integer) |
| **url** | NASA Exoplanet Archive overview page URL |

### Why use NASA Exoplanet Archive Scraper?

- **No authentication required** — Direct access to NASA's public scientific data
- **Comprehensive dataset** — 5,500+ confirmed exoplanets with standardized fields
- **Flexible filtering** — Filter by discovery method, discovery year range, and result limit
- **Research-ready data** — All fields follow NASA's standardized variable naming conventions
- **Fast API access** — Direct fetch from TAP API with no browser overhead
- **Scientific accuracy** — Data curated and maintained by NASA's Exoplanet Archive team
- **Perfect for analysis** — Ideal input for exoplanet trend analysis, statistical research, or educational visualization

### How to scrape NASA Exoplanet Archive data

1. Go to the [NASA Exoplanet Archive Scraper](https://apify.com/seatsignal/nasa-exoplanet-scraper) on Apify Store
2. Click **Try for free**
3. (Optional) Set **Discovery Method** (e.g., `Transit`, `Radial Velocity`, `Direct Imaging`) — leave empty to include all methods
4. Set **Start Year** to filter planets discovered in this year or later (default: 1992, the year of the first confirmed exoplanet discovery)
5. Set **End Year** to filter planets discovered in this year or earlier (default: 2026)
6. Set **Max Results** to limit the number of exoplanets returned (default: 500, max: 10,000)
7. Click **Start** and wait for the API to return results

### Input example

```json
{
    "discoveryMethod": "Transit",
    "startYear": 2020,
    "endYear": 2023,
    "maxResults": 20
}
````

Expected: 20 exoplanets discovered via the Transit method between 2020-2023, sorted by discovery year (newest first).

### Output example

Each exoplanet returns a JSON object like this:

```json
{
    "pl_name": "TOI-1695 b",
    "hostname": "TOI-1695",
    "disc_year": 2023,
    "discoverymethod": "Transit",
    "pl_orbper": 5.26,
    "pl_bmasse": 4.87,
    "pl_rade": 1.98,
    "pl_eqt": 874,
    "sy_snum": 1,
    "sy_pnum": 3,
    "url": "https://exoplanetarchive.ipac.caltech.edu/overview/TOI-1695%20b"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data field reference

#### Planet Properties

- `pl_name`: Exoplanet name (string)
- `hostname`: Host star name (string)
- `disc_year`: Discovery year (integer, 1992-present)
- `discoverymethod`: How the planet was discovered (string, enum)
- `pl_orbper`: Orbital period in days (float)
- `pl_bmasse`: Planet mass in Earth masses (float)
- `pl_rade`: Planet radius in Earth radii (float)
- `pl_eqt`: Equilibrium temperature in Kelvin (integer)

#### System Properties

- `sy_snum`: Number of stars in the system (integer)
- `sy_pnum`: Number of planets in the system (integer)

#### Discovery Methods Filter

Common discovery methods include:

- `Transit` — Exoplanet transit (planet passes in front of star)
- `Radial Velocity` — Doppler shift of host star
- `Direct Imaging` — Direct observation of planet's light
- `Microlensing` — Gravitational lensing effect
- `Timing Variations` — Pulsar/eclipse timing anomalies
- `TTV` — Transit Timing Variations
- `Other` — Less common detection methods

### How much does it cost to scrape NASA Exoplanet Archive?

This Actor uses direct API fetch (no browser, no crawling), so compute costs are extremely low.

| Scenario | Results | Est. Compute | Est. Actor Fee |
|----------|---------|-------------|----------------|
| Quick sample (20 planets) | 20 | ~$0.001 | ~$0.02 |
| Medium query (500 planets) | 500 | ~$0.01 | ~$0.50 |
| Maximum extraction (10,000 planets) | 10,000 | ~$0.05 | ~$10.00 |

Actor pricing: **$0.001 per result** + minimal compute costs (usually under $0.01 per run). A typical extraction of 100 exoplanets costs under $0.15 total.

### Tips for efficient scraping

1. **Use discovery method filter** — Narrow your query to a specific detection method to reduce results and cost. For example, "Transit" returns ~3,500 planets; "Radial Velocity" returns ~900.
2. **Set realistic year ranges** — Discovery rate varies by year. Between 2010-2015, ~1,000 planets were discovered. Recent years (2020+) show ~1,000+ per year.
3. **Batch multiple queries** — If you need all exoplanets, run one Actor with `discoveryMethod` empty instead of separate runs per method.
4. **Schedule recurring updates** — Set up a weekly or monthly schedule to track newly discovered exoplanets.

### FAQ & support

**Q: How current is this data?**
A: The NASA Exoplanet Archive is updated continuously as new discoveries are confirmed. This Actor queries the live API, so data is current within hours of confirmation.

**Q: What if I need stellar properties (temperature, mass, radius)?**
A: The current Actor focuses on planet and system properties. To get stellar data, you would need to query additional TAP tables (e.g., `stars`) and merge the results. Contact support if you need this feature.

**Q: Can I filter by planet properties (e.g., mass > 10 Earth masses)?**
A: The current Actor supports year and method filtering. Custom SQL WHERE clauses could be added in a future version. Please open an issue on GitHub if this is important for your use case.

**Q: Is this legal to use?**
A: Yes. NASA's Exoplanet Archive data is public domain and explicitly designed for research, education, and analysis. No terms-of-service restrictions apply.

**Q: Can I use this data commercially?**
A: Yes. NASA public data has no copyright restrictions. You may use, modify, and commercialize the data as needed.

### Need a custom solution?

This Actor provides a flexible foundation for exoplanet research. If you need:

- Custom TAP query syntax
- Integration with other NASA datasets
- Real-time webhooks on new discoveries
- Scheduled extractions with versioning

Please contact [support](https://apify.com/contact) or open an issue on the [Actor's GitHub repository](https://github.com/apify/actor-nasa-exoplanet-scraper).

### Data attribution

Data sourced from the [NASA Exoplanet Archive](https://exoplanetarchive.ipac.caltech.edu/), a service of the NASA Exoplanet Science Institute at the California Institute of Technology, funded by NASA's Science Mission Directorate.

**Citation**: NASA Exoplanet Science Institute (2024). Exoplanet Archive. Retrieved from https://exoplanetarchive.ipac.caltech.edu

- **[Apify SDK](https://docs.apify.com/sdk/js)** - toolkit for building [Actors](https://apify.com/actors)
- **[Crawlee](https://crawlee.dev/)** - web scraping and browser automation library
- **[Input schema](https://docs.apify.com/platform/actors/development/input-schema)** - define and easily validate a schema for your Actor's input
- **[Dataset](https://docs.apify.com/sdk/python/docs/concepts/storages#working-with-datasets)** - store structured data where each object stored has the same attributes
- **[Cheerio](https://cheerio.js.org/)** - a fast, flexible & elegant library for parsing and manipulating HTML and XML
- **[Proxy configuration](https://docs.apify.com/platform/proxy)** - rotate IP addresses to prevent blocking

### Resources

- [Quick Start](https://docs.apify.com/platform/actors/development/quick-start) guide for building your first Actor
- [Video tutorial](https://www.youtube.com/watch?v=yTRHomGg9uQ) on building a scraper using CheerioCrawler
- [Written tutorial](https://docs.apify.com/academy/web-scraping-for-beginners/challenge) on building a scraper using CheerioCrawler
- [Web scraping with Cheerio in 2023](https://blog.apify.com/web-scraping-with-cheerio/)
- How to [scrape a dynamic page](https://blog.apify.com/what-is-a-dynamic-page/) using Cheerio
- [Integration with Zapier](https://apify.com/integrations), Make, Google Drive and others
- [Video guide on getting data using Apify API](https://www.youtube.com/watch?v=ViYYDHSBAKM)

### Creating Actors with templates

[How to create Apify Actors with web scraping code templates](https://www.youtube.com/watch?v=u-i-Korzf8w)

### Getting started

For complete information [see this article](https://docs.apify.com/platform/actors/development#build-actor-locally). To run the Actor use the following command:

```bash
apify run
```

### Deploy to Apify

#### Connect Git repository to Apify

If you've created a Git repository for the project, you can easily connect to Apify:

1. Go to [Actor creation page](https://console.apify.com/actors/new)
2. Click on **Link Git Repository** button

#### Push project on your local machine to Apify

You can also deploy the project on your local machine to Apify without the need for the Git repository.

1. Log in to Apify. You will need to provide your [Apify API Token](https://console.apify.com/account/integrations) to complete this action.

   ```bash
   apify login
   ```

2. Deploy your Actor. This command will deploy and build the Actor on the Apify Platform. You can find your newly created Actor under [Actors -> My Actors](https://console.apify.com/actors?tab=my).

   ```bash
   apify push
   ```

### Documentation reference

To learn more about Apify and Actors, take a look at the following resources:

- [Apify SDK for JavaScript documentation](https://docs.apify.com/sdk/js)
- [Apify SDK for Python documentation](https://docs.apify.com/sdk/python)
- [Apify Platform documentation](https://docs.apify.com/platform)
- [Join our developer community on Discord](https://discord.com/invite/jyEM2PRvMU)

# Actor input Schema

## `discoveryMethod` (type: `string`):

Filter by discovery method (e.g. Transit, Radial Velocity, Direct Imaging). Leave empty for all.

## `startYear` (type: `integer`):

Only include planets discovered in this year or later.

## `endYear` (type: `integer`):

Only include planets discovered in this year or earlier.

## `maxResults` (type: `integer`):

Maximum number of exoplanets to return.

## Actor input object example

```json
{
  "discoveryMethod": "",
  "startYear": 1992,
  "endYear": 2026,
  "maxResults": 500
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("compute-edge/nasa-exoplanet-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("compute-edge/nasa-exoplanet-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call compute-edge/nasa-exoplanet-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=compute-edge/nasa-exoplanet-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "NASA Exoplanet Archive Scraper",
        "description": "Extract confirmed exoplanet data from NASA Exoplanet Archive TAP API. Filter by discovery method and year. Returns orbital period, mass, radius, equilibrium temp, and stellar data.",
        "version": "0.1",
        "x-build-id": "NIgcUSAX16OA5pfdy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/compute-edge~nasa-exoplanet-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-compute-edge-nasa-exoplanet-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/compute-edge~nasa-exoplanet-scraper/runs": {
            "post": {
                "operationId": "runs-sync-compute-edge-nasa-exoplanet-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/compute-edge~nasa-exoplanet-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-compute-edge-nasa-exoplanet-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "discoveryMethod": {
                        "title": "Discovery Method",
                        "type": "string",
                        "description": "Filter by discovery method (e.g. Transit, Radial Velocity, Direct Imaging). Leave empty for all.",
                        "default": ""
                    },
                    "startYear": {
                        "title": "Start Year",
                        "minimum": 1992,
                        "maximum": 2030,
                        "type": "integer",
                        "description": "Only include planets discovered in this year or later.",
                        "default": 1992
                    },
                    "endYear": {
                        "title": "End Year",
                        "minimum": 1992,
                        "maximum": 2030,
                        "type": "integer",
                        "description": "Only include planets discovered in this year or earlier.",
                        "default": 2026
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of exoplanets to return.",
                        "default": 500
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
