# Arbetsformedlingen Jobs Details Scraper (`alexist/arbetsformedlingen-jobs-details-scraper`) Actor

Scrape detailed job listings from Arbetsformedlingen.se, Sweden's official employment service. Collect titles, descriptions, company details, salary info, requirements, and 28+ fields per listing — perfect for recruiters, labor market researchers, and job aggregators.

- **URL**: https://apify.com/alexist/arbetsformedlingen-jobs-details-scraper.md
- **Developed by:** [Alex](https://apify.com/alexist) (community)
- **Categories:** Automation, Developer tools, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## Arbetsformedlingen Jobs Scraper: Extract Swedish Job Data Instantly

---

### What Is Arbetsformedlingen?

Arbetsformedlingen (Swedish Public Employment Service) is Sweden's official job portal and labor market platform, hosting thousands of active job vacancies across all sectors. The platform provides comprehensive employment listings that reflect the real-time Swedish job market. Manually collecting and organizing this data is labor-intensive — the **Arbetsformedlingen Jobs Scraper** automates extraction, transforming raw job pages into structured, analysis-ready datasets.

---

### Overview

The **Arbetsformedlingen Jobs Scraper** extracts detailed job listings from Platsbanken (the job bank section), capturing every essential field from job descriptions to requirements and application methods. It is built for:

- **Swedish recruiters** and staffing agencies monitoring job market trends
- **Labor market analysts** studying employment patterns and wage trends
- **Job aggregator platforms** consolidating Swedish vacancies
- **Career researchers** analyzing the Nordic employment landscape

The scraper is lightweight and reliable, supporting batch processing with configurable failure handling, ensuring consistent data collection even when occasional URLs become unavailable.

---

### Input Format

The scraper accepts a minimal JSON configuration:

```json
{
  "urls": [
    "https://arbetsformedlingen.se/platsbanken/annonser/31239925"
  ],
  "ignore_url_failures": true
}
````

| Field | Description |
|---|---|
| `urls` | Array of Arbetsformedlingen job detail page URLs. Accepts single or multiple links. Each URL should point to a specific job announcement (e.g., `/annonser/[JOB_ID]`). |
| `ignore_url_failures` | Boolean flag. When set to `true`, the scraper continues running if individual URLs fail to load. Recommended for bulk runs to prevent interruptions. Default: `true`. |

> **Tip:** Copy job URLs directly from Arbetsformedlingen's address bar. The scraper works with both Swedish and English interface URLs.

***

### Output Format

**Sample output**

```json
{
  "application": {
    "email": null,
    "information": null,
    "mail": null,
    "other": null,
    "reference": "teamtailor-8006912-2082207",
    "web_address": "https://career.nextory.com/jobs/8006912-design-engineer/applications/new?promotion=2082207-arbetsformedlingen"
  },
  "company": {
    "city": null,
    "email": null,
    "name": "Nextory AB",
    "organisation_number": "5567084149",
    "phone_number": null,
    "post_code": null,
    "street_address": null,
    "web_address": "https://career.nextory.com"
  },
  "conditions": null,
  "contacts": [],
  "description": "<p>You know that bit where every company says they’re <em>“changing the world”</em>? Yeah, it can feel a little forced. But we like to think our story actually has some realness to it.</p><p>Our story begins with <strong>Shadi Bitar</strong> and <strong>Ninos Malki</strong>, who came to Sweden from Syria as kids and discovered that books could be a bridge - helping them learn the language, understand the culture, and explore new worlds.</p><p>A thought emerged, <em>what if everyone could have that? </em>And just like that, Nextory was born - your all-access pass to read, listen, and discover new perspectives without limits.</p><p>And now, we're on a quest to find a <strong>Design Engineer.</strong> </p><p><strong>Let us tell you about the role 📖 </strong>As a Design Engineer at Nextory, you’ll be working at the intersection of design and engineering, you’ll help turn ideas into fast, intuitive, and genuinely enjoyable experiences. Together with our six product designers, product managers, and engineers, you’ll take ideas from rough concepts to polished features in production.</p><p>Frontend development is your craft, and you care deeply about building high-quality user interfaces with thoughtful interactions, great performance, and attention to detail. You’ll have ownership throughout the entire journey, from the first sketch to the final release, caring just as much about the technical implementation as the user experience.</p><p><strong>Your story so far 👀 </strong>You thrive at the intersection of design and code. You move fast without losing your eye for detail, and you're equally energized by building tools other people use and great experiences for the users.</p><p>We also believe that you have:</p><ul><li><p>Strong fundamentals in modern frontend development - Vue, React or similar architecture</p></li><li><p>Experience building and extending design systems and component libraries in code, including working with Figma's developer tooling (Code Connect, Dev Mode, variables, component properties) to keep design and code in sync.</p></li><li><p>A track record of building internal tools, prototypes, and design-to-code infrastructure used by people across Nextory</p></li><li><p>Skillset to take promising prototypes from rough exploration to polished, production-quality features, owning both the technical implementation and the end result.</p></li><li><p>Good judgment on when to build for speed (a throwaway prototype) versus when to build for scale (a reusable component)</p></li></ul><p>A bonus if you also have experience and a keen interest in motion design.</p><p><strong>The Nextory way of working 🏠 </strong>At Nextory, we believe a strong and inclusive culture is key to our success and that culture flourishes when we meet and collaborate in person as much as possible. That’s why we spend the majority of the working time at our beautiful office!</p><p>We are based in Stockholm, Sweden, with offices in Paris and Bangalore. Our hybrid work policy includes four days in the office and Wednesdays as a work-from-home day.</p><p><strong>Your next story starts here 💫 </strong>We look forward to your application 💫. Applications are reviewed continuously, but please note that due to summer vacations, our response times may be a little longer than usual. If you have any questions about the role, please contact <a href=\"mailto:erika.thorslund@nextory.com\">erika.thorslund@nextory.com</a>.</p><p><em>Please note that we do not offer relocation and that a six-month probationary period applies.</em> </p>",
  "driving_license": [],
  "duration": "Tills vidare",
  "education": {
    "level": null,
    "name": "",
    "required": null
  },
  "employment_type": "Tillsvidare- eller tidsbegränsad anställning",
  "expiration_date": null,
  "id": "31239925",
  "keywords": [],
  "languages": [],
  "last_application_date": "2026-12-29T22:59:59Z",
  "logotype": "https://www.arbetsformedlingen.se/rest/employer-logo-api/api/v1/organisation/5567084149/logotyper/logo.png",
  "occupation": "Frontend-utvecklare",
  "own_car": false,
  "positions": 1,
  "published": true,
  "published_date": "2026-07-02T10:00:20Z",
  "requires_experience": true,
  "salary_description": null,
  "salary_type": "Fast månads- vecko- eller timlön",
  "skills": [],
  "title": "Design Engineer",
  "work_experiences": [],
  "work_time_extent": "Heltid",
  "workplace": {
    "city": "Stockholm",
    "country": "Sverige",
    "latitude": "59.3424311957332",
    "longitude": "18.0517079447527",
    "municipality": "Stockholm",
    "name": "Nextory",
    "post_code": "11329",
    "region": "Stockholms län",
    "show_map": true,
    "street": "Norrtullsgatan 6",
    "unspecified_workplace": false
  }
}
```

Each scraped job returns a comprehensive record with 28 fields:

#### Job Identification & Metadata

| Field | Meaning |
|---|---|
| `ID` | Unique identifier assigned by Arbetsformedlingen |
| `Title` | Official job title as listed |
| `Occupation` | Occupation category or classification |
| `Keywords` | Search tags and job keywords |
| `Published` | Publication status (e.g., active, closed) |
| `Published Date` | Date the listing was first published |
| `Expiration Date` | Deadline for applications or listing removal date |
| `Last Application Date` | Final date to submit applications |

#### Company Information

| Field | Meaning |
|---|---|
| `Company` | Employer name and organization details |
| `Logotype` | Company logo URL for branding |
| `Contacts` | Contact person names and details for inquiries |

#### Job Details

| Field | Meaning |
|---|---|
| `Description` | Full job description including responsibilities and overview |
| `Conditions` | Working conditions, benefits, and special agreements |
| `Workplace` | Geographic location or work site address |
| `Duration` | Contract length (temporary, permanent, seasonal) |
| `Employment Type` | Type of employment (full-time, part-time, project-based) |
| `Work Time Extent` | Hours per week or work schedule |
| `Positions` | Number of open positions |

#### Requirements & Qualifications

| Field | Meaning |
|---|---|
| `Education` | Required or preferred educational background |
| `Work Experiences` | Years of experience needed in the role or field |
| `Requires Experience` | Boolean indicating if prior experience is mandatory |
| `Skills` | Technical and soft skills required |
| `Languages` | Languages required or preferred |
| `Driving License` | Whether a driver's license is required (common in Swedish jobs) |
| `Own Car` | Whether applicant must provide personal transportation |

#### Compensation & Application

| Field | Meaning |
|---|---|
| `Salary Description` | Salary range or description in text format |
| `Salary Type` | Salary structure (hourly, monthly, annual) |
| `Application` | Application method and submission details |

***

### How to Use

1. **Locate job URLs** — Visit Arbetsformedlingen.se, search for jobs, and open individual job announcements. Copy the URL from the address bar (format: `/platsbanken/annonser/[ID]`).

2. **Prepare your input** — Add URLs to the `urls` array. You can include multiple job URLs in a single run.

3. **Enable failure handling** — Set `ignore_url_failures` to `true` for reliability in bulk operations.

4. **Run the scraper** — Execute the actor and monitor progress in the run log.

5. **Export data** — Download results as JSON, CSV, or Excel for use in spreadsheets, databases, or analytics tools.

**Best practices:**

- Test with 5–10 URLs before running large batches
- Use bulk edit to paste multiple URLs efficiently
- Check that URLs point to job detail pages, not search results
- Store results with timestamps for trend analysis

***

### Use Cases & Business Value

- **Market intelligence:** Track Swedish labor demand by industry, location, and role
- **Salary benchmarking:** Analyze compensation trends across sectors
- **Recruitment optimization:** Monitor competitor job listings and hiring patterns
- **Job board aggregation:** Consolidate Swedish vacancies into multi-source platforms
- **Academic & policy research:** Study employment dynamics and labor market shifts

The scraper delivers clean, structured data that eliminates manual copy-paste work and enables real-time labor market insights unavailable through manual browsing.

***

### Conclusion

The **Arbetsformedlingen Jobs Scraper** is the efficient solution for extracting Swedish job market data at scale. Whether you are a recruiter, researcher, or platform developer, this scraper turns Platsbanken listings into actionable intelligence. Start collecting data today and unlock insights into Sweden's dynamic employment landscape.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the Specific jobs urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## Actor input object example

```json
{
  "urls": [
    "https://arbetsformedlingen.se/platsbanken/annonser/31239925"
  ],
  "ignore_url_failures": true
}
```

# 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 = {
    "urls": [
        "https://arbetsformedlingen.se/platsbanken/annonser/31239925"
    ],
    "ignore_url_failures": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("alexist/arbetsformedlingen-jobs-details-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 = {
    "urls": ["https://arbetsformedlingen.se/platsbanken/annonser/31239925"],
    "ignore_url_failures": True,
}

# Run the Actor and wait for it to finish
run = client.actor("alexist/arbetsformedlingen-jobs-details-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 '{
  "urls": [
    "https://arbetsformedlingen.se/platsbanken/annonser/31239925"
  ],
  "ignore_url_failures": true
}' |
apify call alexist/arbetsformedlingen-jobs-details-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Arbetsformedlingen Jobs Details Scraper",
        "description": "Scrape detailed job listings from Arbetsformedlingen.se, Sweden's official employment service. Collect titles, descriptions, company details, salary info, requirements, and 28+ fields per listing — perfect for recruiters, labor market researchers, and job aggregators.",
        "version": "0.0",
        "x-build-id": "022H8WK7IESCI6ZM9"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/alexist~arbetsformedlingen-jobs-details-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-alexist-arbetsformedlingen-jobs-details-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/alexist~arbetsformedlingen-jobs-details-scraper/runs": {
            "post": {
                "operationId": "runs-sync-alexist-arbetsformedlingen-jobs-details-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/alexist~arbetsformedlingen-jobs-details-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-alexist-arbetsformedlingen-jobs-details-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": {
                    "urls": {
                        "title": "URLs of the Specific jobs urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the Specific jobs urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
