# Cutshort Jobs Scraper (`automation-lab/cutshort-jobs-scraper`) Actor

Scrape public Cutshort job listings with companies, locations, skills, salary, experience, URLs, and descriptions for recruiting research.

- **URL**: https://apify.com/automation-lab/cutshort-jobs-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## 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

## Cutshort Jobs Scraper

Extract public job listings from Cutshort.io category and search pages. The actor reads server-rendered Cutshort job data and saves structured records with titles, companies, locations, skills, salary ranges, experience ranges, URLs, and descriptions.

Use it for recruiting intelligence, India tech hiring research, salary monitoring, agency lead sourcing, and job-market dashboards.

### What does Cutshort Jobs Scraper do?

Cutshort Jobs Scraper turns public Cutshort job pages into clean Apify datasets.

It can scrape pages such as:

- `https://cutshort.io/jobs/reactjs-jobs`
- `https://cutshort.io/jobs/python-jobs`
- `https://cutshort.io/jobs/remote-jobs`
- any other public Cutshort `/jobs/...` page that includes job listings

The actor works without a Cutshort account for publicly visible listings.

### Who is it for?

Recruiters use it to monitor active technology hiring in India.

Staffing agencies use it to discover companies hiring for specific skills.

Job-board operators use it to enrich job inventory and trend reports.

Labor-market analysts use it to track skill demand, remote work, and salary bands.

Founders and sales teams use it to identify companies with open roles and growth signals.

### Why use this actor?

- 🧭 Scrapes public Cutshort category pages directly
- 🧑‍💻 Captures skills and tech-stack signals
- 💰 Extracts public salary ranges when Cutshort exposes them
- 📍 Saves locations and remote-work mode
- 🏢 Includes company names and company links when available
- 📝 Optionally includes public job descriptions
- ⚡ Uses HTTP extraction, not a browser, for fast and low-cost runs

### What data can you extract?

| Field | Description |
| --- | --- |
| `title` | Job title |
| `url` | Public Cutshort job URL |
| `jobId` | Cutshort job identifier when present |
| `company` | Company name |
| `companyUrl` | Public company/profile URL when available |
| `locations` | Location array |
| `locationText` | Display location text |
| `remoteType` | Remote mode from Cutshort |
| `roleTypes` | Full-time, internship, contract, or other role tags |
| `skills` | Skills and technologies listed on the job |
| `salaryText` | Human-readable salary range |
| `salaryMin` | Numeric salary lower bound when public |
| `salaryMax` | Numeric salary upper bound when public |
| `salaryCurrency` | Salary currency code |
| `experienceMin` | Minimum experience |
| `experienceMax` | Maximum experience |
| `descriptionText` | Clean text job description |
| `descriptionHtml` | Original public HTML description |
| `sourceUrl` | Category/search URL that produced the job |
| `sourceSlug` | Cutshort slug such as `reactjs-jobs` |
| `scrapedAt` | UTC scrape timestamp |

### How much does it cost to scrape Cutshort jobs?

The actor uses pay-per-event pricing.

- A small start event is charged once per run.
- A per-job event is charged only for saved dataset rows.

Formula-derived pricing is extremely low for this HTTP actor; the platform-ready BRONZE price is about $0.042 per 1,000 saved jobs, with higher-tier discounts. FREE-tier runs use about $0.048 per 1,000 saved jobs; DIAMOND-tier runs use about $0.012 per 1,000 saved jobs.

### How to use Cutshort Jobs Scraper

1. Open the actor on Apify.
2. Add one or more Cutshort job category URLs.
3. Optionally add category slugs such as `reactjs-jobs`.
4. Set the maximum number of jobs.
5. Run the actor.
6. Export the dataset as JSON, CSV, Excel, or via API.

### Input options

#### Start URLs

Use full Cutshort URLs.

```json
[
  { "url": "https://cutshort.io/jobs/reactjs-jobs" }
]
````

#### Search/category slugs

Use this when you only know the last part of a Cutshort URL.

```json
["reactjs-jobs", "python-jobs"]
```

The actor converts the slug into a Cutshort jobs URL.

#### Maximum jobs

Use `maxItems` to stop after a fixed number of saved listings.

#### Include description

Set `includeDescription` to `false` if you only need short listing-level fields.

### Input example

```json
{
  "startUrls": [
    { "url": "https://cutshort.io/jobs/reactjs-jobs" }
  ],
  "searchSlugs": ["python-jobs"],
  "maxItems": 50,
  "includeDescription": true
}
```

### Output example

```json
{
  "title": "Full Stack Developer",
  "url": "https://cutshort.io/job/Full-Stack-Developer-example",
  "jobId": "abc123",
  "company": "Example Technologies",
  "companyUrl": "https://cutshort.io/jobs-at-example-technologies",
  "locations": ["Bengaluru (Bangalore)"],
  "locationText": "Bengaluru (Bangalore)",
  "remoteType": "remote_not_okay",
  "roleTypes": ["full_time"],
  "skills": ["React.js", "Node.js", "TypeScript"],
  "salaryText": "₹10L - ₹20L / yr",
  "salaryMin": 1000000,
  "salaryMax": 2000000,
  "salaryCurrency": "INR",
  "experienceMin": 2,
  "experienceMax": 6,
  "descriptionText": "Public job description text...",
  "sourceUrl": "https://cutshort.io/jobs/reactjs-jobs",
  "sourceSlug": "reactjs-jobs",
  "scrapedAt": "2026-06-08T08:00:00.000Z"
}
```

### Tips for better results

- Use specific skill slugs for targeted sourcing.
- Run multiple smaller skill pages instead of one broad page when building dashboards.
- Keep `maxItems` low during testing.
- Disable descriptions when you only need counts, skills, companies, and salaries.
- Deduplicate downstream by `jobId` or `url`.

### Integrations

You can connect the dataset to:

- Google Sheets for recruiting dashboards
- Airtable for agency lead tracking
- BigQuery or Snowflake for labor-market analysis
- Slack alerts for new jobs in a tracked skill
- CRM tools for company hiring-signal enrichment

### API usage with Node.js

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/cutshort-jobs-scraper').call({
  searchSlugs: ['reactjs-jobs'],
  maxItems: 25,
  includeDescription: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### API usage with Python

```python
from apify_client import ApifyClient

client = ApifyClient('MY-APIFY-TOKEN')
run = client.actor('automation-lab/cutshort-jobs-scraper').call(run_input={
    'searchSlugs': ['reactjs-jobs'],
    'maxItems': 25,
    'includeDescription': True,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### API usage with cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/automation-lab~cutshort-jobs-scraper/runs?token=MY-APIFY-TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"searchSlugs":["reactjs-jobs"],"maxItems":25,"includeDescription":true}'
```

### MCP usage

Use Apify MCP to run this actor from Claude Desktop or Claude Code.

MCP server URL:

```text
https://mcp.apify.com/?tools=automation-lab/cutshort-jobs-scraper
```

Claude Code setup:

```bash
claude mcp add apify-cutshort-jobs "https://mcp.apify.com/?tools=automation-lab/cutshort-jobs-scraper"
```

Claude Desktop JSON config:

```json
{
  "mcpServers": {
    "apify-cutshort-jobs": {
      "url": "https://mcp.apify.com/?tools=automation-lab/cutshort-jobs-scraper"
    }
  }
}
```

Example prompts:

- "Scrape 25 React.js jobs from Cutshort and summarize the most common skills."
- "Find public Cutshort jobs for Python and group them by salary range."
- "Monitor this Cutshort category and show companies hiring remotely."

### Data quality notes

Cutshort controls which fields are public. Some listings may omit salary, experience, locations, or company details. The actor keeps missing optional fields as `null` or empty arrays instead of inventing values.

### FAQ

#### Why did I get fewer jobs than requested?

A Cutshort category page may expose fewer public jobs than your `maxItems`, or duplicates may be skipped across multiple URLs.

#### Why is salary missing?

Salary is only saved when Cutshort exposes a public salary range for that listing.

#### Can I scrape private applicant data?

No. This actor only extracts public job listing data visible without logging in.

### Legality and responsible use

This actor is designed for publicly available job listing data. You are responsible for ensuring that your use case complies with applicable laws, platform terms, and privacy obligations. Do not use scraped data for spam, discrimination, or unauthorized profiling.

### Related scrapers

Explore other Automation Lab actors for job and recruiting workflows:

- https://apify.com/automation-lab/naukri-scraper
- https://apify.com/automation-lab/welcome-to-the-jungle-jobs-scraper
- https://apify.com/automation-lab/remoteok-jobs-scraper
- https://apify.com/automation-lab/jobicy-jobs-scraper

### Changelog

Initial version extracts public Cutshort job listings from server-rendered job category pages.

### Support

If a public Cutshort jobs page fails, include the input URL, run ID, and expected listing examples in your support request.

### Field reference: title

The job title shown by Cutshort.

### Field reference: company

The company name associated with the public listing.

### Field reference: skills

The technologies and skills Cutshort exposes for the job.

### Field reference: salary

The salary text and numeric range when public.

### Field reference: experience

The experience range when public.

### Field reference: description

The public job description converted to text, with optional HTML retained.

# Actor input Schema

## `startUrls` (type: `array`):

Cutshort job category or search URLs to scrape. Example: https://cutshort.io/jobs/reactjs-jobs

## `searchSlugs` (type: `array`):

Optional Cutshort job slugs. The actor converts reactjs-jobs into https://cutshort.io/jobs/reactjs-jobs.

## `maxItems` (type: `integer`):

Maximum number of public Cutshort jobs to save across all URLs and slugs.

## `includeDescription` (type: `boolean`):

Include public job description text and HTML from Cutshort's server-rendered data.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://cutshort.io/jobs/reactjs-jobs"
    }
  ],
  "searchSlugs": [
    "reactjs-jobs"
  ],
  "maxItems": 20,
  "includeDescription": true
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [
        {
            "url": "https://cutshort.io/jobs/reactjs-jobs"
        }
    ],
    "searchSlugs": [
        "reactjs-jobs"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/cutshort-jobs-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 = {
    "startUrls": [{ "url": "https://cutshort.io/jobs/reactjs-jobs" }],
    "searchSlugs": ["reactjs-jobs"],
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/cutshort-jobs-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 '{
  "startUrls": [
    {
      "url": "https://cutshort.io/jobs/reactjs-jobs"
    }
  ],
  "searchSlugs": [
    "reactjs-jobs"
  ]
}' |
apify call automation-lab/cutshort-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/cutshort-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Cutshort Jobs Scraper",
        "description": "Scrape public Cutshort job listings with companies, locations, skills, salary, experience, URLs, and descriptions for recruiting research.",
        "version": "0.1",
        "x-build-id": "zKpl8R9CbAmoV0WjN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~cutshort-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-cutshort-jobs-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/automation-lab~cutshort-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-cutshort-jobs-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/automation-lab~cutshort-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-cutshort-jobs-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": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Cutshort job category or search URLs to scrape. Example: https://cutshort.io/jobs/reactjs-jobs",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "searchSlugs": {
                        "title": "Search/category slugs",
                        "type": "array",
                        "description": "Optional Cutshort job slugs. The actor converts reactjs-jobs into https://cutshort.io/jobs/reactjs-jobs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Maximum jobs",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of public Cutshort jobs to save across all URLs and slugs.",
                        "default": 20
                    },
                    "includeDescription": {
                        "title": "Include job description",
                        "type": "boolean",
                        "description": "Include public job description text and HTML from Cutshort's server-rendered data.",
                        "default": true
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
