diff --git a/.DS_Store b/.DS_Store index 701fc086b..e3109fe1c 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.history/components/navs/SpotNav_20240307025218.js b/.history/components/navs/SpotNav_20240416011111.js similarity index 70% rename from .history/components/navs/SpotNav_20240307025218.js rename to .history/components/navs/SpotNav_20240416011111.js index a6d6fd9f9..b0f37136a 100644 --- a/.history/components/navs/SpotNav_20240307025218.js +++ b/.history/components/navs/SpotNav_20240416011111.js @@ -5,11 +5,11 @@ function SpotNav() { return ( ); diff --git a/.history/pages/cards/compass_20240416011011.js b/.history/pages/cards/compass_20240416011011.js new file mode 100644 index 000000000..727309abb --- /dev/null +++ b/.history/pages/cards/compass_20240416011011.js @@ -0,0 +1,191 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import compasscomputer from '../../public/cards/compass-computer.png'; +import compasscomputerG from '../../public/cards/compass-computerG.png'; +import compassbrowser from '../../public/cards/compass-browser.png'; +import CompassNav from '../../components/navs/CompassNav'; +import compassds from '../../public/cards/compass-ds.png'; +import compasscm from '../../public/cards/compass-cm.png'; +import compasspp from '../../public/cards/compass-pp.png'; +import compassdv from '../../public/cards/compass-dv.png'; +import NavMain from '../../components/Nav.js'; + +function Compass() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ compass app in browser +
+
+

Project Compass with SF Civic Tech

+

An overview of my involvement with Compass - a nonprofit and volunteer driven project founded within SF Civic Tech.

+
+
+ {/* breaks up rest of case study between nav and information */} +
+ +
+ {/* first screen: overview motion-safe:animate-fadeIn */} +
+
+
+

Role

+

Full Stack Engineer

+
+
+

Timeline

+

Jan 2023 - Current

+
+
+

Team

+

Compas Volunteers

+
+
+

Tools

+

Next.js, PostgreSQL, Typescript, NextAuth, Figma

+
+
+
+

What is Compass?

+

Compass is a nonprofit and entirely volunteer-led and sustained project + {' '}founded within the volunteer brigade, SF Civic Tech (formally known as Code for SF). + The project was started with the goal of aiding staff within the SFUSD whose + work are focused on students with disabilities, namely case managers and para professionals (aka paraeducators). The + application aims to streamline their current "nondigital" process of data collection + {' '}on what is referred to as a student's IEP - Individual Education Plan. In other words, it + would allow staff to have an easier time keeping track of their students' progress.

+

+

Check out our github {' '} + here. +

+
+
+

How am I involved?

+

I joined the project as a full stack engineer with an + added interest in product design and UI/UX design. + I was looking to broaden my understanding of overall web architecture, in addition to getting familiar with the best approaches and methods to take for designing a product. + I've gotten the added benefit of learning from and working with some incredibly talented people, and + I couldn't be more grateful to this project for giving me the space to make meaningful contributions and grow through creating! +

+
+
+
+
+

ABOUT

+
+

The Users & The Problem

+

+ Due to lack of funding, there’s no digital application that is geared towards managing the process of IEP goal creation and task delegation for case managers, nor the process of data collection for paraeducators. Much of their work is done on paper, which also doesn’t allow for much room or ability to analyze and visualize a student’s progress. +

+

+

+ Thus, the application has two faces - one for case managers (desktop-first), and one for paraeducators (mobile-first). For a split user base, considerations had to be made regarding limitations and differing tasks. +

+
+
+ visual design elements for compass +

Case Manager View

+
+
+ visual design elements for compass +

Para Educator View

+
+
+
+
+

The Solution & User Flow

+

+ This application is intended to digitize and help streamline their current processes. It gives case managers a dashboard where they can create IEP goal sheets for their students. They can create tasks and assign them to various paraeducators within the application. This allows them to collect data digitally, which is then stored in a database. That stored data is visualized in meaningful ways to the case managers, resulting in their students’ progress to be easily accessible and analyzed. +

+
+
+
+
+

WORK

+
+
+

Organization

+

We use Slack and Github projects to discuss, create, and pickup tickets to work on for building out the application.

+
+
+ +
+
+ +
+
+

Tech Stack

+

Next.js, NextAuth, Typescript, PostgreSQL, Docker

+
+
+
+
+

Pull requests I’ve made / worked on:

+
    +
  • Initial setup of the case manager dashboard and user, as well as the general file structure.
  • +
  • Setup of the CSS structure and the continuous incorporation of the design system.
  • +
  • Creation of the sidebar and its mobile adaptation (hamburger menu) for responsive design.
  • +
  • Minor CSS Fixes
  • +
  • IEP Student Modal (current)
  • +
+
+
+
+
+

Design component I'm working on:

+

I’m currently working with another UX designer on finalizing the mockups and direction for the data visualization portion of the application. + Our primary question: how can we visualize data in meaningful ways for both the CMs and paras? To find our answer + we had to understand how they currently analyze data and how they present it in ways that demonstrate a student’s progress. +

+

+

Current objectives: +

+
    +
  • Determine the best ways to visualize and handle outlier data
  • +
  • Explore whether data be displayed at varying hierarchical levels in the IEP
  • +
  • Test the inclusion and generation of varying graph types
  • +
+ +
+
+ visual design elements for compass +

Mockup of the data table I'm working on for the data viz

+
+ {/*} +
+
+ visual design elements for compass +

Quick look at the visual design elements.

+
+
*/} +
+ +
+ +
+

THOUGHTS

+

I've worked with a lot of new tools and concepts

+

+ Working on this project has given me so much valuable insight into working on cross-functional teams, contributing to open-source projects, getting familiar with schema setups and Typescript, and the importance of understanding the end user and how the application is continuously meeting their goals. +

+
+
+
+
+
+ ) + } + + export default Compass \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416005010.js b/.history/pages/cards/dispotify_20240416005010.js new file mode 100644 index 000000000..c9f076e3d --- /dev/null +++ b/.history/pages/cards/dispotify_20240416005010.js @@ -0,0 +1,130 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Desig & Full Stack Dev

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, tailwind, Spotify API, NextAuth, Recoil

+
+
+

Note: This website is currently in V2. I'll walk through both V1 and V2 in this case study!

+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+

This is pretty much where V1 ends. For V2, I’m rebuilding the same project but in Typescript, and making it better with more features. V2 is still in development but I will update this case study as soon as it’s deployed!

+
+
+
+

DESIGN

+
+

What was my goal?

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout.

+

I didn’t focus too much on design for V1 as I was more focused on learning how to set everything up. For V2, I wanted to incorporate some more elements such as: +

    +
  • styled list components with overflow hidden
  • +
  • some more unique features including (but not limited to): +
      +
    • show countries' popular genres and songs that align with the user's
    • +
    • display how many playlists or artists a user follows (would help for cleaning up inventory too)
    • +
    • the ability to add generated playlists to a user's account
    • +
    +
  • +
  • better responsiveness and horizontal scrolling
  • +
+

+

Visual Design Elements

+
+ DiscoverSpotify Visual Design Elements +
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+

Other Notes

+

I'm still trying to debug some issues from V1 with using information that I'm trying to save upon login for other functions that I also want to be displayed upon login. For V2, I've been using a button to generate the playlists to bypass this issue, but I'm still looking into other implementations. I'm also using Typescript for V2 which I'm hoping will allow for a more robust structure of the application (in addition to giving me practice with Typescript).

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After V1, I went through each step of the process and researched into how everything was actually working together. Starting V2 using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416005125.js b/.history/pages/cards/dispotify_20240416005125.js new file mode 100644 index 000000000..62ae40c7b --- /dev/null +++ b/.history/pages/cards/dispotify_20240416005125.js @@ -0,0 +1,132 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Desig & Full Stack Dev

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, tailwind, Spotify API, NextAuth, Recoil

+
+
+

Note: This website is currently in V2. I'll walk through both V1 and V2 in this case study!

+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+

This is pretty much where V1 ends. For V2, I’m rebuilding the same project but in Typescript, and making it better with more features. V2 is still in development but I will update this case study as soon as it’s deployed!

+
+
+
+

DESIGN

+
+

What was my goal?

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout.

+

I didn’t focus too much on design for V1 as I was more focused on learning how to set everything up. For V2, I wanted to incorporate some more elements such as: +

    +
  • styled list components with overflow hidden
  • +
  • some more unique features including (but not limited to): +
      +
    • show countries' popular genres and songs that align with the user's
    • +
    • display how many playlists or artists a user follows (would help for cleaning up inventory too)
    • +
    • the ability to add generated playlists to a user's account
    • +
    +
  • +
  • better responsiveness and horizontal scrolling
  • +
+

+
+

Visual Design Elements

+
+ DiscoverSpotify Visual Design Elements +
+
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+

Other Notes

+

I'm still trying to debug some issues from V1 with using information that I'm trying to save upon login for other functions that I also want to be displayed upon login. For V2, I've been using a button to generate the playlists to bypass this issue, but I'm still looking into other implementations. I'm also using Typescript for V2 which I'm hoping will allow for a more robust structure of the application (in addition to giving me practice with Typescript).

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After V1, I went through each step of the process and researched into how everything was actually working together. Starting V2 using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416005206.js b/.history/pages/cards/dispotify_20240416005206.js new file mode 100644 index 000000000..6cf60920c --- /dev/null +++ b/.history/pages/cards/dispotify_20240416005206.js @@ -0,0 +1,132 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Desig & Full Stack Dev

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Spotify API, NextAuth, Recoil

+
+
+

Note: This website is currently in V2. I'll walk through both V1 and V2 in this case study!

+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+

This is pretty much where V1 ends. For V2, I’m rebuilding the same project but in Typescript, and making it better with more features. V2 is still in development but I will update this case study as soon as it’s deployed!

+
+
+
+

DESIGN

+
+

What was my goal?

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout.

+

I didn’t focus too much on design for V1 as I was more focused on learning how to set everything up. For V2, I wanted to incorporate some more elements such as: +

    +
  • styled list components with overflow hidden
  • +
  • some more unique features including (but not limited to): +
      +
    • show countries' popular genres and songs that align with the user's
    • +
    • display how many playlists or artists a user follows (would help for cleaning up inventory too)
    • +
    • the ability to add generated playlists to a user's account
    • +
    +
  • +
  • better responsiveness and horizontal scrolling
  • +
+

+
+

Visual Design Elements

+
+ DiscoverSpotify Visual Design Elements +
+
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+

Other Notes

+

I'm still trying to debug some issues from V1 with using information that I'm trying to save upon login for other functions that I also want to be displayed upon login. For V2, I've been using a button to generate the playlists to bypass this issue, but I'm still looking into other implementations. I'm also using Typescript for V2 which I'm hoping will allow for a more robust structure of the application (in addition to giving me practice with Typescript).

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After V1, I went through each step of the process and researched into how everything was actually working together. Starting V2 using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416005217.js b/.history/pages/cards/dispotify_20240416005217.js new file mode 100644 index 000000000..5b232fdf3 --- /dev/null +++ b/.history/pages/cards/dispotify_20240416005217.js @@ -0,0 +1,132 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Spotify API, NextAuth, Recoil

+
+
+

Note: This website is currently in V2. I'll walk through both V1 and V2 in this case study!

+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+

This is pretty much where V1 ends. For V2, I’m rebuilding the same project but in Typescript, and making it better with more features. V2 is still in development but I will update this case study as soon as it’s deployed!

+
+
+
+

DESIGN

+
+

What was my goal?

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout.

+

I didn’t focus too much on design for V1 as I was more focused on learning how to set everything up. For V2, I wanted to incorporate some more elements such as: +

    +
  • styled list components with overflow hidden
  • +
  • some more unique features including (but not limited to): +
      +
    • show countries' popular genres and songs that align with the user's
    • +
    • display how many playlists or artists a user follows (would help for cleaning up inventory too)
    • +
    • the ability to add generated playlists to a user's account
    • +
    +
  • +
  • better responsiveness and horizontal scrolling
  • +
+

+
+

Visual Design Elements

+
+ DiscoverSpotify Visual Design Elements +
+
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+

Other Notes

+

I'm still trying to debug some issues from V1 with using information that I'm trying to save upon login for other functions that I also want to be displayed upon login. For V2, I've been using a button to generate the playlists to bypass this issue, but I'm still looking into other implementations. I'm also using Typescript for V2 which I'm hoping will allow for a more robust structure of the application (in addition to giving me practice with Typescript).

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After V1, I went through each step of the process and researched into how everything was actually working together. Starting V2 using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416005222.js b/.history/pages/cards/dispotify_20240416005222.js new file mode 100644 index 000000000..03873101b --- /dev/null +++ b/.history/pages/cards/dispotify_20240416005222.js @@ -0,0 +1,132 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + UI Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Spotify API, NextAuth, Recoil

+
+
+

Note: This website is currently in V2. I'll walk through both V1 and V2 in this case study!

+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+

This is pretty much where V1 ends. For V2, I’m rebuilding the same project but in Typescript, and making it better with more features. V2 is still in development but I will update this case study as soon as it’s deployed!

+
+
+
+

DESIGN

+
+

What was my goal?

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout.

+

I didn’t focus too much on design for V1 as I was more focused on learning how to set everything up. For V2, I wanted to incorporate some more elements such as: +

    +
  • styled list components with overflow hidden
  • +
  • some more unique features including (but not limited to): +
      +
    • show countries' popular genres and songs that align with the user's
    • +
    • display how many playlists or artists a user follows (would help for cleaning up inventory too)
    • +
    • the ability to add generated playlists to a user's account
    • +
    +
  • +
  • better responsiveness and horizontal scrolling
  • +
+

+
+

Visual Design Elements

+
+ DiscoverSpotify Visual Design Elements +
+
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+

Other Notes

+

I'm still trying to debug some issues from V1 with using information that I'm trying to save upon login for other functions that I also want to be displayed upon login. For V2, I've been using a button to generate the playlists to bypass this issue, but I'm still looking into other implementations. I'm also using Typescript for V2 which I'm hoping will allow for a more robust structure of the application (in addition to giving me practice with Typescript).

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After V1, I went through each step of the process and researched into how everything was actually working together. Starting V2 using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416005233.js b/.history/pages/cards/dispotify_20240416005233.js new file mode 100644 index 000000000..14e178486 --- /dev/null +++ b/.history/pages/cards/dispotify_20240416005233.js @@ -0,0 +1,131 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + UI Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Spotify API, NextAuth, Recoil

+
+
+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+

This is pretty much where V1 ends. For V2, I’m rebuilding the same project but in Typescript, and making it better with more features. V2 is still in development but I will update this case study as soon as it’s deployed!

+
+
+
+

DESIGN

+
+

What was my goal?

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout.

+

I didn’t focus too much on design for V1 as I was more focused on learning how to set everything up. For V2, I wanted to incorporate some more elements such as: +

    +
  • styled list components with overflow hidden
  • +
  • some more unique features including (but not limited to): +
      +
    • show countries' popular genres and songs that align with the user's
    • +
    • display how many playlists or artists a user follows (would help for cleaning up inventory too)
    • +
    • the ability to add generated playlists to a user's account
    • +
    +
  • +
  • better responsiveness and horizontal scrolling
  • +
+

+
+

Visual Design Elements

+
+ DiscoverSpotify Visual Design Elements +
+
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+

Other Notes

+

I'm still trying to debug some issues from V1 with using information that I'm trying to save upon login for other functions that I also want to be displayed upon login. For V2, I've been using a button to generate the playlists to bypass this issue, but I'm still looking into other implementations. I'm also using Typescript for V2 which I'm hoping will allow for a more robust structure of the application (in addition to giving me practice with Typescript).

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After V1, I went through each step of the process and researched into how everything was actually working together. Starting V2 using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416005326.js b/.history/pages/cards/dispotify_20240416005326.js new file mode 100644 index 000000000..66792076c --- /dev/null +++ b/.history/pages/cards/dispotify_20240416005326.js @@ -0,0 +1,131 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + UI Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Spotify API, NextAuth, Recoil

+
+
+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+

This is pretty much where V1 ends. For V2, I’m rebuilding the same project but in Typescript, and making it better with more features. V2 is still in development but I will update this case study as soon as it’s deployed!

+
+
+
+

DESIGN

+
+

What was my goal?

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout.

+

I didn’t focus too much on design for V1 as I was more focused on learning how to set everything up. For V2, I wanted to incorporate some more elements such as: +

    +
  • styled list components with overflow hidden
  • +
  • some more unique features including (but not limited to): +
      +
    • show countries' popular genres and songs that align with the user's
    • +
    • display how many playlists or artists a user follows (would help for cleaning up inventory too)
    • +
    • the ability to add generated playlists to a user's account
    • +
    +
  • +
  • better responsiveness and horizontal scrolling
  • +
+

+
+

Visual Design Elements

+
+ DiscoverSpotify Visual Design Elements +
+
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+

Other Notes

+

I'm still trying to debug some issues from V1 with using information that I'm trying to save upon login for other functions that I also want to be displayed upon login. For V2, I've been using a button to generate the playlists to bypass this issue, but I'm still looking into other implementations. I'm also using Typescript for V2 which I'm hoping will allow for a more robust structure of the application (in addition to giving me practice with Typescript).

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After V1, I went through each step of the process and researched into how everything was actually working together. Starting V2 using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416005331.js b/.history/pages/cards/dispotify_20240416005331.js new file mode 100644 index 000000000..bf8adcfed --- /dev/null +++ b/.history/pages/cards/dispotify_20240416005331.js @@ -0,0 +1,131 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + UI Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Spotify API, NextAuth, Recoil

+
+
+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+

This is pretty much where V1 ends. For V2, I’m rebuilding the same project but in Typescript, and making it better with more features. V2 is still in development but I will update this case study as soon as it’s deployed!

+
+
+
+

DESIGN

+
+

What was my goal?

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout.

+

I didn’t focus too much on design for V1 as I was more focused on learning how to set everything up. For V2, I wanted to incorporate some more elements such as: +

    +
  • styled list components with overflow hidden
  • +
  • some more unique features including (but not limited to): +
      +
    • show countries' popular genres and songs that align with the user's
    • +
    • display how many playlists or artists a user follows (would help for cleaning up inventory too)
    • +
    • the ability to add generated playlists to a user's account
    • +
    +
  • +
  • better responsiveness and horizontal scrolling
  • +
+

+
+

Visual Design Elements

+
+ DiscoverSpotify Visual Design Elements +
+
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+

Other Notes

+

I'm still trying to debug some issues from V1 with using information that I'm trying to save upon login for other functions that I also want to be displayed upon login. For V2, I've been using a button to generate the playlists to bypass this issue, but I'm still looking into other implementations. I'm also using Typescript for V2 which I'm hoping will allow for a more robust structure of the application (in addition to giving me practice with Typescript).

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After V1, I went through each step of the process and researched into how everything was actually working together. Starting V2 using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416005900.js b/.history/pages/cards/dispotify_20240416005900.js new file mode 100644 index 000000000..4d2e97fc0 --- /dev/null +++ b/.history/pages/cards/dispotify_20240416005900.js @@ -0,0 +1,131 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + UI Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Typescript, Spotify API, NextAuth, Recoil

+
+
+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+

This is pretty much where V1 ends. For V2, I’m rebuilding the same project but in Typescript, and making it better with more features. V2 is still in development but I will update this case study as soon as it’s deployed!

+
+
+
+

DESIGN

+
+

What was my goal?

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout.

+

I didn’t focus too much on design for V1 as I was more focused on learning how to set everything up. For V2, I wanted to incorporate some more elements such as: +

    +
  • styled list components with overflow hidden
  • +
  • some more unique features including (but not limited to): +
      +
    • show countries' popular genres and songs that align with the user's
    • +
    • display how many playlists or artists a user follows (would help for cleaning up inventory too)
    • +
    • the ability to add generated playlists to a user's account
    • +
    +
  • +
  • better responsiveness and horizontal scrolling
  • +
+

+
+

Visual Design Elements

+
+ DiscoverSpotify Visual Design Elements +
+
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+

Other Notes

+

I'm still trying to debug some issues from V1 with using information that I'm trying to save upon login for other functions that I also want to be displayed upon login. For V2, I've been using a button to generate the playlists to bypass this issue, but I'm still looking into other implementations. I'm also using Typescript for V2 which I'm hoping will allow for a more robust structure of the application (in addition to giving me practice with Typescript).

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After V1, I went through each step of the process and researched into how everything was actually working together. Starting V2 using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416010000.js b/.history/pages/cards/dispotify_20240416010000.js new file mode 100644 index 000000000..034101918 --- /dev/null +++ b/.history/pages/cards/dispotify_20240416010000.js @@ -0,0 +1,131 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + UI Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Typescript, Spotify API, NextAuth, Recoil

+
+
+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+
+
+
+

DESIGN

+
+

What was my goal?

+

I didn’t focus too much on design for V1 as I was more focused on learning how to set everything up. For V2, I wanted to incorporate some more elements such as: +

    +
  • styled list components with overflow hidden
  • +
  • some more unique features including (but not limited to): +
      +
    • show countries' popular genres and songs that align with the user's
    • +
    • display how many playlists or artists a user follows (would help for cleaning up inventory too)
    • +
    • the ability to add generated playlists to a user's account
    • +
    +
  • +
  • better responsiveness and horizontal scrolling
  • +
+

+
+

Visual Design Elements

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout.

+ +
+ DiscoverSpotify Visual Design Elements +
+
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+

Other Notes

+

I'm still trying to debug some issues from V1 with using information that I'm trying to save upon login for other functions that I also want to be displayed upon login. For V2, I've been using a button to generate the playlists to bypass this issue, but I'm still looking into other implementations. I'm also using Typescript for V2 which I'm hoping will allow for a more robust structure of the application (in addition to giving me practice with Typescript).

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After V1, I went through each step of the process and researched into how everything was actually working together. Starting V2 using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416010251.js b/.history/pages/cards/dispotify_20240416010251.js new file mode 100644 index 000000000..60ac0cd51 --- /dev/null +++ b/.history/pages/cards/dispotify_20240416010251.js @@ -0,0 +1,115 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + UI Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Typescript, Spotify API, NextAuth, Recoil

+
+
+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+
+
+
+

DESIGN

+
+

Visual Design Elements

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout. + I included horizontal scroll for the user's info and vertical scroll for the generated playlists to adhere to responsive design.

+
+ DiscoverSpotify Visual Design Elements +
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+

Other Notes

+

I'm still trying to debug some issues from V1 with using information that I'm trying to save upon login for other functions that I also want to be displayed upon login. For V2, I've been using a button to generate the playlists to bypass this issue, but I'm still looking into other implementations. I'm also using Typescript for V2 which I'm hoping will allow for a more robust structure of the application (in addition to giving me practice with Typescript).

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After V1, I went through each step of the process and researched into how everything was actually working together. Starting V2 using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416010343.js b/.history/pages/cards/dispotify_20240416010343.js new file mode 100644 index 000000000..7ffca7c54 --- /dev/null +++ b/.history/pages/cards/dispotify_20240416010343.js @@ -0,0 +1,113 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + UI Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Typescript, Spotify API, NextAuth, Recoil

+
+
+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+
+
+
+

DESIGN

+
+

Visual Design Elements

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout. + I included horizontal scroll for the user's info and vertical scroll for the generated playlists to adhere to responsive design.

+
+ DiscoverSpotify Visual Design Elements +
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After V1, I went through each step of the process and researched into how everything was actually working together. Starting V2 using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416010459.js b/.history/pages/cards/dispotify_20240416010459.js new file mode 100644 index 000000000..a3949a3f2 --- /dev/null +++ b/.history/pages/cards/dispotify_20240416010459.js @@ -0,0 +1,113 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + UI Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Typescript, Spotify API, NextAuth, Recoil

+
+
+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+
+
+
+

DESIGN

+
+

Visual Design Elements

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout. + I included horizontal scroll for the user's info and vertical scroll for the generated playlists to adhere to responsive design.

+
+ DiscoverSpotify Visual Design Elements +
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After my first attempt at this project, I went through each step of the process and researched into how everything was actually working together. Rebuilding it using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416010831.js b/.history/pages/cards/dispotify_20240416010831.js new file mode 100644 index 000000000..243e1891e --- /dev/null +++ b/.history/pages/cards/dispotify_20240416010831.js @@ -0,0 +1,117 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + UI Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Typescript, Spotify API, NextAuth, Recoil

+
+
+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+

Check it out{' '} + here +

+
+
+
+

DESIGN

+
+

Visual Design Elements

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout. + I included horizontal scroll for the user's info and vertical scroll for the generated playlists to adhere to responsive design.

+
+ DiscoverSpotify Visual Design Elements +
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After my first attempt at this project, I went through each step of the process and researched into how everything was actually working together. Rebuilding it using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416010854.js b/.history/pages/cards/dispotify_20240416010854.js new file mode 100644 index 000000000..1fc756dca --- /dev/null +++ b/.history/pages/cards/dispotify_20240416010854.js @@ -0,0 +1,117 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + UI Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Typescript, Spotify API, NextAuth, Recoil

+
+
+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+

Check it out{' '} + here +

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+
+
+
+

DESIGN

+
+

Visual Design Elements

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout. + I included horizontal scroll for the user's info and vertical scroll for the generated playlists to adhere to responsive design.

+
+ DiscoverSpotify Visual Design Elements +
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After my first attempt at this project, I went through each step of the process and researched into how everything was actually working together. Rebuilding it using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416010921.js b/.history/pages/cards/dispotify_20240416010921.js new file mode 100644 index 000000000..0e0bc480b --- /dev/null +++ b/.history/pages/cards/dispotify_20240416010921.js @@ -0,0 +1,117 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + UI Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Typescript, Spotify API, NextAuth, Recoil

+
+
+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+

Check it out{' '} + here +

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+
+
+
+

DESIGN

+
+

Visual Design Elements

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout. + I included horizontal scroll for the user's info and vertical scroll for the generated playlists to adhere to responsive design.

+
+ DiscoverSpotify Visual Design Elements +
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After my first attempt at this project, I went through each step of the process and researched into how everything was actually working together. Rebuilding it using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416010926.js b/.history/pages/cards/dispotify_20240416010926.js new file mode 100644 index 000000000..3aedaebc9 --- /dev/null +++ b/.history/pages/cards/dispotify_20240416010926.js @@ -0,0 +1,117 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + UI Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Typescript, Spotify API, NextAuth, Recoil

+
+
+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+

Check it out{' '} + here. +

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+
+
+
+

DESIGN

+
+

Visual Design Elements

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout. + I included horizontal scroll for the user's info and vertical scroll for the generated playlists to adhere to responsive design.

+
+ DiscoverSpotify Visual Design Elements +
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After my first attempt at this project, I went through each step of the process and researched into how everything was actually working together. Rebuilding it using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.history/pages/cards/dispotify_20240416011007.js b/.history/pages/cards/dispotify_20240416011007.js new file mode 100644 index 000000000..def63a819 --- /dev/null +++ b/.history/pages/cards/dispotify_20240416011007.js @@ -0,0 +1,117 @@ +import Head from 'next/head'; +import Image from 'next/image'; +import Link from 'next/link'; +import {BsFillMoonStarsFill} from 'react-icons/bs'; +import dispotifycomputer from '../../public/cards/dispotify-computer.png'; +import dispotifycomputerG from '../../public/cards/dispotify-computerG.png'; +import dispotifybrowser from '../../public/cards/dispotify-browser.png'; +import dispotifyvd from '../../public/cards/dispotify-vd.png'; +import SpotNav from '../../components/navs/SpotNav'; +import NavMain from '../../components/Nav.js'; + +function Dispotify() { + return ( +
+ + Hannah McGowan Portfolio + + + + + +
+
+
+ discoverspotify app in browser +
+
+

Discover Spotify Web App Build

+

Build responsive wep app that utilizies the Spotify API to generate curated playlists and info for a user.

+
+
+ {/* breaks up rest of case study between nav and information */} + +
+ +
+ {/* first screen: overview + className="pl-10 h-screen motion-safe:animate-fadeIn"*/} +
+
+
+

Role

+

Full Stack Dev + UI Design

+
+
+

Timeline

+

Couple months

+
+
+

Project

+

Personal Exploration

+
+
+

Tools

+

Next.js, Tailwind CSS, Typescript, Spotify API, NextAuth, Recoil

+
+
+ +
+

What is Discover Spotify?

+

Discover Spotify is a personal project which I started with the intentions of developing my skills in working with APIs. Through building and exploring I also ended up learning authentication and state management.

+

I wanted to build something that I could use. I like looking for new music, and I spend hours scouring through random playlists on Spotify. Why not make something that could just give more recs?

+

Using the Spotify Web API I gather a user’s listening habits, then use those to curate recommended songs and playlists for the user. The app is intended to be inspired by Spotify’s “wrapped” series and therefore displays other information about a user’s habits. Building those components also allowed me to explore more of the API’s features.

+

Check it out{' '} + here. +

+
+
+
+

SETUP

+
+

How did I start?

+

I found a tutorial online on building a “spotify clone” which taught me the foundations for my app - authentication using NextAuth, state management using Recoil, and integrating the Spotify Web API with Nextjs.

+

Once I had the foundations, I could explore what I wanted with the Spotify API. I wanted to play around with different features, which brought me to an all encompassing “Discover Spotify” app. The most important thing for me was trying to build one feature: song and playlist recommendations based on a user’s listening habits. The playlists would be categorized into different "moods" or "vibes." The other features are more basic and display a user’s current listening habits.

+
+
+
+

DESIGN

+
+

Visual Design Elements

+

The visual design elements for this app were simple. I went for a darkmode look: black background, white text, easy layout. + I included horizontal scroll for the user's info and vertical scroll for the generated playlists to adhere to responsive design.

+
+ DiscoverSpotify Visual Design Elements +
+ {/*

Example of the look I've drafted on figma so far:

*/} +
+
+
+

BUILD

+
+

Spotify Web API

+

This app was pretty much built around my desire to play around with the Spotify API. I love listening to music, and I'm always looking for new songs. The API's "get recommendations" feature was a great way for me to build something that does that for me. I figured I could first get a user's listening habits (top artists and tracks), save the state of that info and then feed it as the seed entity to the recommendations function.

+

Authentication

+

Accessing a spotify user's information requires setting up authentication and middleware. The tutorial I found was really helpful in learning how to set up NextAuth, as well as a refresh token function. Since Spotify's API gives you an access token that expires, setting up an automatic refresh token renewal was key to ensuring that a user's session in the app would be able to persist.

+

State Management

+

The tutorial also showed me how to use Recoil for state management, which was really helpful for this project in particular since I didn't need to save too much information and it pairs with React. I just created as many "atoms" as I needed, which with Recoil are essentially individual data storage units. Atoms will also make it so that if you want to change the state of something stored in that specific unit, only components that are using that atom will be re-rendered.

+
+
+
+

THOUGHTS

+
+
    +
  • This continues to be one of the most headbanging yet rewarding projects I've ever started for myself. What they say about learning through doing is very true in this case - and it helps that I'm building something that I genuinely want to use for myself.
  • +
  • Sometimes I think to myself: if I'm having to debug something after every change, then maybe I should be learning more before doing. Which is also true in this case. After my first attempt at this project, I went through each step of the process and researched into how everything was actually working together. Rebuilding it using Typescript showed me I still have so much more to learn, but I'm going into it with a much better appreciation and understanding for how it's being built.
  • +
+
+
+
+
+
+
+ ) + } + + export default Dispotify \ No newline at end of file diff --git a/.next/build-manifest.json b/.next/build-manifest.json index 5b2268989..8b26950df 100644 --- a/.next/build-manifest.json +++ b/.next/build-manifest.json @@ -25,20 +25,10 @@ "static/chunks/main.js", "static/chunks/pages/_error.js" ], - "/cards/compass": [ + "/cards/dispotify": [ "static/chunks/webpack.js", "static/chunks/main.js", - "static/chunks/pages/cards/compass.js" - ], - "/cards/cssa": [ - "static/chunks/webpack.js", - "static/chunks/main.js", - "static/chunks/pages/cards/cssa.js" - ], - "/cards/hopsandbeans": [ - "static/chunks/webpack.js", - "static/chunks/main.js", - "static/chunks/pages/cards/hopsandbeans.js" + "static/chunks/pages/cards/dispotify.js" ] }, "ampFirstPages": [] diff --git a/.next/cache/images/4IOOUvojDxyzecoj37U+eP1sZ+fEv27lnVmEtIK9Aug=/60.1713174731199.XmjvFo1WVQll0shQ+3V6ucAfuxi9-sx28YhY6ziHFRA=.webp b/.next/cache/images/4IOOUvojDxyzecoj37U+eP1sZ+fEv27lnVmEtIK9Aug=/60.1713254028919.XmjvFo1WVQll0shQ+3V6ucAfuxi9-sx28YhY6ziHFRA=.webp similarity index 100% rename from .next/cache/images/4IOOUvojDxyzecoj37U+eP1sZ+fEv27lnVmEtIK9Aug=/60.1713174731199.XmjvFo1WVQll0shQ+3V6ucAfuxi9-sx28YhY6ziHFRA=.webp rename to .next/cache/images/4IOOUvojDxyzecoj37U+eP1sZ+fEv27lnVmEtIK9Aug=/60.1713254028919.XmjvFo1WVQll0shQ+3V6ucAfuxi9-sx28YhY6ziHFRA=.webp diff --git a/.next/cache/images/AEFL5FH2MDFNprOwrW2QISaSgHxjrD5g7HUItbc3CQw=/60.1713174733575.pYRNwF2PekuyO5-6tZ0wKtoY0PEJzyyGlGAJcfUU5bw=.webp b/.next/cache/images/AEFL5FH2MDFNprOwrW2QISaSgHxjrD5g7HUItbc3CQw=/60.1713254030631.pYRNwF2PekuyO5-6tZ0wKtoY0PEJzyyGlGAJcfUU5bw=.webp similarity index 100% rename from .next/cache/images/AEFL5FH2MDFNprOwrW2QISaSgHxjrD5g7HUItbc3CQw=/60.1713174733575.pYRNwF2PekuyO5-6tZ0wKtoY0PEJzyyGlGAJcfUU5bw=.webp rename to .next/cache/images/AEFL5FH2MDFNprOwrW2QISaSgHxjrD5g7HUItbc3CQw=/60.1713254030631.pYRNwF2PekuyO5-6tZ0wKtoY0PEJzyyGlGAJcfUU5bw=.webp diff --git a/.next/cache/images/ECl26zBRGYnAvSGwQKg-04fsx5bUJ7Bmhj8g4lVKB1k=/60.1713174733067.KlfOzan6JxW3JNBNFtvq7uOHUxl8+uN1Uct-+SNYcOY=.webp b/.next/cache/images/ECl26zBRGYnAvSGwQKg-04fsx5bUJ7Bmhj8g4lVKB1k=/60.1713254030148.KlfOzan6JxW3JNBNFtvq7uOHUxl8+uN1Uct-+SNYcOY=.webp similarity index 100% rename from .next/cache/images/ECl26zBRGYnAvSGwQKg-04fsx5bUJ7Bmhj8g4lVKB1k=/60.1713174733067.KlfOzan6JxW3JNBNFtvq7uOHUxl8+uN1Uct-+SNYcOY=.webp rename to .next/cache/images/ECl26zBRGYnAvSGwQKg-04fsx5bUJ7Bmhj8g4lVKB1k=/60.1713254030148.KlfOzan6JxW3JNBNFtvq7uOHUxl8+uN1Uct-+SNYcOY=.webp diff --git a/.next/cache/images/NQzfyNwC++Uz6+oUlfzlKRpMAxMWBymxgt-bgSPdPqg=/60.1713174735134.oS0tR+Q5RDvFKldReZIUuyUhmn3JK3DzPVZ6AR6iGNk=.webp b/.next/cache/images/NQzfyNwC++Uz6+oUlfzlKRpMAxMWBymxgt-bgSPdPqg=/60.1713254032384.oS0tR+Q5RDvFKldReZIUuyUhmn3JK3DzPVZ6AR6iGNk=.webp similarity index 100% rename from .next/cache/images/NQzfyNwC++Uz6+oUlfzlKRpMAxMWBymxgt-bgSPdPqg=/60.1713174735134.oS0tR+Q5RDvFKldReZIUuyUhmn3JK3DzPVZ6AR6iGNk=.webp rename to .next/cache/images/NQzfyNwC++Uz6+oUlfzlKRpMAxMWBymxgt-bgSPdPqg=/60.1713254032384.oS0tR+Q5RDvFKldReZIUuyUhmn3JK3DzPVZ6AR6iGNk=.webp diff --git a/.next/cache/images/SHV9iCfnSddLbuW7NbuIqm17X5wgRwWX+LEMQwI84nE=/60.1713253886836.dkD-kuTQKyyXxgFZIEggoxxSBQvYbLWuoQyS+SWZkM4=.webp b/.next/cache/images/SHV9iCfnSddLbuW7NbuIqm17X5wgRwWX+LEMQwI84nE=/60.1713253886836.dkD-kuTQKyyXxgFZIEggoxxSBQvYbLWuoQyS+SWZkM4=.webp new file mode 100644 index 000000000..3cde94c81 Binary files /dev/null and b/.next/cache/images/SHV9iCfnSddLbuW7NbuIqm17X5wgRwWX+LEMQwI84nE=/60.1713253886836.dkD-kuTQKyyXxgFZIEggoxxSBQvYbLWuoQyS+SWZkM4=.webp differ diff --git a/.next/cache/images/WJCY-tKdDFr2rcsRkvLuw1bQo9k2dlzLeFCyFADodGM=/60.1713174734282.zEOssxF87zRuXpwk4nW31jU1vrjgvTMa37yjsdJq28E=.webp b/.next/cache/images/WJCY-tKdDFr2rcsRkvLuw1bQo9k2dlzLeFCyFADodGM=/60.1713254031462.zEOssxF87zRuXpwk4nW31jU1vrjgvTMa37yjsdJq28E=.webp similarity index 100% rename from .next/cache/images/WJCY-tKdDFr2rcsRkvLuw1bQo9k2dlzLeFCyFADodGM=/60.1713174734282.zEOssxF87zRuXpwk4nW31jU1vrjgvTMa37yjsdJq28E=.webp rename to .next/cache/images/WJCY-tKdDFr2rcsRkvLuw1bQo9k2dlzLeFCyFADodGM=/60.1713254031462.zEOssxF87zRuXpwk4nW31jU1vrjgvTMa37yjsdJq28E=.webp diff --git a/.next/cache/images/b9pilR9bKaTfZPpMUBd5bILtwdgTKFoNWBfsk1NFIoI=/60.1713174731819.yokatXDeV-dDI2TftZhM82lcYqFD4SNd9pGX8+3C5pM=.webp b/.next/cache/images/b9pilR9bKaTfZPpMUBd5bILtwdgTKFoNWBfsk1NFIoI=/60.1713254027997.yokatXDeV-dDI2TftZhM82lcYqFD4SNd9pGX8+3C5pM=.webp similarity index 100% rename from .next/cache/images/b9pilR9bKaTfZPpMUBd5bILtwdgTKFoNWBfsk1NFIoI=/60.1713174731819.yokatXDeV-dDI2TftZhM82lcYqFD4SNd9pGX8+3C5pM=.webp rename to .next/cache/images/b9pilR9bKaTfZPpMUBd5bILtwdgTKFoNWBfsk1NFIoI=/60.1713254027997.yokatXDeV-dDI2TftZhM82lcYqFD4SNd9pGX8+3C5pM=.webp diff --git a/.next/cache/images/hvXJut9ZbUlG+wHMgdKBBlpSIYSa0thINYvXtZd3JH4=/60.1713174603281.vpVw6p4WRzuY3j1agLGKjnv8g2vMUmtzcXCPv-Bbj+4=.webp b/.next/cache/images/hvXJut9ZbUlG+wHMgdKBBlpSIYSa0thINYvXtZd3JH4=/60.1713250403980.vpVw6p4WRzuY3j1agLGKjnv8g2vMUmtzcXCPv-Bbj+4=.webp similarity index 100% rename from .next/cache/images/hvXJut9ZbUlG+wHMgdKBBlpSIYSa0thINYvXtZd3JH4=/60.1713174603281.vpVw6p4WRzuY3j1agLGKjnv8g2vMUmtzcXCPv-Bbj+4=.webp rename to .next/cache/images/hvXJut9ZbUlG+wHMgdKBBlpSIYSa0thINYvXtZd3JH4=/60.1713250403980.vpVw6p4WRzuY3j1agLGKjnv8g2vMUmtzcXCPv-Bbj+4=.webp diff --git a/.next/cache/images/kD9ESI0RTZPfyqGzTSn7xB2CuktCujAekrcseDOVdHM=/60.1713174056173.S34uNEqdu8kFs4uPfmvdvJPRh-tufHIxHZBLVUcOE8g=.webp b/.next/cache/images/kD9ESI0RTZPfyqGzTSn7xB2CuktCujAekrcseDOVdHM=/60.1713255083767.S34uNEqdu8kFs4uPfmvdvJPRh-tufHIxHZBLVUcOE8g=.webp similarity index 100% rename from .next/cache/images/kD9ESI0RTZPfyqGzTSn7xB2CuktCujAekrcseDOVdHM=/60.1713174056173.S34uNEqdu8kFs4uPfmvdvJPRh-tufHIxHZBLVUcOE8g=.webp rename to .next/cache/images/kD9ESI0RTZPfyqGzTSn7xB2CuktCujAekrcseDOVdHM=/60.1713255083767.S34uNEqdu8kFs4uPfmvdvJPRh-tufHIxHZBLVUcOE8g=.webp diff --git a/.next/cache/images/tduc6oPfeXELHyKVwMhgONHl3oL7iFyl3i8j50mF7p4=/60.1713162969106.7HnYhdMVXACMWki0wrRDYwH0Jpa3ryy00KCTvgWB61U=.webp b/.next/cache/images/tduc6oPfeXELHyKVwMhgONHl3oL7iFyl3i8j50mF7p4=/60.1713250381503.7HnYhdMVXACMWki0wrRDYwH0Jpa3ryy00KCTvgWB61U=.webp similarity index 100% rename from .next/cache/images/tduc6oPfeXELHyKVwMhgONHl3oL7iFyl3i8j50mF7p4=/60.1713162969106.7HnYhdMVXACMWki0wrRDYwH0Jpa3ryy00KCTvgWB61U=.webp rename to .next/cache/images/tduc6oPfeXELHyKVwMhgONHl3oL7iFyl3i8j50mF7p4=/60.1713250381503.7HnYhdMVXACMWki0wrRDYwH0Jpa3ryy00KCTvgWB61U=.webp diff --git a/.next/cache/webpack/client-development/0.pack b/.next/cache/webpack/client-development/0.pack index 0e4e756c4..d8b982c5b 100644 Binary files a/.next/cache/webpack/client-development/0.pack and b/.next/cache/webpack/client-development/0.pack differ diff --git a/.next/cache/webpack/client-development/1.pack b/.next/cache/webpack/client-development/1.pack index 50b4fd934..ece7aa902 100644 Binary files a/.next/cache/webpack/client-development/1.pack and b/.next/cache/webpack/client-development/1.pack differ diff --git a/.next/cache/webpack/client-development/12.pack b/.next/cache/webpack/client-development/12.pack index ebd03720c..436ea1492 100644 Binary files a/.next/cache/webpack/client-development/12.pack and b/.next/cache/webpack/client-development/12.pack differ diff --git a/.next/cache/webpack/client-development/14.pack b/.next/cache/webpack/client-development/14.pack index fa7e61c4b..0cf911377 100644 Binary files a/.next/cache/webpack/client-development/14.pack and b/.next/cache/webpack/client-development/14.pack differ diff --git a/.next/cache/webpack/client-development/15.pack b/.next/cache/webpack/client-development/15.pack index d8b982c5b..106121fb2 100644 Binary files a/.next/cache/webpack/client-development/15.pack and b/.next/cache/webpack/client-development/15.pack differ diff --git a/.next/cache/webpack/client-development/16.pack b/.next/cache/webpack/client-development/16.pack index 8ad445283..b76456961 100644 Binary files a/.next/cache/webpack/client-development/16.pack and b/.next/cache/webpack/client-development/16.pack differ diff --git a/.next/cache/webpack/client-development/17.pack b/.next/cache/webpack/client-development/17.pack index eb9fa70da..1452bbb8a 100644 Binary files a/.next/cache/webpack/client-development/17.pack and b/.next/cache/webpack/client-development/17.pack differ diff --git a/.next/cache/webpack/client-development/20.pack b/.next/cache/webpack/client-development/20.pack index 13a4528a5..0fad9609a 100644 Binary files a/.next/cache/webpack/client-development/20.pack and b/.next/cache/webpack/client-development/20.pack differ diff --git a/.next/cache/webpack/client-development/21.pack b/.next/cache/webpack/client-development/21.pack index 9afb8f9a5..dc9af4a3a 100644 Binary files a/.next/cache/webpack/client-development/21.pack and b/.next/cache/webpack/client-development/21.pack differ diff --git a/.next/cache/webpack/client-development/22.pack b/.next/cache/webpack/client-development/22.pack index 420c2355e..51abf66d5 100644 Binary files a/.next/cache/webpack/client-development/22.pack and b/.next/cache/webpack/client-development/22.pack differ diff --git a/.next/cache/webpack/client-development/23.pack b/.next/cache/webpack/client-development/23.pack index d0128dae3..d0780cc9b 100644 Binary files a/.next/cache/webpack/client-development/23.pack and b/.next/cache/webpack/client-development/23.pack differ diff --git a/.next/cache/webpack/client-development/24.pack b/.next/cache/webpack/client-development/24.pack index 24dde7fdd..d6a333414 100644 Binary files a/.next/cache/webpack/client-development/24.pack and b/.next/cache/webpack/client-development/24.pack differ diff --git a/.next/cache/webpack/client-development/25.pack b/.next/cache/webpack/client-development/25.pack index c2964206a..8bb9dcbb8 100644 Binary files a/.next/cache/webpack/client-development/25.pack and b/.next/cache/webpack/client-development/25.pack differ diff --git a/.next/cache/webpack/client-development/4.pack b/.next/cache/webpack/client-development/4.pack index 1af0d0f32..f8341516b 100644 Binary files a/.next/cache/webpack/client-development/4.pack and b/.next/cache/webpack/client-development/4.pack differ diff --git a/.next/cache/webpack/client-development/5.pack b/.next/cache/webpack/client-development/5.pack index 15678f05d..3b34db3e5 100644 Binary files a/.next/cache/webpack/client-development/5.pack and b/.next/cache/webpack/client-development/5.pack differ diff --git a/.next/cache/webpack/client-development/index.pack b/.next/cache/webpack/client-development/index.pack index 6deb18cab..f4de8fb2d 100644 Binary files a/.next/cache/webpack/client-development/index.pack and b/.next/cache/webpack/client-development/index.pack differ diff --git a/.next/cache/webpack/client-development/index.pack 282.pack b/.next/cache/webpack/client-development/index.pack 282.pack new file mode 100644 index 000000000..8878ff129 Binary files /dev/null and b/.next/cache/webpack/client-development/index.pack 282.pack differ diff --git a/.next/cache/webpack/client-development/index.pack.old b/.next/cache/webpack/client-development/index.pack.old index fb8c35f49..f15ed7e6d 100644 Binary files a/.next/cache/webpack/client-development/index.pack.old and b/.next/cache/webpack/client-development/index.pack.old differ diff --git a/.next/cache/webpack/client-development/index.pack.pack b/.next/cache/webpack/client-development/index.pack.pack index 8878ff129..6deb18cab 100644 Binary files a/.next/cache/webpack/client-development/index.pack.pack and b/.next/cache/webpack/client-development/index.pack.pack differ diff --git a/.next/cache/webpack/server-development/0.pack b/.next/cache/webpack/server-development/0.pack index ffa482986..8b3082166 100644 Binary files a/.next/cache/webpack/server-development/0.pack and b/.next/cache/webpack/server-development/0.pack differ diff --git a/.next/cache/webpack/server-development/1.pack b/.next/cache/webpack/server-development/1.pack index 3703eb063..99bdfff35 100644 Binary files a/.next/cache/webpack/server-development/1.pack and b/.next/cache/webpack/server-development/1.pack differ diff --git a/.next/cache/webpack/server-development/10.pack b/.next/cache/webpack/server-development/10.pack index e02d2e0b3..d10f3f75d 100644 Binary files a/.next/cache/webpack/server-development/10.pack and b/.next/cache/webpack/server-development/10.pack differ diff --git a/.next/cache/webpack/server-development/13.pack b/.next/cache/webpack/server-development/13.pack index efd2cd51c..2065d0fea 100644 Binary files a/.next/cache/webpack/server-development/13.pack and b/.next/cache/webpack/server-development/13.pack differ diff --git a/.next/cache/webpack/server-development/14.pack b/.next/cache/webpack/server-development/14.pack index ddc344af6..8d3c4cd87 100644 Binary files a/.next/cache/webpack/server-development/14.pack and b/.next/cache/webpack/server-development/14.pack differ diff --git a/.next/cache/webpack/server-development/15.pack b/.next/cache/webpack/server-development/15.pack index 336b021f6..18eb2d27f 100644 Binary files a/.next/cache/webpack/server-development/15.pack and b/.next/cache/webpack/server-development/15.pack differ diff --git a/.next/cache/webpack/server-development/16.pack b/.next/cache/webpack/server-development/16.pack index bcca16e5e..35ab76372 100644 Binary files a/.next/cache/webpack/server-development/16.pack and b/.next/cache/webpack/server-development/16.pack differ diff --git a/.next/cache/webpack/server-development/17.pack b/.next/cache/webpack/server-development/17.pack index 698c8fbfa..2e0bee37b 100644 Binary files a/.next/cache/webpack/server-development/17.pack and b/.next/cache/webpack/server-development/17.pack differ diff --git a/.next/cache/webpack/server-development/3.pack b/.next/cache/webpack/server-development/3.pack index 016e63a00..bc1aedf97 100644 Binary files a/.next/cache/webpack/server-development/3.pack and b/.next/cache/webpack/server-development/3.pack differ diff --git a/.next/cache/webpack/server-development/4.pack b/.next/cache/webpack/server-development/4.pack index df94381ec..4a7f794d6 100644 Binary files a/.next/cache/webpack/server-development/4.pack and b/.next/cache/webpack/server-development/4.pack differ diff --git a/.next/cache/webpack/server-development/7.pack b/.next/cache/webpack/server-development/7.pack index ce8f31931..818fe0edb 100644 Binary files a/.next/cache/webpack/server-development/7.pack and b/.next/cache/webpack/server-development/7.pack differ diff --git a/.next/cache/webpack/server-development/index 15.pack b/.next/cache/webpack/server-development/index 15.pack new file mode 100644 index 000000000..1bc70be95 Binary files /dev/null and b/.next/cache/webpack/server-development/index 15.pack differ diff --git a/.next/cache/webpack/server-development/index.pack b/.next/cache/webpack/server-development/index.pack index 1bc70be95..636ab1103 100644 Binary files a/.next/cache/webpack/server-development/index.pack and b/.next/cache/webpack/server-development/index.pack differ diff --git a/.next/cache/webpack/server-development/index.pack.old b/.next/cache/webpack/server-development/index.pack.old index 08e081d02..76d171391 100644 Binary files a/.next/cache/webpack/server-development/index.pack.old and b/.next/cache/webpack/server-development/index.pack.old differ diff --git a/.next/server/_error.js b/.next/server/_error.js new file mode 100644 index 000000000..001eb094f --- /dev/null +++ b/.next/server/_error.js @@ -0,0 +1,66 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +(() => { +var exports = {}; +exports.id = "/_error"; +exports.ids = ["/_error"]; +exports.modules = { + +/***/ "./node_modules/@swc/helpers/lib/_interop_require_default.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@swc/helpers/lib/_interop_require_default.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports[\"default\"] = _interopRequireDefault;\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHN3Yy9oZWxwZXJzL2xpYi9faW50ZXJvcF9yZXF1aXJlX2RlZmF1bHQuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkM7QUFDN0M7QUFDQSxDQUFDLEVBQUM7QUFDRixrQkFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tY2dwb3J0Zm8vLi9ub2RlX21vZHVsZXMvQHN3Yy9oZWxwZXJzL2xpYi9faW50ZXJvcF9yZXF1aXJlX2RlZmF1bHQuanM/OWI3YyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQ7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7XG4gICAgICAgIGRlZmF1bHQ6IG9ialxuICAgIH07XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@swc/helpers/lib/_interop_require_default.js\n"); + +/***/ }), + +/***/ "./node_modules/next/dist/pages/_error.js": +/*!************************************************!*\ + !*** ./node_modules/next/dist/pages/_error.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports[\"default\"] = void 0;\nvar _interop_require_default = (__webpack_require__(/*! @swc/helpers/lib/_interop_require_default.js */ \"./node_modules/@swc/helpers/lib/_interop_require_default.js\")[\"default\"]);\nvar _react = _interop_require_default(__webpack_require__(/*! react */ \"react\"));\nvar _head = _interop_require_default(__webpack_require__(/*! ../shared/lib/head */ \"../shared/lib/head\"));\nconst statusCodes = {\n 400: \"Bad Request\",\n 404: \"This page could not be found\",\n 405: \"Method Not Allowed\",\n 500: \"Internal Server Error\"\n};\nfunction _getInitialProps({ res , err }) {\n const statusCode = res && res.statusCode ? res.statusCode : err ? err.statusCode : 404;\n return {\n statusCode\n };\n}\nconst styles = {\n error: {\n fontFamily: '-apple-system, BlinkMacSystemFont, Roboto, \"Segoe UI\", \"Fira Sans\", Avenir, \"Helvetica Neue\", \"Lucida Grande\", sans-serif',\n height: \"100vh\",\n textAlign: \"center\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\"\n },\n desc: {\n display: \"inline-block\",\n textAlign: \"left\",\n lineHeight: \"49px\",\n height: \"49px\",\n verticalAlign: \"middle\"\n },\n h1: {\n display: \"inline-block\",\n margin: 0,\n marginRight: \"20px\",\n padding: \"0 23px 0 0\",\n fontSize: \"24px\",\n fontWeight: 500,\n verticalAlign: \"top\",\n lineHeight: \"49px\"\n },\n h2: {\n fontSize: \"14px\",\n fontWeight: \"normal\",\n lineHeight: \"49px\",\n margin: 0,\n padding: 0\n }\n};\nvar _Component;\nclass Error extends (_Component = _react.default.Component) {\n render() {\n const { statusCode , withDarkMode =true } = this.props;\n const title = this.props.title || statusCodes[statusCode] || \"An unexpected error has occurred\";\n return /*#__PURE__*/ _react.default.createElement(\"div\", {\n style: styles.error\n }, /*#__PURE__*/ _react.default.createElement(_head.default, null, /*#__PURE__*/ _react.default.createElement(\"title\", null, statusCode ? `${statusCode}: ${title}` : \"Application error: a client-side exception has occurred\")), /*#__PURE__*/ _react.default.createElement(\"div\", null, /*#__PURE__*/ _react.default.createElement(\"style\", {\n dangerouslySetInnerHTML: {\n __html: `\n body { margin: 0; color: #000; background: #fff; }\n .next-error-h1 {\n border-right: 1px solid rgba(0, 0, 0, .3);\n }\n\n ${withDarkMode ? `@media (prefers-color-scheme: dark) {\n body { color: #fff; background: #000; }\n .next-error-h1 {\n border-right: 1px solid rgba(255, 255, 255, .3);\n }\n }` : \"\"}`\n }\n }), statusCode ? /*#__PURE__*/ _react.default.createElement(\"h1\", {\n className: \"next-error-h1\",\n style: styles.h1\n }, statusCode) : null, /*#__PURE__*/ _react.default.createElement(\"div\", {\n style: styles.desc\n }, /*#__PURE__*/ _react.default.createElement(\"h2\", {\n style: styles.h2\n }, this.props.title || statusCode ? title : /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, \"Application error: a client-side exception has occurred (see the browser console for more information)\"), \".\"))));\n }\n}\nError.displayName = \"ErrorPage\";\nError.getInitialProps = _getInitialProps;\nError.origGetInitialProps = _getInitialProps;\nexports[\"default\"] = Error; //# sourceMappingURL=_error.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L3BhZ2VzL19lcnJvci5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiQSw4Q0FBNkM7SUFDekNHLE9BQU8sSUFBSTtBQUNmLENBQUMsRUFBQztBQUNGRCxrQkFBZSxHQUFHLEtBQUs7QUFDdkIsSUFBSUcsMkJBQTJCQyxtSkFBK0Q7QUFDOUYsSUFBSUMsU0FBU0YseUJBQXlCQyxtQkFBT0EsQ0FBQyxvQkFBTztBQUNyRCxJQUFJRSxRQUFRSCx5QkFBeUJDLG1CQUFPQSxDQUFDLDhDQUFvQjtBQUNqRSxNQUFNRyxjQUFjO0lBQ2hCLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7QUFDVDtBQUNBLFNBQVNDLGlCQUFpQixFQUFFQyxJQUFHLEVBQUdDLElBQUcsRUFBRyxFQUFFO0lBQ3RDLE1BQU1DLGFBQWFGLE9BQU9BLElBQUlFLFVBQVUsR0FBR0YsSUFBSUUsVUFBVSxHQUFHRCxNQUFNQSxJQUFJQyxVQUFVLEdBQUcsR0FBRztJQUN0RixPQUFPO1FBQ0hBO0lBQ0o7QUFDSjtBQUNBLE1BQU1DLFNBQVM7SUFDWEMsT0FBTztRQUNIQyxZQUFZO1FBQ1pDLFFBQVE7UUFDUkMsV0FBVztRQUNYQyxTQUFTO1FBQ1RDLGVBQWU7UUFDZkMsWUFBWTtRQUNaQyxnQkFBZ0I7SUFDcEI7SUFDQUMsTUFBTTtRQUNGSixTQUFTO1FBQ1RELFdBQVc7UUFDWE0sWUFBWTtRQUNaUCxRQUFRO1FBQ1JRLGVBQWU7SUFDbkI7SUFDQUMsSUFBSTtRQUNBUCxTQUFTO1FBQ1RRLFFBQVE7UUFDUkMsYUFBYTtRQUNiQyxTQUFTO1FBQ1RDLFVBQVU7UUFDVkMsWUFBWTtRQUNaTixlQUFlO1FBQ2ZELFlBQVk7SUFDaEI7SUFDQVEsSUFBSTtRQUNBRixVQUFVO1FBQ1ZDLFlBQVk7UUFDWlAsWUFBWTtRQUNaRyxRQUFRO1FBQ1JFLFNBQVM7SUFDYjtBQUNKO0FBQ0EsSUFBSUk7QUFDSixNQUFNQyxjQUFlRCxDQUFBQSxhQUFhMUIsT0FBT0gsT0FBTyxDQUFDK0IsU0FBUztJQUN0REMsU0FBUztRQUNMLE1BQU0sRUFBRXZCLFdBQVUsRUFBR3dCLGNBQWMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDQyxLQUFLO1FBQ3ZELE1BQU1DLFFBQVEsSUFBSSxDQUFDRCxLQUFLLENBQUNDLEtBQUssSUFBSTlCLFdBQVcsQ0FBQ0ksV0FBVyxJQUFJO1FBQzdELE9BQU8sV0FBVyxHQUFHTixPQUFPSCxPQUFPLENBQUNvQyxhQUFhLENBQUMsT0FBTztZQUNyREMsT0FBTzNCLE9BQU9DLEtBQUs7UUFDdkIsR0FBRyxXQUFXLEdBQUdSLE9BQU9ILE9BQU8sQ0FBQ29DLGFBQWEsQ0FBQ2hDLE1BQU1KLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxHQUFHRyxPQUFPSCxPQUFPLENBQUNvQyxhQUFhLENBQUMsU0FBUyxJQUFJLEVBQUUzQixhQUFhLENBQUMsRUFBRUEsV0FBVyxFQUFFLEVBQUUwQixNQUFNLENBQUMsR0FBRyx5REFBeUQsSUFBSSxXQUFXLEdBQUdoQyxPQUFPSCxPQUFPLENBQUNvQyxhQUFhLENBQUMsT0FBTyxJQUFJLEVBQUUsV0FBVyxHQUFHakMsT0FBT0gsT0FBTyxDQUFDb0MsYUFBYSxDQUFDLFNBQVM7WUFDM1VFLHlCQUF5QjtnQkFDckJDLFFBQVEsQ0FBQzs7Ozs7O2dCQU1ULEVBQUVOLGVBQWUsQ0FBQzs7Ozs7aUJBS2pCLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNiO1FBQ0osSUFBSXhCLGFBQWEsV0FBVyxHQUFHTixPQUFPSCxPQUFPLENBQUNvQyxhQUFhLENBQUMsTUFBTTtZQUM5REksV0FBVztZQUNYSCxPQUFPM0IsT0FBT1ksRUFBRTtRQUNwQixHQUFHYixjQUFjLElBQUksRUFBRSxXQUFXLEdBQUdOLE9BQU9ILE9BQU8sQ0FBQ29DLGFBQWEsQ0FBQyxPQUFPO1lBQ3JFQyxPQUFPM0IsT0FBT1MsSUFBSTtRQUN0QixHQUFHLFdBQVcsR0FBR2hCLE9BQU9ILE9BQU8sQ0FBQ29DLGFBQWEsQ0FBQyxNQUFNO1lBQ2hEQyxPQUFPM0IsT0FBT2tCLEVBQUU7UUFDcEIsR0FBRyxJQUFJLENBQUNNLEtBQUssQ0FBQ0MsS0FBSyxJQUFJMUIsYUFBYTBCLFFBQVEsV0FBVyxHQUFHaEMsT0FBT0gsT0FBTyxDQUFDb0MsYUFBYSxDQUFDakMsT0FBT0gsT0FBTyxDQUFDeUMsUUFBUSxFQUFFLElBQUksRUFBRSx5R0FBeUcsRUFBRTtJQUNyTztBQUNKO0FBQ0FYLE1BQU1ZLFdBQVcsR0FBRztBQUNwQlosTUFBTWEsZUFBZSxHQUFHckM7QUFDeEJ3QixNQUFNYyxtQkFBbUIsR0FBR3RDO0FBQzVCUixrQkFBZSxHQUFHZ0MsT0FFbEIsa0NBQWtDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWNncG9ydGZvLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9wYWdlcy9fZXJyb3IuanM/MThmMiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaW50ZXJvcF9yZXF1aXJlX2RlZmF1bHQgPSByZXF1aXJlKFwiQHN3Yy9oZWxwZXJzL2xpYi9faW50ZXJvcF9yZXF1aXJlX2RlZmF1bHQuanNcIikuZGVmYXVsdDtcbnZhciBfcmVhY3QgPSBfaW50ZXJvcF9yZXF1aXJlX2RlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfaGVhZCA9IF9pbnRlcm9wX3JlcXVpcmVfZGVmYXVsdChyZXF1aXJlKFwiLi4vc2hhcmVkL2xpYi9oZWFkXCIpKTtcbmNvbnN0IHN0YXR1c0NvZGVzID0ge1xuICAgIDQwMDogJ0JhZCBSZXF1ZXN0JyxcbiAgICA0MDQ6ICdUaGlzIHBhZ2UgY291bGQgbm90IGJlIGZvdW5kJyxcbiAgICA0MDU6ICdNZXRob2QgTm90IEFsbG93ZWQnLFxuICAgIDUwMDogJ0ludGVybmFsIFNlcnZlciBFcnJvcidcbn07XG5mdW5jdGlvbiBfZ2V0SW5pdGlhbFByb3BzKHsgcmVzICwgZXJyICB9KSB7XG4gICAgY29uc3Qgc3RhdHVzQ29kZSA9IHJlcyAmJiByZXMuc3RhdHVzQ29kZSA/IHJlcy5zdGF0dXNDb2RlIDogZXJyID8gZXJyLnN0YXR1c0NvZGUgOiA0MDQ7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzQ29kZVxuICAgIH07XG59XG5jb25zdCBzdHlsZXMgPSB7XG4gICAgZXJyb3I6IHtcbiAgICAgICAgZm9udEZhbWlseTogJy1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgUm9ib3RvLCBcIlNlZ29lIFVJXCIsIFwiRmlyYSBTYW5zXCIsIEF2ZW5pciwgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBcIkx1Y2lkYSBHcmFuZGVcIiwgc2Fucy1zZXJpZicsXG4gICAgICAgIGhlaWdodDogJzEwMHZoJyxcbiAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJ1xuICAgIH0sXG4gICAgZGVzYzoge1xuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgdGV4dEFsaWduOiAnbGVmdCcsXG4gICAgICAgIGxpbmVIZWlnaHQ6ICc0OXB4JyxcbiAgICAgICAgaGVpZ2h0OiAnNDlweCcsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnXG4gICAgfSxcbiAgICBoMToge1xuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICBtYXJnaW5SaWdodDogJzIwcHgnLFxuICAgICAgICBwYWRkaW5nOiAnMCAyM3B4IDAgMCcsXG4gICAgICAgIGZvbnRTaXplOiAnMjRweCcsXG4gICAgICAgIGZvbnRXZWlnaHQ6IDUwMCxcbiAgICAgICAgdmVydGljYWxBbGlnbjogJ3RvcCcsXG4gICAgICAgIGxpbmVIZWlnaHQ6ICc0OXB4J1xuICAgIH0sXG4gICAgaDI6IHtcbiAgICAgICAgZm9udFNpemU6ICcxNHB4JyxcbiAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCcsXG4gICAgICAgIGxpbmVIZWlnaHQ6ICc0OXB4JyxcbiAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICBwYWRkaW5nOiAwXG4gICAgfVxufTtcbnZhciBfQ29tcG9uZW50O1xuY2xhc3MgRXJyb3IgZXh0ZW5kcyAoX0NvbXBvbmVudCA9IF9yZWFjdC5kZWZhdWx0LkNvbXBvbmVudCkge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXNDb2RlICwgd2l0aERhcmtNb2RlID10cnVlICB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLnByb3BzLnRpdGxlIHx8IHN0YXR1c0NvZGVzW3N0YXR1c0NvZGVdIHx8ICdBbiB1bmV4cGVjdGVkIGVycm9yIGhhcyBvY2N1cnJlZCc7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgc3R5bGU6IHN0eWxlcy5lcnJvclxuICAgICAgICB9LCAvKiNfX1BVUkVfXyovIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX2hlYWQuZGVmYXVsdCwgbnVsbCwgLyojX19QVVJFX18qLyBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGl0bGVcIiwgbnVsbCwgc3RhdHVzQ29kZSA/IGAke3N0YXR1c0NvZGV9OiAke3RpdGxlfWAgOiAnQXBwbGljYXRpb24gZXJyb3I6IGEgY2xpZW50LXNpZGUgZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCcpKSwgLyojX19QVVJFX18qLyBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIC8qI19fUFVSRV9fKi8gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIsIHtcbiAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICAgICAgICAgICAgX19odG1sOiBgXG4gICAgICAgICAgICAgICAgYm9keSB7IG1hcmdpbjogMDsgY29sb3I6ICMwMDA7IGJhY2tncm91bmQ6ICNmZmY7IH1cbiAgICAgICAgICAgICAgICAubmV4dC1lcnJvci1oMSB7XG4gICAgICAgICAgICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIC4zKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAke3dpdGhEYXJrTW9kZSA/IGBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7XG4gICAgICAgICAgICAgICAgICBib2R5IHsgY29sb3I6ICNmZmY7IGJhY2tncm91bmQ6ICMwMDA7IH1cbiAgICAgICAgICAgICAgICAgIC5uZXh0LWVycm9yLWgxIHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAuMyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfWAgOiAnJ31gXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLCBzdGF0dXNDb2RlID8gLyojX19QVVJFX18qLyBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaDFcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIm5leHQtZXJyb3ItaDFcIixcbiAgICAgICAgICAgIHN0eWxlOiBzdHlsZXMuaDFcbiAgICAgICAgfSwgc3RhdHVzQ29kZSkgOiBudWxsLCAvKiNfX1BVUkVfXyovIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgc3R5bGU6IHN0eWxlcy5kZXNjXG4gICAgICAgIH0sIC8qI19fUFVSRV9fKi8gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImgyXCIsIHtcbiAgICAgICAgICAgIHN0eWxlOiBzdHlsZXMuaDJcbiAgICAgICAgfSwgdGhpcy5wcm9wcy50aXRsZSB8fCBzdGF0dXNDb2RlID8gdGl0bGUgOiAvKiNfX1BVUkVfXyovIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX3JlYWN0LmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIFwiQXBwbGljYXRpb24gZXJyb3I6IGEgY2xpZW50LXNpZGUgZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCAoc2VlIHRoZSBicm93c2VyIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24pXCIpLCBcIi5cIikpKSk7XG4gICAgfVxufVxuRXJyb3IuZGlzcGxheU5hbWUgPSAnRXJyb3JQYWdlJztcbkVycm9yLmdldEluaXRpYWxQcm9wcyA9IF9nZXRJbml0aWFsUHJvcHM7XG5FcnJvci5vcmlnR2V0SW5pdGlhbFByb3BzID0gX2dldEluaXRpYWxQcm9wcztcbmV4cG9ydHMuZGVmYXVsdCA9IEVycm9yO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1fZXJyb3IuanMubWFwIl0sIm5hbWVzIjpbIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZXhwb3J0cyIsInZhbHVlIiwiZGVmYXVsdCIsIl9pbnRlcm9wX3JlcXVpcmVfZGVmYXVsdCIsInJlcXVpcmUiLCJfcmVhY3QiLCJfaGVhZCIsInN0YXR1c0NvZGVzIiwiX2dldEluaXRpYWxQcm9wcyIsInJlcyIsImVyciIsInN0YXR1c0NvZGUiLCJzdHlsZXMiLCJlcnJvciIsImZvbnRGYW1pbHkiLCJoZWlnaHQiLCJ0ZXh0QWxpZ24iLCJkaXNwbGF5IiwiZmxleERpcmVjdGlvbiIsImFsaWduSXRlbXMiLCJqdXN0aWZ5Q29udGVudCIsImRlc2MiLCJsaW5lSGVpZ2h0IiwidmVydGljYWxBbGlnbiIsImgxIiwibWFyZ2luIiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nIiwiZm9udFNpemUiLCJmb250V2VpZ2h0IiwiaDIiLCJfQ29tcG9uZW50IiwiRXJyb3IiLCJDb21wb25lbnQiLCJyZW5kZXIiLCJ3aXRoRGFya01vZGUiLCJwcm9wcyIsInRpdGxlIiwiY3JlYXRlRWxlbWVudCIsInN0eWxlIiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJfX2h0bWwiLCJjbGFzc05hbWUiLCJGcmFnbWVudCIsImRpc3BsYXlOYW1lIiwiZ2V0SW5pdGlhbFByb3BzIiwib3JpZ0dldEluaXRpYWxQcm9wcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/next/dist/pages/_error.js\n"); + +/***/ }), + +/***/ "../shared/lib/head": +/*!***********************************************!*\ + !*** external "next/dist/shared/lib/head.js" ***! + \***********************************************/ +/***/ ((module) => { + +module.exports = require("next/dist/shared/lib/head.js"); + +/***/ }), + +/***/ "react": +/*!************************!*\ + !*** external "react" ***! + \************************/ +/***/ ((module) => { + +module.exports = require("react"); + +/***/ }) + +}; +; + +// load runtime +var __webpack_require__ = require("../webpack-runtime.js"); +__webpack_require__.C(exports); +var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +var __webpack_exports__ = (__webpack_exec__("./node_modules/next/dist/pages/_error.js")); +module.exports = __webpack_exports__; + +})(); \ No newline at end of file diff --git a/.next/server/middleware-build-manifest.js b/.next/server/middleware-build-manifest.js index 9413ac984..956c90f43 100644 --- a/.next/server/middleware-build-manifest.js +++ b/.next/server/middleware-build-manifest.js @@ -1 +1 @@ -self.__BUILD_MANIFEST={"polyfillFiles":["static/chunks/polyfills.js"],"devFiles":["static/chunks/react-refresh.js"],"ampDevFiles":["static/chunks/webpack.js","static/chunks/amp.js"],"lowPriorityFiles":["static/development/_buildManifest.js","static/development/_ssgManifest.js"],"rootMainFiles":[],"pages":{"/_app":["static/chunks/webpack.js","static/chunks/main.js","static/chunks/pages/_app.js"],"/_error":["static/chunks/webpack.js","static/chunks/main.js","static/chunks/pages/_error.js"],"/cards/compass":["static/chunks/webpack.js","static/chunks/main.js","static/chunks/pages/cards/compass.js"],"/cards/cssa":["static/chunks/webpack.js","static/chunks/main.js","static/chunks/pages/cards/cssa.js"],"/cards/hopsandbeans":["static/chunks/webpack.js","static/chunks/main.js","static/chunks/pages/cards/hopsandbeans.js"]},"ampFirstPages":[]} \ No newline at end of file +self.__BUILD_MANIFEST={"polyfillFiles":["static/chunks/polyfills.js"],"devFiles":["static/chunks/react-refresh.js"],"ampDevFiles":["static/chunks/webpack.js","static/chunks/amp.js"],"lowPriorityFiles":["static/development/_buildManifest.js","static/development/_ssgManifest.js"],"rootMainFiles":[],"pages":{"/_app":["static/chunks/webpack.js","static/chunks/main.js","static/chunks/pages/_app.js"],"/_error":["static/chunks/webpack.js","static/chunks/main.js","static/chunks/pages/_error.js"],"/cards/dispotify":["static/chunks/webpack.js","static/chunks/main.js","static/chunks/pages/cards/dispotify.js"]},"ampFirstPages":[]} \ No newline at end of file diff --git a/.next/server/pages-manifest.json b/.next/server/pages-manifest.json index 2cdb745ec..ed158f7de 100644 --- a/.next/server/pages-manifest.json +++ b/.next/server/pages-manifest.json @@ -2,7 +2,5 @@ "/_app": "pages/_app.js", "/_error": "pages/_error.js", "/_document": "pages/_document.js", - "/cards/hopsandbeans": "pages/cards/hopsandbeans.js", - "/cards/cssa": "pages/cards/cssa.js", - "/cards/compass": "pages/cards/compass.js" + "/cards/dispotify": "pages/cards/dispotify.js" } \ No newline at end of file diff --git a/.next/server/pages/cards/compass.js b/.next/server/pages/cards/compass.js deleted file mode 100644 index 1a3f79e90..000000000 --- a/.next/server/pages/cards/compass.js +++ /dev/null @@ -1,837 +0,0 @@ -/* - * ATTENTION: An "eval-source-map" devtool has been used. - * This devtool is neither made for production nor for readable output files. - * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. - * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) - * or disable the default devtool with "devtool: false". - * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). - */ -(() => { -var exports = {}; -exports.id = "pages/cards/compass"; -exports.ids = ["pages/cards/compass"]; -exports.modules = { - -/***/ "./node_modules/@swc/helpers/lib/_async_to_generator.js": -/*!**************************************************************!*\ - !*** ./node_modules/@swc/helpers/lib/_async_to_generator.js ***! - \**************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports[\"default\"] = _asyncToGenerator;\nfunction _asyncToGenerator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHN3Yy9oZWxwZXJzL2xpYi9fYXN5bmNfdG9fZ2VuZXJhdG9yLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQTZDO0FBQzdDO0FBQ0EsQ0FBQyxFQUFDO0FBQ0Ysa0JBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWNncG9ydGZvLy4vbm9kZV9tb2R1bGVzL0Bzd2MvaGVscGVycy9saWIvX2FzeW5jX3RvX2dlbmVyYXRvci5qcz8wZTMwIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2FzeW5jVG9HZW5lcmF0b3I7XG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5mdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@swc/helpers/lib/_async_to_generator.js\n"); - -/***/ }), - -/***/ "./node_modules/@swc/helpers/lib/_extends.js": -/*!***************************************************!*\ - !*** ./node_modules/@swc/helpers/lib/_extends.js ***! - \***************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports[\"default\"] = _extends;\nfunction _extends() {\n return extends_.apply(this, arguments);\n}\nfunction extends_() {\n extends_ = Object.assign || function(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i];\n for(var key in source){\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return extends_.apply(this, arguments);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHN3Yy9oZWxwZXJzL2xpYi9fZXh0ZW5kcy5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQztBQUNGLGtCQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL21jZ3BvcnRmby8uL25vZGVfbW9kdWxlcy9Ac3djL2hlbHBlcnMvbGliL19leHRlbmRzLmpzPzM5OGEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBfZXh0ZW5kcztcbmZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICAgIHJldHVybiBleHRlbmRzXy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gZXh0ZW5kc18oKSB7XG4gICAgZXh0ZW5kc18gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICBmb3IodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IodmFyIGtleSBpbiBzb3VyY2Upe1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbiAgICByZXR1cm4gZXh0ZW5kc18uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@swc/helpers/lib/_extends.js\n"); - -/***/ }), - -/***/ "./node_modules/@swc/helpers/lib/_interop_require_default.js": -/*!*******************************************************************!*\ - !*** ./node_modules/@swc/helpers/lib/_interop_require_default.js ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports[\"default\"] = _interopRequireDefault;\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHN3Yy9oZWxwZXJzL2xpYi9faW50ZXJvcF9yZXF1aXJlX2RlZmF1bHQuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkM7QUFDN0M7QUFDQSxDQUFDLEVBQUM7QUFDRixrQkFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tY2dwb3J0Zm8vLi9ub2RlX21vZHVsZXMvQHN3Yy9oZWxwZXJzL2xpYi9faW50ZXJvcF9yZXF1aXJlX2RlZmF1bHQuanM/OWI3YyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQ7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7XG4gICAgICAgIGRlZmF1bHQ6IG9ialxuICAgIH07XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@swc/helpers/lib/_interop_require_default.js\n"); - -/***/ }), - -/***/ "./node_modules/@swc/helpers/lib/_interop_require_wildcard.js": -/*!********************************************************************!*\ - !*** ./node_modules/@swc/helpers/lib/_interop_require_wildcard.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports[\"default\"] = _interopRequireWildcard;\nfunction _interopRequireWildcard(obj, nodeInterop) {\n if (!nodeInterop && obj && obj.__esModule) {\n return obj;\n }\n if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") {\n return {\n default: obj\n };\n }\n var cache = _getRequireWildcardCache(nodeInterop);\n if (cache && cache.has(obj)) {\n return cache.get(obj);\n }\n var newObj = {};\n var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n for(var key in obj){\n if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) {\n var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n if (desc && (desc.get || desc.set)) {\n Object.defineProperty(newObj, key, desc);\n } else {\n newObj[key] = obj[key];\n }\n }\n }\n newObj.default = obj;\n if (cache) {\n cache.set(obj, newObj);\n }\n return newObj;\n}\nfunction _getRequireWildcardCache(nodeInterop1) {\n if (typeof WeakMap !== \"function\") return null;\n var cacheBabelInterop = new WeakMap();\n var cacheNodeInterop = new WeakMap();\n return (_getRequireWildcardCache = function(nodeInterop) {\n return nodeInterop ? cacheNodeInterop : cacheBabelInterop;\n })(nodeInterop1);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHN3Yy9oZWxwZXJzL2xpYi9faW50ZXJvcF9yZXF1aXJlX3dpbGRjYXJkLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQTZDO0FBQzdDO0FBQ0EsQ0FBQyxFQUFDO0FBQ0Ysa0JBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWNncG9ydGZvLy4vbm9kZV9tb2R1bGVzL0Bzd2MvaGVscGVycy9saWIvX2ludGVyb3BfcmVxdWlyZV93aWxkY2FyZC5qcz8wNTFiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQ7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7XG4gICAgaWYgKCFub2RlSW50ZXJvcCAmJiBvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVmYXVsdDogb2JqXG4gICAgICAgIH07XG4gICAgfVxuICAgIHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCk7XG4gICAgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7XG4gICAgICAgIHJldHVybiBjYWNoZS5nZXQob2JqKTtcbiAgICB9XG4gICAgdmFyIG5ld09iaiA9IHt9O1xuICAgIHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICBmb3IodmFyIGtleSBpbiBvYmope1xuICAgICAgICBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDtcbiAgICAgICAgICAgIGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdPYmpba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG5ld09iai5kZWZhdWx0ID0gb2JqO1xuICAgIGlmIChjYWNoZSkge1xuICAgICAgICBjYWNoZS5zZXQob2JqLCBuZXdPYmopO1xuICAgIH1cbiAgICByZXR1cm4gbmV3T2JqO1xufVxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wMSkge1xuICAgIGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgY2FjaGVCYWJlbEludGVyb3AgPSBuZXcgV2Vha01hcCgpO1xuICAgIHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTtcbiAgICByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uKG5vZGVJbnRlcm9wKSB7XG4gICAgICAgIHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDtcbiAgICB9KShub2RlSW50ZXJvcDEpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@swc/helpers/lib/_interop_require_wildcard.js\n"); - -/***/ }), - -/***/ "./node_modules/@swc/helpers/lib/_object_without_properties_loose.js": -/*!***************************************************************************!*\ - !*** ./node_modules/@swc/helpers/lib/_object_without_properties_loose.js ***! - \***************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports[\"default\"] = _objectWithoutPropertiesLoose;\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHN3Yy9oZWxwZXJzL2xpYi9fb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc19sb29zZS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQztBQUNGLGtCQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsdUJBQXVCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL21jZ3BvcnRmby8uL25vZGVfbW9kdWxlcy9Ac3djL2hlbHBlcnMvbGliL19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3NlLmpzPzRjYjkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZTtcbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgICB2YXIgdGFyZ2V0ID0ge307XG4gICAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgIHZhciBrZXksIGk7XG4gICAgZm9yKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@swc/helpers/lib/_object_without_properties_loose.js\n"); - -/***/ }), - -/***/ "./public/cards/compass-browser.png": -/*!******************************************!*\ - !*** ./public/cards/compass-browser.png ***! - \******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\"src\":\"/_next/static/media/compass-browser.fe341fea.png\",\"height\":1800,\"width\":2880,\"blurDataURL\":\"/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcompass-browser.fe341fea.png&w=8&q=70\",\"blurWidth\":8,\"blurHeight\":5});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWMvY2FyZHMvY29tcGFzcy1icm93c2VyLnBuZy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUEsaUVBQWUsQ0FBQyxvTkFBb04iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tY2dwb3J0Zm8vLi9wdWJsaWMvY2FyZHMvY29tcGFzcy1icm93c2VyLnBuZz84ZWZjIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IHtcInNyY1wiOlwiL19uZXh0L3N0YXRpYy9tZWRpYS9jb21wYXNzLWJyb3dzZXIuZmUzNDFmZWEucG5nXCIsXCJoZWlnaHRcIjoxODAwLFwid2lkdGhcIjoyODgwLFwiYmx1ckRhdGFVUkxcIjpcIi9fbmV4dC9pbWFnZT91cmw9JTJGX25leHQlMkZzdGF0aWMlMkZtZWRpYSUyRmNvbXBhc3MtYnJvd3Nlci5mZTM0MWZlYS5wbmcmdz04JnE9NzBcIixcImJsdXJXaWR0aFwiOjgsXCJibHVySGVpZ2h0XCI6NX07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./public/cards/compass-browser.png\n"); - -/***/ }), - -/***/ "./public/cards/compass-cm.png": -/*!*************************************!*\ - !*** ./public/cards/compass-cm.png ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\"src\":\"/_next/static/media/compass-cm.d3ce062d.png\",\"height\":2048,\"width\":2880,\"blurDataURL\":\"/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcompass-cm.d3ce062d.png&w=8&q=70\",\"blurWidth\":8,\"blurHeight\":6});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWMvY2FyZHMvY29tcGFzcy1jbS5wbmcuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLENBQUMsME1BQTBNIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWNncG9ydGZvLy4vcHVibGljL2NhcmRzL2NvbXBhc3MtY20ucG5nPzMwMjciXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQge1wic3JjXCI6XCIvX25leHQvc3RhdGljL21lZGlhL2NvbXBhc3MtY20uZDNjZTA2MmQucG5nXCIsXCJoZWlnaHRcIjoyMDQ4LFwid2lkdGhcIjoyODgwLFwiYmx1ckRhdGFVUkxcIjpcIi9fbmV4dC9pbWFnZT91cmw9JTJGX25leHQlMkZzdGF0aWMlMkZtZWRpYSUyRmNvbXBhc3MtY20uZDNjZTA2MmQucG5nJnc9OCZxPTcwXCIsXCJibHVyV2lkdGhcIjo4LFwiYmx1ckhlaWdodFwiOjZ9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./public/cards/compass-cm.png\n"); - -/***/ }), - -/***/ "./public/cards/compass-computer.png": -/*!*******************************************!*\ - !*** ./public/cards/compass-computer.png ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\"src\":\"/_next/static/media/compass-computer.e9566c2a.png\",\"height\":1032,\"width\":1794,\"blurDataURL\":\"/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcompass-computer.e9566c2a.png&w=8&q=70\",\"blurWidth\":8,\"blurHeight\":5});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWMvY2FyZHMvY29tcGFzcy1jb21wdXRlci5wbmcuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLENBQUMsc05BQXNOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWNncG9ydGZvLy4vcHVibGljL2NhcmRzL2NvbXBhc3MtY29tcHV0ZXIucG5nP2ViMDUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQge1wic3JjXCI6XCIvX25leHQvc3RhdGljL21lZGlhL2NvbXBhc3MtY29tcHV0ZXIuZTk1NjZjMmEucG5nXCIsXCJoZWlnaHRcIjoxMDMyLFwid2lkdGhcIjoxNzk0LFwiYmx1ckRhdGFVUkxcIjpcIi9fbmV4dC9pbWFnZT91cmw9JTJGX25leHQlMkZzdGF0aWMlMkZtZWRpYSUyRmNvbXBhc3MtY29tcHV0ZXIuZTk1NjZjMmEucG5nJnc9OCZxPTcwXCIsXCJibHVyV2lkdGhcIjo4LFwiYmx1ckhlaWdodFwiOjV9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./public/cards/compass-computer.png\n"); - -/***/ }), - -/***/ "./public/cards/compass-computerG.png": -/*!********************************************!*\ - !*** ./public/cards/compass-computerG.png ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\"src\":\"/_next/static/media/compass-computerG.7a6406b5.png\",\"height\":2355,\"width\":3600,\"blurDataURL\":\"/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcompass-computerG.7a6406b5.png&w=8&q=70\",\"blurWidth\":8,\"blurHeight\":5});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWMvY2FyZHMvY29tcGFzcy1jb21wdXRlckcucG5nLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSxpRUFBZSxDQUFDLHdOQUF3TiIsInNvdXJjZXMiOlsid2VicGFjazovL21jZ3BvcnRmby8uL3B1YmxpYy9jYXJkcy9jb21wYXNzLWNvbXB1dGVyRy5wbmc/YjM1ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCB7XCJzcmNcIjpcIi9fbmV4dC9zdGF0aWMvbWVkaWEvY29tcGFzcy1jb21wdXRlckcuN2E2NDA2YjUucG5nXCIsXCJoZWlnaHRcIjoyMzU1LFwid2lkdGhcIjozNjAwLFwiYmx1ckRhdGFVUkxcIjpcIi9fbmV4dC9pbWFnZT91cmw9JTJGX25leHQlMkZzdGF0aWMlMkZtZWRpYSUyRmNvbXBhc3MtY29tcHV0ZXJHLjdhNjQwNmI1LnBuZyZ3PTgmcT03MFwiLFwiYmx1cldpZHRoXCI6OCxcImJsdXJIZWlnaHRcIjo1fTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./public/cards/compass-computerG.png\n"); - -/***/ }), - -/***/ "./public/cards/compass-ds.png": -/*!*************************************!*\ - !*** ./public/cards/compass-ds.png ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\"src\":\"/_next/static/media/compass-ds.5f7760ee.png\",\"height\":862,\"width\":1524,\"blurDataURL\":\"/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcompass-ds.5f7760ee.png&w=8&q=70\",\"blurWidth\":8,\"blurHeight\":5});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWMvY2FyZHMvY29tcGFzcy1kcy5wbmcuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLENBQUMseU1BQXlNIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWNncG9ydGZvLy4vcHVibGljL2NhcmRzL2NvbXBhc3MtZHMucG5nPzJhYjYiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQge1wic3JjXCI6XCIvX25leHQvc3RhdGljL21lZGlhL2NvbXBhc3MtZHMuNWY3NzYwZWUucG5nXCIsXCJoZWlnaHRcIjo4NjIsXCJ3aWR0aFwiOjE1MjQsXCJibHVyRGF0YVVSTFwiOlwiL19uZXh0L2ltYWdlP3VybD0lMkZfbmV4dCUyRnN0YXRpYyUyRm1lZGlhJTJGY29tcGFzcy1kcy41Zjc3NjBlZS5wbmcmdz04JnE9NzBcIixcImJsdXJXaWR0aFwiOjgsXCJibHVySGVpZ2h0XCI6NX07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./public/cards/compass-ds.png\n"); - -/***/ }), - -/***/ "./public/cards/compass-dv.png": -/*!*************************************!*\ - !*** ./public/cards/compass-dv.png ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\"src\":\"/_next/static/media/compass-dv.7f4a08fd.png\",\"height\":2048,\"width\":2880,\"blurDataURL\":\"/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcompass-dv.7f4a08fd.png&w=8&q=70\",\"blurWidth\":8,\"blurHeight\":6});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWMvY2FyZHMvY29tcGFzcy1kdi5wbmcuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLENBQUMsME1BQTBNIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWNncG9ydGZvLy4vcHVibGljL2NhcmRzL2NvbXBhc3MtZHYucG5nP2VmY2MiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQge1wic3JjXCI6XCIvX25leHQvc3RhdGljL21lZGlhL2NvbXBhc3MtZHYuN2Y0YTA4ZmQucG5nXCIsXCJoZWlnaHRcIjoyMDQ4LFwid2lkdGhcIjoyODgwLFwiYmx1ckRhdGFVUkxcIjpcIi9fbmV4dC9pbWFnZT91cmw9JTJGX25leHQlMkZzdGF0aWMlMkZtZWRpYSUyRmNvbXBhc3MtZHYuN2Y0YTA4ZmQucG5nJnc9OCZxPTcwXCIsXCJibHVyV2lkdGhcIjo4LFwiYmx1ckhlaWdodFwiOjZ9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./public/cards/compass-dv.png\n"); - -/***/ }), - -/***/ "./public/cards/compass-pp.png": -/*!*************************************!*\ - !*** ./public/cards/compass-pp.png ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\"src\":\"/_next/static/media/compass-pp.93948870.png\",\"height\":1862,\"width\":856,\"blurDataURL\":\"/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcompass-pp.93948870.png&w=4&q=70\",\"blurWidth\":4,\"blurHeight\":8});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWMvY2FyZHMvY29tcGFzcy1wcC5wbmcuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLENBQUMseU1BQXlNIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWNncG9ydGZvLy4vcHVibGljL2NhcmRzL2NvbXBhc3MtcHAucG5nPzZjNmUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQge1wic3JjXCI6XCIvX25leHQvc3RhdGljL21lZGlhL2NvbXBhc3MtcHAuOTM5NDg4NzAucG5nXCIsXCJoZWlnaHRcIjoxODYyLFwid2lkdGhcIjo4NTYsXCJibHVyRGF0YVVSTFwiOlwiL19uZXh0L2ltYWdlP3VybD0lMkZfbmV4dCUyRnN0YXRpYyUyRm1lZGlhJTJGY29tcGFzcy1wcC45Mzk0ODg3MC5wbmcmdz00JnE9NzBcIixcImJsdXJXaWR0aFwiOjQsXCJibHVySGVpZ2h0XCI6OH07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./public/cards/compass-pp.png\n"); - -/***/ }), - -/***/ "./components/Nav.js": -/*!***************************!*\ - !*** ./components/Nav.js ***! - \***************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ NavMain)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"react/jsx-dev-runtime\");\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _material_tailwind_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-tailwind/react */ \"@material-tailwind/react\");\n/* harmony import */ var _material_tailwind_react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_material_tailwind_react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @heroicons/react/24/outline */ \"@heroicons/react/24/outline\");\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! next/link */ \"./node_modules/next/link.js\");\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! next/router */ \"next/router\");\n/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(next_router__WEBPACK_IMPORTED_MODULE_5__);\nvar __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__]);\n_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];\n\n\n\n\n\n\nfunction NavList() {\n const router = (0,next_router__WEBPACK_IMPORTED_MODULE_5__.useRouter)();\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"my-3 flex flex-col items-end justify-center gap-2 lg:mb-0 lg:mt-0 lg:flex-row lg:items-center lg:gap-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_material_tailwind_react__WEBPACK_IMPORTED_MODULE_2__.Typography, {\n as: \"li\",\n variant: \"h6\",\n className: \"text-md 3xl:text-xl p-1 font-semibold text-slate-900\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)((next_link__WEBPACK_IMPORTED_MODULE_4___default()), {\n href: \"/work\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: `flex items-center hover:text-light-blue-500 active:text-light-blue-800 transition-colors ${router.pathname == \"/work\" ? \"text-light-blue-800\" : \"text-brand-darkblue\"}`,\n children: \"WORK\"\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 22,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 21,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 16,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_material_tailwind_react__WEBPACK_IMPORTED_MODULE_2__.Typography, {\n as: \"li\",\n variant: \"h6\",\n className: \"text-md 3xl:text-xl p-1 font-semibold text-slate-900\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)((next_link__WEBPACK_IMPORTED_MODULE_4___default()), {\n href: \"/about\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: `flex items-center hover:text-light-blue-500 active:text-light-blue-800 transition-colors ${router.pathname == \"/about\" ? \"text-light-blue-800\" : \"text-brand-darkblue\"}`,\n children: \"ABOUT\"\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 33,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 32,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 27,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_material_tailwind_react__WEBPACK_IMPORTED_MODULE_2__.Typography, {\n as: \"li\",\n variant: \"h6\",\n className: \"text-md 3xl:text-xl p-1 font-semibold text-slate-900\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)((next_link__WEBPACK_IMPORTED_MODULE_4___default()), {\n href: \"/gallery\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: `flex items-center hover:text-light-blue-500 active:text-light-blue-800 transition-colors ${router.pathname == \"/gallery\" ? \"text-light-blue-800\" : \"text-brand-darkblue\"}`,\n children: \"GALLERY\"\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 44,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 43,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 38,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 15,\n columnNumber: 5\n }, this);\n}\n;\nfunction NavMain() {\n const [openNav, setOpenNav] = react__WEBPACK_IMPORTED_MODULE_1___default().useState(false);\n const handleWindowResize = ()=>window.innerWidth >= 960 && setOpenNav(false);\n react__WEBPACK_IMPORTED_MODULE_1___default().useEffect(()=>{\n window.addEventListener(\"resize\", handleWindowResize);\n return ()=>{\n window.removeEventListener(\"resize\", handleWindowResize);\n };\n }, []);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_material_tailwind_react__WEBPACK_IMPORTED_MODULE_2__.Navbar, {\n fullWidth: true,\n className: \"mx-auto px-12 py-3 fixed z-10 bg-gray-50 bg-opacity-100 border-none shadow-none\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between text-slate-900\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_material_tailwind_react__WEBPACK_IMPORTED_MODULE_2__.Typography, {\n as: \"a\",\n href: \"/\",\n variant: \"h3\",\n className: \"3xl:text-4xl mr-4 cursor-pointer py-1.5 hover:text-light-blue-500 active:text-light-blue-800\",\n children: \"H + M\"\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 71,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden lg:block\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(NavList, {}, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 80,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 79,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_material_tailwind_react__WEBPACK_IMPORTED_MODULE_2__.IconButton, {\n variant: \"text\",\n className: \"ml-auto h-6 w-6 text-inherit hover:bg-transparent focus:bg-transparent active:bg-transparent lg:hidden\",\n ripple: false,\n onClick: ()=>setOpenNav(!openNav),\n children: openNav ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__.XMarkIcon, {\n className: \"h-8 w-8\",\n strokeWidth: 3\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 89,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_heroicons_react_24_outline__WEBPACK_IMPORTED_MODULE_3__.Bars3Icon, {\n className: \"h-8 w-8\",\n strokeWidth: 3\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 91,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 82,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 70,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_material_tailwind_react__WEBPACK_IMPORTED_MODULE_2__.Collapse, {\n open: openNav,\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(NavList, {}, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 96,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 95,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/Nav.js\",\n lineNumber: 69,\n columnNumber: 5\n }, this);\n}\n\n__webpack_async_result__();\n} catch(e) { __webpack_async_result__(e); } });//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9jb21wb25lbnRzL05hdi5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUEwQjtBQU1RO0FBQ2lDO0FBQ3RDO0FBQ1c7QUFFeEMsU0FBU1MsVUFBVTtJQUNqQixNQUFNQyxTQUFTRixzREFBU0E7SUFDeEIscUJBQ0UsOERBQUNHO1FBQUdDLFdBQVU7OzBCQUNaLDhEQUFDVCxnRUFBVUE7Z0JBQ1RVLElBQUc7Z0JBQ0hDLFNBQVE7Z0JBQ1JGLFdBQVU7MEJBRVYsNEVBQUNMLGtEQUFJQTtvQkFBQ1EsTUFBSzs4QkFDWCw0RUFBQ0M7d0JBQUVKLFdBQVcsQ0FBQyx5RkFBeUYsRUFBRUYsT0FBT08sUUFBUSxJQUFJLFVBQVUsd0JBQXdCLHFCQUFxQixDQUFDLENBQUM7a0NBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBSzFMLDhEQUFDZCxnRUFBVUE7Z0JBQ1RVLElBQUc7Z0JBQ0hDLFNBQVE7Z0JBQ1JGLFdBQVU7MEJBRVYsNEVBQUNMLGtEQUFJQTtvQkFBQ1EsTUFBSzs4QkFDWCw0RUFBQ0M7d0JBQUVKLFdBQVcsQ0FBQyx5RkFBeUYsRUFBRUYsT0FBT08sUUFBUSxJQUFJLFdBQVcsd0JBQXdCLHFCQUFxQixDQUFDLENBQUM7a0NBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBSzNMLDhEQUFDZCxnRUFBVUE7Z0JBQ1RVLElBQUc7Z0JBQ0hDLFNBQVE7Z0JBQ1JGLFdBQVU7MEJBRVYsNEVBQUNMLGtEQUFJQTtvQkFBQ1EsTUFBSzs4QkFDWCw0RUFBQ0M7d0JBQUVKLFdBQVcsQ0FBQyx5RkFBeUYsRUFBRUYsT0FBT08sUUFBUSxJQUFJLGFBQWEsd0JBQXdCLHFCQUFxQixDQUFDLENBQUM7a0NBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPbk07O0FBRWUsU0FBU0MsVUFBVTtJQUVoQyxNQUFNLENBQUNDLFNBQVNDLFdBQVcsR0FBR3BCLHFEQUFjLENBQUMsS0FBSztJQUVsRCxNQUFNc0IscUJBQXFCLElBQ3pCQyxPQUFPQyxVQUFVLElBQUksT0FBT0osV0FBVyxLQUFLO0lBRTlDcEIsc0RBQWUsQ0FBQyxJQUFNO1FBQ3BCdUIsT0FBT0csZ0JBQWdCLENBQUMsVUFBVUo7UUFFbEMsT0FBTyxJQUFNO1lBQ1hDLE9BQU9JLG1CQUFtQixDQUFDLFVBQVVMO1FBQ3ZDO0lBQ0YsR0FBRyxFQUFFO0lBRUwscUJBQ0UsOERBQUNyQiw0REFBTUE7UUFBQzJCLFdBQVcsSUFBSTtRQUFFaEIsV0FBVTs7MEJBQ2pDLDhEQUFDaUI7Z0JBQUlqQixXQUFVOztrQ0FDYiw4REFBQ1QsZ0VBQVVBO3dCQUNUVSxJQUFHO3dCQUNIRSxNQUFLO3dCQUNMRCxTQUFRO3dCQUNSRixXQUFVO2tDQUNYOzs7Ozs7a0NBR0QsOERBQUNpQjt3QkFBSWpCLFdBQVU7a0NBQ2IsNEVBQUNIOzs7Ozs7Ozs7O2tDQUVILDhEQUFDTCxnRUFBVUE7d0JBQ1RVLFNBQVE7d0JBQ1JGLFdBQVU7d0JBQ1ZrQixRQUFRLEtBQUs7d0JBQ2JDLFNBQVMsSUFBTVgsV0FBVyxDQUFDRDtrQ0FFMUJBLHdCQUNDLDhEQUFDYixrRUFBU0E7NEJBQUNNLFdBQVU7NEJBQVVvQixhQUFhOzs7OztpREFFNUMsOERBQUMzQixrRUFBU0E7NEJBQUNPLFdBQVU7NEJBQVVvQixhQUFhOzs7OztnQ0FDN0M7Ozs7Ozs7Ozs7OzswQkFHTCw4REFBQzlCLDhEQUFRQTtnQkFBQytCLE1BQU1kOzBCQUNkLDRFQUFDVjs7Ozs7Ozs7Ozs7Ozs7OztBQUlULENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tY2dwb3J0Zm8vLi9jb21wb25lbnRzL05hdi5qcz84NjRhIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gIE5hdmJhcixcbiAgQ29sbGFwc2UsXG4gIFR5cG9ncmFwaHksXG4gIEljb25CdXR0b24sXG59IGZyb20gXCJAbWF0ZXJpYWwtdGFpbHdpbmQvcmVhY3RcIjtcbmltcG9ydCB7IEJhcnMzSWNvbiwgWE1hcmtJY29uIH0gZnJvbSBcIkBoZXJvaWNvbnMvcmVhY3QvMjQvb3V0bGluZVwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlUm91dGVyIH0gZnJvbSAnbmV4dC9yb3V0ZXInO1xuIFxuZnVuY3Rpb24gTmF2TGlzdCgpIHtcbiAgY29uc3Qgcm91dGVyID0gdXNlUm91dGVyKCk7XG4gIHJldHVybiAoXG4gICAgPHVsIGNsYXNzTmFtZT1cIm15LTMgZmxleCBmbGV4LWNvbCBpdGVtcy1lbmQganVzdGlmeS1jZW50ZXIgZ2FwLTIgbGc6bWItMCBsZzptdC0wIGxnOmZsZXgtcm93IGxnOml0ZW1zLWNlbnRlciBsZzpnYXAtNlwiPlxuICAgICAgPFR5cG9ncmFwaHlcbiAgICAgICAgYXM9XCJsaVwiXG4gICAgICAgIHZhcmlhbnQ9XCJoNlwiXG4gICAgICAgIGNsYXNzTmFtZT1cInRleHQtbWQgM3hsOnRleHQteGwgcC0xIGZvbnQtc2VtaWJvbGQgdGV4dC1zbGF0ZS05MDBcIlxuICAgICAgPlxuICAgICAgICA8TGluayBocmVmPVwiL3dvcmtcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPXtgZmxleCBpdGVtcy1jZW50ZXIgaG92ZXI6dGV4dC1saWdodC1ibHVlLTUwMCBhY3RpdmU6dGV4dC1saWdodC1ibHVlLTgwMCB0cmFuc2l0aW9uLWNvbG9ycyAke3JvdXRlci5wYXRobmFtZSA9PSBcIi93b3JrXCIgPyBcInRleHQtbGlnaHQtYmx1ZS04MDBcIiA6IFwidGV4dC1icmFuZC1kYXJrYmx1ZVwifWB9PlxuICAgICAgICAgIFdPUktcbiAgICAgICAgPC9wPlxuICAgICAgICA8L0xpbms+XG4gICAgICA8L1R5cG9ncmFwaHk+XG4gICAgICA8VHlwb2dyYXBoeVxuICAgICAgICBhcz1cImxpXCJcbiAgICAgICAgdmFyaWFudD1cImg2XCJcbiAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1tZCAzeGw6dGV4dC14bCBwLTEgZm9udC1zZW1pYm9sZCB0ZXh0LXNsYXRlLTkwMFwiXG4gICAgICA+XG4gICAgICAgIDxMaW5rIGhyZWY9XCIvYWJvdXRcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPXtgZmxleCBpdGVtcy1jZW50ZXIgaG92ZXI6dGV4dC1saWdodC1ibHVlLTUwMCBhY3RpdmU6dGV4dC1saWdodC1ibHVlLTgwMCB0cmFuc2l0aW9uLWNvbG9ycyAke3JvdXRlci5wYXRobmFtZSA9PSBcIi9hYm91dFwiID8gXCJ0ZXh0LWxpZ2h0LWJsdWUtODAwXCIgOiBcInRleHQtYnJhbmQtZGFya2JsdWVcIn1gfT5cbiAgICAgICAgICBBQk9VVFxuICAgICAgICA8L3A+XG4gICAgICAgIDwvTGluaz5cbiAgICAgIDwvVHlwb2dyYXBoeT5cbiAgICAgIDxUeXBvZ3JhcGh5XG4gICAgICAgIGFzPVwibGlcIlxuICAgICAgICB2YXJpYW50PVwiaDZcIlxuICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LW1kIDN4bDp0ZXh0LXhsIHAtMSBmb250LXNlbWlib2xkIHRleHQtc2xhdGUtOTAwXCJcbiAgICAgID5cbiAgICAgICAgPExpbmsgaHJlZj1cIi9nYWxsZXJ5XCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT17YGZsZXggaXRlbXMtY2VudGVyIGhvdmVyOnRleHQtbGlnaHQtYmx1ZS01MDAgYWN0aXZlOnRleHQtbGlnaHQtYmx1ZS04MDAgdHJhbnNpdGlvbi1jb2xvcnMgJHtyb3V0ZXIucGF0aG5hbWUgPT0gXCIvZ2FsbGVyeVwiID8gXCJ0ZXh0LWxpZ2h0LWJsdWUtODAwXCIgOiBcInRleHQtYnJhbmQtZGFya2JsdWVcIn1gfT5cbiAgICAgICAgICBHQUxMRVJZXG4gICAgICAgIDwvcD5cbiAgICAgICAgPC9MaW5rPlxuICAgICAgPC9UeXBvZ3JhcGh5PlxuICAgIDwvdWw+XG4gICk7XG59O1xuIFxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTmF2TWFpbigpIHtcblxuICBjb25zdCBbb3Blbk5hdiwgc2V0T3Blbk5hdl0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gXG4gIGNvbnN0IGhhbmRsZVdpbmRvd1Jlc2l6ZSA9ICgpID0+XG4gICAgd2luZG93LmlubmVyV2lkdGggPj0gOTYwICYmIHNldE9wZW5OYXYoZmFsc2UpO1xuIFxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIGhhbmRsZVdpbmRvd1Jlc2l6ZSk7XG4gXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIGhhbmRsZVdpbmRvd1Jlc2l6ZSk7XG4gICAgfTtcbiAgfSwgW10pO1xuIFxuICByZXR1cm4gKFxuICAgIDxOYXZiYXIgZnVsbFdpZHRoPXt0cnVlfSBjbGFzc05hbWU9XCJteC1hdXRvIHB4LTEyIHB5LTMgZml4ZWQgei0xMCBiZy1ncmF5LTUwIGJnLW9wYWNpdHktMTAwIGJvcmRlci1ub25lIHNoYWRvdy1ub25lXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiB0ZXh0LXNsYXRlLTkwMFwiPlxuICAgICAgICA8VHlwb2dyYXBoeVxuICAgICAgICAgIGFzPVwiYVwiXG4gICAgICAgICAgaHJlZj1cIi9cIlxuICAgICAgICAgIHZhcmlhbnQ9XCJoM1wiXG4gICAgICAgICAgY2xhc3NOYW1lPVwiM3hsOnRleHQtNHhsIG1yLTQgY3Vyc29yLXBvaW50ZXIgcHktMS41IGhvdmVyOnRleHQtbGlnaHQtYmx1ZS01MDAgYWN0aXZlOnRleHQtbGlnaHQtYmx1ZS04MDBcIlxuICAgICAgICA+XG4gICAgICAgICAgSCArIE1cbiAgICAgICAgPC9UeXBvZ3JhcGh5PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9ja1wiPlxuICAgICAgICAgIDxOYXZMaXN0IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8SWNvbkJ1dHRvblxuICAgICAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJtbC1hdXRvIGgtNiB3LTYgdGV4dC1pbmhlcml0IGhvdmVyOmJnLXRyYW5zcGFyZW50IGZvY3VzOmJnLXRyYW5zcGFyZW50IGFjdGl2ZTpiZy10cmFuc3BhcmVudCBsZzpoaWRkZW5cIlxuICAgICAgICAgIHJpcHBsZT17ZmFsc2V9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0T3Blbk5hdighb3Blbk5hdil9XG4gICAgICAgID5cbiAgICAgICAgICB7b3Blbk5hdiA/IChcbiAgICAgICAgICAgIDxYTWFya0ljb24gY2xhc3NOYW1lPVwiaC04IHctOFwiIHN0cm9rZVdpZHRoPXszfSAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8QmFyczNJY29uIGNsYXNzTmFtZT1cImgtOCB3LThcIiBzdHJva2VXaWR0aD17M30gLz5cbiAgICAgICAgICApfVxuICAgICAgICA8L0ljb25CdXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxDb2xsYXBzZSBvcGVuPXtvcGVuTmF2fT5cbiAgICAgICAgPE5hdkxpc3QgLz5cbiAgICAgIDwvQ29sbGFwc2U+XG4gICAgPC9OYXZiYXI+XG4gICk7XG59Il0sIm5hbWVzIjpbIlJlYWN0IiwiTmF2YmFyIiwiQ29sbGFwc2UiLCJUeXBvZ3JhcGh5IiwiSWNvbkJ1dHRvbiIsIkJhcnMzSWNvbiIsIlhNYXJrSWNvbiIsIkxpbmsiLCJ1c2VSb3V0ZXIiLCJOYXZMaXN0Iiwicm91dGVyIiwidWwiLCJjbGFzc05hbWUiLCJhcyIsInZhcmlhbnQiLCJocmVmIiwicCIsInBhdGhuYW1lIiwiTmF2TWFpbiIsIm9wZW5OYXYiLCJzZXRPcGVuTmF2IiwidXNlU3RhdGUiLCJoYW5kbGVXaW5kb3dSZXNpemUiLCJ3aW5kb3ciLCJpbm5lcldpZHRoIiwidXNlRWZmZWN0IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJmdWxsV2lkdGgiLCJkaXYiLCJyaXBwbGUiLCJvbkNsaWNrIiwic3Ryb2tlV2lkdGgiLCJvcGVuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./components/Nav.js\n"); - -/***/ }), - -/***/ "./components/navs/CompassNav.js": -/*!***************************************!*\ - !*** ./components/navs/CompassNav.js ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"react/jsx-dev-runtime\");\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/link */ \"./node_modules/next/link.js\");\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\nfunction CompassNav() {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"nav\", {\n className: \"hidden md:block sticky mb-5 bg-white md:bg-transparent md:pr-8 lg:pr-12 h-10 top-0 md:top-[80px]\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"flex justify-between md:flex-col pt-2 md:pt-0 md:space-x-0 list-none bg-white md:bg-transparent text-slate-900 md:space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"a\", {\n href: \"#1\",\n className: \"text-sm font-medium hover:text-light-blue-300 active:text-light-blue-700\",\n children: \"OVERVIEW\"\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/navs/CompassNav.js\",\n lineNumber: 11,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/navs/CompassNav.js\",\n lineNumber: 11,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"a\", {\n href: \"#2\",\n className: \"text-sm font-medium hover:text-light-blue-300 active:text-light-blue-700\",\n children: \"ABOUT\"\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/navs/CompassNav.js\",\n lineNumber: 12,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/navs/CompassNav.js\",\n lineNumber: 12,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"a\", {\n href: \"#3\",\n className: \"text-sm font-medium hover:text-light-blue-300 active:text-light-blue-700\",\n children: \"WORK\"\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/navs/CompassNav.js\",\n lineNumber: 13,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/navs/CompassNav.js\",\n lineNumber: 13,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"a\", {\n href: \"#4\",\n className: \"text-sm font-medium hover:text-light-blue-300 active:text-light-blue-700\",\n children: \"THOUGHTS\"\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/navs/CompassNav.js\",\n lineNumber: 14,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/navs/CompassNav.js\",\n lineNumber: 14,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/navs/CompassNav.js\",\n lineNumber: 10,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: \"/Users/test/Desktop/mysite/myweb/components/navs/CompassNav.js\",\n lineNumber: 9,\n columnNumber: 9\n }, this);\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CompassNav);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9jb21wb25lbnRzL25hdnMvQ29tcGFzc05hdi5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFBNkI7QUFDOEI7QUFJM0QsU0FBU0ssYUFBYTtJQUVsQixxQkFDSSw4REFBQ0M7UUFBSUMsV0FBVTtrQkFDWCw0RUFBQ0M7WUFBR0QsV0FBVTs7OEJBQ1YsOERBQUNFOzhCQUFHLDRFQUFDQzt3QkFBRUMsTUFBSzt3QkFBS0osV0FBVTtrQ0FBMkU7Ozs7Ozs7Ozs7OzhCQUN0Ryw4REFBQ0U7OEJBQUcsNEVBQUNDO3dCQUFFQyxNQUFLO3dCQUFLSixXQUFVO2tDQUEyRTs7Ozs7Ozs7Ozs7OEJBQ3RHLDhEQUFDRTs4QkFBRyw0RUFBQ0M7d0JBQUVDLE1BQUs7d0JBQUtKLFdBQVU7a0NBQTJFOzs7Ozs7Ozs7Ozs4QkFDdEcsOERBQUNFOzhCQUFHLDRFQUFDQzt3QkFBRUMsTUFBSzt3QkFBS0osV0FBVTtrQ0FBMkU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPdEg7QUFFQSxpRUFBZUYsVUFBVUEsRUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL21jZ3BvcnRmby8uL2NvbXBvbmVudHMvbmF2cy9Db21wYXNzTmF2LmpzPzQ0ZjEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExpbmsgZnJvbSAnbmV4dC9saW5rJztcbmltcG9ydCBSZWFjdCwgeyB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcblxuXG5cbmZ1bmN0aW9uIENvbXBhc3NOYXYoKSB7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8bmF2IGNsYXNzTmFtZT1cImhpZGRlbiBtZDpibG9jayBzdGlja3kgbWItNSBiZy13aGl0ZSBtZDpiZy10cmFuc3BhcmVudCBtZDpwci04IGxnOnByLTEyIGgtMTAgdG9wLTAgbWQ6dG9wLVs4MHB4XVwiPlxuICAgICAgICAgICAgPHVsIGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIG1kOmZsZXgtY29sIHB0LTIgbWQ6cHQtMCBtZDpzcGFjZS14LTAgbGlzdC1ub25lIGJnLXdoaXRlIG1kOmJnLXRyYW5zcGFyZW50IHRleHQtc2xhdGUtOTAwIG1kOnNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPVwiIzFcIiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIGhvdmVyOnRleHQtbGlnaHQtYmx1ZS0zMDAgYWN0aXZlOnRleHQtbGlnaHQtYmx1ZS03MDBcIj5PVkVSVklFVzwvYT48L2xpPlxuICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPVwiIzJcIiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIGhvdmVyOnRleHQtbGlnaHQtYmx1ZS0zMDAgYWN0aXZlOnRleHQtbGlnaHQtYmx1ZS03MDBcIj5BQk9VVDwvYT48L2xpPlxuICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPVwiIzNcIiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIGhvdmVyOnRleHQtbGlnaHQtYmx1ZS0zMDAgYWN0aXZlOnRleHQtbGlnaHQtYmx1ZS03MDBcIj5XT1JLPC9hPjwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9XCIjNFwiIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW0gaG92ZXI6dGV4dC1saWdodC1ibHVlLTMwMCBhY3RpdmU6dGV4dC1saWdodC1ibHVlLTcwMFwiPlRIT1VHSFRTPC9hPjwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICA8L25hdj5cbiAgICAgICAgXG5cblxuICAgICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbXBhc3NOYXYiXSwibmFtZXMiOlsiTGluayIsIlJlYWN0IiwidXNlUmVmIiwidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJDb21wYXNzTmF2IiwibmF2IiwiY2xhc3NOYW1lIiwidWwiLCJsaSIsImEiLCJocmVmIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./components/navs/CompassNav.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/add-base-path.js": -/*!********************************************************!*\ - !*** ./node_modules/next/dist/client/add-base-path.js ***! - \********************************************************/ -/***/ ((module, exports, __webpack_require__) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.addBasePath = addBasePath;\nvar _addPathPrefix = __webpack_require__(/*! ../shared/lib/router/utils/add-path-prefix */ \"../shared/lib/router/utils/add-path-prefix\");\nvar _normalizeTrailingSlash = __webpack_require__(/*! ./normalize-trailing-slash */ \"./node_modules/next/dist/client/normalize-trailing-slash.js\");\nconst basePath = false || \"\";\nfunction addBasePath(path, required) {\n if (false) {}\n return (0, _normalizeTrailingSlash).normalizePathTrailingSlash((0, _addPathPrefix).addPathPrefix(path, basePath));\n}\nif ((typeof exports.default === \"function\" || typeof exports.default === \"object\" && exports.default !== null) && typeof exports.default.__esModule === \"undefined\") {\n Object.defineProperty(exports.default, \"__esModule\", {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=add-base-path.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9hZGQtYmFzZS1wYXRoLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2JBLDhDQUE2QztJQUN6Q0csT0FBTyxJQUFJO0FBQ2YsQ0FBQyxFQUFDO0FBQ0ZELG1CQUFtQixHQUFHRTtBQUN0QixJQUFJQyxpQkFBaUJDLG1CQUFPQSxDQUFDLDhGQUE0QztBQUN6RSxJQUFJQywwQkFBMEJELG1CQUFPQSxDQUFDLCtGQUE0QjtBQUNsRSxNQUFNRSxXQUFXQyxNQUFrQyxJQUFJO0FBQ3ZELFNBQVNMLFlBQVlRLElBQUksRUFBRUMsUUFBUSxFQUFFO0lBQ2pDLElBQUlKLEtBQTBDLEVBQUUsRUFJL0M7SUFDRCxPQUFPLENBQUMsR0FBR0YsdUJBQXVCLEVBQUVRLDBCQUEwQixDQUFDLENBQUMsR0FBR1YsY0FBYyxFQUFFVyxhQUFhLENBQUNKLE1BQU1KO0FBQzNHO0FBRUEsSUFBSSxDQUFDLE9BQU9OLFFBQVFlLE9BQU8sS0FBSyxjQUFlLE9BQU9mLFFBQVFlLE9BQU8sS0FBSyxZQUFZZixRQUFRZSxPQUFPLEtBQUssSUFBSSxLQUFNLE9BQU9mLFFBQVFlLE9BQU8sQ0FBQ0MsVUFBVSxLQUFLLGFBQWE7SUFDcktsQixPQUFPQyxjQUFjLENBQUNDLFFBQVFlLE9BQU8sRUFBRSxjQUFjO1FBQUVkLE9BQU8sSUFBSTtJQUFDO0lBQ25FSCxPQUFPbUIsTUFBTSxDQUFDakIsUUFBUWUsT0FBTyxFQUFFZjtJQUMvQmtCLE9BQU9sQixPQUFPLEdBQUdBLFFBQVFlLE9BQU87QUFDbEMsQ0FBQyxDQUVELHlDQUF5QyIsInNvdXJjZXMiOlsid2VicGFjazovL21jZ3BvcnRmby8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L2FkZC1iYXNlLXBhdGguanM/NjEzMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuYWRkQmFzZVBhdGggPSBhZGRCYXNlUGF0aDtcbnZhciBfYWRkUGF0aFByZWZpeCA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvbGliL3JvdXRlci91dGlscy9hZGQtcGF0aC1wcmVmaXhcIik7XG52YXIgX25vcm1hbGl6ZVRyYWlsaW5nU2xhc2ggPSByZXF1aXJlKFwiLi9ub3JtYWxpemUtdHJhaWxpbmctc2xhc2hcIik7XG5jb25zdCBiYXNlUGF0aCA9IHByb2Nlc3MuZW52Ll9fTkVYVF9ST1VURVJfQkFTRVBBVEggfHwgJyc7XG5mdW5jdGlvbiBhZGRCYXNlUGF0aChwYXRoLCByZXF1aXJlZCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5fX05FWFRfTUFOVUFMX0NMSUVOVF9CQVNFX1BBVEgpIHtcbiAgICAgICAgaWYgKCFyZXF1aXJlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICgwLCBfbm9ybWFsaXplVHJhaWxpbmdTbGFzaCkubm9ybWFsaXplUGF0aFRyYWlsaW5nU2xhc2goKDAsIF9hZGRQYXRoUHJlZml4KS5hZGRQYXRoUHJlZml4KHBhdGgsIGJhc2VQYXRoKSk7XG59XG5cbmlmICgodHlwZW9mIGV4cG9ydHMuZGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJyB8fCAodHlwZW9mIGV4cG9ydHMuZGVmYXVsdCA9PT0gJ29iamVjdCcgJiYgZXhwb3J0cy5kZWZhdWx0ICE9PSBudWxsKSkgJiYgdHlwZW9mIGV4cG9ydHMuZGVmYXVsdC5fX2VzTW9kdWxlID09PSAndW5kZWZpbmVkJykge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cy5kZWZhdWx0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gIE9iamVjdC5hc3NpZ24oZXhwb3J0cy5kZWZhdWx0LCBleHBvcnRzKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzLmRlZmF1bHQ7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkZC1iYXNlLXBhdGguanMubWFwIl0sIm5hbWVzIjpbIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZXhwb3J0cyIsInZhbHVlIiwiYWRkQmFzZVBhdGgiLCJfYWRkUGF0aFByZWZpeCIsInJlcXVpcmUiLCJfbm9ybWFsaXplVHJhaWxpbmdTbGFzaCIsImJhc2VQYXRoIiwicHJvY2VzcyIsImVudiIsIl9fTkVYVF9ST1VURVJfQkFTRVBBVEgiLCJwYXRoIiwicmVxdWlyZWQiLCJfX05FWFRfTUFOVUFMX0NMSUVOVF9CQVNFX1BBVEgiLCJub3JtYWxpemVQYXRoVHJhaWxpbmdTbGFzaCIsImFkZFBhdGhQcmVmaXgiLCJkZWZhdWx0IiwiX19lc01vZHVsZSIsImFzc2lnbiIsIm1vZHVsZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/add-base-path.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/add-locale.js": -/*!*****************************************************!*\ - !*** ./node_modules/next/dist/client/add-locale.js ***! - \*****************************************************/ -/***/ ((module, exports, __webpack_require__) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.addLocale = void 0;\nvar _normalizeTrailingSlash = __webpack_require__(/*! ./normalize-trailing-slash */ \"./node_modules/next/dist/client/normalize-trailing-slash.js\");\nconst addLocale = (path, ...args)=>{\n if (false) {}\n return path;\n};\nexports.addLocale = addLocale;\nif ((typeof exports.default === \"function\" || typeof exports.default === \"object\" && exports.default !== null) && typeof exports.default.__esModule === \"undefined\") {\n Object.defineProperty(exports.default, \"__esModule\", {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=add-locale.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9hZGQtbG9jYWxlLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2JBLDhDQUE2QztJQUN6Q0csT0FBTyxJQUFJO0FBQ2YsQ0FBQyxFQUFDO0FBQ0ZELGlCQUFpQixHQUFHLEtBQUs7QUFDekIsSUFBSUcsMEJBQTBCQyxtQkFBT0EsQ0FBQywrRkFBNEI7QUFDbEUsTUFBTUYsWUFBWSxDQUFDRyxNQUFNLEdBQUdDLE9BQU87SUFDL0IsSUFBSUMsS0FBK0IsRUFBRSxFQUVwQztJQUNELE9BQU9GO0FBQ1g7QUFDQUwsaUJBQWlCLEdBQUdFO0FBRXBCLElBQUksQ0FBQyxPQUFPRixRQUFRVyxPQUFPLEtBQUssY0FBZSxPQUFPWCxRQUFRVyxPQUFPLEtBQUssWUFBWVgsUUFBUVcsT0FBTyxLQUFLLElBQUksS0FBTSxPQUFPWCxRQUFRVyxPQUFPLENBQUNDLFVBQVUsS0FBSyxhQUFhO0lBQ3JLZCxPQUFPQyxjQUFjLENBQUNDLFFBQVFXLE9BQU8sRUFBRSxjQUFjO1FBQUVWLE9BQU8sSUFBSTtJQUFDO0lBQ25FSCxPQUFPZSxNQUFNLENBQUNiLFFBQVFXLE9BQU8sRUFBRVg7SUFDL0JjLE9BQU9kLE9BQU8sR0FBR0EsUUFBUVcsT0FBTztBQUNsQyxDQUFDLENBRUQsc0NBQXNDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWNncG9ydGZvLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9jbGllbnQvYWRkLWxvY2FsZS5qcz9lMmQ5Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5hZGRMb2NhbGUgPSB2b2lkIDA7XG52YXIgX25vcm1hbGl6ZVRyYWlsaW5nU2xhc2ggPSByZXF1aXJlKFwiLi9ub3JtYWxpemUtdHJhaWxpbmctc2xhc2hcIik7XG5jb25zdCBhZGRMb2NhbGUgPSAocGF0aCwgLi4uYXJncyk9PntcbiAgICBpZiAocHJvY2Vzcy5lbnYuX19ORVhUX0kxOE5fU1VQUE9SVCkge1xuICAgICAgICByZXR1cm4gKDAsIF9ub3JtYWxpemVUcmFpbGluZ1NsYXNoKS5ub3JtYWxpemVQYXRoVHJhaWxpbmdTbGFzaChyZXF1aXJlKCcuLi9zaGFyZWQvbGliL3JvdXRlci91dGlscy9hZGQtbG9jYWxlJykuYWRkTG9jYWxlKHBhdGgsIC4uLmFyZ3MpKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59O1xuZXhwb3J0cy5hZGRMb2NhbGUgPSBhZGRMb2NhbGU7XG5cbmlmICgodHlwZW9mIGV4cG9ydHMuZGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJyB8fCAodHlwZW9mIGV4cG9ydHMuZGVmYXVsdCA9PT0gJ29iamVjdCcgJiYgZXhwb3J0cy5kZWZhdWx0ICE9PSBudWxsKSkgJiYgdHlwZW9mIGV4cG9ydHMuZGVmYXVsdC5fX2VzTW9kdWxlID09PSAndW5kZWZpbmVkJykge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cy5kZWZhdWx0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gIE9iamVjdC5hc3NpZ24oZXhwb3J0cy5kZWZhdWx0LCBleHBvcnRzKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzLmRlZmF1bHQ7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkZC1sb2NhbGUuanMubWFwIl0sIm5hbWVzIjpbIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZXhwb3J0cyIsInZhbHVlIiwiYWRkTG9jYWxlIiwiX25vcm1hbGl6ZVRyYWlsaW5nU2xhc2giLCJyZXF1aXJlIiwicGF0aCIsImFyZ3MiLCJwcm9jZXNzIiwiZW52IiwiX19ORVhUX0kxOE5fU1VQUE9SVCIsIm5vcm1hbGl6ZVBhdGhUcmFpbGluZ1NsYXNoIiwiZGVmYXVsdCIsIl9fZXNNb2R1bGUiLCJhc3NpZ24iLCJtb2R1bGUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/add-locale.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/detect-domain-locale.js": -/*!***************************************************************!*\ - !*** ./node_modules/next/dist/client/detect-domain-locale.js ***! - \***************************************************************/ -/***/ ((module, exports) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.detectDomainLocale = void 0;\nconst detectDomainLocale = (...args)=>{\n if (false) {}\n};\nexports.detectDomainLocale = detectDomainLocale;\nif ((typeof exports.default === \"function\" || typeof exports.default === \"object\" && exports.default !== null) && typeof exports.default.__esModule === \"undefined\") {\n Object.defineProperty(exports.default, \"__esModule\", {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=detect-domain-locale.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9kZXRlY3QtZG9tYWluLWxvY2FsZS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiQSw4Q0FBNkM7SUFDekNHLE9BQU8sSUFBSTtBQUNmLENBQUMsRUFBQztBQUNGRCwwQkFBMEIsR0FBRyxLQUFLO0FBQ2xDLE1BQU1FLHFCQUFxQixDQUFDLEdBQUdDLE9BQU87SUFDbEMsSUFBSUMsS0FBK0IsRUFBRSxFQUVwQztBQUNMO0FBQ0FKLDBCQUEwQixHQUFHRTtBQUU3QixJQUFJLENBQUMsT0FBT0YsUUFBUVEsT0FBTyxLQUFLLGNBQWUsT0FBT1IsUUFBUVEsT0FBTyxLQUFLLFlBQVlSLFFBQVFRLE9BQU8sS0FBSyxJQUFJLEtBQU0sT0FBT1IsUUFBUVEsT0FBTyxDQUFDQyxVQUFVLEtBQUssYUFBYTtJQUNyS1gsT0FBT0MsY0FBYyxDQUFDQyxRQUFRUSxPQUFPLEVBQUUsY0FBYztRQUFFUCxPQUFPLElBQUk7SUFBQztJQUNuRUgsT0FBT1ksTUFBTSxDQUFDVixRQUFRUSxPQUFPLEVBQUVSO0lBQy9CVyxPQUFPWCxPQUFPLEdBQUdBLFFBQVFRLE9BQU87QUFDbEMsQ0FBQyxDQUVELGdEQUFnRCIsInNvdXJjZXMiOlsid2VicGFjazovL21jZ3BvcnRmby8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L2RldGVjdC1kb21haW4tbG9jYWxlLmpzPzAzYjUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRldGVjdERvbWFpbkxvY2FsZSA9IHZvaWQgMDtcbmNvbnN0IGRldGVjdERvbWFpbkxvY2FsZSA9ICguLi5hcmdzKT0+e1xuICAgIGlmIChwcm9jZXNzLmVudi5fX05FWFRfSTE4Tl9TVVBQT1JUKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlKCcuLi9zaGFyZWQvbGliL2kxOG4vZGV0ZWN0LWRvbWFpbi1sb2NhbGUnKS5kZXRlY3REb21haW5Mb2NhbGUoLi4uYXJncyk7XG4gICAgfVxufTtcbmV4cG9ydHMuZGV0ZWN0RG9tYWluTG9jYWxlID0gZGV0ZWN0RG9tYWluTG9jYWxlO1xuXG5pZiAoKHR5cGVvZiBleHBvcnRzLmRlZmF1bHQgPT09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiBleHBvcnRzLmRlZmF1bHQgPT09ICdvYmplY3QnICYmIGV4cG9ydHMuZGVmYXVsdCAhPT0gbnVsbCkpICYmIHR5cGVvZiBleHBvcnRzLmRlZmF1bHQuX19lc01vZHVsZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMuZGVmYXVsdCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuICBPYmplY3QuYXNzaWduKGV4cG9ydHMuZGVmYXVsdCwgZXhwb3J0cyk7XG4gIG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cy5kZWZhdWx0O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXRlY3QtZG9tYWluLWxvY2FsZS5qcy5tYXAiXSwibmFtZXMiOlsiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJleHBvcnRzIiwidmFsdWUiLCJkZXRlY3REb21haW5Mb2NhbGUiLCJhcmdzIiwicHJvY2VzcyIsImVudiIsIl9fTkVYVF9JMThOX1NVUFBPUlQiLCJyZXF1aXJlIiwiZGVmYXVsdCIsIl9fZXNNb2R1bGUiLCJhc3NpZ24iLCJtb2R1bGUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/detect-domain-locale.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/get-domain-locale.js": -/*!************************************************************!*\ - !*** ./node_modules/next/dist/client/get-domain-locale.js ***! - \************************************************************/ -/***/ ((module, exports) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.getDomainLocale = getDomainLocale;\nconst basePath = false || \"\";\nfunction getDomainLocale(path, locale, locales, domainLocales) {\n if (false) {} else {\n return false;\n }\n}\nif ((typeof exports.default === \"function\" || typeof exports.default === \"object\" && exports.default !== null) && typeof exports.default.__esModule === \"undefined\") {\n Object.defineProperty(exports.default, \"__esModule\", {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=get-domain-locale.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9nZXQtZG9tYWluLWxvY2FsZS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiQSw4Q0FBNkM7SUFDekNHLE9BQU8sSUFBSTtBQUNmLENBQUMsRUFBQztBQUNGRCx1QkFBdUIsR0FBR0U7QUFDMUIsTUFBTUMsV0FBV0MsTUFBa0MsSUFBSTtBQUN2RCxTQUFTRixnQkFBZ0JLLElBQUksRUFBRUMsTUFBTSxFQUFFQyxPQUFPLEVBQUVDLGFBQWEsRUFBRTtJQUMzRCxJQUFJTixLQUErQixFQUFFLEVBV3BDLE1BQU07UUFDSCxPQUFPLEtBQUs7SUFDaEIsQ0FBQztBQUNMO0FBRUEsSUFBSSxDQUFDLE9BQU9KLFFBQVF1QixPQUFPLEtBQUssY0FBZSxPQUFPdkIsUUFBUXVCLE9BQU8sS0FBSyxZQUFZdkIsUUFBUXVCLE9BQU8sS0FBSyxJQUFJLEtBQU0sT0FBT3ZCLFFBQVF1QixPQUFPLENBQUNDLFVBQVUsS0FBSyxhQUFhO0lBQ3JLMUIsT0FBT0MsY0FBYyxDQUFDQyxRQUFRdUIsT0FBTyxFQUFFLGNBQWM7UUFBRXRCLE9BQU8sSUFBSTtJQUFDO0lBQ25FSCxPQUFPMkIsTUFBTSxDQUFDekIsUUFBUXVCLE9BQU8sRUFBRXZCO0lBQy9CMEIsT0FBTzFCLE9BQU8sR0FBR0EsUUFBUXVCLE9BQU87QUFDbEMsQ0FBQyxDQUVELDZDQUE2QyIsInNvdXJjZXMiOlsid2VicGFjazovL21jZ3BvcnRmby8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L2dldC1kb21haW4tbG9jYWxlLmpzPzVjMjciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldERvbWFpbkxvY2FsZSA9IGdldERvbWFpbkxvY2FsZTtcbmNvbnN0IGJhc2VQYXRoID0gcHJvY2Vzcy5lbnYuX19ORVhUX1JPVVRFUl9CQVNFUEFUSCB8fCAnJztcbmZ1bmN0aW9uIGdldERvbWFpbkxvY2FsZShwYXRoLCBsb2NhbGUsIGxvY2FsZXMsIGRvbWFpbkxvY2FsZXMpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuX19ORVhUX0kxOE5fU1VQUE9SVCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVMb2NhbGVQYXRoID0gcmVxdWlyZSgnLi9ub3JtYWxpemUtbG9jYWxlLXBhdGgnKS5ub3JtYWxpemVMb2NhbGVQYXRoO1xuICAgICAgICBjb25zdCBkZXRlY3REb21haW5Mb2NhbGUgPSByZXF1aXJlKCcuL2RldGVjdC1kb21haW4tbG9jYWxlJykuZGV0ZWN0RG9tYWluTG9jYWxlO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBsb2NhbGUgfHwgbm9ybWFsaXplTG9jYWxlUGF0aChwYXRoLCBsb2NhbGVzKS5kZXRlY3RlZExvY2FsZTtcbiAgICAgICAgY29uc3QgZG9tYWluID0gZGV0ZWN0RG9tYWluTG9jYWxlKGRvbWFpbkxvY2FsZXMsIHVuZGVmaW5lZCwgdGFyZ2V0KTtcbiAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgY29uc3QgcHJvdG8gPSBgaHR0cCR7ZG9tYWluLmh0dHAgPyAnJyA6ICdzJ306Ly9gO1xuICAgICAgICAgICAgY29uc3QgZmluYWxMb2NhbGUgPSB0YXJnZXQgPT09IGRvbWFpbi5kZWZhdWx0TG9jYWxlID8gJycgOiBgLyR7dGFyZ2V0fWA7XG4gICAgICAgICAgICByZXR1cm4gYCR7cHJvdG99JHtkb21haW4uZG9tYWlufSR7YmFzZVBhdGh9JHtmaW5hbExvY2FsZX0ke3BhdGh9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuaWYgKCh0eXBlb2YgZXhwb3J0cy5kZWZhdWx0ID09PSAnZnVuY3Rpb24nIHx8ICh0eXBlb2YgZXhwb3J0cy5kZWZhdWx0ID09PSAnb2JqZWN0JyAmJiBleHBvcnRzLmRlZmF1bHQgIT09IG51bGwpKSAmJiB0eXBlb2YgZXhwb3J0cy5kZWZhdWx0Ll9fZXNNb2R1bGUgPT09ICd1bmRlZmluZWQnKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLmRlZmF1bHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiAgT2JqZWN0LmFzc2lnbihleHBvcnRzLmRlZmF1bHQsIGV4cG9ydHMpO1xuICBtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMuZGVmYXVsdDtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0LWRvbWFpbi1sb2NhbGUuanMubWFwIl0sIm5hbWVzIjpbIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZXhwb3J0cyIsInZhbHVlIiwiZ2V0RG9tYWluTG9jYWxlIiwiYmFzZVBhdGgiLCJwcm9jZXNzIiwiZW52IiwiX19ORVhUX1JPVVRFUl9CQVNFUEFUSCIsInBhdGgiLCJsb2NhbGUiLCJsb2NhbGVzIiwiZG9tYWluTG9jYWxlcyIsIl9fTkVYVF9JMThOX1NVUFBPUlQiLCJub3JtYWxpemVMb2NhbGVQYXRoIiwicmVxdWlyZSIsImRldGVjdERvbWFpbkxvY2FsZSIsInRhcmdldCIsImRldGVjdGVkTG9jYWxlIiwiZG9tYWluIiwidW5kZWZpbmVkIiwicHJvdG8iLCJodHRwIiwiZmluYWxMb2NhbGUiLCJkZWZhdWx0TG9jYWxlIiwiZGVmYXVsdCIsIl9fZXNNb2R1bGUiLCJhc3NpZ24iLCJtb2R1bGUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/get-domain-locale.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/has-base-path.js": -/*!********************************************************!*\ - !*** ./node_modules/next/dist/client/has-base-path.js ***! - \********************************************************/ -/***/ ((module, exports, __webpack_require__) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.hasBasePath = hasBasePath;\nvar _pathHasPrefix = __webpack_require__(/*! ../shared/lib/router/utils/path-has-prefix */ \"../shared/lib/router/utils/path-has-prefix\");\nconst basePath = false || \"\";\nfunction hasBasePath(path) {\n return (0, _pathHasPrefix).pathHasPrefix(path, basePath);\n}\nif ((typeof exports.default === \"function\" || typeof exports.default === \"object\" && exports.default !== null) && typeof exports.default.__esModule === \"undefined\") {\n Object.defineProperty(exports.default, \"__esModule\", {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=has-base-path.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9oYXMtYmFzZS1wYXRoLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2JBLDhDQUE2QztJQUN6Q0csT0FBTyxJQUFJO0FBQ2YsQ0FBQyxFQUFDO0FBQ0ZELG1CQUFtQixHQUFHRTtBQUN0QixJQUFJQyxpQkFBaUJDLG1CQUFPQSxDQUFDLDhGQUE0QztBQUN6RSxNQUFNQyxXQUFXQyxNQUFrQyxJQUFJO0FBQ3ZELFNBQVNKLFlBQVlPLElBQUksRUFBRTtJQUN2QixPQUFPLENBQUMsR0FBR04sY0FBYyxFQUFFTyxhQUFhLENBQUNELE1BQU1KO0FBQ25EO0FBRUEsSUFBSSxDQUFDLE9BQU9MLFFBQVFXLE9BQU8sS0FBSyxjQUFlLE9BQU9YLFFBQVFXLE9BQU8sS0FBSyxZQUFZWCxRQUFRVyxPQUFPLEtBQUssSUFBSSxLQUFNLE9BQU9YLFFBQVFXLE9BQU8sQ0FBQ0MsVUFBVSxLQUFLLGFBQWE7SUFDcktkLE9BQU9DLGNBQWMsQ0FBQ0MsUUFBUVcsT0FBTyxFQUFFLGNBQWM7UUFBRVYsT0FBTyxJQUFJO0lBQUM7SUFDbkVILE9BQU9lLE1BQU0sQ0FBQ2IsUUFBUVcsT0FBTyxFQUFFWDtJQUMvQmMsT0FBT2QsT0FBTyxHQUFHQSxRQUFRVyxPQUFPO0FBQ2xDLENBQUMsQ0FFRCx5Q0FBeUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tY2dwb3J0Zm8vLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9oYXMtYmFzZS1wYXRoLmpzPzVhNDkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmhhc0Jhc2VQYXRoID0gaGFzQmFzZVBhdGg7XG52YXIgX3BhdGhIYXNQcmVmaXggPSByZXF1aXJlKFwiLi4vc2hhcmVkL2xpYi9yb3V0ZXIvdXRpbHMvcGF0aC1oYXMtcHJlZml4XCIpO1xuY29uc3QgYmFzZVBhdGggPSBwcm9jZXNzLmVudi5fX05FWFRfUk9VVEVSX0JBU0VQQVRIIHx8ICcnO1xuZnVuY3Rpb24gaGFzQmFzZVBhdGgocGF0aCkge1xuICAgIHJldHVybiAoMCwgX3BhdGhIYXNQcmVmaXgpLnBhdGhIYXNQcmVmaXgocGF0aCwgYmFzZVBhdGgpO1xufVxuXG5pZiAoKHR5cGVvZiBleHBvcnRzLmRlZmF1bHQgPT09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiBleHBvcnRzLmRlZmF1bHQgPT09ICdvYmplY3QnICYmIGV4cG9ydHMuZGVmYXVsdCAhPT0gbnVsbCkpICYmIHR5cGVvZiBleHBvcnRzLmRlZmF1bHQuX19lc01vZHVsZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMuZGVmYXVsdCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuICBPYmplY3QuYXNzaWduKGV4cG9ydHMuZGVmYXVsdCwgZXhwb3J0cyk7XG4gIG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cy5kZWZhdWx0O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXMtYmFzZS1wYXRoLmpzLm1hcCJdLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImhhc0Jhc2VQYXRoIiwiX3BhdGhIYXNQcmVmaXgiLCJyZXF1aXJlIiwiYmFzZVBhdGgiLCJwcm9jZXNzIiwiZW52IiwiX19ORVhUX1JPVVRFUl9CQVNFUEFUSCIsInBhdGgiLCJwYXRoSGFzUHJlZml4IiwiZGVmYXVsdCIsIl9fZXNNb2R1bGUiLCJhc3NpZ24iLCJtb2R1bGUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/has-base-path.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/head-manager.js": -/*!*******************************************************!*\ - !*** ./node_modules/next/dist/client/head-manager.js ***! - \*******************************************************/ -/***/ ((module, exports) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports[\"default\"] = initHeadManager;\nexports.isEqualNode = isEqualNode;\nexports.DOMAttributeNames = void 0;\nfunction initHeadManager() {\n return {\n mountedInstances: new Set(),\n updateHead: (head)=>{\n const tags = {};\n head.forEach((h)=>{\n if (// it won't be inlined. In this case revert to the original behavior\n h.type === \"link\" && h.props[\"data-optimized-fonts\"]) {\n if (document.querySelector(`style[data-href=\"${h.props[\"data-href\"]}\"]`)) {\n return;\n } else {\n h.props.href = h.props[\"data-href\"];\n h.props[\"data-href\"] = undefined;\n }\n }\n const components = tags[h.type] || [];\n components.push(h);\n tags[h.type] = components;\n });\n const titleComponent = tags.title ? tags.title[0] : null;\n let title = \"\";\n if (titleComponent) {\n const { children } = titleComponent.props;\n title = typeof children === \"string\" ? children : Array.isArray(children) ? children.join(\"\") : \"\";\n }\n if (title !== document.title) document.title = title;\n [\n \"meta\",\n \"base\",\n \"link\",\n \"style\",\n \"script\"\n ].forEach((type)=>{\n updateElements(type, tags[type] || []);\n });\n }\n };\n}\nconst DOMAttributeNames = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\",\n noModule: \"noModule\"\n};\nexports.DOMAttributeNames = DOMAttributeNames;\nfunction reactElementToDOM({ type , props }) {\n const el = document.createElement(type);\n for(const p in props){\n if (!props.hasOwnProperty(p)) continue;\n if (p === \"children\" || p === \"dangerouslySetInnerHTML\") continue;\n // we don't render undefined props to the DOM\n if (props[p] === undefined) continue;\n const attr = DOMAttributeNames[p] || p.toLowerCase();\n if (type === \"script\" && (attr === \"async\" || attr === \"defer\" || attr === \"noModule\")) {\n el[attr] = !!props[p];\n } else {\n el.setAttribute(attr, props[p]);\n }\n }\n const { children , dangerouslySetInnerHTML } = props;\n if (dangerouslySetInnerHTML) {\n el.innerHTML = dangerouslySetInnerHTML.__html || \"\";\n } else if (children) {\n el.textContent = typeof children === \"string\" ? children : Array.isArray(children) ? children.join(\"\") : \"\";\n }\n return el;\n}\nfunction isEqualNode(oldTag, newTag) {\n if (oldTag instanceof HTMLElement && newTag instanceof HTMLElement) {\n const nonce = newTag.getAttribute(\"nonce\");\n // Only strip the nonce if `oldTag` has had it stripped. An element's nonce attribute will not\n // be stripped if there is no content security policy response header that includes a nonce.\n if (nonce && !oldTag.getAttribute(\"nonce\")) {\n const cloneTag = newTag.cloneNode(true);\n cloneTag.setAttribute(\"nonce\", \"\");\n cloneTag.nonce = nonce;\n return nonce === oldTag.nonce && oldTag.isEqualNode(cloneTag);\n }\n }\n return oldTag.isEqualNode(newTag);\n}\nfunction updateElements(type, components) {\n const headEl = document.getElementsByTagName(\"head\")[0];\n const headCountEl = headEl.querySelector(\"meta[name=next-head-count]\");\n if (true) {\n if (!headCountEl) {\n console.error(\"Warning: next-head-count is missing. https://nextjs.org/docs/messages/next-head-count-missing\");\n return;\n }\n }\n const headCount = Number(headCountEl.content);\n const oldTags = [];\n for(let i = 0, j = headCountEl.previousElementSibling; i < headCount; i++, j = (j == null ? void 0 : j.previousElementSibling) || null){\n var ref;\n if ((j == null ? void 0 : (ref = j.tagName) == null ? void 0 : ref.toLowerCase()) === type) {\n oldTags.push(j);\n }\n }\n const newTags = components.map(reactElementToDOM).filter((newTag)=>{\n for(let k = 0, len = oldTags.length; k < len; k++){\n const oldTag = oldTags[k];\n if (isEqualNode(oldTag, newTag)) {\n oldTags.splice(k, 1);\n return false;\n }\n }\n return true;\n });\n oldTags.forEach((t)=>{\n var ref;\n return (ref = t.parentNode) == null ? void 0 : ref.removeChild(t);\n });\n newTags.forEach((t)=>headEl.insertBefore(t, headCountEl));\n headCountEl.content = (headCount - oldTags.length + newTags.length).toString();\n}\nif ((typeof exports.default === \"function\" || typeof exports.default === \"object\" && exports.default !== null) && typeof exports.default.__esModule === \"undefined\") {\n Object.defineProperty(exports.default, \"__esModule\", {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=head-manager.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9oZWFkLW1hbmFnZXIuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYkEsOENBQTZDO0lBQ3pDRyxPQUFPLElBQUk7QUFDZixDQUFDLEVBQUM7QUFDRkQsa0JBQWUsR0FBR0c7QUFDbEJILG1CQUFtQixHQUFHSTtBQUN0QkoseUJBQXlCLEdBQUcsS0FBSztBQUNqQyxTQUFTRyxrQkFBa0I7SUFDdkIsT0FBTztRQUNIRyxrQkFBa0IsSUFBSUM7UUFDdEJDLFlBQVksQ0FBQ0MsT0FBTztZQUNoQixNQUFNQyxPQUFPLENBQUM7WUFDZEQsS0FBS0UsT0FBTyxDQUFDLENBQUNDLElBQUk7Z0JBQ2QsSUFDQSxvRUFBb0U7Z0JBQ3BFQSxFQUFFQyxJQUFJLEtBQUssVUFBVUQsRUFBRUUsS0FBSyxDQUFDLHVCQUF1QixFQUFFO29CQUNsRCxJQUFJQyxTQUFTQyxhQUFhLENBQUMsQ0FBQyxpQkFBaUIsRUFBRUosRUFBRUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsR0FBRzt3QkFDdEU7b0JBQ0osT0FBTzt3QkFDSEYsRUFBRUUsS0FBSyxDQUFDRyxJQUFJLEdBQUdMLEVBQUVFLEtBQUssQ0FBQyxZQUFZO3dCQUNuQ0YsRUFBRUUsS0FBSyxDQUFDLFlBQVksR0FBR0k7b0JBQzNCLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxNQUFNQyxhQUFhVCxJQUFJLENBQUNFLEVBQUVDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ3JDTSxXQUFXQyxJQUFJLENBQUNSO2dCQUNoQkYsSUFBSSxDQUFDRSxFQUFFQyxJQUFJLENBQUMsR0FBR007WUFDbkI7WUFDQSxNQUFNRSxpQkFBaUJYLEtBQUtZLEtBQUssR0FBR1osS0FBS1ksS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJO1lBQ3hELElBQUlBLFFBQVE7WUFDWixJQUFJRCxnQkFBZ0I7Z0JBQ2hCLE1BQU0sRUFBRUUsU0FBUSxFQUFHLEdBQUdGLGVBQWVQLEtBQUs7Z0JBQzFD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QyxPQUFPOUUsUUFBUUUsT0FBTyxLQUFLLGNBQWUsT0FBT0YsUUFBUUUsT0FBTyxLQUFLLFlBQVlGLFFBQVFFLE9BQU8sS0FBSyxJQUFJLEtBQU0sT0FBT0YsUUFBUUUsT0FBTyxDQUFDNkUsVUFBVSxLQUFLLGFBQWE7SUFDcktqRixPQUFPQyxjQUFjLENBQUNDLFFBQVFFLE9BQU8sRUFBRSxjQUFjO1FBQUVELE9BQU8sSUFBSTtJQUFDO0lBQ25FSCxPQUFPa0YsTUFBTSxDQUFDaEYsUUFBUUUsT0FBTyxFQUFFRjtJQUMvQmlGLE9BQU9qRixPQUFPLEdBQUdBLFFBQVFFLE9BQU87QUFDbEMsQ0FBQyxDQUVELHdDQUF3QyIsInNvdXJjZXMiOlsid2VicGFjazovL21jZ3BvcnRmby8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L2hlYWQtbWFuYWdlci5qcz9jYTRhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gaW5pdEhlYWRNYW5hZ2VyO1xuZXhwb3J0cy5pc0VxdWFsTm9kZSA9IGlzRXF1YWxOb2RlO1xuZXhwb3J0cy5ET01BdHRyaWJ1dGVOYW1lcyA9IHZvaWQgMDtcbmZ1bmN0aW9uIGluaXRIZWFkTWFuYWdlcigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBtb3VudGVkSW5zdGFuY2VzOiBuZXcgU2V0KCksXG4gICAgICAgIHVwZGF0ZUhlYWQ6IChoZWFkKT0+e1xuICAgICAgICAgICAgY29uc3QgdGFncyA9IHt9O1xuICAgICAgICAgICAgaGVhZC5mb3JFYWNoKChoKT0+e1xuICAgICAgICAgICAgICAgIGlmICgvLyBJZiB0aGUgZm9udCB0YWcgaXMgbG9hZGVkIG9ubHkgb24gY2xpZW50IG5hdmlnYXRpb25cbiAgICAgICAgICAgICAgICAvLyBpdCB3b24ndCBiZSBpbmxpbmVkLiBJbiB0aGlzIGNhc2UgcmV2ZXJ0IHRvIHRoZSBvcmlnaW5hbCBiZWhhdmlvclxuICAgICAgICAgICAgICAgIGgudHlwZSA9PT0gJ2xpbmsnICYmIGgucHJvcHNbJ2RhdGEtb3B0aW1pemVkLWZvbnRzJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHN0eWxlW2RhdGEtaHJlZj1cIiR7aC5wcm9wc1snZGF0YS1ocmVmJ119XCJdYCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGgucHJvcHMuaHJlZiA9IGgucHJvcHNbJ2RhdGEtaHJlZiddO1xuICAgICAgICAgICAgICAgICAgICAgICAgaC5wcm9wc1snZGF0YS1ocmVmJ10gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRhZ3NbaC50eXBlXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goaCk7XG4gICAgICAgICAgICAgICAgdGFnc1toLnR5cGVdID0gY29tcG9uZW50cztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgdGl0bGVDb21wb25lbnQgPSB0YWdzLnRpdGxlID8gdGFncy50aXRsZVswXSA6IG51bGw7XG4gICAgICAgICAgICBsZXQgdGl0bGUgPSAnJztcbiAgICAgICAgICAgIGlmICh0aXRsZUNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY2hpbGRyZW4gIH0gPSB0aXRsZUNvbXBvbmVudC5wcm9wcztcbiAgICAgICAgICAgICAgICB0aXRsZSA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gJ3N0cmluZycgPyBjaGlsZHJlbiA6IEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4uam9pbignJykgOiAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aXRsZSAhPT0gZG9jdW1lbnQudGl0bGUpIGRvY3VtZW50LnRpdGxlID0gdGl0bGU7XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgJ21ldGEnLFxuICAgICAgICAgICAgICAgICdiYXNlJyxcbiAgICAgICAgICAgICAgICAnbGluaycsXG4gICAgICAgICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAgICAgICAnc2NyaXB0J1xuICAgICAgICAgICAgXS5mb3JFYWNoKCh0eXBlKT0+e1xuICAgICAgICAgICAgICAgIHVwZGF0ZUVsZW1lbnRzKHR5cGUsIHRhZ3NbdHlwZV0gfHwgW10pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuY29uc3QgRE9NQXR0cmlidXRlTmFtZXMgPSB7XG4gICAgYWNjZXB0Q2hhcnNldDogJ2FjY2VwdC1jaGFyc2V0JyxcbiAgICBjbGFzc05hbWU6ICdjbGFzcycsXG4gICAgaHRtbEZvcjogJ2ZvcicsXG4gICAgaHR0cEVxdWl2OiAnaHR0cC1lcXVpdicsXG4gICAgbm9Nb2R1bGU6ICdub01vZHVsZSdcbn07XG5leHBvcnRzLkRPTUF0dHJpYnV0ZU5hbWVzID0gRE9NQXR0cmlidXRlTmFtZXM7XG5mdW5jdGlvbiByZWFjdEVsZW1lbnRUb0RPTSh7IHR5cGUgLCBwcm9wcyAgfSkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTtcbiAgICBmb3IoY29uc3QgcCBpbiBwcm9wcyl7XG4gICAgICAgIGlmICghcHJvcHMuaGFzT3duUHJvcGVydHkocCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocCA9PT0gJ2NoaWxkcmVuJyB8fCBwID09PSAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnKSBjb250aW51ZTtcbiAgICAgICAgLy8gd2UgZG9uJ3QgcmVuZGVyIHVuZGVmaW5lZCBwcm9wcyB0byB0aGUgRE9NXG4gICAgICAgIGlmIChwcm9wc1twXSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYXR0ciA9IERPTUF0dHJpYnV0ZU5hbWVzW3BdIHx8IHAudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzY3JpcHQnICYmIChhdHRyID09PSAnYXN5bmMnIHx8IGF0dHIgPT09ICdkZWZlcicgfHwgYXR0ciA9PT0gJ25vTW9kdWxlJykpIHtcbiAgICAgICAgICAgIGVsW2F0dHJdID0gISFwcm9wc1twXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShhdHRyLCBwcm9wc1twXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgeyBjaGlsZHJlbiAsIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICB9ID0gcHJvcHM7XG4gICAgaWYgKGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSB7XG4gICAgICAgIGVsLmlubmVySFRNTCA9IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCB8fCAnJztcbiAgICB9IGVsc2UgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIGVsLnRleHRDb250ZW50ID0gdHlwZW9mIGNoaWxkcmVuID09PSAnc3RyaW5nJyA/IGNoaWxkcmVuIDogQXJyYXkuaXNBcnJheShjaGlsZHJlbikgPyBjaGlsZHJlbi5qb2luKCcnKSA6ICcnO1xuICAgIH1cbiAgICByZXR1cm4gZWw7XG59XG5mdW5jdGlvbiBpc0VxdWFsTm9kZShvbGRUYWcsIG5ld1RhZykge1xuICAgIGlmIChvbGRUYWcgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBuZXdUYWcgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICBjb25zdCBub25jZSA9IG5ld1RhZy5nZXRBdHRyaWJ1dGUoJ25vbmNlJyk7XG4gICAgICAgIC8vIE9ubHkgc3RyaXAgdGhlIG5vbmNlIGlmIGBvbGRUYWdgIGhhcyBoYWQgaXQgc3RyaXBwZWQuIEFuIGVsZW1lbnQncyBub25jZSBhdHRyaWJ1dGUgd2lsbCBub3RcbiAgICAgICAgLy8gYmUgc3RyaXBwZWQgaWYgdGhlcmUgaXMgbm8gY29udGVudCBzZWN1cml0eSBwb2xpY3kgcmVzcG9uc2UgaGVhZGVyIHRoYXQgaW5jbHVkZXMgYSBub25jZS5cbiAgICAgICAgaWYgKG5vbmNlICYmICFvbGRUYWcuZ2V0QXR0cmlidXRlKCdub25jZScpKSB7XG4gICAgICAgICAgICBjb25zdCBjbG9uZVRhZyA9IG5ld1RhZy5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICBjbG9uZVRhZy5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgJycpO1xuICAgICAgICAgICAgY2xvbmVUYWcubm9uY2UgPSBub25jZTtcbiAgICAgICAgICAgIHJldHVybiBub25jZSA9PT0gb2xkVGFnLm5vbmNlICYmIG9sZFRhZy5pc0VxdWFsTm9kZShjbG9uZVRhZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9sZFRhZy5pc0VxdWFsTm9kZShuZXdUYWcpO1xufVxuZnVuY3Rpb24gdXBkYXRlRWxlbWVudHModHlwZSwgY29tcG9uZW50cykge1xuICAgIGNvbnN0IGhlYWRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XG4gICAgY29uc3QgaGVhZENvdW50RWwgPSBoZWFkRWwucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPW5leHQtaGVhZC1jb3VudF0nKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoIWhlYWRDb3VudEVsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdXYXJuaW5nOiBuZXh0LWhlYWQtY291bnQgaXMgbWlzc2luZy4gaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvbWVzc2FnZXMvbmV4dC1oZWFkLWNvdW50LW1pc3NpbmcnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBoZWFkQ291bnQgPSBOdW1iZXIoaGVhZENvdW50RWwuY29udGVudCk7XG4gICAgY29uc3Qgb2xkVGFncyA9IFtdO1xuICAgIGZvcihsZXQgaSA9IDAsIGogPSBoZWFkQ291bnRFbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOyBpIDwgaGVhZENvdW50OyBpKyssIGogPSAoaiA9PSBudWxsID8gdm9pZCAwIDogai5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB8fCBudWxsKXtcbiAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgaWYgKChqID09IG51bGwgPyB2b2lkIDAgOiAocmVmID0gai50YWdOYW1lKSA9PSBudWxsID8gdm9pZCAwIDogcmVmLnRvTG93ZXJDYXNlKCkpID09PSB0eXBlKSB7XG4gICAgICAgICAgICBvbGRUYWdzLnB1c2goaik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3VGFncyA9IGNvbXBvbmVudHMubWFwKHJlYWN0RWxlbWVudFRvRE9NKS5maWx0ZXIoKG5ld1RhZyk9PntcbiAgICAgICAgZm9yKGxldCBrID0gMCwgbGVuID0gb2xkVGFncy5sZW5ndGg7IGsgPCBsZW47IGsrKyl7XG4gICAgICAgICAgICBjb25zdCBvbGRUYWcgPSBvbGRUYWdzW2tdO1xuICAgICAgICAgICAgaWYgKGlzRXF1YWxOb2RlKG9sZFRhZywgbmV3VGFnKSkge1xuICAgICAgICAgICAgICAgIG9sZFRhZ3Muc3BsaWNlKGssIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBvbGRUYWdzLmZvckVhY2goKHQpPT57XG4gICAgICAgIHZhciByZWY7XG4gICAgICAgIHJldHVybiAocmVmID0gdC5wYXJlbnROb2RlKSA9PSBudWxsID8gdm9pZCAwIDogcmVmLnJlbW92ZUNoaWxkKHQpO1xuICAgIH0pO1xuICAgIG5ld1RhZ3MuZm9yRWFjaCgodCk9PmhlYWRFbC5pbnNlcnRCZWZvcmUodCwgaGVhZENvdW50RWwpKTtcbiAgICBoZWFkQ291bnRFbC5jb250ZW50ID0gKGhlYWRDb3VudCAtIG9sZFRhZ3MubGVuZ3RoICsgbmV3VGFncy5sZW5ndGgpLnRvU3RyaW5nKCk7XG59XG5cbmlmICgodHlwZW9mIGV4cG9ydHMuZGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJyB8fCAodHlwZW9mIGV4cG9ydHMuZGVmYXVsdCA9PT0gJ29iamVjdCcgJiYgZXhwb3J0cy5kZWZhdWx0ICE9PSBudWxsKSkgJiYgdHlwZW9mIGV4cG9ydHMuZGVmYXVsdC5fX2VzTW9kdWxlID09PSAndW5kZWZpbmVkJykge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cy5kZWZhdWx0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gIE9iamVjdC5hc3NpZ24oZXhwb3J0cy5kZWZhdWx0LCBleHBvcnRzKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzLmRlZmF1bHQ7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhlYWQtbWFuYWdlci5qcy5tYXAiXSwibmFtZXMiOlsiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJleHBvcnRzIiwidmFsdWUiLCJkZWZhdWx0IiwiaW5pdEhlYWRNYW5hZ2VyIiwiaXNFcXVhbE5vZGUiLCJET01BdHRyaWJ1dGVOYW1lcyIsIm1vdW50ZWRJbnN0YW5jZXMiLCJTZXQiLCJ1cGRhdGVIZWFkIiwiaGVhZCIsInRhZ3MiLCJmb3JFYWNoIiwiaCIsInR5cGUiLCJwcm9wcyIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsImhyZWYiLCJ1bmRlZmluZWQiLCJjb21wb25lbnRzIiwicHVzaCIsInRpdGxlQ29tcG9uZW50IiwidGl0bGUiLCJjaGlsZHJlbiIsIkFycmF5IiwiaXNBcnJheSIsImpvaW4iLCJ1cGRhdGVFbGVtZW50cyIsImFjY2VwdENoYXJzZXQiLCJjbGFzc05hbWUiLCJodG1sRm9yIiwiaHR0cEVxdWl2Iiwibm9Nb2R1bGUiLCJyZWFjdEVsZW1lbnRUb0RPTSIsImVsIiwiY3JlYXRlRWxlbWVudCIsInAiLCJoYXNPd25Qcm9wZXJ0eSIsImF0dHIiLCJ0b0xvd2VyQ2FzZSIsInNldEF0dHJpYnV0ZSIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiaW5uZXJIVE1MIiwiX19odG1sIiwidGV4dENvbnRlbnQiLCJvbGRUYWciLCJuZXdUYWciLCJIVE1MRWxlbWVudCIsIm5vbmNlIiwiZ2V0QXR0cmlidXRlIiwiY2xvbmVUYWciLCJjbG9uZU5vZGUiLCJoZWFkRWwiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImhlYWRDb3VudEVsIiwicHJvY2VzcyIsImNvbnNvbGUiLCJlcnJvciIsImhlYWRDb3VudCIsIk51bWJlciIsImNvbnRlbnQiLCJvbGRUYWdzIiwiaSIsImoiLCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwicmVmIiwidGFnTmFtZSIsIm5ld1RhZ3MiLCJtYXAiLCJmaWx0ZXIiLCJrIiwibGVuIiwibGVuZ3RoIiwic3BsaWNlIiwidCIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsImluc2VydEJlZm9yZSIsInRvU3RyaW5nIiwiX19lc01vZHVsZSIsImFzc2lnbiIsIm1vZHVsZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/head-manager.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/image.js": -/*!************************************************!*\ - !*** ./node_modules/next/dist/client/image.js ***! - \************************************************/ -/***/ ((module, exports, __webpack_require__) => { - -"use strict"; -eval("\n\"use client\";\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports[\"default\"] = Image;\nvar _extends = (__webpack_require__(/*! @swc/helpers/lib/_extends.js */ \"./node_modules/@swc/helpers/lib/_extends.js\")[\"default\"]);\nvar _interop_require_default = (__webpack_require__(/*! @swc/helpers/lib/_interop_require_default.js */ \"./node_modules/@swc/helpers/lib/_interop_require_default.js\")[\"default\"]);\nvar _interop_require_wildcard = (__webpack_require__(/*! @swc/helpers/lib/_interop_require_wildcard.js */ \"./node_modules/@swc/helpers/lib/_interop_require_wildcard.js\")[\"default\"]);\nvar _object_without_properties_loose = (__webpack_require__(/*! @swc/helpers/lib/_object_without_properties_loose.js */ \"./node_modules/@swc/helpers/lib/_object_without_properties_loose.js\")[\"default\"]);\nvar _react = _interop_require_wildcard(__webpack_require__(/*! react */ \"react\"));\nvar _head = _interop_require_default(__webpack_require__(/*! ../shared/lib/head */ \"../shared/lib/head\"));\nvar _imageBlurSvg = __webpack_require__(/*! ../shared/lib/image-blur-svg */ \"../shared/lib/image-blur-svg\");\nvar _imageConfig = __webpack_require__(/*! ../shared/lib/image-config */ \"../shared/lib/image-config\");\nvar _imageConfigContext = __webpack_require__(/*! ../shared/lib/image-config-context */ \"../shared/lib/image-config-context\");\nvar _warnOnce = __webpack_require__(/*! ../shared/lib/utils/warn-once */ \"../shared/lib/utils/warn-once\");\nvar _imageLoader = _interop_require_default(__webpack_require__(/*! next/dist/shared/lib/image-loader */ \"next/dist/shared/lib/image-loader\"));\nfunction Image(_param) {\n var { src , sizes , unoptimized =false , priority =false , loading , className , quality , width , height , fill , style , onLoad , onLoadingComplete , placeholder =\"empty\" , blurDataURL , layout , objectFit , objectPosition , lazyBoundary , lazyRoot } = _param, all = _object_without_properties_loose(_param, [\n \"src\",\n \"sizes\",\n \"unoptimized\",\n \"priority\",\n \"loading\",\n \"className\",\n \"quality\",\n \"width\",\n \"height\",\n \"fill\",\n \"style\",\n \"onLoad\",\n \"onLoadingComplete\",\n \"placeholder\",\n \"blurDataURL\",\n \"layout\",\n \"objectFit\",\n \"objectPosition\",\n \"lazyBoundary\",\n \"lazyRoot\"\n ]);\n const configContext = (0, _react).useContext(_imageConfigContext.ImageConfigContext);\n const config = (0, _react).useMemo(()=>{\n const c = configEnv || configContext || _imageConfig.imageConfigDefault;\n const allSizes = [\n ...c.deviceSizes,\n ...c.imageSizes\n ].sort((a, b)=>a - b);\n const deviceSizes = c.deviceSizes.sort((a, b)=>a - b);\n return _extends({}, c, {\n allSizes,\n deviceSizes\n });\n }, [\n configContext\n ]);\n let rest = all;\n let loader = rest.loader || _imageLoader.default;\n // Remove property so it's not spread on element\n delete rest.loader;\n if (\"__next_img_default\" in loader) {\n // This special value indicates that the user\n // didn't define a \"loader\" prop or config.\n if (config.loader === \"custom\") {\n throw new Error(`Image with src \"${src}\" is missing \"loader\" prop.` + `\\nRead more: https://nextjs.org/docs/messages/next-image-missing-loader`);\n }\n } else {\n // The user defined a \"loader\" prop or config.\n // Since the config object is internal only, we\n // must not pass it to the user-defined \"loader\".\n const customImageLoader = loader;\n var _tmp;\n _tmp = (obj)=>{\n const { config: _ } = obj, opts = _object_without_properties_loose(obj, [\n \"config\"\n ]);\n return customImageLoader(opts);\n }, loader = _tmp, _tmp;\n }\n if (layout) {\n if (layout === \"fill\") {\n fill = true;\n }\n const layoutToStyle = {\n intrinsic: {\n maxWidth: \"100%\",\n height: \"auto\"\n },\n responsive: {\n width: \"100%\",\n height: \"auto\"\n }\n };\n const layoutToSizes = {\n responsive: \"100vw\",\n fill: \"100vw\"\n };\n const layoutStyle = layoutToStyle[layout];\n if (layoutStyle) {\n style = _extends({}, style, layoutStyle);\n }\n const layoutSizes = layoutToSizes[layout];\n if (layoutSizes && !sizes) {\n sizes = layoutSizes;\n }\n }\n let staticSrc = \"\";\n let widthInt = getInt(width);\n let heightInt = getInt(height);\n let blurWidth;\n let blurHeight;\n if (isStaticImport(src)) {\n const staticImageData = isStaticRequire(src) ? src.default : src;\n if (!staticImageData.src) {\n throw new Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received ${JSON.stringify(staticImageData)}`);\n }\n if (!staticImageData.height || !staticImageData.width) {\n throw new Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received ${JSON.stringify(staticImageData)}`);\n }\n blurWidth = staticImageData.blurWidth;\n blurHeight = staticImageData.blurHeight;\n blurDataURL = blurDataURL || staticImageData.blurDataURL;\n staticSrc = staticImageData.src;\n if (!fill) {\n if (!widthInt && !heightInt) {\n widthInt = staticImageData.width;\n heightInt = staticImageData.height;\n } else if (widthInt && !heightInt) {\n const ratio = widthInt / staticImageData.width;\n heightInt = Math.round(staticImageData.height * ratio);\n } else if (!widthInt && heightInt) {\n const ratio1 = heightInt / staticImageData.height;\n widthInt = Math.round(staticImageData.width * ratio1);\n }\n }\n }\n src = typeof src === \"string\" ? src : staticSrc;\n let isLazy = !priority && (loading === \"lazy\" || typeof loading === \"undefined\");\n if (src.startsWith(\"data:\") || src.startsWith(\"blob:\")) {\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\n unoptimized = true;\n isLazy = false;\n }\n if (config.unoptimized) {\n unoptimized = true;\n }\n const [blurComplete, setBlurComplete] = (0, _react).useState(false);\n const [showAltText, setShowAltText] = (0, _react).useState(false);\n const qualityInt = getInt(quality);\n if (true) {\n if (!src) {\n // React doesn't show the stack trace and there's\n // no `src` to help identify which image, so we\n // instead console.error(ref) during mount.\n unoptimized = true;\n } else {\n if (fill) {\n if (width) {\n throw new Error(`Image with src \"${src}\" has both \"width\" and \"fill\" properties. Only one should be used.`);\n }\n if (height) {\n throw new Error(`Image with src \"${src}\" has both \"height\" and \"fill\" properties. Only one should be used.`);\n }\n if ((style == null ? void 0 : style.position) && style.position !== \"absolute\") {\n throw new Error(`Image with src \"${src}\" has both \"fill\" and \"style.position\" properties. Images with \"fill\" always use position absolute - it cannot be modified.`);\n }\n if ((style == null ? void 0 : style.width) && style.width !== \"100%\") {\n throw new Error(`Image with src \"${src}\" has both \"fill\" and \"style.width\" properties. Images with \"fill\" always use width 100% - it cannot be modified.`);\n }\n if ((style == null ? void 0 : style.height) && style.height !== \"100%\") {\n throw new Error(`Image with src \"${src}\" has both \"fill\" and \"style.height\" properties. Images with \"fill\" always use height 100% - it cannot be modified.`);\n }\n } else {\n if (typeof widthInt === \"undefined\") {\n throw new Error(`Image with src \"${src}\" is missing required \"width\" property.`);\n } else if (isNaN(widthInt)) {\n throw new Error(`Image with src \"${src}\" has invalid \"width\" property. Expected a numeric value in pixels but received \"${width}\".`);\n }\n if (typeof heightInt === \"undefined\") {\n throw new Error(`Image with src \"${src}\" is missing required \"height\" property.`);\n } else if (isNaN(heightInt)) {\n throw new Error(`Image with src \"${src}\" has invalid \"height\" property. Expected a numeric value in pixels but received \"${height}\".`);\n }\n }\n }\n if (!VALID_LOADING_VALUES.includes(loading)) {\n throw new Error(`Image with src \"${src}\" has invalid \"loading\" property. Provided \"${loading}\" should be one of ${VALID_LOADING_VALUES.map(String).join(\",\")}.`);\n }\n if (priority && loading === \"lazy\") {\n throw new Error(`Image with src \"${src}\" has both \"priority\" and \"loading='lazy'\" properties. Only one should be used.`);\n }\n if (placeholder === \"blur\") {\n if (widthInt && heightInt && widthInt * heightInt < 1600) {\n (0, _warnOnce).warnOnce(`Image with src \"${src}\" is smaller than 40x40. Consider removing the \"placeholder='blur'\" property to improve performance.`);\n }\n if (!blurDataURL) {\n const VALID_BLUR_EXT = [\n \"jpeg\",\n \"png\",\n \"webp\",\n \"avif\"\n ] // should match next-image-loader\n ;\n throw new Error(`Image with src \"${src}\" has \"placeholder='blur'\" property but is missing the \"blurDataURL\" property.\n Possible solutions:\n - Add a \"blurDataURL\" property, the contents should be a small Data URL to represent the image\n - Change the \"src\" property to a static import with one of the supported file types: ${VALID_BLUR_EXT.join(\",\")}\n - Remove the \"placeholder\" property, effectively no blur effect\n Read more: https://nextjs.org/docs/messages/placeholder-blur-data-url`);\n }\n }\n if (\"ref\" in rest) {\n (0, _warnOnce).warnOnce(`Image with src \"${src}\" is using unsupported \"ref\" property. Consider using the \"onLoadingComplete\" property instead.`);\n }\n if (!unoptimized && loader !== _imageLoader.default) {\n const urlStr = loader({\n config,\n src,\n width: widthInt || 400,\n quality: qualityInt || 75\n });\n let url;\n try {\n url = new URL(urlStr);\n } catch (err) {}\n if (urlStr === src || url && url.pathname === src && !url.search) {\n (0, _warnOnce).warnOnce(`Image with src \"${src}\" has a \"loader\" property that does not implement width. Please implement it or use the \"unoptimized\" property instead.` + `\\nRead more: https://nextjs.org/docs/messages/next-image-missing-loader-width`);\n }\n }\n for (const [legacyKey, legacyValue] of Object.entries({\n layout,\n objectFit,\n objectPosition,\n lazyBoundary,\n lazyRoot\n })){\n if (legacyValue) {\n (0, _warnOnce).warnOnce(`Image with src \"${src}\" has legacy prop \"${legacyKey}\". Did you forget to run the codemod?` + `\\nRead more: https://nextjs.org/docs/messages/next-image-upgrade-to-13`);\n }\n }\n if (false) {}\n }\n const imgStyle = Object.assign(fill ? {\n position: \"absolute\",\n height: \"100%\",\n width: \"100%\",\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n objectFit,\n objectPosition\n } : {}, showAltText ? {} : {\n color: \"transparent\"\n }, style);\n const blurStyle = placeholder === \"blur\" && blurDataURL && !blurComplete ? {\n backgroundSize: imgStyle.objectFit || \"cover\",\n backgroundPosition: imgStyle.objectPosition || \"50% 50%\",\n backgroundRepeat: \"no-repeat\",\n backgroundImage: `url(\"data:image/svg+xml;charset=utf-8,${(0, _imageBlurSvg).getImageBlurSvg({\n widthInt,\n heightInt,\n blurWidth,\n blurHeight,\n blurDataURL\n })}\")`\n } : {};\n if (true) {\n if (blurStyle.backgroundImage && (blurDataURL == null ? void 0 : blurDataURL.startsWith(\"/\"))) {\n // During `next dev`, we don't want to generate blur placeholders with webpack\n // because it can delay starting the dev server. Instead, `next-image-loader.js`\n // will inline a special url to lazily generate the blur placeholder at request time.\n blurStyle.backgroundImage = `url(\"${blurDataURL}\")`;\n }\n }\n const imgAttributes = generateImgAttrs({\n config,\n src,\n unoptimized,\n width: widthInt,\n quality: qualityInt,\n sizes,\n loader\n });\n let srcString = src;\n if (true) {\n if (false) {}\n }\n const linkProps = {\n // @ts-expect-error upgrade react types to react 18\n imageSrcSet: imgAttributes.srcSet,\n imageSizes: imgAttributes.sizes,\n crossOrigin: rest.crossOrigin\n };\n const onLoadRef = (0, _react).useRef(onLoad);\n (0, _react).useEffect(()=>{\n onLoadRef.current = onLoad;\n }, [\n onLoad\n ]);\n const onLoadingCompleteRef = (0, _react).useRef(onLoadingComplete);\n (0, _react).useEffect(()=>{\n onLoadingCompleteRef.current = onLoadingComplete;\n }, [\n onLoadingComplete\n ]);\n const imgElementArgs = _extends({\n isLazy,\n imgAttributes,\n heightInt,\n widthInt,\n qualityInt,\n className,\n imgStyle,\n blurStyle,\n loading,\n config,\n fill,\n unoptimized,\n placeholder,\n loader,\n srcString,\n onLoadRef,\n onLoadingCompleteRef,\n setBlurComplete,\n setShowAltText\n }, rest);\n return /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/ _react.default.createElement(ImageElement, Object.assign({}, imgElementArgs)), priority ? // for browsers that do not support `imagesrcset`, and in those cases\n // it would likely cause the incorrect image to be preloaded.\n //\n // https://html.spec.whatwg.org/multipage/semantics.html#attr-link-imagesrcset\n /*#__PURE__*/ _react.default.createElement(_head.default, null, /*#__PURE__*/ _react.default.createElement(\"link\", Object.assign({\n key: \"__nimg-\" + imgAttributes.src + imgAttributes.srcSet + imgAttributes.sizes,\n rel: \"preload\",\n as: \"image\",\n href: imgAttributes.srcSet ? undefined : imgAttributes.src\n }, linkProps))) : null);\n}\n\"use client\";\nconst configEnv = {\"deviceSizes\":[640,750,828,1080,1200,1920,2048,3840],\"imageSizes\":[16,32,48,64,96,128,256,384],\"path\":\"/_next/image\",\"loader\":\"default\",\"dangerouslyAllowSVG\":false,\"unoptimized\":false,\"domains\":[],\"remotePatterns\":[]};\nconst allImgs = new Map();\nlet perfObserver;\nif (true) {\n globalThis.__NEXT_IMAGE_IMPORTED = true;\n}\nconst VALID_LOADING_VALUES = [\n \"lazy\",\n \"eager\",\n undefined\n];\nfunction isStaticRequire(src) {\n return src.default !== undefined;\n}\nfunction isStaticImageData(src) {\n return src.src !== undefined;\n}\nfunction isStaticImport(src) {\n return typeof src === \"object\" && (isStaticRequire(src) || isStaticImageData(src));\n}\nfunction getWidths({ deviceSizes , allSizes }, width, sizes) {\n if (sizes) {\n // Find all the \"vw\" percent sizes used in the sizes prop\n const viewportWidthRe = /(^|\\s)(1?\\d?\\d)vw/g;\n const percentSizes = [];\n for(let match; match = viewportWidthRe.exec(sizes); match){\n percentSizes.push(parseInt(match[2]));\n }\n if (percentSizes.length) {\n const smallestRatio = Math.min(...percentSizes) * 0.01;\n return {\n widths: allSizes.filter((s)=>s >= deviceSizes[0] * smallestRatio),\n kind: \"w\"\n };\n }\n return {\n widths: allSizes,\n kind: \"w\"\n };\n }\n if (typeof width !== \"number\") {\n return {\n widths: deviceSizes,\n kind: \"w\"\n };\n }\n const widths = [\n ...new Set(// > are actually 3x in the green color, but only 1.5x in the red and\n // > blue colors. Showing a 3x resolution image in the app vs a 2x\n // > resolution image will be visually the same, though the 3x image\n // > takes significantly more data. Even true 3x resolution screens are\n // > wasteful as the human eye cannot see that level of detail without\n // > something like a magnifying glass.\n // https://blog.twitter.com/engineering/en_us/topics/infrastructure/2019/capping-image-fidelity-on-ultra-high-resolution-devices.html\n [\n width,\n width * 2 /*, width * 3*/ \n ].map((w)=>allSizes.find((p)=>p >= w) || allSizes[allSizes.length - 1]))\n ];\n return {\n widths,\n kind: \"x\"\n };\n}\nfunction generateImgAttrs({ config , src , unoptimized , width , quality , sizes , loader }) {\n if (unoptimized) {\n return {\n src,\n srcSet: undefined,\n sizes: undefined\n };\n }\n const { widths , kind } = getWidths(config, width, sizes);\n const last = widths.length - 1;\n return {\n sizes: !sizes && kind === \"w\" ? \"100vw\" : sizes,\n srcSet: widths.map((w, i)=>`${loader({\n config,\n src,\n quality,\n width: w\n })} ${kind === \"w\" ? w : i + 1}${kind}`).join(\", \"),\n // It's intended to keep `src` the last attribute because React updates\n // attributes in order. If we keep `src` the first one, Safari will\n // immediately start to fetch `src`, before `sizes` and `srcSet` are even\n // updated by React. That causes multiple unnecessary requests if `srcSet`\n // and `sizes` are defined.\n // This bug cannot be reproduced in Chrome or Firefox.\n src: loader({\n config,\n src,\n quality,\n width: widths[last]\n })\n };\n}\nfunction getInt(x) {\n if (typeof x === \"number\" || typeof x === \"undefined\") {\n return x;\n }\n if (typeof x === \"string\" && /^[0-9]+$/.test(x)) {\n return parseInt(x, 10);\n }\n return NaN;\n}\n// See https://stackoverflow.com/q/39777833/266535 for why we use this ref\n// handler instead of the img's onLoad attribute.\nfunction handleLoading(img, src, placeholder, onLoadRef, onLoadingCompleteRef, setBlurComplete, unoptimized) {\n if (!img || img[\"data-loaded-src\"] === src) {\n return;\n }\n img[\"data-loaded-src\"] = src;\n const p = \"decode\" in img ? img.decode() : Promise.resolve();\n p.catch(()=>{}).then(()=>{\n if (!img.parentNode) {\n // Exit early in case of race condition:\n // - onload() is called\n // - decode() is called but incomplete\n // - unmount is called\n // - decode() completes\n return;\n }\n if (placeholder === \"blur\") {\n setBlurComplete(true);\n }\n if (onLoadRef == null ? void 0 : onLoadRef.current) {\n // Since we don't have the SyntheticEvent here,\n // we must create one with the same shape.\n // See https://reactjs.org/docs/events.html\n const event = new Event(\"load\");\n Object.defineProperty(event, \"target\", {\n writable: false,\n value: img\n });\n let prevented = false;\n let stopped = false;\n onLoadRef.current(_extends({}, event, {\n nativeEvent: event,\n currentTarget: img,\n target: img,\n isDefaultPrevented: ()=>prevented,\n isPropagationStopped: ()=>stopped,\n persist: ()=>{},\n preventDefault: ()=>{\n prevented = true;\n event.preventDefault();\n },\n stopPropagation: ()=>{\n stopped = true;\n event.stopPropagation();\n }\n }));\n }\n if (onLoadingCompleteRef == null ? void 0 : onLoadingCompleteRef.current) {\n onLoadingCompleteRef.current(img);\n }\n if (true) {\n if (img.getAttribute(\"data-nimg\") === \"fill\") {\n if (!unoptimized && (!img.getAttribute(\"sizes\") || img.getAttribute(\"sizes\") === \"100vw\")) {\n let widthViewportRatio = img.getBoundingClientRect().width / window.innerWidth;\n if (widthViewportRatio < 0.6) {\n (0, _warnOnce).warnOnce(`Image with src \"${src}\" has \"fill\" but is missing \"sizes\" prop. Please add it to improve page performance. Read more: https://nextjs.org/docs/api-reference/next/image#sizes`);\n }\n }\n if (img.parentElement) {\n const { position } = window.getComputedStyle(img.parentElement);\n const valid = [\n \"absolute\",\n \"fixed\",\n \"relative\"\n ];\n if (!valid.includes(position)) {\n (0, _warnOnce).warnOnce(`Image with src \"${src}\" has \"fill\" and parent element with invalid \"position\". Provided \"${position}\" should be one of ${valid.map(String).join(\",\")}.`);\n }\n }\n if (img.height === 0) {\n (0, _warnOnce).warnOnce(`Image with src \"${src}\" has \"fill\" and a height value of 0. This is likely because the parent element of the image has not been styled to have a set height.`);\n }\n }\n const heightModified = img.height.toString() !== img.getAttribute(\"height\");\n const widthModified = img.width.toString() !== img.getAttribute(\"width\");\n if (heightModified && !widthModified || !heightModified && widthModified) {\n (0, _warnOnce).warnOnce(`Image with src \"${src}\" has either width or height modified, but not the other. If you use CSS to change the size of your image, also include the styles 'width: \"auto\"' or 'height: \"auto\"' to maintain the aspect ratio.`);\n }\n }\n });\n}\nconst ImageElement = (_param)=>{\n var { imgAttributes , heightInt , widthInt , qualityInt , className , imgStyle , blurStyle , isLazy , fill , placeholder , loading , srcString , config , unoptimized , loader , onLoadRef , onLoadingCompleteRef , setBlurComplete , setShowAltText , onLoad , onError } = _param, rest = _object_without_properties_loose(_param, [\n \"imgAttributes\",\n \"heightInt\",\n \"widthInt\",\n \"qualityInt\",\n \"className\",\n \"imgStyle\",\n \"blurStyle\",\n \"isLazy\",\n \"fill\",\n \"placeholder\",\n \"loading\",\n \"srcString\",\n \"config\",\n \"unoptimized\",\n \"loader\",\n \"onLoadRef\",\n \"onLoadingCompleteRef\",\n \"setBlurComplete\",\n \"setShowAltText\",\n \"onLoad\",\n \"onError\"\n ]);\n loading = isLazy ? \"lazy\" : loading;\n return /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/ _react.default.createElement(\"img\", Object.assign({}, rest, imgAttributes, {\n width: widthInt,\n height: heightInt,\n decoding: \"async\",\n \"data-nimg\": fill ? \"fill\" : \"1\",\n className: className,\n // @ts-ignore - TODO: upgrade to `@types/react@17`\n loading: loading,\n style: _extends({}, imgStyle, blurStyle),\n ref: (0, _react).useCallback((img)=>{\n if (!img) {\n return;\n }\n if (onError) {\n // If the image has an error before react hydrates, then the error is lost.\n // The workaround is to wait until the image is mounted which is after hydration,\n // then we set the src again to trigger the error handler (if there was an error).\n // eslint-disable-next-line no-self-assign\n img.src = img.src;\n }\n if (true) {\n if (!srcString) {\n console.error(`Image is missing required \"src\" property:`, img);\n }\n if (img.getAttribute(\"alt\") === null) {\n console.error(`Image is missing required \"alt\" property. Please add Alternative Text to describe the image for screen readers and search engines.`);\n }\n }\n if (img.complete) {\n handleLoading(img, srcString, placeholder, onLoadRef, onLoadingCompleteRef, setBlurComplete, unoptimized);\n }\n }, [\n srcString,\n placeholder,\n onLoadRef,\n onLoadingCompleteRef,\n setBlurComplete,\n onError,\n unoptimized\n ]),\n onLoad: (event)=>{\n const img = event.currentTarget;\n handleLoading(img, srcString, placeholder, onLoadRef, onLoadingCompleteRef, setBlurComplete, unoptimized);\n },\n onError: (event)=>{\n // if the real image fails to load, this will ensure \"alt\" is visible\n setShowAltText(true);\n if (placeholder === \"blur\") {\n // If the real image fails to load, this will still remove the placeholder.\n setBlurComplete(true);\n }\n if (onError) {\n onError(event);\n }\n }\n })));\n};\nif ((typeof exports.default === \"function\" || typeof exports.default === \"object\" && exports.default !== null) && typeof exports.default.__esModule === \"undefined\") {\n Object.defineProperty(exports.default, \"__esModule\", {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=image.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9pbWFnZS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFDYTtBQURiO0FBRUFBLDhDQUE2QztJQUN6Q0csT0FBTyxJQUFJO0FBQ2YsQ0FBQyxFQUFDO0FBQ0ZELGtCQUFlLEdBQUdHO0FBQ2xCLElBQUlDLFdBQVdDLG1IQUErQztBQUM5RCxJQUFJQywyQkFBMkJELG1KQUErRDtBQUM5RixJQUFJRSw0QkFBNEJGLHFKQUFnRTtBQUNoRyxJQUFJRyxtQ0FBbUNILG1LQUF1RTtBQUM5RyxJQUFJSSxTQUFTRiwwQkFBMEJGLG1CQUFPQSxDQUFDLG9CQUFPO0FBQ3RELElBQUlLLFFBQVFKLHlCQUF5QkQsbUJBQU9BLENBQUMsOENBQW9CO0FBQ2pFLElBQUlNLGdCQUFnQk4sbUJBQU9BLENBQUMsa0VBQThCO0FBQzFELElBQUlPLGVBQWVQLG1CQUFPQSxDQUFDLDhEQUE0QjtBQUN2RCxJQUFJUSxzQkFBc0JSLG1CQUFPQSxDQUFDLDhFQUFvQztBQUN0RSxJQUFJUyxZQUFZVCxtQkFBT0EsQ0FBQyxvRUFBK0I7QUFDdkQsSUFBSVUsZUFBZVQseUJBQXlCRCxtQkFBT0EsQ0FBQyw0RUFBbUM7QUFDdkYsU0FBU0YsTUFBTWEsTUFBTSxFQUFFO0lBQ25CLElBQUksRUFBRUMsSUFBRyxFQUFHQyxNQUFLLEVBQUdDLGFBQWEsS0FBSyxHQUFHQyxVQUFVLEtBQUssR0FBR0MsUUFBTyxFQUFHQyxVQUFTLEVBQUdDLFFBQU8sRUFBR0MsTUFBSyxFQUFHQyxPQUFNLEVBQUdDLEtBQUksRUFBR0MsTUFBSyxFQUFHQyxPQUFNLEVBQUdDLGtCQUFpQixFQUFHQyxhQUFhLFFBQU8sRUFBR0MsWUFBVyxFQUFHQyxPQUFNLEVBQUdDLFVBQVMsRUFBR0MsZUFBYyxFQUFHQyxhQUFZLEVBQUdDLFNBQVEsRUFBRyxHQUFHcEIsUUFBUXFCLE1BQU03QixpQ0FBaUNRLFFBQVE7UUFDblQ7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtR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STtZQUN4QixDQUFDO1lBQ0QsSUFBSTJJLFNBQVM7Z0JBQ1RBLFFBQVF2QjtZQUNaLENBQUM7UUFDTDtJQUNKO0FBQ0o7QUFFQSxJQUFJLENBQUMsT0FBT3hNLFFBQVFFLE9BQU8sS0FBSyxjQUFlLE9BQU9GLFFBQVFFLE9BQU8sS0FBSyxZQUFZRixRQUFRRSxPQUFPLEtBQUssSUFBSSxLQUFNLE9BQU9GLFFBQVFFLE9BQU8sQ0FBQ2lPLFVBQVUsS0FBSyxhQUFhO0lBQ3JLck8sT0FBT0MsY0FBYyxDQUFDQyxRQUFRRSxPQUFPLEVBQUUsY0FBYztRQUFFRCxPQUFPLElBQUk7SUFBQztJQUNuRUgsT0FBT2dJLE1BQU0sQ0FBQzlILFFBQVFFLE9BQU8sRUFBRUY7SUFDL0JvTyxPQUFPcE8sT0FBTyxHQUFHQSxRQUFRRSxPQUFPO0FBQ2xDLENBQUMsQ0FFRCxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tY2dwb3J0Zm8vLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9pbWFnZS5qcz84MmY2Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBJbWFnZTtcbnZhciBfZXh0ZW5kcyA9IHJlcXVpcmUoXCJAc3djL2hlbHBlcnMvbGliL19leHRlbmRzLmpzXCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0ID0gcmVxdWlyZShcIkBzd2MvaGVscGVycy9saWIvX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0LmpzXCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BfcmVxdWlyZV93aWxkY2FyZCA9IHJlcXVpcmUoXCJAc3djL2hlbHBlcnMvbGliL19pbnRlcm9wX3JlcXVpcmVfd2lsZGNhcmQuanNcIikuZGVmYXVsdDtcbnZhciBfb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc19sb29zZSA9IHJlcXVpcmUoXCJAc3djL2hlbHBlcnMvbGliL19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3NlLmpzXCIpLmRlZmF1bHQ7XG52YXIgX3JlYWN0ID0gX2ludGVyb3BfcmVxdWlyZV93aWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9oZWFkID0gX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0KHJlcXVpcmUoXCIuLi9zaGFyZWQvbGliL2hlYWRcIikpO1xudmFyIF9pbWFnZUJsdXJTdmcgPSByZXF1aXJlKFwiLi4vc2hhcmVkL2xpYi9pbWFnZS1ibHVyLXN2Z1wiKTtcbnZhciBfaW1hZ2VDb25maWcgPSByZXF1aXJlKFwiLi4vc2hhcmVkL2xpYi9pbWFnZS1jb25maWdcIik7XG52YXIgX2ltYWdlQ29uZmlnQ29udGV4dCA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvbGliL2ltYWdlLWNvbmZpZy1jb250ZXh0XCIpO1xudmFyIF93YXJuT25jZSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvbGliL3V0aWxzL3dhcm4tb25jZVwiKTtcbnZhciBfaW1hZ2VMb2FkZXIgPSBfaW50ZXJvcF9yZXF1aXJlX2RlZmF1bHQocmVxdWlyZShcIm5leHQvZGlzdC9zaGFyZWQvbGliL2ltYWdlLWxvYWRlclwiKSk7XG5mdW5jdGlvbiBJbWFnZShfcGFyYW0pIHtcbiAgICB2YXIgeyBzcmMgLCBzaXplcyAsIHVub3B0aW1pemVkID1mYWxzZSAsIHByaW9yaXR5ID1mYWxzZSAsIGxvYWRpbmcgLCBjbGFzc05hbWUgLCBxdWFsaXR5ICwgd2lkdGggLCBoZWlnaHQgLCBmaWxsICwgc3R5bGUgLCBvbkxvYWQgLCBvbkxvYWRpbmdDb21wbGV0ZSAsIHBsYWNlaG9sZGVyID0nZW1wdHknICwgYmx1ckRhdGFVUkwgLCBsYXlvdXQgLCBvYmplY3RGaXQgLCBvYmplY3RQb3NpdGlvbiAsIGxhenlCb3VuZGFyeSAsIGxhenlSb290ICB9ID0gX3BhcmFtLCBhbGwgPSBfb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc19sb29zZShfcGFyYW0sIFtcbiAgICAgICAgXCJzcmNcIixcbiAgICAgICAgXCJzaXplc1wiLFxuICAgICAgICBcInVub3B0aW1pemVkXCIsXG4gICAgICAgIFwicHJpb3JpdHlcIixcbiAgICAgICAgXCJsb2FkaW5nXCIsXG4gICAgICAgIFwiY2xhc3NOYW1lXCIsXG4gICAgICAgIFwicXVhbGl0eVwiLFxuICAgICAgICBcIndpZHRoXCIsXG4gICAgICAgIFwiaGVpZ2h0XCIsXG4gICAgICAgIFwiZmlsbFwiLFxuICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgIFwib25Mb2FkXCIsXG4gICAgICAgIFwib25Mb2FkaW5nQ29tcGxldGVcIixcbiAgICAgICAgXCJwbGFjZWhvbGRlclwiLFxuICAgICAgICBcImJsdXJEYXRhVVJMXCIsXG4gICAgICAgIFwibGF5b3V0XCIsXG4gICAgICAgIFwib2JqZWN0Rml0XCIsXG4gICAgICAgIFwib2JqZWN0UG9zaXRpb25cIixcbiAgICAgICAgXCJsYXp5Qm91bmRhcnlcIixcbiAgICAgICAgXCJsYXp5Um9vdFwiXG4gICAgXSk7XG4gICAgY29uc3QgY29uZmlnQ29udGV4dCA9ICgwLCBfcmVhY3QpLnVzZUNvbnRleHQoX2ltYWdlQ29uZmlnQ29udGV4dC5JbWFnZUNvbmZpZ0NvbnRleHQpO1xuICAgIGNvbnN0IGNvbmZpZyA9ICgwLCBfcmVhY3QpLnVzZU1lbW8oKCk9PntcbiAgICAgICAgY29uc3QgYyA9IGNvbmZpZ0VudiB8fCBjb25maWdDb250ZXh0IHx8IF9pbWFnZUNvbmZpZy5pbWFnZUNvbmZpZ0RlZmF1bHQ7XG4gICAgICAgIGNvbnN0IGFsbFNpemVzID0gW1xuICAgICAgICAgICAgLi4uYy5kZXZpY2VTaXplcyxcbiAgICAgICAgICAgIC4uLmMuaW1hZ2VTaXplc1xuICAgICAgICBdLnNvcnQoKGEsIGIpPT5hIC0gYik7XG4gICAgICAgIGNvbnN0IGRldmljZVNpemVzID0gYy5kZXZpY2VTaXplcy5zb3J0KChhLCBiKT0+YSAtIGIpO1xuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIGMsIHtcbiAgICAgICAgICAgIGFsbFNpemVzLFxuICAgICAgICAgICAgZGV2aWNlU2l6ZXNcbiAgICAgICAgfSk7XG4gICAgfSwgW1xuICAgICAgICBjb25maWdDb250ZXh0XG4gICAgXSk7XG4gICAgbGV0IHJlc3QgPSBhbGw7XG4gICAgbGV0IGxvYWRlciA9IHJlc3QubG9hZGVyIHx8IF9pbWFnZUxvYWRlci5kZWZhdWx0O1xuICAgIC8vIFJlbW92ZSBwcm9wZXJ0eSBzbyBpdCdzIG5vdCBzcHJlYWQgb24gPGltZz4gZWxlbWVudFxuICAgIGRlbGV0ZSByZXN0LmxvYWRlcjtcbiAgICBpZiAoJ19fbmV4dF9pbWdfZGVmYXVsdCcgaW4gbG9hZGVyKSB7XG4gICAgICAgIC8vIFRoaXMgc3BlY2lhbCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlclxuICAgICAgICAvLyBkaWRuJ3QgZGVmaW5lIGEgXCJsb2FkZXJcIiBwcm9wIG9yIGNvbmZpZy5cbiAgICAgICAgaWYgKGNvbmZpZy5sb2FkZXIgPT09ICdjdXN0b20nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEltYWdlIHdpdGggc3JjIFwiJHtzcmN9XCIgaXMgbWlzc2luZyBcImxvYWRlclwiIHByb3AuYCArIGBcXG5SZWFkIG1vcmU6IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL21lc3NhZ2VzL25leHQtaW1hZ2UtbWlzc2luZy1sb2FkZXJgKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSB1c2VyIGRlZmluZWQgYSBcImxvYWRlclwiIHByb3Agb3IgY29uZmlnLlxuICAgICAgICAvLyBTaW5jZSB0aGUgY29uZmlnIG9iamVjdCBpcyBpbnRlcm5hbCBvbmx5LCB3ZVxuICAgICAgICAvLyBtdXN0IG5vdCBwYXNzIGl0IHRvIHRoZSB1c2VyLWRlZmluZWQgXCJsb2FkZXJcIi5cbiAgICAgICAgY29uc3QgY3VzdG9tSW1hZ2VMb2FkZXIgPSBsb2FkZXI7XG4gICAgICAgIHZhciBfdG1wO1xuICAgICAgICBfdG1wID0gKG9iaik9PntcbiAgICAgICAgICAgIGNvbnN0IHsgY29uZmlnOiBfICB9ID0gb2JqLCBvcHRzID0gX29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfbG9vc2Uob2JqLCBbXG4gICAgICAgICAgICAgICAgXCJjb25maWdcIlxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICByZXR1cm4gY3VzdG9tSW1hZ2VMb2FkZXIob3B0cyk7XG4gICAgICAgIH0sIGxvYWRlciA9IF90bXAsIF90bXA7XG4gICAgfVxuICAgIGlmIChsYXlvdXQpIHtcbiAgICAgICAgaWYgKGxheW91dCA9PT0gJ2ZpbGwnKSB7XG4gICAgICAgICAgICBmaWxsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYXlvdXRUb1N0eWxlID0ge1xuICAgICAgICAgICAgaW50cmluc2ljOiB7XG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3BvbnNpdmU6IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGxheW91dFRvU2l6ZXMgPSB7XG4gICAgICAgICAgICByZXNwb25zaXZlOiAnMTAwdncnLFxuICAgICAgICAgICAgZmlsbDogJzEwMHZ3J1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBsYXlvdXRTdHlsZSA9IGxheW91dFRvU3R5bGVbbGF5b3V0XTtcbiAgICAgICAgaWYgKGxheW91dFN0eWxlKSB7XG4gICAgICAgICAgICBzdHlsZSA9IF9leHRlbmRzKHt9LCBzdHlsZSwgbGF5b3V0U3R5bGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxheW91dFNpemVzID0gbGF5b3V0VG9TaXplc1tsYXlvdXRdO1xuICAgICAgICBpZiAobGF5b3V0U2l6ZXMgJiYgIXNpemVzKSB7XG4gICAgICAgICAgICBzaXplcyA9IGxheW91dFNpemVzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzdGF0aWNTcmMgPSAnJztcbiAgICBsZXQgd2lkdGhJbnQgPSBnZXRJbnQod2lkdGgpO1xuICAgIGxldCBoZWlnaHRJbnQgPSBnZXRJbnQoaGVpZ2h0KTtcbiAgICBsZXQgYmx1cldpZHRoO1xuICAgIGxldCBibHVySGVpZ2h0O1xuICAgIGlmIChpc1N0YXRpY0ltcG9ydChzcmMpKSB7XG4gICAgICAgIGNvbnN0IHN0YXRpY0ltYWdlRGF0YSA9IGlzU3RhdGljUmVxdWlyZShzcmMpID8gc3JjLmRlZmF1bHQgOiBzcmM7XG4gICAgICAgIGlmICghc3RhdGljSW1hZ2VEYXRhLnNyYykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbiBvYmplY3Qgc2hvdWxkIG9ubHkgYmUgcGFzc2VkIHRvIHRoZSBpbWFnZSBjb21wb25lbnQgc3JjIHBhcmFtZXRlciBpZiBpdCBjb21lcyBmcm9tIGEgc3RhdGljIGltYWdlIGltcG9ydC4gSXQgbXVzdCBpbmNsdWRlIHNyYy4gUmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShzdGF0aWNJbWFnZURhdGEpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3RhdGljSW1hZ2VEYXRhLmhlaWdodCB8fCAhc3RhdGljSW1hZ2VEYXRhLndpZHRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuIG9iamVjdCBzaG91bGQgb25seSBiZSBwYXNzZWQgdG8gdGhlIGltYWdlIGNvbXBvbmVudCBzcmMgcGFyYW1ldGVyIGlmIGl0IGNvbWVzIGZyb20gYSBzdGF0aWMgaW1hZ2UgaW1wb3J0LiBJdCBtdXN0IGluY2x1ZGUgaGVpZ2h0IGFuZCB3aWR0aC4gUmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShzdGF0aWNJbWFnZURhdGEpfWApO1xuICAgICAgICB9XG4gICAgICAgIGJsdXJXaWR0aCA9IHN0YXRpY0ltYWdlRGF0YS5ibHVyV2lkdGg7XG4gICAgICAgIGJsdXJIZWlnaHQgPSBzdGF0aWNJbWFnZURhdGEuYmx1ckhlaWdodDtcbiAgICAgICAgYmx1ckRhdGFVUkwgPSBibHVyRGF0YVVSTCB8fCBzdGF0aWNJbWFnZURhdGEuYmx1ckRhdGFVUkw7XG4gICAgICAgIHN0YXRpY1NyYyA9IHN0YXRpY0ltYWdlRGF0YS5zcmM7XG4gICAgICAgIGlmICghZmlsbCkge1xuICAgICAgICAgICAgaWYgKCF3aWR0aEludCAmJiAhaGVpZ2h0SW50KSB7XG4gICAgICAgICAgICAgICAgd2lkdGhJbnQgPSBzdGF0aWNJbWFnZURhdGEud2lkdGg7XG4gICAgICAgICAgICAgICAgaGVpZ2h0SW50ID0gc3RhdGljSW1hZ2VEYXRhLmhlaWdodDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGhJbnQgJiYgIWhlaWdodEludCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhdGlvID0gd2lkdGhJbnQgLyBzdGF0aWNJbWFnZURhdGEud2lkdGg7XG4gICAgICAgICAgICAgICAgaGVpZ2h0SW50ID0gTWF0aC5yb3VuZChzdGF0aWNJbWFnZURhdGEuaGVpZ2h0ICogcmF0aW8pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghd2lkdGhJbnQgJiYgaGVpZ2h0SW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmF0aW8gPSBoZWlnaHRJbnQgLyBzdGF0aWNJbWFnZURhdGEuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIHdpZHRoSW50ID0gTWF0aC5yb3VuZChzdGF0aWNJbWFnZURhdGEud2lkdGggKiByYXRpbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3JjID0gdHlwZW9mIHNyYyA9PT0gJ3N0cmluZycgPyBzcmMgOiBzdGF0aWNTcmM7XG4gICAgbGV0IGlzTGF6eSA9ICFwcmlvcml0eSAmJiAobG9hZGluZyA9PT0gJ2xhenknIHx8IHR5cGVvZiBsb2FkaW5nID09PSAndW5kZWZpbmVkJyk7XG4gICAgaWYgKHNyYy5zdGFydHNXaXRoKCdkYXRhOicpIHx8IHNyYy5zdGFydHNXaXRoKCdibG9iOicpKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvRGF0YV9VUklzXG4gICAgICAgIHVub3B0aW1pemVkID0gdHJ1ZTtcbiAgICAgICAgaXNMYXp5ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcudW5vcHRpbWl6ZWQpIHtcbiAgICAgICAgdW5vcHRpbWl6ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBbYmx1ckNvbXBsZXRlLCBzZXRCbHVyQ29tcGxldGVdID0gKDAsIF9yZWFjdCkudXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IFtzaG93QWx0VGV4dCwgc2V0U2hvd0FsdFRleHRdID0gKDAsIF9yZWFjdCkudXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IHF1YWxpdHlJbnQgPSBnZXRJbnQocXVhbGl0eSk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKCFzcmMpIHtcbiAgICAgICAgICAgIC8vIFJlYWN0IGRvZXNuJ3Qgc2hvdyB0aGUgc3RhY2sgdHJhY2UgYW5kIHRoZXJlJ3NcbiAgICAgICAgICAgIC8vIG5vIGBzcmNgIHRvIGhlbHAgaWRlbnRpZnkgd2hpY2ggaW1hZ2UsIHNvIHdlXG4gICAgICAgICAgICAvLyBpbnN0ZWFkIGNvbnNvbGUuZXJyb3IocmVmKSBkdXJpbmcgbW91bnQuXG4gICAgICAgICAgICB1bm9wdGltaXplZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZmlsbCkge1xuICAgICAgICAgICAgICAgIGlmICh3aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEltYWdlIHdpdGggc3JjIFwiJHtzcmN9XCIgaGFzIGJvdGggXCJ3aWR0aFwiIGFuZCBcImZpbGxcIiBwcm9wZXJ0aWVzLiBPbmx5IG9uZSBzaG91bGQgYmUgdXNlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEltYWdlIHdpdGggc3JjIFwiJHtzcmN9XCIgaGFzIGJvdGggXCJoZWlnaHRcIiBhbmQgXCJmaWxsXCIgcHJvcGVydGllcy4gT25seSBvbmUgc2hvdWxkIGJlIHVzZWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgoc3R5bGUgPT0gbnVsbCA/IHZvaWQgMCA6IHN0eWxlLnBvc2l0aW9uKSAmJiBzdHlsZS5wb3NpdGlvbiAhPT0gJ2Fic29sdXRlJykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEltYWdlIHdpdGggc3JjIFwiJHtzcmN9XCIgaGFzIGJvdGggXCJmaWxsXCIgYW5kIFwic3R5bGUucG9zaXRpb25cIiBwcm9wZXJ0aWVzLiBJbWFnZXMgd2l0aCBcImZpbGxcIiBhbHdheXMgdXNlIHBvc2l0aW9uIGFic29sdXRlIC0gaXQgY2Fubm90IGJlIG1vZGlmaWVkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKHN0eWxlID09IG51bGwgPyB2b2lkIDAgOiBzdHlsZS53aWR0aCkgJiYgc3R5bGUud2lkdGggIT09ICcxMDAlJykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEltYWdlIHdpdGggc3JjIFwiJHtzcmN9XCIgaGFzIGJvdGggXCJmaWxsXCIgYW5kIFwic3R5bGUud2lkdGhcIiBwcm9wZXJ0aWVzLiBJbWFnZXMgd2l0aCBcImZpbGxcIiBhbHdheXMgdXNlIHdpZHRoIDEwMCUgLSBpdCBjYW5ub3QgYmUgbW9kaWZpZWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgoc3R5bGUgPT0gbnVsbCA/IHZvaWQgMCA6IHN0eWxlLmhlaWdodCkgJiYgc3R5bGUuaGVpZ2h0ICE9PSAnMTAwJScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbWFnZSB3aXRoIHNyYyBcIiR7c3JjfVwiIGhhcyBib3RoIFwiZmlsbFwiIGFuZCBcInN0eWxlLmhlaWdodFwiIHByb3BlcnRpZXMuIEltYWdlcyB3aXRoIFwiZmlsbFwiIGFsd2F5cyB1c2UgaGVpZ2h0IDEwMCUgLSBpdCBjYW5ub3QgYmUgbW9kaWZpZWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoSW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEltYWdlIHdpdGggc3JjIFwiJHtzcmN9XCIgaXMgbWlzc2luZyByZXF1aXJlZCBcIndpZHRoXCIgcHJvcGVydHkuYCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc05hTih3aWR0aEludCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbWFnZSB3aXRoIHNyYyBcIiR7c3JjfVwiIGhhcyBpbnZhbGlkIFwid2lkdGhcIiBwcm9wZXJ0eS4gRXhwZWN0ZWQgYSBudW1lcmljIHZhbHVlIGluIHBpeGVscyBidXQgcmVjZWl2ZWQgXCIke3dpZHRofVwiLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGhlaWdodEludCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbWFnZSB3aXRoIHNyYyBcIiR7c3JjfVwiIGlzIG1pc3NpbmcgcmVxdWlyZWQgXCJoZWlnaHRcIiBwcm9wZXJ0eS5gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTmFOKGhlaWdodEludCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbWFnZSB3aXRoIHNyYyBcIiR7c3JjfVwiIGhhcyBpbnZhbGlkIFwiaGVpZ2h0XCIgcHJvcGVydHkuIEV4cGVjdGVkIGEgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMgYnV0IHJlY2VpdmVkIFwiJHtoZWlnaHR9XCIuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghVkFMSURfTE9BRElOR19WQUxVRVMuaW5jbHVkZXMobG9hZGluZykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW1hZ2Ugd2l0aCBzcmMgXCIke3NyY31cIiBoYXMgaW52YWxpZCBcImxvYWRpbmdcIiBwcm9wZXJ0eS4gUHJvdmlkZWQgXCIke2xvYWRpbmd9XCIgc2hvdWxkIGJlIG9uZSBvZiAke1ZBTElEX0xPQURJTkdfVkFMVUVTLm1hcChTdHJpbmcpLmpvaW4oJywnKX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByaW9yaXR5ICYmIGxvYWRpbmcgPT09ICdsYXp5Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbWFnZSB3aXRoIHNyYyBcIiR7c3JjfVwiIGhhcyBib3RoIFwicHJpb3JpdHlcIiBhbmQgXCJsb2FkaW5nPSdsYXp5J1wiIHByb3BlcnRpZXMuIE9ubHkgb25lIHNob3VsZCBiZSB1c2VkLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwbGFjZWhvbGRlciA9PT0gJ2JsdXInKSB7XG4gICAgICAgICAgICBpZiAod2lkdGhJbnQgJiYgaGVpZ2h0SW50ICYmIHdpZHRoSW50ICogaGVpZ2h0SW50IDwgMTYwMCkge1xuICAgICAgICAgICAgICAgICgwLCBfd2Fybk9uY2UpLndhcm5PbmNlKGBJbWFnZSB3aXRoIHNyYyBcIiR7c3JjfVwiIGlzIHNtYWxsZXIgdGhhbiA0MHg0MC4gQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIFwicGxhY2Vob2xkZXI9J2JsdXInXCIgcHJvcGVydHkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYmx1ckRhdGFVUkwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBWQUxJRF9CTFVSX0VYVCA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ2pwZWcnLFxuICAgICAgICAgICAgICAgICAgICAncG5nJyxcbiAgICAgICAgICAgICAgICAgICAgJ3dlYnAnLFxuICAgICAgICAgICAgICAgICAgICAnYXZpZidcbiAgICAgICAgICAgICAgICBdIC8vIHNob3VsZCBtYXRjaCBuZXh0LWltYWdlLWxvYWRlclxuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEltYWdlIHdpdGggc3JjIFwiJHtzcmN9XCIgaGFzIFwicGxhY2Vob2xkZXI9J2JsdXInXCIgcHJvcGVydHkgYnV0IGlzIG1pc3NpbmcgdGhlIFwiYmx1ckRhdGFVUkxcIiBwcm9wZXJ0eS5cbiAgICAgICAgICBQb3NzaWJsZSBzb2x1dGlvbnM6XG4gICAgICAgICAgICAtIEFkZCBhIFwiYmx1ckRhdGFVUkxcIiBwcm9wZXJ0eSwgdGhlIGNvbnRlbnRzIHNob3VsZCBiZSBhIHNtYWxsIERhdGEgVVJMIHRvIHJlcHJlc2VudCB0aGUgaW1hZ2VcbiAgICAgICAgICAgIC0gQ2hhbmdlIHRoZSBcInNyY1wiIHByb3BlcnR5IHRvIGEgc3RhdGljIGltcG9ydCB3aXRoIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGZpbGUgdHlwZXM6ICR7VkFMSURfQkxVUl9FWFQuam9pbignLCcpfVxuICAgICAgICAgICAgLSBSZW1vdmUgdGhlIFwicGxhY2Vob2xkZXJcIiBwcm9wZXJ0eSwgZWZmZWN0aXZlbHkgbm8gYmx1ciBlZmZlY3RcbiAgICAgICAgICBSZWFkIG1vcmU6IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL21lc3NhZ2VzL3BsYWNlaG9sZGVyLWJsdXItZGF0YS11cmxgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoJ3JlZicgaW4gcmVzdCkge1xuICAgICAgICAgICAgKDAsIF93YXJuT25jZSkud2Fybk9uY2UoYEltYWdlIHdpdGggc3JjIFwiJHtzcmN9XCIgaXMgdXNpbmcgdW5zdXBwb3J0ZWQgXCJyZWZcIiBwcm9wZXJ0eS4gQ29uc2lkZXIgdXNpbmcgdGhlIFwib25Mb2FkaW5nQ29tcGxldGVcIiBwcm9wZXJ0eSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdW5vcHRpbWl6ZWQgJiYgbG9hZGVyICE9PSBfaW1hZ2VMb2FkZXIuZGVmYXVsdCkge1xuICAgICAgICAgICAgY29uc3QgdXJsU3RyID0gbG9hZGVyKHtcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgc3JjLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aEludCB8fCA0MDAsXG4gICAgICAgICAgICAgICAgcXVhbGl0eTogcXVhbGl0eUludCB8fCA3NVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgdXJsO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHVybFN0cik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG4gICAgICAgICAgICBpZiAodXJsU3RyID09PSBzcmMgfHwgdXJsICYmIHVybC5wYXRobmFtZSA9PT0gc3JjICYmICF1cmwuc2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgKDAsIF93YXJuT25jZSkud2Fybk9uY2UoYEltYWdlIHdpdGggc3JjIFwiJHtzcmN9XCIgaGFzIGEgXCJsb2FkZXJcIiBwcm9wZXJ0eSB0aGF0IGRvZXMgbm90IGltcGxlbWVudCB3aWR0aC4gUGxlYXNlIGltcGxlbWVudCBpdCBvciB1c2UgdGhlIFwidW5vcHRpbWl6ZWRcIiBwcm9wZXJ0eSBpbnN0ZWFkLmAgKyBgXFxuUmVhZCBtb3JlOiBodHRwczovL25leHRqcy5vcmcvZG9jcy9tZXNzYWdlcy9uZXh0LWltYWdlLW1pc3NpbmctbG9hZGVyLXdpZHRoYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBbbGVnYWN5S2V5LCBsZWdhY3lWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoe1xuICAgICAgICAgICAgbGF5b3V0LFxuICAgICAgICAgICAgb2JqZWN0Rml0LFxuICAgICAgICAgICAgb2JqZWN0UG9zaXRpb24sXG4gICAgICAgICAgICBsYXp5Qm91bmRhcnksXG4gICAgICAgICAgICBsYXp5Um9vdFxuICAgICAgICB9KSl7XG4gICAgICAgICAgICBpZiAobGVnYWN5VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAoMCwgX3dhcm5PbmNlKS53YXJuT25jZShgSW1hZ2Ugd2l0aCBzcmMgXCIke3NyY31cIiBoYXMgbGVnYWN5IHByb3AgXCIke2xlZ2FjeUtleX1cIi4gRGlkIHlvdSBmb3JnZXQgdG8gcnVuIHRoZSBjb2RlbW9kP2AgKyBgXFxuUmVhZCBtb3JlOiBodHRwczovL25leHRqcy5vcmcvZG9jcy9tZXNzYWdlcy9uZXh0LWltYWdlLXVwZ3JhZGUtdG8tMTNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgIXBlcmZPYnNlcnZlciAmJiB3aW5kb3cuUGVyZm9ybWFuY2VPYnNlcnZlcikge1xuICAgICAgICAgICAgcGVyZk9ic2VydmVyID0gbmV3IFBlcmZvcm1hbmNlT2JzZXJ2ZXIoKGVudHJ5TGlzdCk9PntcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJ5TGlzdC5nZXRFbnRyaWVzKCkpe1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVmO1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIC0gbWlzc2luZyBcIkxhcmdlc3RDb250ZW50ZnVsUGFpbnRcIiBjbGFzcyB3aXRoIFwiZWxlbWVudFwiIHByb3BcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nU3JjID0gKGVudHJ5ID09IG51bGwgPyB2b2lkIDAgOiAocmVmID0gZW50cnkuZWxlbWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IHJlZi5zcmMpIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsY3BJbWFnZSA9IGFsbEltZ3MuZ2V0KGltZ1NyYyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsY3BJbWFnZSAmJiAhbGNwSW1hZ2UucHJpb3JpdHkgJiYgbGNwSW1hZ2UucGxhY2Vob2xkZXIgIT09ICdibHVyJyAmJiAhbGNwSW1hZ2Uuc3JjLnN0YXJ0c1dpdGgoJ2RhdGE6JykgJiYgIWxjcEltYWdlLnNyYy5zdGFydHNXaXRoKCdibG9iOicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL3dlYi5kZXYvbGNwLyNtZWFzdXJlLWxjcC1pbi1qYXZhc2NyaXB0XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgX3dhcm5PbmNlKS53YXJuT25jZShgSW1hZ2Ugd2l0aCBzcmMgXCIke2xjcEltYWdlLnNyY31cIiB3YXMgZGV0ZWN0ZWQgYXMgdGhlIExhcmdlc3QgQ29udGVudGZ1bCBQYWludCAoTENQKS4gUGxlYXNlIGFkZCB0aGUgXCJwcmlvcml0eVwiIHByb3BlcnR5IGlmIHRoaXMgaW1hZ2UgaXMgYWJvdmUgdGhlIGZvbGQuYCArIGBcXG5SZWFkIG1vcmU6IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwaS1yZWZlcmVuY2UvbmV4dC9pbWFnZSNwcmlvcml0eWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBlcmZPYnNlcnZlci5vYnNlcnZlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xhcmdlc3QtY29udGVudGZ1bC1wYWludCcsXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IgYnV0IGRvbid0IGNyYXNoIHRoZSBhcHBcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaW1nU3R5bGUgPSBPYmplY3QuYXNzaWduKGZpbGwgPyB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICByaWdodDogMCxcbiAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICBvYmplY3RGaXQsXG4gICAgICAgIG9iamVjdFBvc2l0aW9uXG4gICAgfSA6IHt9LCBzaG93QWx0VGV4dCA/IHt9IDoge1xuICAgICAgICBjb2xvcjogJ3RyYW5zcGFyZW50J1xuICAgIH0sIHN0eWxlKTtcbiAgICBjb25zdCBibHVyU3R5bGUgPSBwbGFjZWhvbGRlciA9PT0gJ2JsdXInICYmIGJsdXJEYXRhVVJMICYmICFibHVyQ29tcGxldGUgPyB7XG4gICAgICAgIGJhY2tncm91bmRTaXplOiBpbWdTdHlsZS5vYmplY3RGaXQgfHwgJ2NvdmVyJyxcbiAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uOiBpbWdTdHlsZS5vYmplY3RQb3NpdGlvbiB8fCAnNTAlIDUwJScsXG4gICAgICAgIGJhY2tncm91bmRSZXBlYXQ6ICduby1yZXBlYXQnLFxuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IGB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwkeygwLCBfaW1hZ2VCbHVyU3ZnKS5nZXRJbWFnZUJsdXJTdmcoe1xuICAgICAgICAgICAgd2lkdGhJbnQsXG4gICAgICAgICAgICBoZWlnaHRJbnQsXG4gICAgICAgICAgICBibHVyV2lkdGgsXG4gICAgICAgICAgICBibHVySGVpZ2h0LFxuICAgICAgICAgICAgYmx1ckRhdGFVUkxcbiAgICAgICAgfSl9XCIpYFxuICAgIH0gOiB7fTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgaWYgKGJsdXJTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgJiYgKGJsdXJEYXRhVVJMID09IG51bGwgPyB2b2lkIDAgOiBibHVyRGF0YVVSTC5zdGFydHNXaXRoKCcvJykpKSB7XG4gICAgICAgICAgICAvLyBEdXJpbmcgYG5leHQgZGV2YCwgd2UgZG9uJ3Qgd2FudCB0byBnZW5lcmF0ZSBibHVyIHBsYWNlaG9sZGVycyB3aXRoIHdlYnBhY2tcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQgY2FuIGRlbGF5IHN0YXJ0aW5nIHRoZSBkZXYgc2VydmVyLiBJbnN0ZWFkLCBgbmV4dC1pbWFnZS1sb2FkZXIuanNgXG4gICAgICAgICAgICAvLyB3aWxsIGlubGluZSBhIHNwZWNpYWwgdXJsIHRvIGxhemlseSBnZW5lcmF0ZSB0aGUgYmx1ciBwbGFjZWhvbGRlciBhdCByZXF1ZXN0IHRpbWUuXG4gICAgICAgICAgICBibHVyU3R5bGUuYmFja2dyb3VuZEltYWdlID0gYHVybChcIiR7Ymx1ckRhdGFVUkx9XCIpYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbWdBdHRyaWJ1dGVzID0gZ2VuZXJhdGVJbWdBdHRycyh7XG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgc3JjLFxuICAgICAgICB1bm9wdGltaXplZCxcbiAgICAgICAgd2lkdGg6IHdpZHRoSW50LFxuICAgICAgICBxdWFsaXR5OiBxdWFsaXR5SW50LFxuICAgICAgICBzaXplcyxcbiAgICAgICAgbG9hZGVyXG4gICAgfSk7XG4gICAgbGV0IHNyY1N0cmluZyA9IHNyYztcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGxldCBmdWxsVXJsO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmdWxsVXJsID0gbmV3IFVSTChpbWdBdHRyaWJ1dGVzLnNyYyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgZnVsbFVybCA9IG5ldyBVUkwoaW1nQXR0cmlidXRlcy5zcmMsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFsbEltZ3Muc2V0KGZ1bGxVcmwuaHJlZiwge1xuICAgICAgICAgICAgICAgIHNyYyxcbiAgICAgICAgICAgICAgICBwcmlvcml0eSxcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGlua1Byb3BzID0ge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHVwZ3JhZGUgcmVhY3QgdHlwZXMgdG8gcmVhY3QgMThcbiAgICAgICAgaW1hZ2VTcmNTZXQ6IGltZ0F0dHJpYnV0ZXMuc3JjU2V0LFxuICAgICAgICBpbWFnZVNpemVzOiBpbWdBdHRyaWJ1dGVzLnNpemVzLFxuICAgICAgICBjcm9zc09yaWdpbjogcmVzdC5jcm9zc09yaWdpblxuICAgIH07XG4gICAgY29uc3Qgb25Mb2FkUmVmID0gKDAsIF9yZWFjdCkudXNlUmVmKG9uTG9hZCk7XG4gICAgKDAsIF9yZWFjdCkudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIG9uTG9hZFJlZi5jdXJyZW50ID0gb25Mb2FkO1xuICAgIH0sIFtcbiAgICAgICAgb25Mb2FkXG4gICAgXSk7XG4gICAgY29uc3Qgb25Mb2FkaW5nQ29tcGxldGVSZWYgPSAoMCwgX3JlYWN0KS51c2VSZWYob25Mb2FkaW5nQ29tcGxldGUpO1xuICAgICgwLCBfcmVhY3QpLnVzZUVmZmVjdCgoKT0+e1xuICAgICAgICBvbkxvYWRpbmdDb21wbGV0ZVJlZi5jdXJyZW50ID0gb25Mb2FkaW5nQ29tcGxldGU7XG4gICAgfSwgW1xuICAgICAgICBvbkxvYWRpbmdDb21wbGV0ZVxuICAgIF0pO1xuICAgIGNvbnN0IGltZ0VsZW1lbnRBcmdzID0gX2V4dGVuZHMoe1xuICAgICAgICBpc0xhenksXG4gICAgICAgIGltZ0F0dHJpYnV0ZXMsXG4gICAgICAgIGhlaWdodEludCxcbiAgICAgICAgd2lkdGhJbnQsXG4gICAgICAgIHF1YWxpdHlJbnQsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgaW1nU3R5bGUsXG4gICAgICAgIGJsdXJTdHlsZSxcbiAgICAgICAgbG9hZGluZyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBmaWxsLFxuICAgICAgICB1bm9wdGltaXplZCxcbiAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgIGxvYWRlcixcbiAgICAgICAgc3JjU3RyaW5nLFxuICAgICAgICBvbkxvYWRSZWYsXG4gICAgICAgIG9uTG9hZGluZ0NvbXBsZXRlUmVmLFxuICAgICAgICBzZXRCbHVyQ29tcGxldGUsXG4gICAgICAgIHNldFNob3dBbHRUZXh0XG4gICAgfSwgcmVzdCk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi8gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfcmVhY3QuZGVmYXVsdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qLyBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEltYWdlRWxlbWVudCwgT2JqZWN0LmFzc2lnbih7fSwgaW1nRWxlbWVudEFyZ3MpKSwgcHJpb3JpdHkgPyAvLyBOb3RlIGhvdyB3ZSBvbWl0IHRoZSBgaHJlZmAgYXR0cmlidXRlLCBhcyBpdCB3b3VsZCBvbmx5IGJlIHJlbGV2YW50XG4gICAgLy8gZm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgYGltYWdlc3Jjc2V0YCwgYW5kIGluIHRob3NlIGNhc2VzXG4gICAgLy8gaXQgd291bGQgbGlrZWx5IGNhdXNlIHRoZSBpbmNvcnJlY3QgaW1hZ2UgdG8gYmUgcHJlbG9hZGVkLlxuICAgIC8vXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLmh0bWwjYXR0ci1saW5rLWltYWdlc3Jjc2V0XG4gICAgLyojX19QVVJFX18qLyBfcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9oZWFkLmRlZmF1bHQsIG51bGwsIC8qI19fUFVSRV9fKi8gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxpbmtcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGtleTogJ19fbmltZy0nICsgaW1nQXR0cmlidXRlcy5zcmMgKyBpbWdBdHRyaWJ1dGVzLnNyY1NldCArIGltZ0F0dHJpYnV0ZXMuc2l6ZXMsXG4gICAgICAgIHJlbDogXCJwcmVsb2FkXCIsXG4gICAgICAgIGFzOiBcImltYWdlXCIsXG4gICAgICAgIGhyZWY6IGltZ0F0dHJpYnV0ZXMuc3JjU2V0ID8gdW5kZWZpbmVkIDogaW1nQXR0cmlidXRlcy5zcmNcbiAgICB9LCBsaW5rUHJvcHMpKSkgOiBudWxsKTtcbn1cbid1c2UgY2xpZW50JztcbmNvbnN0IGNvbmZpZ0VudiA9IHByb2Nlc3MuZW52Ll9fTkVYVF9JTUFHRV9PUFRTO1xuY29uc3QgYWxsSW1ncyA9IG5ldyBNYXAoKTtcbmxldCBwZXJmT2JzZXJ2ZXI7XG5pZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBnbG9iYWxUaGlzLl9fTkVYVF9JTUFHRV9JTVBPUlRFRCA9IHRydWU7XG59XG5jb25zdCBWQUxJRF9MT0FESU5HX1ZBTFVFUyA9IFtcbiAgICAnbGF6eScsXG4gICAgJ2VhZ2VyJyxcbiAgICB1bmRlZmluZWRcbl07XG5mdW5jdGlvbiBpc1N0YXRpY1JlcXVpcmUoc3JjKSB7XG4gICAgcmV0dXJuIHNyYy5kZWZhdWx0ICE9PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBpc1N0YXRpY0ltYWdlRGF0YShzcmMpIHtcbiAgICByZXR1cm4gc3JjLnNyYyAhPT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gaXNTdGF0aWNJbXBvcnQoc3JjKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzcmMgPT09ICdvYmplY3QnICYmIChpc1N0YXRpY1JlcXVpcmUoc3JjKSB8fCBpc1N0YXRpY0ltYWdlRGF0YShzcmMpKTtcbn1cbmZ1bmN0aW9uIGdldFdpZHRocyh7IGRldmljZVNpemVzICwgYWxsU2l6ZXMgIH0sIHdpZHRoLCBzaXplcykge1xuICAgIGlmIChzaXplcykge1xuICAgICAgICAvLyBGaW5kIGFsbCB0aGUgXCJ2d1wiIHBlcmNlbnQgc2l6ZXMgdXNlZCBpbiB0aGUgc2l6ZXMgcHJvcFxuICAgICAgICBjb25zdCB2aWV3cG9ydFdpZHRoUmUgPSAvKF58XFxzKSgxP1xcZD9cXGQpdncvZztcbiAgICAgICAgY29uc3QgcGVyY2VudFNpemVzID0gW107XG4gICAgICAgIGZvcihsZXQgbWF0Y2g7IG1hdGNoID0gdmlld3BvcnRXaWR0aFJlLmV4ZWMoc2l6ZXMpOyBtYXRjaCl7XG4gICAgICAgICAgICBwZXJjZW50U2l6ZXMucHVzaChwYXJzZUludChtYXRjaFsyXSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJjZW50U2l6ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBzbWFsbGVzdFJhdGlvID0gTWF0aC5taW4oLi4ucGVyY2VudFNpemVzKSAqIDAuMDE7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHdpZHRoczogYWxsU2l6ZXMuZmlsdGVyKChzKT0+cyA+PSBkZXZpY2VTaXplc1swXSAqIHNtYWxsZXN0UmF0aW8pLFxuICAgICAgICAgICAgICAgIGtpbmQ6ICd3J1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGhzOiBhbGxTaXplcyxcbiAgICAgICAgICAgIGtpbmQ6ICd3J1xuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpZHRoICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGhzOiBkZXZpY2VTaXplcyxcbiAgICAgICAgICAgIGtpbmQ6ICd3J1xuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCB3aWR0aHMgPSBbXG4gICAgICAgIC4uLm5ldyBTZXQoLy8gPiBUaGlzIG1lYW5zIHRoYXQgbW9zdCBPTEVEIHNjcmVlbnMgdGhhdCBzYXkgdGhleSBhcmUgM3ggcmVzb2x1dGlvbixcbiAgICAgICAgLy8gPiBhcmUgYWN0dWFsbHkgM3ggaW4gdGhlIGdyZWVuIGNvbG9yLCBidXQgb25seSAxLjV4IGluIHRoZSByZWQgYW5kXG4gICAgICAgIC8vID4gYmx1ZSBjb2xvcnMuIFNob3dpbmcgYSAzeCByZXNvbHV0aW9uIGltYWdlIGluIHRoZSBhcHAgdnMgYSAyeFxuICAgICAgICAvLyA+IHJlc29sdXRpb24gaW1hZ2Ugd2lsbCBiZSB2aXN1YWxseSB0aGUgc2FtZSwgdGhvdWdoIHRoZSAzeCBpbWFnZVxuICAgICAgICAvLyA+IHRha2VzIHNpZ25pZmljYW50bHkgbW9yZSBkYXRhLiBFdmVuIHRydWUgM3ggcmVzb2x1dGlvbiBzY3JlZW5zIGFyZVxuICAgICAgICAvLyA+IHdhc3RlZnVsIGFzIHRoZSBodW1hbiBleWUgY2Fubm90IHNlZSB0aGF0IGxldmVsIG9mIGRldGFpbCB3aXRob3V0XG4gICAgICAgIC8vID4gc29tZXRoaW5nIGxpa2UgYSBtYWduaWZ5aW5nIGdsYXNzLlxuICAgICAgICAvLyBodHRwczovL2Jsb2cudHdpdHRlci5jb20vZW5naW5lZXJpbmcvZW5fdXMvdG9waWNzL2luZnJhc3RydWN0dXJlLzIwMTkvY2FwcGluZy1pbWFnZS1maWRlbGl0eS1vbi11bHRyYS1oaWdoLXJlc29sdXRpb24tZGV2aWNlcy5odG1sXG4gICAgICAgIFtcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgd2lkdGggKiAyIC8qLCB3aWR0aCAqIDMqLyBcbiAgICAgICAgXS5tYXAoKHcpPT5hbGxTaXplcy5maW5kKChwKT0+cCA+PSB3KSB8fCBhbGxTaXplc1thbGxTaXplcy5sZW5ndGggLSAxXSkpLCBcbiAgICBdO1xuICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRocyxcbiAgICAgICAga2luZDogJ3gnXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdlbmVyYXRlSW1nQXR0cnMoeyBjb25maWcgLCBzcmMgLCB1bm9wdGltaXplZCAsIHdpZHRoICwgcXVhbGl0eSAsIHNpemVzICwgbG9hZGVyICB9KSB7XG4gICAgaWYgKHVub3B0aW1pemVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzcmMsXG4gICAgICAgICAgICBzcmNTZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNpemVzOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgeyB3aWR0aHMgLCBraW5kICB9ID0gZ2V0V2lkdGhzKGNvbmZpZywgd2lkdGgsIHNpemVzKTtcbiAgICBjb25zdCBsYXN0ID0gd2lkdGhzLmxlbmd0aCAtIDE7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2l6ZXM6ICFzaXplcyAmJiBraW5kID09PSAndycgPyAnMTAwdncnIDogc2l6ZXMsXG4gICAgICAgIHNyY1NldDogd2lkdGhzLm1hcCgodywgaSk9PmAke2xvYWRlcih7XG4gICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgIHNyYyxcbiAgICAgICAgICAgICAgICBxdWFsaXR5LFxuICAgICAgICAgICAgICAgIHdpZHRoOiB3XG4gICAgICAgICAgICB9KX0gJHtraW5kID09PSAndycgPyB3IDogaSArIDF9JHtraW5kfWApLmpvaW4oJywgJyksXG4gICAgICAgIC8vIEl0J3MgaW50ZW5kZWQgdG8ga2VlcCBgc3JjYCB0aGUgbGFzdCBhdHRyaWJ1dGUgYmVjYXVzZSBSZWFjdCB1cGRhdGVzXG4gICAgICAgIC8vIGF0dHJpYnV0ZXMgaW4gb3JkZXIuIElmIHdlIGtlZXAgYHNyY2AgdGhlIGZpcnN0IG9uZSwgU2FmYXJpIHdpbGxcbiAgICAgICAgLy8gaW1tZWRpYXRlbHkgc3RhcnQgdG8gZmV0Y2ggYHNyY2AsIGJlZm9yZSBgc2l6ZXNgIGFuZCBgc3JjU2V0YCBhcmUgZXZlblxuICAgICAgICAvLyB1cGRhdGVkIGJ5IFJlYWN0LiBUaGF0IGNhdXNlcyBtdWx0aXBsZSB1bm5lY2Vzc2FyeSByZXF1ZXN0cyBpZiBgc3JjU2V0YFxuICAgICAgICAvLyBhbmQgYHNpemVzYCBhcmUgZGVmaW5lZC5cbiAgICAgICAgLy8gVGhpcyBidWcgY2Fubm90IGJlIHJlcHJvZHVjZWQgaW4gQ2hyb21lIG9yIEZpcmVmb3guXG4gICAgICAgIHNyYzogbG9hZGVyKHtcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHNyYyxcbiAgICAgICAgICAgIHF1YWxpdHksXG4gICAgICAgICAgICB3aWR0aDogd2lkdGhzW2xhc3RdXG4gICAgICAgIH0pXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldEludCh4KSB7XG4gICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgeCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgeCA9PT0gJ3N0cmluZycgJiYgL15bMC05XSskLy50ZXN0KHgpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludCh4LCAxMCk7XG4gICAgfVxuICAgIHJldHVybiBOYU47XG59XG4vLyBTZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzM5Nzc3ODMzLzI2NjUzNSBmb3Igd2h5IHdlIHVzZSB0aGlzIHJlZlxuLy8gaGFuZGxlciBpbnN0ZWFkIG9mIHRoZSBpbWcncyBvbkxvYWQgYXR0cmlidXRlLlxuZnVuY3Rpb24gaGFuZGxlTG9hZGluZyhpbWcsIHNyYywgcGxhY2Vob2xkZXIsIG9uTG9hZFJlZiwgb25Mb2FkaW5nQ29tcGxldGVSZWYsIHNldEJsdXJDb21wbGV0ZSwgdW5vcHRpbWl6ZWQpIHtcbiAgICBpZiAoIWltZyB8fCBpbWdbJ2RhdGEtbG9hZGVkLXNyYyddID09PSBzcmMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbWdbJ2RhdGEtbG9hZGVkLXNyYyddID0gc3JjO1xuICAgIGNvbnN0IHAgPSAnZGVjb2RlJyBpbiBpbWcgPyBpbWcuZGVjb2RlKCkgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBwLmNhdGNoKCgpPT57fSkudGhlbigoKT0+e1xuICAgICAgICBpZiAoIWltZy5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAvLyBFeGl0IGVhcmx5IGluIGNhc2Ugb2YgcmFjZSBjb25kaXRpb246XG4gICAgICAgICAgICAvLyAtIG9ubG9hZCgpIGlzIGNhbGxlZFxuICAgICAgICAgICAgLy8gLSBkZWNvZGUoKSBpcyBjYWxsZWQgYnV0IGluY29tcGxldGVcbiAgICAgICAgICAgIC8vIC0gdW5tb3VudCBpcyBjYWxsZWRcbiAgICAgICAgICAgIC8vIC0gZGVjb2RlKCkgY29tcGxldGVzXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyID09PSAnYmx1cicpIHtcbiAgICAgICAgICAgIHNldEJsdXJDb21wbGV0ZSh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob25Mb2FkUmVmID09IG51bGwgPyB2b2lkIDAgOiBvbkxvYWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgU3ludGhldGljRXZlbnQgaGVyZSxcbiAgICAgICAgICAgIC8vIHdlIG11c3QgY3JlYXRlIG9uZSB3aXRoIHRoZSBzYW1lIHNoYXBlLlxuICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9ldmVudHMuaHRtbFxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ2xvYWQnKTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldmVudCwgJ3RhcmdldCcsIHtcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGltZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgcHJldmVudGVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICAgICAgb25Mb2FkUmVmLmN1cnJlbnQoX2V4dGVuZHMoe30sIGV2ZW50LCB7XG4gICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQ6IGltZyxcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IGltZyxcbiAgICAgICAgICAgICAgICBpc0RlZmF1bHRQcmV2ZW50ZWQ6ICgpPT5wcmV2ZW50ZWQsXG4gICAgICAgICAgICAgICAgaXNQcm9wYWdhdGlvblN0b3BwZWQ6ICgpPT5zdG9wcGVkLFxuICAgICAgICAgICAgICAgIHBlcnNpc3Q6ICgpPT57fSxcbiAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogKCk9PntcbiAgICAgICAgICAgICAgICAgICAgcHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbjogKCk9PntcbiAgICAgICAgICAgICAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob25Mb2FkaW5nQ29tcGxldGVSZWYgPT0gbnVsbCA/IHZvaWQgMCA6IG9uTG9hZGluZ0NvbXBsZXRlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIG9uTG9hZGluZ0NvbXBsZXRlUmVmLmN1cnJlbnQoaW1nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgaWYgKGltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtbmltZycpID09PSAnZmlsbCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXVub3B0aW1pemVkICYmICghaW1nLmdldEF0dHJpYnV0ZSgnc2l6ZXMnKSB8fCBpbWcuZ2V0QXR0cmlidXRlKCdzaXplcycpID09PSAnMTAwdncnKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGhWaWV3cG9ydFJhdGlvID0gaW1nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC8gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aFZpZXdwb3J0UmF0aW8gPCAwLjYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICgwLCBfd2Fybk9uY2UpLndhcm5PbmNlKGBJbWFnZSB3aXRoIHNyYyBcIiR7c3JjfVwiIGhhcyBcImZpbGxcIiBidXQgaXMgbWlzc2luZyBcInNpemVzXCIgcHJvcC4gUGxlYXNlIGFkZCBpdCB0byBpbXByb3ZlIHBhZ2UgcGVyZm9ybWFuY2UuIFJlYWQgbW9yZTogaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBpLXJlZmVyZW5jZS9uZXh0L2ltYWdlI3NpemVzYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGltZy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcG9zaXRpb24gIH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpbWcucGFyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmaXhlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAncmVsYXRpdmUnXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsaWQuaW5jbHVkZXMocG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgX3dhcm5PbmNlKS53YXJuT25jZShgSW1hZ2Ugd2l0aCBzcmMgXCIke3NyY31cIiBoYXMgXCJmaWxsXCIgYW5kIHBhcmVudCBlbGVtZW50IHdpdGggaW52YWxpZCBcInBvc2l0aW9uXCIuIFByb3ZpZGVkIFwiJHtwb3NpdGlvbn1cIiBzaG91bGQgYmUgb25lIG9mICR7dmFsaWQubWFwKFN0cmluZykuam9pbignLCcpfS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW1nLmhlaWdodCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAoMCwgX3dhcm5PbmNlKS53YXJuT25jZShgSW1hZ2Ugd2l0aCBzcmMgXCIke3NyY31cIiBoYXMgXCJmaWxsXCIgYW5kIGEgaGVpZ2h0IHZhbHVlIG9mIDAuIFRoaXMgaXMgbGlrZWx5IGJlY2F1c2UgdGhlIHBhcmVudCBlbGVtZW50IG9mIHRoZSBpbWFnZSBoYXMgbm90IGJlZW4gc3R5bGVkIHRvIGhhdmUgYSBzZXQgaGVpZ2h0LmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhlaWdodE1vZGlmaWVkID0gaW1nLmhlaWdodC50b1N0cmluZygpICE9PSBpbWcuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoTW9kaWZpZWQgPSBpbWcud2lkdGgudG9TdHJpbmcoKSAhPT0gaW1nLmdldEF0dHJpYnV0ZSgnd2lkdGgnKTtcbiAgICAgICAgICAgIGlmIChoZWlnaHRNb2RpZmllZCAmJiAhd2lkdGhNb2RpZmllZCB8fCAhaGVpZ2h0TW9kaWZpZWQgJiYgd2lkdGhNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgICgwLCBfd2Fybk9uY2UpLndhcm5PbmNlKGBJbWFnZSB3aXRoIHNyYyBcIiR7c3JjfVwiIGhhcyBlaXRoZXIgd2lkdGggb3IgaGVpZ2h0IG1vZGlmaWVkLCBidXQgbm90IHRoZSBvdGhlci4gSWYgeW91IHVzZSBDU1MgdG8gY2hhbmdlIHRoZSBzaXplIG9mIHlvdXIgaW1hZ2UsIGFsc28gaW5jbHVkZSB0aGUgc3R5bGVzICd3aWR0aDogXCJhdXRvXCInIG9yICdoZWlnaHQ6IFwiYXV0b1wiJyB0byBtYWludGFpbiB0aGUgYXNwZWN0IHJhdGlvLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5jb25zdCBJbWFnZUVsZW1lbnQgPSAoX3BhcmFtKT0+e1xuICAgIHZhciB7IGltZ0F0dHJpYnV0ZXMgLCBoZWlnaHRJbnQgLCB3aWR0aEludCAsIHF1YWxpdHlJbnQgLCBjbGFzc05hbWUgLCBpbWdTdHlsZSAsIGJsdXJTdHlsZSAsIGlzTGF6eSAsIGZpbGwgLCBwbGFjZWhvbGRlciAsIGxvYWRpbmcgLCBzcmNTdHJpbmcgLCBjb25maWcgLCB1bm9wdGltaXplZCAsIGxvYWRlciAsIG9uTG9hZFJlZiAsIG9uTG9hZGluZ0NvbXBsZXRlUmVmICwgc2V0Qmx1ckNvbXBsZXRlICwgc2V0U2hvd0FsdFRleHQgLCBvbkxvYWQgLCBvbkVycm9yICB9ID0gX3BhcmFtLCByZXN0ID0gX29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfbG9vc2UoX3BhcmFtLCBbXG4gICAgICAgIFwiaW1nQXR0cmlidXRlc1wiLFxuICAgICAgICBcImhlaWdodEludFwiLFxuICAgICAgICBcIndpZHRoSW50XCIsXG4gICAgICAgIFwicXVhbGl0eUludFwiLFxuICAgICAgICBcImNsYXNzTmFtZVwiLFxuICAgICAgICBcImltZ1N0eWxlXCIsXG4gICAgICAgIFwiYmx1clN0eWxlXCIsXG4gICAgICAgIFwiaXNMYXp5XCIsXG4gICAgICAgIFwiZmlsbFwiLFxuICAgICAgICBcInBsYWNlaG9sZGVyXCIsXG4gICAgICAgIFwibG9hZGluZ1wiLFxuICAgICAgICBcInNyY1N0cmluZ1wiLFxuICAgICAgICBcImNvbmZpZ1wiLFxuICAgICAgICBcInVub3B0aW1pemVkXCIsXG4gICAgICAgIFwibG9hZGVyXCIsXG4gICAgICAgIFwib25Mb2FkUmVmXCIsXG4gICAgICAgIFwib25Mb2FkaW5nQ29tcGxldGVSZWZcIixcbiAgICAgICAgXCJzZXRCbHVyQ29tcGxldGVcIixcbiAgICAgICAgXCJzZXRTaG93QWx0VGV4dFwiLFxuICAgICAgICBcIm9uTG9hZFwiLFxuICAgICAgICBcIm9uRXJyb3JcIlxuICAgIF0pO1xuICAgIGxvYWRpbmcgPSBpc0xhenkgPyAnbGF6eScgOiBsb2FkaW5nO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX3JlYWN0LmRlZmF1bHQuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi8gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImltZ1wiLCBPYmplY3QuYXNzaWduKHt9LCByZXN0LCBpbWdBdHRyaWJ1dGVzLCB7XG4gICAgICAgIHdpZHRoOiB3aWR0aEludCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHRJbnQsXG4gICAgICAgIGRlY29kaW5nOiBcImFzeW5jXCIsXG4gICAgICAgIFwiZGF0YS1uaW1nXCI6IGZpbGwgPyAnZmlsbCcgOiAnMScsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICAvLyBAdHMtaWdub3JlIC0gVE9ETzogdXBncmFkZSB0byBgQHR5cGVzL3JlYWN0QDE3YFxuICAgICAgICBsb2FkaW5nOiBsb2FkaW5nLFxuICAgICAgICBzdHlsZTogX2V4dGVuZHMoe30sIGltZ1N0eWxlLCBibHVyU3R5bGUpLFxuICAgICAgICByZWY6ICgwLCBfcmVhY3QpLnVzZUNhbGxiYWNrKChpbWcpPT57XG4gICAgICAgICAgICBpZiAoIWltZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGltYWdlIGhhcyBhbiBlcnJvciBiZWZvcmUgcmVhY3QgaHlkcmF0ZXMsIHRoZW4gdGhlIGVycm9yIGlzIGxvc3QuXG4gICAgICAgICAgICAgICAgLy8gVGhlIHdvcmthcm91bmQgaXMgdG8gd2FpdCB1bnRpbCB0aGUgaW1hZ2UgaXMgbW91bnRlZCB3aGljaCBpcyBhZnRlciBoeWRyYXRpb24sXG4gICAgICAgICAgICAgICAgLy8gdGhlbiB3ZSBzZXQgdGhlIHNyYyBhZ2FpbiB0byB0cmlnZ2VyIHRoZSBlcnJvciBoYW5kbGVyIChpZiB0aGVyZSB3YXMgYW4gZXJyb3IpLlxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgICAgICAgICAgICAgIGltZy5zcmMgPSBpbWcuc3JjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNyY1N0cmluZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBJbWFnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIFwic3JjXCIgcHJvcGVydHk6YCwgaW1nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGltZy5nZXRBdHRyaWJ1dGUoJ2FsdCcpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEltYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgXCJhbHRcIiBwcm9wZXJ0eS4gUGxlYXNlIGFkZCBBbHRlcm5hdGl2ZSBUZXh0IHRvIGRlc2NyaWJlIHRoZSBpbWFnZSBmb3Igc2NyZWVuIHJlYWRlcnMgYW5kIHNlYXJjaCBlbmdpbmVzLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbWcuY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVMb2FkaW5nKGltZywgc3JjU3RyaW5nLCBwbGFjZWhvbGRlciwgb25Mb2FkUmVmLCBvbkxvYWRpbmdDb21wbGV0ZVJlZiwgc2V0Qmx1ckNvbXBsZXRlLCB1bm9wdGltaXplZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIFtcbiAgICAgICAgICAgIHNyY1N0cmluZyxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgb25Mb2FkUmVmLFxuICAgICAgICAgICAgb25Mb2FkaW5nQ29tcGxldGVSZWYsXG4gICAgICAgICAgICBzZXRCbHVyQ29tcGxldGUsXG4gICAgICAgICAgICBvbkVycm9yLFxuICAgICAgICAgICAgdW5vcHRpbWl6ZWQsIFxuICAgICAgICBdKSxcbiAgICAgICAgb25Mb2FkOiAoZXZlbnQpPT57XG4gICAgICAgICAgICBjb25zdCBpbWcgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgICAgICAgaGFuZGxlTG9hZGluZyhpbWcsIHNyY1N0cmluZywgcGxhY2Vob2xkZXIsIG9uTG9hZFJlZiwgb25Mb2FkaW5nQ29tcGxldGVSZWYsIHNldEJsdXJDb21wbGV0ZSwgdW5vcHRpbWl6ZWQpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiAoZXZlbnQpPT57XG4gICAgICAgICAgICAvLyBpZiB0aGUgcmVhbCBpbWFnZSBmYWlscyB0byBsb2FkLCB0aGlzIHdpbGwgZW5zdXJlIFwiYWx0XCIgaXMgdmlzaWJsZVxuICAgICAgICAgICAgc2V0U2hvd0FsdFRleHQodHJ1ZSk7XG4gICAgICAgICAgICBpZiAocGxhY2Vob2xkZXIgPT09ICdibHVyJykge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZWFsIGltYWdlIGZhaWxzIHRvIGxvYWQsIHRoaXMgd2lsbCBzdGlsbCByZW1vdmUgdGhlIHBsYWNlaG9sZGVyLlxuICAgICAgICAgICAgICAgIHNldEJsdXJDb21wbGV0ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgb25FcnJvcihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KSkpO1xufTtcblxuaWYgKCh0eXBlb2YgZXhwb3J0cy5kZWZhdWx0ID09PSAnZnVuY3Rpb24nIHx8ICh0eXBlb2YgZXhwb3J0cy5kZWZhdWx0ID09PSAnb2JqZWN0JyAmJiBleHBvcnRzLmRlZmF1bHQgIT09IG51bGwpKSAmJiB0eXBlb2YgZXhwb3J0cy5kZWZhdWx0Ll9fZXNNb2R1bGUgPT09ICd1bmRlZmluZWQnKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLmRlZmF1bHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiAgT2JqZWN0LmFzc2lnbihleHBvcnRzLmRlZmF1bHQsIGV4cG9ydHMpO1xuICBtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMuZGVmYXVsdDtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW1hZ2UuanMubWFwIl0sIm5hbWVzIjpbIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZXhwb3J0cyIsInZhbHVlIiwiZGVmYXVsdCIsIkltYWdlIiwiX2V4dGVuZHMiLCJyZXF1aXJlIiwiX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0IiwiX2ludGVyb3BfcmVxdWlyZV93aWxkY2FyZCIsIl9vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3NlIiwiX3JlYWN0IiwiX2hlYWQiLCJfaW1hZ2VCbHVyU3ZnIiwiX2ltYWdlQ29uZmlnIiwiX2ltYWdlQ29uZmlnQ29udGV4dCIsIl93YXJuT25jZSIsIl9pbWFnZUxvYWRlciIsIl9wYXJhbSIsInNyYyIsInNpemVzIiwidW5vcHRpbWl6ZWQiLCJwcmlvcml0eSIsImxvYWRpbmciLCJjbGFzc05hbWUiLCJxdWFsaXR5Iiwid2lkdGgiLCJoZWlnaHQiLCJmaWxsIiwic3R5bGUiLCJvbkxvYWQiLCJvbkxvYWRpbmdDb21wbGV0ZSIsInBsYWNlaG9sZGVyIiwiYmx1ckRhdGFVUkwiLCJsYXlvdXQiLCJvYmplY3RGaXQiLCJvYmplY3RQb3NpdGlvbiIsImxhenlCb3VuZGFyeSIsImxhenlSb290IiwiYWxsIiwiY29uZmlnQ29udGV4dCIsInVzZUNvbnRleHQiLCJJbWFnZUNvbmZpZ0NvbnRleHQiLCJjb25maWciLCJ1c2VNZW1vIiwiYyIsImNvbmZpZ0VudiIsImltYWdlQ29uZmlnRGVmYXVsdCIsImFsbFNpemVzIiwiZGV2aWNlU2l6ZXMiLCJpbWFnZVNpemVzIiwic29ydCIsImEiLCJiIiwicmVzdCIsImxvYWRlciIsIkVycm9yIiwiY3VzdG9tSW1hZ2VMb2FkZXIiLCJfdG1wIiwib2JqIiwiXyIsIm9wdHMiLCJsYXlvdXRUb1N0eWxlIiwiaW50cmluc2ljIiwibWF4V2lkdGgiLCJyZXNwb25zaXZlIiwibGF5b3V0VG9TaXplcyIsImxheW91dFN0eWxlIiwibGF5b3V0U2l6ZXMiLCJzdGF0aWNTcmMiLCJ3aWR0aEludCIsImdldEludCIsImhlaWdodEludCIsImJsdXJXaWR0aCIsImJsdXJIZWlnaHQiLCJpc1N0YXRpY0ltcG9ydCIsInN0YXRpY0ltYWdlRGF0YSIsImlzU3RhdGljUmVxdWlyZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJyYXRpbyIsIk1hdGgiLCJyb3VuZCIsImlzTGF6eSIsInN0YXJ0c1dpdGgiLCJibHVyQ29tcGxldGUiLCJzZXRCbHVyQ29tcGxldGUiLCJ1c2VTdGF0ZSIsInNob3dBbHRUZXh0Iiwic2V0U2hvd0FsdFRleHQiLCJxdWFsaXR5SW50IiwicHJvY2VzcyIsInBvc2l0aW9uIiwiaXNOYU4iLCJWQUxJRF9MT0FESU5HX1ZBTFVFUyIsImluY2x1ZGVzIiwibWFwIiwiU3RyaW5nIiwiam9pbiIsIndhcm5PbmNlIiwiVkFMSURfQkxVUl9FWFQiLCJ1cmxTdHIiLCJ1cmwiLCJVUkwiLCJlcnIiLCJwYXRobmFtZSIsInNlYXJjaCIsImxlZ2FjeUtleSIsImxlZ2FjeVZhbHVlIiwiZW50cmllcyIsInBlcmZPYnNlcnZlciIsIndpbmRvdyIsIlBlcmZvcm1hbmNlT2JzZXJ2ZXIiLCJlbnRyeUxpc3QiLCJlbnRyeSIsImdldEVudHJpZXMiLCJyZWYiLCJpbWdTcmMiLCJlbGVtZW50IiwibGNwSW1hZ2UiLCJhbGxJbWdzIiwiZ2V0Iiwib2JzZXJ2ZSIsInR5cGUiLCJidWZmZXJlZCIsImNvbnNvbGUiLCJlcnJvciIsImltZ1N0eWxlIiwiYXNzaWduIiwibGVmdCIsInRvcCIsInJpZ2h0IiwiYm90dG9tIiwiY29sb3IiLCJibHVyU3R5bGUiLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRQb3NpdGlvbiIsImJhY2tncm91bmRSZXBlYXQiLCJiYWNrZ3JvdW5kSW1hZ2UiLCJnZXRJbWFnZUJsdXJTdmciLCJpbWdBdHRyaWJ1dGVzIiwiZ2VuZXJhdGVJbWdBdHRycyIsInNyY1N0cmluZyIsImZ1bGxVcmwiLCJlIiwibG9jYXRpb24iLCJocmVmIiwic2V0IiwibGlua1Byb3BzIiwiaW1hZ2VTcmNTZXQiLCJzcmNTZXQiLCJjcm9zc09yaWdpbiIsIm9uTG9hZFJlZiIsInVzZVJlZiIsInVzZUVmZmVjdCIsImN1cnJlbnQiLCJvbkxvYWRpbmdDb21wbGV0ZVJlZiIsImltZ0VsZW1lbnRBcmdzIiwiY3JlYXRlRWxlbWVudCIsIkZyYWdtZW50IiwiSW1hZ2VFbGVtZW50Iiwia2V5IiwicmVsIiwiYXMiLCJ1bmRlZmluZWQiLCJlbnYiLCJfX05FWFRfSU1BR0VfT1BUUyIsIk1hcCIsImdsb2JhbFRoaXMiLCJfX05FWFRfSU1BR0VfSU1QT1JURUQiLCJpc1N0YXRpY0ltYWdlRGF0YSIsImdldFdpZHRocyIsInZpZXdwb3J0V2lkdGhSZSIsInBlcmNlbnRTaXplcyIsIm1hdGNoIiwiZXhlYyIsInB1c2giLCJwYXJzZUludCIsImxlbmd0aCIsInNtYWxsZXN0UmF0aW8iLCJtaW4iLCJ3aWR0aHMiLCJmaWx0ZXIiLCJzIiwia2luZCIsIlNldCIsInciLCJmaW5kIiwicCIsImxhc3QiLCJpIiwieCIsInRlc3QiLCJOYU4iLCJoYW5kbGVMb2FkaW5nIiwiaW1nIiwiZGVjb2RlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjYXRjaCIsInRoZW4iLCJwYXJlbnROb2RlIiwiZXZlbnQiLCJFdmVudCIsIndyaXRhYmxlIiwicHJldmVudGVkIiwic3RvcHBlZCIsIm5hdGl2ZUV2ZW50IiwiY3VycmVudFRhcmdldCIsInRhcmdldCIsImlzRGVmYXVsdFByZXZlbnRlZCIsImlzUHJvcGFnYXRpb25TdG9wcGVkIiwicGVyc2lzdCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwiZ2V0QXR0cmlidXRlIiwid2lkdGhWaWV3cG9ydFJhdGlvIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiaW5uZXJXaWR0aCIsInBhcmVudEVsZW1lbnQiLCJnZXRDb21wdXRlZFN0eWxlIiwidmFsaWQiLCJoZWlnaHRNb2RpZmllZCIsInRvU3RyaW5nIiwid2lkdGhNb2RpZmllZCIsIm9uRXJyb3IiLCJkZWNvZGluZyIsInVzZUNhbGxiYWNrIiwiY29tcGxldGUiLCJfX2VzTW9kdWxlIiwibW9kdWxlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/image.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/link.js": -/*!***********************************************!*\ - !*** ./node_modules/next/dist/client/link.js ***! - \***********************************************/ -/***/ ((module, exports, __webpack_require__) => { - -"use strict"; -eval("\n\"use client\";\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports[\"default\"] = void 0;\nvar _interop_require_default = (__webpack_require__(/*! @swc/helpers/lib/_interop_require_default.js */ \"./node_modules/@swc/helpers/lib/_interop_require_default.js\")[\"default\"]);\nvar _object_without_properties_loose = (__webpack_require__(/*! @swc/helpers/lib/_object_without_properties_loose.js */ \"./node_modules/@swc/helpers/lib/_object_without_properties_loose.js\")[\"default\"]);\nvar _react = _interop_require_default(__webpack_require__(/*! react */ \"react\"));\nvar _router = __webpack_require__(/*! ../shared/lib/router/router */ \"./node_modules/next/dist/shared/lib/router/router.js\");\nvar _formatUrl = __webpack_require__(/*! ../shared/lib/router/utils/format-url */ \"../shared/lib/router/utils/format-url\");\nvar _addLocale = __webpack_require__(/*! ./add-locale */ \"./node_modules/next/dist/client/add-locale.js\");\nvar _routerContext = __webpack_require__(/*! ../shared/lib/router-context */ \"../shared/lib/router-context\");\nvar _appRouterContext = __webpack_require__(/*! ../shared/lib/app-router-context */ \"../shared/lib/app-router-context\");\nvar _useIntersection = __webpack_require__(/*! ./use-intersection */ \"./node_modules/next/dist/client/use-intersection.js\");\nvar _getDomainLocale = __webpack_require__(/*! ./get-domain-locale */ \"./node_modules/next/dist/client/get-domain-locale.js\");\nvar _addBasePath = __webpack_require__(/*! ./add-base-path */ \"./node_modules/next/dist/client/add-base-path.js\");\n\"use client\";\nconst prefetched = new Set();\nfunction prefetch(router, href, as, options) {\n if (true) {\n return;\n }\n if (!(0, _router).isLocalURL(href)) {\n return;\n }\n // We should only dedupe requests when experimental.optimisticClientCache is\n // disabled.\n if (!options.bypassPrefetchedCheck) {\n const locale = typeof options.locale !== \"undefined\" ? options.locale : \"locale\" in router ? router.locale : undefined;\n const prefetchedKey = href + \"%\" + as + \"%\" + locale;\n // If we've already fetched the key, then don't prefetch it again!\n if (prefetched.has(prefetchedKey)) {\n return;\n }\n // Mark this URL as prefetched.\n prefetched.add(prefetchedKey);\n }\n // Prefetch the JSON page if asked (only in the client)\n // We need to handle a prefetch error here since we may be\n // loading with priority which can reject but we don't\n // want to force navigation since this is only a prefetch\n Promise.resolve(router.prefetch(href, as, options)).catch((err)=>{\n if (true) {\n // rethrow to show invalid URL errors\n throw err;\n }\n });\n}\nfunction isModifiedEvent(event) {\n const { target } = event.currentTarget;\n return target && target !== \"_self\" || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.nativeEvent && event.nativeEvent.which === 2;\n}\nfunction linkClicked(e, router, href, as, replace, shallow, scroll, locale, isAppRouter, prefetchEnabled) {\n const { nodeName } = e.currentTarget;\n // anchors inside an svg have a lowercase nodeName\n const isAnchorNodeName = nodeName.toUpperCase() === \"A\";\n if (isAnchorNodeName && (isModifiedEvent(e) || !(0, _router).isLocalURL(href))) {\n // ignore click for browser’s default behavior\n return;\n }\n e.preventDefault();\n const navigate = ()=>{\n // If the router is an NextRouter instance it will have `beforePopState`\n if (\"beforePopState\" in router) {\n router[replace ? \"replace\" : \"push\"](href, as, {\n shallow,\n locale,\n scroll\n });\n } else {\n router[replace ? \"replace\" : \"push\"](as || href, {\n forceOptimisticNavigation: !prefetchEnabled\n });\n }\n };\n if (isAppRouter) {\n // @ts-expect-error startTransition exists.\n _react.default.startTransition(navigate);\n } else {\n navigate();\n }\n}\nfunction formatStringOrUrl(urlObjOrString) {\n if (typeof urlObjOrString === \"string\") {\n return urlObjOrString;\n }\n return (0, _formatUrl).formatUrl(urlObjOrString);\n}\n/**\n * React Component that enables client-side transitions between routes.\n */ const Link = /*#__PURE__*/ _react.default.forwardRef(function LinkComponent(props, forwardedRef) {\n if (true) {\n function createPropError(args) {\n return new Error(`Failed prop type: The prop \\`${args.key}\\` expects a ${args.expected} in \\`\\`, but got \\`${args.actual}\\` instead.` + ( false ? 0 : \"\"));\n }\n // TypeScript trick for type-guarding:\n const requiredPropsGuard = {\n href: true\n };\n const requiredProps = Object.keys(requiredPropsGuard);\n requiredProps.forEach((key)=>{\n if (key === \"href\") {\n if (props[key] == null || typeof props[key] !== \"string\" && typeof props[key] !== \"object\") {\n throw createPropError({\n key,\n expected: \"`string` or `object`\",\n actual: props[key] === null ? \"null\" : typeof props[key]\n });\n }\n } else {\n // TypeScript trick for type-guarding:\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ = key;\n }\n });\n // TypeScript trick for type-guarding:\n const optionalPropsGuard = {\n as: true,\n replace: true,\n scroll: true,\n shallow: true,\n passHref: true,\n prefetch: true,\n locale: true,\n onClick: true,\n onMouseEnter: true,\n onTouchStart: true,\n legacyBehavior: true\n };\n const optionalProps = Object.keys(optionalPropsGuard);\n optionalProps.forEach((key)=>{\n const valType = typeof props[key];\n if (key === \"as\") {\n if (props[key] && valType !== \"string\" && valType !== \"object\") {\n throw createPropError({\n key,\n expected: \"`string` or `object`\",\n actual: valType\n });\n }\n } else if (key === \"locale\") {\n if (props[key] && valType !== \"string\") {\n throw createPropError({\n key,\n expected: \"`string`\",\n actual: valType\n });\n }\n } else if (key === \"onClick\" || key === \"onMouseEnter\" || key === \"onTouchStart\") {\n if (props[key] && valType !== \"function\") {\n throw createPropError({\n key,\n expected: \"`function`\",\n actual: valType\n });\n }\n } else if (key === \"replace\" || key === \"scroll\" || key === \"shallow\" || key === \"passHref\" || key === \"prefetch\" || key === \"legacyBehavior\") {\n if (props[key] != null && valType !== \"boolean\") {\n throw createPropError({\n key,\n expected: \"`boolean`\",\n actual: valType\n });\n }\n } else {\n // TypeScript trick for type-guarding:\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ = key;\n }\n });\n // This hook is in a conditional but that is ok because `process.env.NODE_ENV` never changes\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const hasWarned = _react.default.useRef(false);\n if (props.prefetch && !hasWarned.current) {\n hasWarned.current = true;\n console.warn(\"Next.js auto-prefetches automatically based on viewport. The prefetch attribute is no longer needed. More: https://nextjs.org/docs/messages/prefetch-true-deprecated\");\n }\n }\n let children;\n const { href: hrefProp , as: asProp , children: childrenProp , prefetch: prefetchProp , passHref , replace , shallow , scroll , locale , onClick , onMouseEnter: onMouseEnterProp , onTouchStart: onTouchStartProp , legacyBehavior =Boolean(true) !== true } = props, restProps = _object_without_properties_loose(props, [\n \"href\",\n \"as\",\n \"children\",\n \"prefetch\",\n \"passHref\",\n \"replace\",\n \"shallow\",\n \"scroll\",\n \"locale\",\n \"onClick\",\n \"onMouseEnter\",\n \"onTouchStart\",\n \"legacyBehavior\"\n ]);\n children = childrenProp;\n if (legacyBehavior && (typeof children === \"string\" || typeof children === \"number\")) {\n children = /*#__PURE__*/ _react.default.createElement(\"a\", null, children);\n }\n const prefetchEnabled = prefetchProp !== false;\n const pagesRouter = _react.default.useContext(_routerContext.RouterContext);\n const appRouter = _react.default.useContext(_appRouterContext.AppRouterContext);\n const router = pagesRouter != null ? pagesRouter : appRouter;\n // We're in the app directory if there is no pages router.\n const isAppRouter = !pagesRouter;\n const { href , as } = _react.default.useMemo(()=>{\n if (!pagesRouter) {\n const resolvedHref = formatStringOrUrl(hrefProp);\n return {\n href: resolvedHref,\n as: asProp ? formatStringOrUrl(asProp) : resolvedHref\n };\n }\n const [resolvedHref1, resolvedAs] = (0, _router).resolveHref(pagesRouter, hrefProp, true);\n return {\n href: resolvedHref1,\n as: asProp ? (0, _router).resolveHref(pagesRouter, asProp) : resolvedAs || resolvedHref1\n };\n }, [\n pagesRouter,\n hrefProp,\n asProp\n ]);\n const previousHref = _react.default.useRef(href);\n const previousAs = _react.default.useRef(as);\n // This will return the first child, if multiple are provided it will throw an error\n let child;\n if (legacyBehavior) {\n if (true) {\n if (onClick) {\n console.warn(`\"onClick\" was passed to with \\`href\\` of \\`${hrefProp}\\` but \"legacyBehavior\" was set. The legacy behavior requires onClick be set on the child of next/link`);\n }\n if (onMouseEnterProp) {\n console.warn(`\"onMouseEnter\" was passed to with \\`href\\` of \\`${hrefProp}\\` but \"legacyBehavior\" was set. The legacy behavior requires onMouseEnter be set on the child of next/link`);\n }\n try {\n child = _react.default.Children.only(children);\n } catch (err) {\n if (!children) {\n throw new Error(`No children were passed to with \\`href\\` of \\`${hrefProp}\\` but one child is required https://nextjs.org/docs/messages/link-no-children`);\n }\n throw new Error(`Multiple children were passed to with \\`href\\` of \\`${hrefProp}\\` but only one child is supported https://nextjs.org/docs/messages/link-multiple-children` + ( false ? 0 : \"\"));\n }\n } else {}\n } else {\n if (true) {\n var ref;\n if (((ref = children) == null ? void 0 : ref.type) === \"a\") {\n throw new Error(\"Invalid with child. Please remove or use .\\nLearn more: https://nextjs.org/docs/messages/invalid-new-link-with-extra-anchor\");\n }\n }\n }\n const childRef = legacyBehavior ? child && typeof child === \"object\" && child.ref : forwardedRef;\n const [setIntersectionRef, isVisible, resetVisible] = (0, _useIntersection).useIntersection({\n rootMargin: \"200px\"\n });\n const setRef = _react.default.useCallback((el)=>{\n // Before the link getting observed, check if visible state need to be reset\n if (previousAs.current !== as || previousHref.current !== href) {\n resetVisible();\n previousAs.current = as;\n previousHref.current = href;\n }\n setIntersectionRef(el);\n if (childRef) {\n if (typeof childRef === \"function\") childRef(el);\n else if (typeof childRef === \"object\") {\n childRef.current = el;\n }\n }\n }, [\n as,\n childRef,\n href,\n resetVisible,\n setIntersectionRef\n ]);\n // Prefetch the URL if we haven't already and it's visible.\n _react.default.useEffect(()=>{\n if (!router) {\n return;\n }\n // If we don't need to prefetch the URL, don't do prefetch.\n if (!isVisible || !prefetchEnabled) {\n return;\n }\n // Prefetch the URL.\n prefetch(router, href, as, {\n locale\n });\n }, [\n as,\n href,\n isVisible,\n locale,\n prefetchEnabled,\n pagesRouter == null ? void 0 : pagesRouter.locale,\n router\n ]);\n const childProps = {\n ref: setRef,\n onClick: (e)=>{\n if (true) {\n if (!e) {\n throw new Error(`Component rendered inside next/link has to pass click event to \"onClick\" prop.`);\n }\n }\n if (!legacyBehavior && typeof onClick === \"function\") {\n onClick(e);\n }\n if (legacyBehavior && child.props && typeof child.props.onClick === \"function\") {\n child.props.onClick(e);\n }\n if (!router) {\n return;\n }\n if (e.defaultPrevented) {\n return;\n }\n linkClicked(e, router, href, as, replace, shallow, scroll, locale, isAppRouter, prefetchEnabled);\n },\n onMouseEnter: (e)=>{\n if (!legacyBehavior && typeof onMouseEnterProp === \"function\") {\n onMouseEnterProp(e);\n }\n if (legacyBehavior && child.props && typeof child.props.onMouseEnter === \"function\") {\n child.props.onMouseEnter(e);\n }\n if (!router) {\n return;\n }\n if (!prefetchEnabled && isAppRouter) {\n return;\n }\n prefetch(router, href, as, {\n locale,\n priority: true,\n // @see {https://github.com/vercel/next.js/discussions/40268?sort=top#discussioncomment-3572642}\n bypassPrefetchedCheck: true\n });\n },\n onTouchStart: (e)=>{\n if (!legacyBehavior && typeof onTouchStartProp === \"function\") {\n onTouchStartProp(e);\n }\n if (legacyBehavior && child.props && typeof child.props.onTouchStart === \"function\") {\n child.props.onTouchStart(e);\n }\n if (!router) {\n return;\n }\n if (!prefetchEnabled && isAppRouter) {\n return;\n }\n prefetch(router, href, as, {\n locale,\n priority: true,\n // @see {https://github.com/vercel/next.js/discussions/40268?sort=top#discussioncomment-3572642}\n bypassPrefetchedCheck: true\n });\n }\n };\n // If child is an tag and doesn't have a href attribute, or if the 'passHref' property is\n // defined, we specify the current 'href', so that repetition is not needed by the user\n if (!legacyBehavior || passHref || child.type === \"a\" && !(\"href\" in child.props)) {\n const curLocale = typeof locale !== \"undefined\" ? locale : pagesRouter == null ? void 0 : pagesRouter.locale;\n // we only render domain locales if we are currently on a domain locale\n // so that locale links are still visitable in development/preview envs\n const localeDomain = (pagesRouter == null ? void 0 : pagesRouter.isLocaleDomain) && (0, _getDomainLocale).getDomainLocale(as, curLocale, pagesRouter == null ? void 0 : pagesRouter.locales, pagesRouter == null ? void 0 : pagesRouter.domainLocales);\n childProps.href = localeDomain || (0, _addBasePath).addBasePath((0, _addLocale).addLocale(as, curLocale, pagesRouter == null ? void 0 : pagesRouter.defaultLocale));\n }\n return legacyBehavior ? /*#__PURE__*/ _react.default.cloneElement(child, childProps) : /*#__PURE__*/ _react.default.createElement(\"a\", Object.assign({}, restProps, childProps), children);\n});\nvar _default = Link;\nexports[\"default\"] = _default;\nif ((typeof exports.default === \"function\" || typeof exports.default === \"object\" && exports.default !== null) && typeof exports.default.__esModule === \"undefined\") {\n Object.defineProperty(exports.default, \"__esModule\", {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=link.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9saW5rLmpzLmpzIiwibWFwcGluZ3MiOiJBQUNhO0FBRGI7QUFFQUEsOENBQTZDO0lBQ3pDRyxPQUFPLElBQUk7QUFDZixDQUFDLEVBQUM7QUFDRkQsa0JBQWUsR0FBRyxLQUFLO0FBQ3ZCLElBQUlHLDJCQUEyQkMsbUpBQStEO0FBQzlGLElBQUlDLG1DQUFtQ0QsbUtBQXVFO0FBQzlHLElBQUlFLFNBQVNILHlCQUF5QkMsbUJBQU9BLENBQUMsb0JBQU87QUFDckQsSUFBSUcsVUFBVUgsbUJBQU9BLENBQUMseUZBQTZCO0FBQ25ELElBQUlJLGFBQWFKLG1CQUFPQSxDQUFDLG9GQUF1QztBQUNoRSxJQUFJSyxhQUFhTCxtQkFBT0EsQ0FBQyxtRUFBYztBQUN2QyxJQUFJTSxpQkFBaUJOLG1CQUFPQSxDQUFDLGtFQUE4QjtBQUMzRCxJQUFJTyxvQkFBb0JQLG1CQUFPQSxDQUFDLDBFQUFrQztBQUNsRSxJQUFJUSxtQkFBbUJSLG1CQUFPQSxDQUFDLCtFQUFvQjtBQUNuRCxJQUFJUyxtQkFBbUJULG1CQUFPQSxDQUFDLGlGQUFxQjtBQUNwRCxJQUFJVSxlQUFlVixtQkFBT0EsQ0FBQyx5RUFBaUI7QUFDNUM7QUFDQSxNQUFNVyxhQUFhLElBQUlDO0FBQ3ZCLFNBQVNDLFNBQVNDLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxFQUFFLEVBQUVDLE9BQU8sRUFBRTtJQUN6QyxJQUFJLElBQWtCLEVBQWE7UUFDL0I7SUFDSixDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsR0FBR2QsT0FBTyxFQUFFZSxVQUFVLENBQUNILE9BQU87UUFDaEM7SUFDSixDQUFDO0lBQ0QsNEVBQTRFO0lBQzVFLFlBQVk7SUFDWixJQUFJLENBQUNFLFFBQVFFLHFCQUFxQixFQUFFO1FBQ2hDLE1BQU1DLFNBQ04sT0FBT0gsUUFBUUcsTUFBTSxLQUFLLGNBQWNILFFBQVFHLE1BQU0sR0FBRyxZQUFZTixTQUFTQSxPQUFPTSxNQUFNLEdBQUdDLFNB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QUFPLEVBQUVqQyxlQUFlLElBQUksR0FBRyxLQUFLLElBQUlBLFlBQVlrQyxhQUFhO1FBQ3JQUixXQUFXN0csSUFBSSxHQUFHaUgsZ0JBQWdCLENBQUMsR0FBR3RILFlBQVksRUFBRTJILFdBQVcsQ0FBQyxDQUFDLEdBQUdoSSxVQUFVLEVBQUVpSSxTQUFTLENBQUN0SCxJQUFJK0csV0FBVzdCLGVBQWUsSUFBSSxHQUFHLEtBQUssSUFBSUEsWUFBWXFDLGFBQWE7SUFDckssQ0FBQztJQUNELE9BQU96RCxpQkFBaUIsV0FBVyxHQUFHNUUsT0FBT0osT0FBTyxDQUFDMEksWUFBWSxDQUFDM0IsT0FBT2UsY0FBYyxXQUFXLEdBQUcxSCxPQUFPSixPQUFPLENBQUNtRyxhQUFhLENBQUMsS0FBS3ZHLE9BQU8rSSxNQUFNLENBQUMsQ0FBQyxHQUFHekMsV0FBVzRCLGFBQWF0QyxTQUFTO0FBQzlMO0FBQ0EsSUFBSW9ELFdBQVdqRjtBQUNmN0Qsa0JBQWUsR0FBRzhJO0FBRWxCLElBQUksQ0FBQyxPQUFPOUksUUFBUUUsT0FBTyxLQUFLLGNBQWUsT0FBT0YsUUFBUUUsT0FBTyxLQUFLLFlBQVlGLFFBQVFFLE9BQU8sS0FBSyxJQUFJLEtBQU0sT0FBT0YsUUFBUUUsT0FBTyxDQUFDNkksVUFBVSxLQUFLLGFBQWE7SUFDcktqSixPQUFPQyxjQUFjLENBQUNDLFFBQVFFLE9BQU8sRUFBRSxjQUFjO1FBQUVELE9BQU8sSUFBSTtJQUFDO0lBQ25FSCxPQUFPK0ksTUFBTSxDQUFDN0ksUUFBUUUsT0FBTyxFQUFFRjtJQUMvQmdKLE9BQU9oSixPQUFPLEdBQUdBLFFBQVFFLE9BQU87QUFDbEMsQ0FBQyxDQUVELGdDQUFnQyIsInNvdXJjZXMiOlsid2VicGFjazovL21jZ3BvcnRmby8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L2xpbmsuanM/ZTRmOSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pbnRlcm9wX3JlcXVpcmVfZGVmYXVsdCA9IHJlcXVpcmUoXCJAc3djL2hlbHBlcnMvbGliL19pbnRlcm9wX3JlcXVpcmVfZGVmYXVsdC5qc1wiKS5kZWZhdWx0O1xudmFyIF9vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3NlID0gcmVxdWlyZShcIkBzd2MvaGVscGVycy9saWIvX29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfbG9vc2UuanNcIikuZGVmYXVsdDtcbnZhciBfcmVhY3QgPSBfaW50ZXJvcF9yZXF1aXJlX2RlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfcm91dGVyID0gcmVxdWlyZShcIi4uL3NoYXJlZC9saWIvcm91dGVyL3JvdXRlclwiKTtcbnZhciBfZm9ybWF0VXJsID0gcmVxdWlyZShcIi4uL3NoYXJlZC9saWIvcm91dGVyL3V0aWxzL2Zvcm1hdC11cmxcIik7XG52YXIgX2FkZExvY2FsZSA9IHJlcXVpcmUoXCIuL2FkZC1sb2NhbGVcIik7XG52YXIgX3JvdXRlckNvbnRleHQgPSByZXF1aXJlKFwiLi4vc2hhcmVkL2xpYi9yb3V0ZXItY29udGV4dFwiKTtcbnZhciBfYXBwUm91dGVyQ29udGV4dCA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvbGliL2FwcC1yb3V0ZXItY29udGV4dFwiKTtcbnZhciBfdXNlSW50ZXJzZWN0aW9uID0gcmVxdWlyZShcIi4vdXNlLWludGVyc2VjdGlvblwiKTtcbnZhciBfZ2V0RG9tYWluTG9jYWxlID0gcmVxdWlyZShcIi4vZ2V0LWRvbWFpbi1sb2NhbGVcIik7XG52YXIgX2FkZEJhc2VQYXRoID0gcmVxdWlyZShcIi4vYWRkLWJhc2UtcGF0aFwiKTtcbid1c2UgY2xpZW50JztcbmNvbnN0IHByZWZldGNoZWQgPSBuZXcgU2V0KCk7XG5mdW5jdGlvbiBwcmVmZXRjaChyb3V0ZXIsIGhyZWYsIGFzLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCEoMCwgX3JvdXRlcikuaXNMb2NhbFVSTChocmVmKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFdlIHNob3VsZCBvbmx5IGRlZHVwZSByZXF1ZXN0cyB3aGVuIGV4cGVyaW1lbnRhbC5vcHRpbWlzdGljQ2xpZW50Q2FjaGUgaXNcbiAgICAvLyBkaXNhYmxlZC5cbiAgICBpZiAoIW9wdGlvbnMuYnlwYXNzUHJlZmV0Y2hlZENoZWNrKSB7XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9IC8vIExldCB0aGUgbGluaydzIGxvY2FsZSBwcm9wIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHJvdXRlciBsb2NhbGUuXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLmxvY2FsZSAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRpb25zLmxvY2FsZSA6ICdsb2NhbGUnIGluIHJvdXRlciA/IHJvdXRlci5sb2NhbGUgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHByZWZldGNoZWRLZXkgPSBocmVmICsgJyUnICsgYXMgKyAnJScgKyBsb2NhbGU7XG4gICAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZmV0Y2hlZCB0aGUga2V5LCB0aGVuIGRvbid0IHByZWZldGNoIGl0IGFnYWluIVxuICAgICAgICBpZiAocHJlZmV0Y2hlZC5oYXMocHJlZmV0Y2hlZEtleSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBNYXJrIHRoaXMgVVJMIGFzIHByZWZldGNoZWQuXG4gICAgICAgIHByZWZldGNoZWQuYWRkKHByZWZldGNoZWRLZXkpO1xuICAgIH1cbiAgICAvLyBQcmVmZXRjaCB0aGUgSlNPTiBwYWdlIGlmIGFza2VkIChvbmx5IGluIHRoZSBjbGllbnQpXG4gICAgLy8gV2UgbmVlZCB0byBoYW5kbGUgYSBwcmVmZXRjaCBlcnJvciBoZXJlIHNpbmNlIHdlIG1heSBiZVxuICAgIC8vIGxvYWRpbmcgd2l0aCBwcmlvcml0eSB3aGljaCBjYW4gcmVqZWN0IGJ1dCB3ZSBkb24ndFxuICAgIC8vIHdhbnQgdG8gZm9yY2UgbmF2aWdhdGlvbiBzaW5jZSB0aGlzIGlzIG9ubHkgYSBwcmVmZXRjaFxuICAgIFByb21pc2UucmVzb2x2ZShyb3V0ZXIucHJlZmV0Y2goaHJlZiwgYXMsIG9wdGlvbnMpKS5jYXRjaCgoZXJyKT0+e1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgLy8gcmV0aHJvdyB0byBzaG93IGludmFsaWQgVVJMIGVycm9yc1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpc01vZGlmaWVkRXZlbnQoZXZlbnQpIHtcbiAgICBjb25zdCB7IHRhcmdldCAgfSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gICAgcmV0dXJuIHRhcmdldCAmJiB0YXJnZXQgIT09ICdfc2VsZicgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5uYXRpdmVFdmVudCAmJiBldmVudC5uYXRpdmVFdmVudC53aGljaCA9PT0gMjtcbn1cbmZ1bmN0aW9uIGxpbmtDbGlja2VkKGUsIHJvdXRlciwgaHJlZiwgYXMsIHJlcGxhY2UsIHNoYWxsb3csIHNjcm9sbCwgbG9jYWxlLCBpc0FwcFJvdXRlciwgcHJlZmV0Y2hFbmFibGVkKSB7XG4gICAgY29uc3QgeyBub2RlTmFtZSAgfSA9IGUuY3VycmVudFRhcmdldDtcbiAgICAvLyBhbmNob3JzIGluc2lkZSBhbiBzdmcgaGF2ZSBhIGxvd2VyY2FzZSBub2RlTmFtZVxuICAgIGNvbnN0IGlzQW5jaG9yTm9kZU5hbWUgPSBub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQSc7XG4gICAgaWYgKGlzQW5jaG9yTm9kZU5hbWUgJiYgKGlzTW9kaWZpZWRFdmVudChlKSB8fCAhKDAsIF9yb3V0ZXIpLmlzTG9jYWxVUkwoaHJlZikpKSB7XG4gICAgICAgIC8vIGlnbm9yZSBjbGljayBmb3IgYnJvd3NlcuKAmXMgZGVmYXVsdCBiZWhhdmlvclxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBuYXZpZ2F0ZSA9ICgpPT57XG4gICAgICAgIC8vIElmIHRoZSByb3V0ZXIgaXMgYW4gTmV4dFJvdXRlciBpbnN0YW5jZSBpdCB3aWxsIGhhdmUgYGJlZm9yZVBvcFN0YXRlYFxuICAgICAgICBpZiAoJ2JlZm9yZVBvcFN0YXRlJyBpbiByb3V0ZXIpIHtcbiAgICAgICAgICAgIHJvdXRlcltyZXBsYWNlID8gJ3JlcGxhY2UnIDogJ3B1c2gnXShocmVmLCBhcywge1xuICAgICAgICAgICAgICAgIHNoYWxsb3csXG4gICAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICAgIHNjcm9sbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3V0ZXJbcmVwbGFjZSA/ICdyZXBsYWNlJyA6ICdwdXNoJ10oYXMgfHwgaHJlZiwge1xuICAgICAgICAgICAgICAgIGZvcmNlT3B0aW1pc3RpY05hdmlnYXRpb246ICFwcmVmZXRjaEVuYWJsZWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAoaXNBcHBSb3V0ZXIpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzdGFydFRyYW5zaXRpb24gZXhpc3RzLlxuICAgICAgICBfcmVhY3QuZGVmYXVsdC5zdGFydFRyYW5zaXRpb24obmF2aWdhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG5hdmlnYXRlKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZm9ybWF0U3RyaW5nT3JVcmwodXJsT2JqT3JTdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHVybE9iak9yU3RyaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdXJsT2JqT3JTdHJpbmc7XG4gICAgfVxuICAgIHJldHVybiAoMCwgX2Zvcm1hdFVybCkuZm9ybWF0VXJsKHVybE9iak9yU3RyaW5nKTtcbn1cbi8qKlxuICogUmVhY3QgQ29tcG9uZW50IHRoYXQgZW5hYmxlcyBjbGllbnQtc2lkZSB0cmFuc2l0aW9ucyBiZXR3ZWVuIHJvdXRlcy5cbiAqLyBjb25zdCBMaW5rID0gLyojX19QVVJFX18qLyBfcmVhY3QuZGVmYXVsdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIExpbmtDb21wb25lbnQocHJvcHMsIGZvcndhcmRlZFJlZikge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVByb3BFcnJvcihhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBGYWlsZWQgcHJvcCB0eXBlOiBUaGUgcHJvcCBcXGAke2FyZ3Mua2V5fVxcYCBleHBlY3RzIGEgJHthcmdzLmV4cGVjdGVkfSBpbiBcXGA8TGluaz5cXGAsIGJ1dCBnb3QgXFxgJHthcmdzLmFjdHVhbH1cXGAgaW5zdGVhZC5gICsgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gXCJcXG5PcGVuIHlvdXIgYnJvd3NlcidzIGNvbnNvbGUgdG8gdmlldyB0aGUgQ29tcG9uZW50IHN0YWNrIHRyYWNlLlwiIDogJycpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUeXBlU2NyaXB0IHRyaWNrIGZvciB0eXBlLWd1YXJkaW5nOlxuICAgICAgICBjb25zdCByZXF1aXJlZFByb3BzR3VhcmQgPSB7XG4gICAgICAgICAgICBocmVmOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkUHJvcHMgPSBPYmplY3Qua2V5cyhyZXF1aXJlZFByb3BzR3VhcmQpO1xuICAgICAgICByZXF1aXJlZFByb3BzLmZvckVhY2goKGtleSk9PntcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdocmVmJykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wc1trZXldID09IG51bGwgfHwgdHlwZW9mIHByb3BzW2tleV0gIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwcm9wc1trZXldICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVQcm9wRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6ICdgc3RyaW5nYCBvciBgb2JqZWN0YCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IHByb3BzW2tleV0gPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgcHJvcHNba2V5XVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFR5cGVTY3JpcHQgdHJpY2sgZm9yIHR5cGUtZ3VhcmRpbmc6XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIGNvbnN0IF8gPSBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUeXBlU2NyaXB0IHRyaWNrIGZvciB0eXBlLWd1YXJkaW5nOlxuICAgICAgICBjb25zdCBvcHRpb25hbFByb3BzR3VhcmQgPSB7XG4gICAgICAgICAgICBhczogdHJ1ZSxcbiAgICAgICAgICAgIHJlcGxhY2U6IHRydWUsXG4gICAgICAgICAgICBzY3JvbGw6IHRydWUsXG4gICAgICAgICAgICBzaGFsbG93OiB0cnVlLFxuICAgICAgICAgICAgcGFzc0hyZWY6IHRydWUsXG4gICAgICAgICAgICBwcmVmZXRjaDogdHJ1ZSxcbiAgICAgICAgICAgIGxvY2FsZTogdHJ1ZSxcbiAgICAgICAgICAgIG9uQ2xpY2s6IHRydWUsXG4gICAgICAgICAgICBvbk1vdXNlRW50ZXI6IHRydWUsXG4gICAgICAgICAgICBvblRvdWNoU3RhcnQ6IHRydWUsXG4gICAgICAgICAgICBsZWdhY3lCZWhhdmlvcjogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvcHRpb25hbFByb3BzID0gT2JqZWN0LmtleXMob3B0aW9uYWxQcm9wc0d1YXJkKTtcbiAgICAgICAgb3B0aW9uYWxQcm9wcy5mb3JFYWNoKChrZXkpPT57XG4gICAgICAgICAgICBjb25zdCB2YWxUeXBlID0gdHlwZW9mIHByb3BzW2tleV07XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnYXMnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BzW2tleV0gJiYgdmFsVHlwZSAhPT0gJ3N0cmluZycgJiYgdmFsVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlUHJvcEVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiAnYHN0cmluZ2Agb3IgYG9iamVjdGAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsOiB2YWxUeXBlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbG9jYWxlJykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wc1trZXldICYmIHZhbFR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZVByb3BFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogJ2BzdHJpbmdgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogdmFsVHlwZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ29uQ2xpY2snIHx8IGtleSA9PT0gJ29uTW91c2VFbnRlcicgfHwga2V5ID09PSAnb25Ub3VjaFN0YXJ0Jykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wc1trZXldICYmIHZhbFR5cGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlUHJvcEVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiAnYGZ1bmN0aW9uYCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IHZhbFR5cGVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyZXBsYWNlJyB8fCBrZXkgPT09ICdzY3JvbGwnIHx8IGtleSA9PT0gJ3NoYWxsb3cnIHx8IGtleSA9PT0gJ3Bhc3NIcmVmJyB8fCBrZXkgPT09ICdwcmVmZXRjaCcgfHwga2V5ID09PSAnbGVnYWN5QmVoYXZpb3InKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BzW2tleV0gIT0gbnVsbCAmJiB2YWxUeXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlUHJvcEVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiAnYGJvb2xlYW5gJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogdmFsVHlwZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFR5cGVTY3JpcHQgdHJpY2sgZm9yIHR5cGUtZ3VhcmRpbmc6XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIGNvbnN0IF8gPSBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUaGlzIGhvb2sgaXMgaW4gYSBjb25kaXRpb25hbCBidXQgdGhhdCBpcyBvayBiZWNhdXNlIGBwcm9jZXNzLmVudi5OT0RFX0VOVmAgbmV2ZXIgY2hhbmdlc1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvcnVsZXMtb2YtaG9va3NcbiAgICAgICAgY29uc3QgaGFzV2FybmVkID0gX3JlYWN0LmRlZmF1bHQudXNlUmVmKGZhbHNlKTtcbiAgICAgICAgaWYgKHByb3BzLnByZWZldGNoICYmICFoYXNXYXJuZWQuY3VycmVudCkge1xuICAgICAgICAgICAgaGFzV2FybmVkLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdOZXh0LmpzIGF1dG8tcHJlZmV0Y2hlcyBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHZpZXdwb3J0LiBUaGUgcHJlZmV0Y2ggYXR0cmlidXRlIGlzIG5vIGxvbmdlciBuZWVkZWQuIE1vcmU6IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL21lc3NhZ2VzL3ByZWZldGNoLXRydWUtZGVwcmVjYXRlZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBjaGlsZHJlbjtcbiAgICBjb25zdCB7IGhyZWY6IGhyZWZQcm9wICwgYXM6IGFzUHJvcCAsIGNoaWxkcmVuOiBjaGlsZHJlblByb3AgLCBwcmVmZXRjaDogcHJlZmV0Y2hQcm9wICwgcGFzc0hyZWYgLCByZXBsYWNlICwgc2hhbGxvdyAsIHNjcm9sbCAsIGxvY2FsZSAsIG9uQ2xpY2sgLCBvbk1vdXNlRW50ZXI6IG9uTW91c2VFbnRlclByb3AgLCBvblRvdWNoU3RhcnQ6IG9uVG91Y2hTdGFydFByb3AgLCBsZWdhY3lCZWhhdmlvciA9Qm9vbGVhbihwcm9jZXNzLmVudi5fX05FWFRfTkVXX0xJTktfQkVIQVZJT1IpICE9PSB0cnVlICB9ID0gcHJvcHMsIHJlc3RQcm9wcyA9IF9vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3NlKHByb3BzLCBbXG4gICAgICAgIFwiaHJlZlwiLFxuICAgICAgICBcImFzXCIsXG4gICAgICAgIFwiY2hpbGRyZW5cIixcbiAgICAgICAgXCJwcmVmZXRjaFwiLFxuICAgICAgICBcInBhc3NIcmVmXCIsXG4gICAgICAgIFwicmVwbGFjZVwiLFxuICAgICAgICBcInNoYWxsb3dcIixcbiAgICAgICAgXCJzY3JvbGxcIixcbiAgICAgICAgXCJsb2NhbGVcIixcbiAgICAgICAgXCJvbkNsaWNrXCIsXG4gICAgICAgIFwib25Nb3VzZUVudGVyXCIsXG4gICAgICAgIFwib25Ub3VjaFN0YXJ0XCIsXG4gICAgICAgIFwibGVnYWN5QmVoYXZpb3JcIlxuICAgIF0pO1xuICAgIGNoaWxkcmVuID0gY2hpbGRyZW5Qcm9wO1xuICAgIGlmIChsZWdhY3lCZWhhdmlvciAmJiAodHlwZW9mIGNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY2hpbGRyZW4gPT09ICdudW1iZXInKSkge1xuICAgICAgICBjaGlsZHJlbiA9IC8qI19fUFVSRV9fKi8gX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImFcIiwgbnVsbCwgY2hpbGRyZW4pO1xuICAgIH1cbiAgICBjb25zdCBwcmVmZXRjaEVuYWJsZWQgPSBwcmVmZXRjaFByb3AgIT09IGZhbHNlO1xuICAgIGNvbnN0IHBhZ2VzUm91dGVyID0gX3JlYWN0LmRlZmF1bHQudXNlQ29udGV4dChfcm91dGVyQ29udGV4dC5Sb3V0ZXJDb250ZXh0KTtcbiAgICBjb25zdCBhcHBSb3V0ZXIgPSBfcmVhY3QuZGVmYXVsdC51c2VDb250ZXh0KF9hcHBSb3V0ZXJDb250ZXh0LkFwcFJvdXRlckNvbnRleHQpO1xuICAgIGNvbnN0IHJvdXRlciA9IHBhZ2VzUm91dGVyICE9IG51bGwgPyBwYWdlc1JvdXRlciA6IGFwcFJvdXRlcjtcbiAgICAvLyBXZSdyZSBpbiB0aGUgYXBwIGRpcmVjdG9yeSBpZiB0aGVyZSBpcyBubyBwYWdlcyByb3V0ZXIuXG4gICAgY29uc3QgaXNBcHBSb3V0ZXIgPSAhcGFnZXNSb3V0ZXI7XG4gICAgY29uc3QgeyBocmVmICwgYXMgIH0gPSBfcmVhY3QuZGVmYXVsdC51c2VNZW1vKCgpPT57XG4gICAgICAgIGlmICghcGFnZXNSb3V0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkSHJlZiA9IGZvcm1hdFN0cmluZ09yVXJsKGhyZWZQcm9wKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaHJlZjogcmVzb2x2ZWRIcmVmLFxuICAgICAgICAgICAgICAgIGFzOiBhc1Byb3AgPyBmb3JtYXRTdHJpbmdPclVybChhc1Byb3ApIDogcmVzb2x2ZWRIcmVmXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFtyZXNvbHZlZEhyZWYsIHJlc29sdmVkQXNdID0gKDAsIF9yb3V0ZXIpLnJlc29sdmVIcmVmKHBhZ2VzUm91dGVyLCBocmVmUHJvcCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBocmVmOiByZXNvbHZlZEhyZWYsXG4gICAgICAgICAgICBhczogYXNQcm9wID8gKDAsIF9yb3V0ZXIpLnJlc29sdmVIcmVmKHBhZ2VzUm91dGVyLCBhc1Byb3ApIDogcmVzb2x2ZWRBcyB8fCByZXNvbHZlZEhyZWZcbiAgICAgICAgfTtcbiAgICB9LCBbXG4gICAgICAgIHBhZ2VzUm91dGVyLFxuICAgICAgICBocmVmUHJvcCxcbiAgICAgICAgYXNQcm9wXG4gICAgXSk7XG4gICAgY29uc3QgcHJldmlvdXNIcmVmID0gX3JlYWN0LmRlZmF1bHQudXNlUmVmKGhyZWYpO1xuICAgIGNvbnN0IHByZXZpb3VzQXMgPSBfcmVhY3QuZGVmYXVsdC51c2VSZWYoYXMpO1xuICAgIC8vIFRoaXMgd2lsbCByZXR1cm4gdGhlIGZpcnN0IGNoaWxkLCBpZiBtdWx0aXBsZSBhcmUgcHJvdmlkZWQgaXQgd2lsbCB0aHJvdyBhbiBlcnJvclxuICAgIGxldCBjaGlsZDtcbiAgICBpZiAobGVnYWN5QmVoYXZpb3IpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgICAgICBpZiAob25DbGljaykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgXCJvbkNsaWNrXCIgd2FzIHBhc3NlZCB0byA8TGluaz4gd2l0aCBcXGBocmVmXFxgIG9mIFxcYCR7aHJlZlByb3B9XFxgIGJ1dCBcImxlZ2FjeUJlaGF2aW9yXCIgd2FzIHNldC4gVGhlIGxlZ2FjeSBiZWhhdmlvciByZXF1aXJlcyBvbkNsaWNrIGJlIHNldCBvbiB0aGUgY2hpbGQgb2YgbmV4dC9saW5rYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob25Nb3VzZUVudGVyUHJvcCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgXCJvbk1vdXNlRW50ZXJcIiB3YXMgcGFzc2VkIHRvIDxMaW5rPiB3aXRoIFxcYGhyZWZcXGAgb2YgXFxgJHtocmVmUHJvcH1cXGAgYnV0IFwibGVnYWN5QmVoYXZpb3JcIiB3YXMgc2V0LiBUaGUgbGVnYWN5IGJlaGF2aW9yIHJlcXVpcmVzIG9uTW91c2VFbnRlciBiZSBzZXQgb24gdGhlIGNoaWxkIG9mIG5leHQvbGlua2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjaGlsZCA9IF9yZWFjdC5kZWZhdWx0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNoaWxkcmVuIHdlcmUgcGFzc2VkIHRvIDxMaW5rPiB3aXRoIFxcYGhyZWZcXGAgb2YgXFxgJHtocmVmUHJvcH1cXGAgYnV0IG9uZSBjaGlsZCBpcyByZXF1aXJlZCBodHRwczovL25leHRqcy5vcmcvZG9jcy9tZXNzYWdlcy9saW5rLW5vLWNoaWxkcmVuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTXVsdGlwbGUgY2hpbGRyZW4gd2VyZSBwYXNzZWQgdG8gPExpbms+IHdpdGggXFxgaHJlZlxcYCBvZiBcXGAke2hyZWZQcm9wfVxcYCBidXQgb25seSBvbmUgY2hpbGQgaXMgc3VwcG9ydGVkIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL21lc3NhZ2VzL2xpbmstbXVsdGlwbGUtY2hpbGRyZW5gICsgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gXCIgXFxuT3BlbiB5b3VyIGJyb3dzZXIncyBjb25zb2xlIHRvIHZpZXcgdGhlIENvbXBvbmVudCBzdGFjayB0cmFjZS5cIiA6ICcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaGlsZCA9IF9yZWFjdC5kZWZhdWx0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgICAgICB2YXIgcmVmO1xuICAgICAgICAgICAgaWYgKCgocmVmID0gY2hpbGRyZW4pID09IG51bGwgPyB2b2lkIDAgOiByZWYudHlwZSkgPT09ICdhJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCA8TGluaz4gd2l0aCA8YT4gY2hpbGQuIFBsZWFzZSByZW1vdmUgPGE+IG9yIHVzZSA8TGluayBsZWdhY3lCZWhhdmlvcj4uXFxuTGVhcm4gbW9yZTogaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvbWVzc2FnZXMvaW52YWxpZC1uZXctbGluay13aXRoLWV4dHJhLWFuY2hvcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkUmVmID0gbGVnYWN5QmVoYXZpb3IgPyBjaGlsZCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnICYmIGNoaWxkLnJlZiA6IGZvcndhcmRlZFJlZjtcbiAgICBjb25zdCBbc2V0SW50ZXJzZWN0aW9uUmVmLCBpc1Zpc2libGUsIHJlc2V0VmlzaWJsZV0gPSAoMCwgX3VzZUludGVyc2VjdGlvbikudXNlSW50ZXJzZWN0aW9uKHtcbiAgICAgICAgcm9vdE1hcmdpbjogJzIwMHB4J1xuICAgIH0pO1xuICAgIGNvbnN0IHNldFJlZiA9IF9yZWFjdC5kZWZhdWx0LnVzZUNhbGxiYWNrKChlbCk9PntcbiAgICAgICAgLy8gQmVmb3JlIHRoZSBsaW5rIGdldHRpbmcgb2JzZXJ2ZWQsIGNoZWNrIGlmIHZpc2libGUgc3RhdGUgbmVlZCB0byBiZSByZXNldFxuICAgICAgICBpZiAocHJldmlvdXNBcy5jdXJyZW50ICE9PSBhcyB8fCBwcmV2aW91c0hyZWYuY3VycmVudCAhPT0gaHJlZikge1xuICAgICAgICAgICAgcmVzZXRWaXNpYmxlKCk7XG4gICAgICAgICAgICBwcmV2aW91c0FzLmN1cnJlbnQgPSBhcztcbiAgICAgICAgICAgIHByZXZpb3VzSHJlZi5jdXJyZW50ID0gaHJlZjtcbiAgICAgICAgfVxuICAgICAgICBzZXRJbnRlcnNlY3Rpb25SZWYoZWwpO1xuICAgICAgICBpZiAoY2hpbGRSZWYpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRSZWYgPT09ICdmdW5jdGlvbicpIGNoaWxkUmVmKGVsKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjaGlsZFJlZiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBjaGlsZFJlZi5jdXJyZW50ID0gZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCBbXG4gICAgICAgIGFzLFxuICAgICAgICBjaGlsZFJlZixcbiAgICAgICAgaHJlZixcbiAgICAgICAgcmVzZXRWaXNpYmxlLFxuICAgICAgICBzZXRJbnRlcnNlY3Rpb25SZWZcbiAgICBdKTtcbiAgICAvLyBQcmVmZXRjaCB0aGUgVVJMIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBhbmQgaXQncyB2aXNpYmxlLlxuICAgIF9yZWFjdC5kZWZhdWx0LnVzZUVmZmVjdCgoKT0+e1xuICAgICAgICBpZiAoIXJvdXRlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIGRvbid0IG5lZWQgdG8gcHJlZmV0Y2ggdGhlIFVSTCwgZG9uJ3QgZG8gcHJlZmV0Y2guXG4gICAgICAgIGlmICghaXNWaXNpYmxlIHx8ICFwcmVmZXRjaEVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmVmZXRjaCB0aGUgVVJMLlxuICAgICAgICBwcmVmZXRjaChyb3V0ZXIsIGhyZWYsIGFzLCB7XG4gICAgICAgICAgICBsb2NhbGVcbiAgICAgICAgfSk7XG4gICAgfSwgW1xuICAgICAgICBhcyxcbiAgICAgICAgaHJlZixcbiAgICAgICAgaXNWaXNpYmxlLFxuICAgICAgICBsb2NhbGUsXG4gICAgICAgIHByZWZldGNoRW5hYmxlZCxcbiAgICAgICAgcGFnZXNSb3V0ZXIgPT0gbnVsbCA/IHZvaWQgMCA6IHBhZ2VzUm91dGVyLmxvY2FsZSxcbiAgICAgICAgcm91dGVyLCBcbiAgICBdKTtcbiAgICBjb25zdCBjaGlsZFByb3BzID0ge1xuICAgICAgICByZWY6IHNldFJlZixcbiAgICAgICAgb25DbGljazogKGUpPT57XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGlmICghZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbXBvbmVudCByZW5kZXJlZCBpbnNpZGUgbmV4dC9saW5rIGhhcyB0byBwYXNzIGNsaWNrIGV2ZW50IHRvIFwib25DbGlja1wiIHByb3AuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFsZWdhY3lCZWhhdmlvciAmJiB0eXBlb2Ygb25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIG9uQ2xpY2soZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGVnYWN5QmVoYXZpb3IgJiYgY2hpbGQucHJvcHMgJiYgdHlwZW9mIGNoaWxkLnByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjaGlsZC5wcm9wcy5vbkNsaWNrKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyb3V0ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlua0NsaWNrZWQoZSwgcm91dGVyLCBocmVmLCBhcywgcmVwbGFjZSwgc2hhbGxvdywgc2Nyb2xsLCBsb2NhbGUsIGlzQXBwUm91dGVyLCBwcmVmZXRjaEVuYWJsZWQpO1xuICAgICAgICB9LFxuICAgICAgICBvbk1vdXNlRW50ZXI6IChlKT0+e1xuICAgICAgICAgICAgaWYgKCFsZWdhY3lCZWhhdmlvciAmJiB0eXBlb2Ygb25Nb3VzZUVudGVyUHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIG9uTW91c2VFbnRlclByb3AoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGVnYWN5QmVoYXZpb3IgJiYgY2hpbGQucHJvcHMgJiYgdHlwZW9mIGNoaWxkLnByb3BzLm9uTW91c2VFbnRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNoaWxkLnByb3BzLm9uTW91c2VFbnRlcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcm91dGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwcmVmZXRjaEVuYWJsZWQgJiYgaXNBcHBSb3V0ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmVmZXRjaChyb3V0ZXIsIGhyZWYsIGFzLCB7XG4gICAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICAgIHByaW9yaXR5OiB0cnVlLFxuICAgICAgICAgICAgICAgIC8vIEBzZWUge2h0dHBzOi8vZ2l0aHViLmNvbS92ZXJjZWwvbmV4dC5qcy9kaXNjdXNzaW9ucy80MDI2OD9zb3J0PXRvcCNkaXNjdXNzaW9uY29tbWVudC0zNTcyNjQyfVxuICAgICAgICAgICAgICAgIGJ5cGFzc1ByZWZldGNoZWRDaGVjazogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVG91Y2hTdGFydDogKGUpPT57XG4gICAgICAgICAgICBpZiAoIWxlZ2FjeUJlaGF2aW9yICYmIHR5cGVvZiBvblRvdWNoU3RhcnRQcm9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgb25Ub3VjaFN0YXJ0UHJvcChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZWdhY3lCZWhhdmlvciAmJiBjaGlsZC5wcm9wcyAmJiB0eXBlb2YgY2hpbGQucHJvcHMub25Ub3VjaFN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY2hpbGQucHJvcHMub25Ub3VjaFN0YXJ0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyb3V0ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXByZWZldGNoRW5hYmxlZCAmJiBpc0FwcFJvdXRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZWZldGNoKHJvdXRlciwgaHJlZiwgYXMsIHtcbiAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IHRydWUsXG4gICAgICAgICAgICAgICAgLy8gQHNlZSB7aHR0cHM6Ly9naXRodWIuY29tL3ZlcmNlbC9uZXh0LmpzL2Rpc2N1c3Npb25zLzQwMjY4P3NvcnQ9dG9wI2Rpc2N1c3Npb25jb21tZW50LTM1NzI2NDJ9XG4gICAgICAgICAgICAgICAgYnlwYXNzUHJlZmV0Y2hlZENoZWNrOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gSWYgY2hpbGQgaXMgYW4gPGE+IHRhZyBhbmQgZG9lc24ndCBoYXZlIGEgaHJlZiBhdHRyaWJ1dGUsIG9yIGlmIHRoZSAncGFzc0hyZWYnIHByb3BlcnR5IGlzXG4gICAgLy8gZGVmaW5lZCwgd2Ugc3BlY2lmeSB0aGUgY3VycmVudCAnaHJlZicsIHNvIHRoYXQgcmVwZXRpdGlvbiBpcyBub3QgbmVlZGVkIGJ5IHRoZSB1c2VyXG4gICAgaWYgKCFsZWdhY3lCZWhhdmlvciB8fCBwYXNzSHJlZiB8fCBjaGlsZC50eXBlID09PSAnYScgJiYgISgnaHJlZicgaW4gY2hpbGQucHJvcHMpKSB7XG4gICAgICAgIGNvbnN0IGN1ckxvY2FsZSA9IHR5cGVvZiBsb2NhbGUgIT09ICd1bmRlZmluZWQnID8gbG9jYWxlIDogcGFnZXNSb3V0ZXIgPT0gbnVsbCA/IHZvaWQgMCA6IHBhZ2VzUm91dGVyLmxvY2FsZTtcbiAgICAgICAgLy8gd2Ugb25seSByZW5kZXIgZG9tYWluIGxvY2FsZXMgaWYgd2UgYXJlIGN1cnJlbnRseSBvbiBhIGRvbWFpbiBsb2NhbGVcbiAgICAgICAgLy8gc28gdGhhdCBsb2NhbGUgbGlua3MgYXJlIHN0aWxsIHZpc2l0YWJsZSBpbiBkZXZlbG9wbWVudC9wcmV2aWV3IGVudnNcbiAgICAgICAgY29uc3QgbG9jYWxlRG9tYWluID0gKHBhZ2VzUm91dGVyID09IG51bGwgPyB2b2lkIDAgOiBwYWdlc1JvdXRlci5pc0xvY2FsZURvbWFpbikgJiYgKDAsIF9nZXREb21haW5Mb2NhbGUpLmdldERvbWFpbkxvY2FsZShhcywgY3VyTG9jYWxlLCBwYWdlc1JvdXRlciA9PSBudWxsID8gdm9pZCAwIDogcGFnZXNSb3V0ZXIubG9jYWxlcywgcGFnZXNSb3V0ZXIgPT0gbnVsbCA/IHZvaWQgMCA6IHBhZ2VzUm91dGVyLmRvbWFpbkxvY2FsZXMpO1xuICAgICAgICBjaGlsZFByb3BzLmhyZWYgPSBsb2NhbGVEb21haW4gfHwgKDAsIF9hZGRCYXNlUGF0aCkuYWRkQmFzZVBhdGgoKDAsIF9hZGRMb2NhbGUpLmFkZExvY2FsZShhcywgY3VyTG9jYWxlLCBwYWdlc1JvdXRlciA9PSBudWxsID8gdm9pZCAwIDogcGFnZXNSb3V0ZXIuZGVmYXVsdExvY2FsZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbGVnYWN5QmVoYXZpb3IgPyAvKiNfX1BVUkVfXyovIF9yZWFjdC5kZWZhdWx0LmNsb25lRWxlbWVudChjaGlsZCwgY2hpbGRQcm9wcykgOiAvKiNfX1BVUkVfXyovIF9yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIE9iamVjdC5hc3NpZ24oe30sIHJlc3RQcm9wcywgY2hpbGRQcm9wcyksIGNoaWxkcmVuKTtcbn0pO1xudmFyIF9kZWZhdWx0ID0gTGluaztcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuXG5pZiAoKHR5cGVvZiBleHBvcnRzLmRlZmF1bHQgPT09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiBleHBvcnRzLmRlZmF1bHQgPT09ICdvYmplY3QnICYmIGV4cG9ydHMuZGVmYXVsdCAhPT0gbnVsbCkpICYmIHR5cGVvZiBleHBvcnRzLmRlZmF1bHQuX19lc01vZHVsZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMuZGVmYXVsdCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuICBPYmplY3QuYXNzaWduKGV4cG9ydHMuZGVmYXVsdCwgZXhwb3J0cyk7XG4gIG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cy5kZWZhdWx0O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5rLmpzLm1hcCJdLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImRlZmF1bHQiLCJfaW50ZXJvcF9yZXF1aXJlX2RlZmF1bHQiLCJyZXF1aXJlIiwiX29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfbG9vc2UiLCJfcmVhY3QiLCJfcm91dGVyIiwiX2Zvcm1hdFVybCIsIl9hZGRMb2NhbGUiLCJfcm91dGVyQ29udGV4dCIsIl9hcHBSb3V0ZXJDb250ZXh0IiwiX3VzZUludGVyc2VjdGlvbiIsIl9nZXREb21haW5Mb2NhbGUiLCJfYWRkQmFzZVBhdGgiLCJwcmVmZXRjaGVkIiwiU2V0IiwicHJlZmV0Y2giLCJyb3V0ZXIiLCJocmVmIiwiYXMiLCJvcHRpb25zIiwiaXNMb2NhbFVSTCIsImJ5cGFzc1ByZWZldGNoZWRDaGVjayIsImxvY2FsZSIsInVuZGVmaW5lZCIsInByZWZldGNoZWRLZXkiLCJoYXMiLCJhZGQiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNhdGNoIiwiZXJyIiwicHJvY2VzcyIsImlzTW9kaWZpZWRFdmVudCIsImV2ZW50IiwidGFyZ2V0IiwiY3VycmVudFRhcmdldCIsIm1ldGFLZXkiLCJjdHJsS2V5Iiwic2hpZnRLZXkiLCJhbHRLZXkiLCJuYXRpdmVFdmVudCIsIndoaWNoIiwibGlua0NsaWNrZWQiLCJlIiwicmVwbGFjZSIsInNoYWxsb3ciLCJzY3JvbGwiLCJpc0FwcFJvdXRlciIsInByZWZldGNoRW5hYmxlZCIsIm5vZGVOYW1lIiwiaXNBbmNob3JOb2RlTmFtZSIsInRvVXBwZXJDYXNlIiwicHJldmVudERlZmF1bHQiLCJuYXZpZ2F0ZSIsImZvcmNlT3B0aW1pc3RpY05hdmlnYXRpb24iLCJzdGFydFRyYW5zaXRpb24iLCJmb3JtYXRTdHJpbmdPclVybCIsInVybE9iak9yU3RyaW5nIiwiZm9ybWF0VXJsIiwiTGluayIsImZvcndhcmRSZWYiLCJMaW5rQ29tcG9uZW50IiwicHJvcHMiLCJmb3J3YXJkZWRSZWYiLCJjcmVhdGVQcm9wRXJyb3IiLCJhcmdzIiwiRXJyb3IiLCJrZXkiLCJleHBlY3RlZCIsImFjdHVhbCIsInJlcXVpcmVkUHJvcHNHdWFyZCIsInJlcXVpcmVkUHJvcHMiLCJrZXlzIiwiZm9yRWFjaCIsIl8iLCJvcHRpb25hbFByb3BzR3VhcmQiLCJwYXNzSHJlZiIsIm9uQ2xpY2siLCJvbk1vdXNlRW50ZXIiLCJvblRvdWNoU3RhcnQiLCJsZWdhY3lCZWhhdmlvciIsIm9wdGlvbmFsUHJvcHMiLCJ2YWxUeXBlIiwiaGFzV2FybmVkIiwidXNlUmVmIiwiY3VycmVudCIsImNvbnNvbGUiLCJ3YXJuIiwiY2hpbGRyZW4iLCJocmVmUHJvcCIsImFzUHJvcCIsImNoaWxkcmVuUHJvcCIsInByZWZldGNoUHJvcCIsIm9uTW91c2VFbnRlclByb3AiLCJvblRvdWNoU3RhcnRQcm9wIiwiQm9vbGVhbiIsImVudiIsIl9fTkVYVF9ORVdfTElOS19CRUhBVklPUiIsInJlc3RQcm9wcyIsImNyZWF0ZUVsZW1lbnQiLCJwYWdlc1JvdXRlciIsInVzZUNvbnRleHQiLCJSb3V0ZXJDb250ZXh0IiwiYXBwUm91dGVyIiwiQXBwUm91dGVyQ29udGV4dCIsInVzZU1lbW8iLCJyZXNvbHZlZEhyZWYiLCJyZXNvbHZlZEFzIiwicmVzb2x2ZUhyZWYiLCJwcmV2aW91c0hyZWYiLCJwcmV2aW91c0FzIiwiY2hpbGQiLCJDaGlsZHJlbiIsIm9ubHkiLCJyZWYiLCJ0eXBlIiwiY2hpbGRSZWYiLCJzZXRJbnRlcnNlY3Rpb25SZWYiLCJpc1Zpc2libGUiLCJyZXNldFZpc2libGUiLCJ1c2VJbnRlcnNlY3Rpb24iLCJyb290TWFyZ2luIiwic2V0UmVmIiwidXNlQ2FsbGJhY2siLCJlbCIsInVzZUVmZmVjdCIsImNoaWxkUHJvcHMiLCJkZWZhdWx0UHJldmVudGVkIiwicHJpb3JpdHkiLCJjdXJMb2NhbGUiLCJsb2NhbGVEb21haW4iLCJpc0xvY2FsZURvbWFpbiIsImdldERvbWFpbkxvY2FsZSIsImxvY2FsZXMiLCJkb21haW5Mb2NhbGVzIiwiYWRkQmFzZVBhdGgiLCJhZGRMb2NhbGUiLCJkZWZhdWx0TG9jYWxlIiwiY2xvbmVFbGVtZW50IiwiYXNzaWduIiwiX2RlZmF1bHQiLCJfX2VzTW9kdWxlIiwibW9kdWxlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/link.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/normalize-trailing-slash.js": -/*!*******************************************************************!*\ - !*** ./node_modules/next/dist/client/normalize-trailing-slash.js ***! - \*******************************************************************/ -/***/ ((module, exports, __webpack_require__) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.normalizePathTrailingSlash = void 0;\nvar _removeTrailingSlash = __webpack_require__(/*! ../shared/lib/router/utils/remove-trailing-slash */ \"../shared/lib/router/utils/remove-trailing-slash\");\nvar _parsePath = __webpack_require__(/*! ../shared/lib/router/utils/parse-path */ \"../shared/lib/router/utils/parse-path\");\nconst normalizePathTrailingSlash = (path)=>{\n if (!path.startsWith(\"/\")) {\n return path;\n }\n const { pathname , query , hash } = (0, _parsePath).parsePath(path);\n if (false) {}\n return `${(0, _removeTrailingSlash).removeTrailingSlash(pathname)}${query}${hash}`;\n};\nexports.normalizePathTrailingSlash = normalizePathTrailingSlash;\nif ((typeof exports.default === \"function\" || typeof exports.default === \"object\" && exports.default !== null) && typeof exports.default.__esModule === \"undefined\") {\n Object.defineProperty(exports.default, \"__esModule\", {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=normalize-trailing-slash.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9ub3JtYWxpemUtdHJhaWxpbmctc2xhc2guanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYkEsOENBQTZDO0lBQ3pDRyxPQUFPLElBQUk7QUFDZixDQUFDLEVBQUM7QUFDRkQsa0NBQWtDLEdBQUcsS0FBSztBQUMxQyxJQUFJRyx1QkFBdUJDLG1CQUFPQSxDQUFDLDBHQUFrRDtBQUNyRixJQUFJQyxhQUFhRCxtQkFBT0EsQ0FBQyxvRkFBdUM7QUFDaEUsTUFBTUYsNkJBQTZCLENBQUNJLE9BQU87SUFDdkMsSUFBSSxDQUFDQSxLQUFLQyxVQUFVLENBQUMsTUFBTTtRQUN2QixPQUFPRDtJQUNYLENBQUM7SUFDRCxNQUFNLEVBQUVFLFNBQVEsRUFBR0MsTUFBSyxFQUFHQyxLQUFJLEVBQUcsR0FBRyxDQUFDLEdBQUdMLFVBQVUsRUFBRU0sU0FBUyxDQUFDTDtJQUMvRCxJQUFJTSxLQUFpQyxFQUFFLEVBUXRDO0lBQ0QsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHVCxvQkFBb0IsRUFBRWEsbUJBQW1CLENBQUNSLFVBQVUsRUFBRUMsTUFBTSxFQUFFQyxLQUFLLENBQUM7QUFDdEY7QUFDQVYsa0NBQWtDLEdBQUdFO0FBRXJDLElBQUksQ0FBQyxPQUFPRixRQUFRa0IsT0FBTyxLQUFLLGNBQWUsT0FBT2xCLFFBQVFrQixPQUFPLEtBQUssWUFBWWxCLFFBQVFrQixPQUFPLEtBQUssSUFBSSxLQUFNLE9BQU9sQixRQUFRa0IsT0FBTyxDQUFDQyxVQUFVLEtBQUssYUFBYTtJQUNyS3JCLE9BQU9DLGNBQWMsQ0FBQ0MsUUFBUWtCLE9BQU8sRUFBRSxjQUFjO1FBQUVqQixPQUFPLElBQUk7SUFBQztJQUNuRUgsT0FBT3NCLE1BQU0sQ0FBQ3BCLFFBQVFrQixPQUFPLEVBQUVsQjtJQUMvQnFCLE9BQU9yQixPQUFPLEdBQUdBLFFBQVFrQixPQUFPO0FBQ2xDLENBQUMsQ0FFRCxvREFBb0QiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tY2dwb3J0Zm8vLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9ub3JtYWxpemUtdHJhaWxpbmctc2xhc2guanM/NGMyZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMubm9ybWFsaXplUGF0aFRyYWlsaW5nU2xhc2ggPSB2b2lkIDA7XG52YXIgX3JlbW92ZVRyYWlsaW5nU2xhc2ggPSByZXF1aXJlKFwiLi4vc2hhcmVkL2xpYi9yb3V0ZXIvdXRpbHMvcmVtb3ZlLXRyYWlsaW5nLXNsYXNoXCIpO1xudmFyIF9wYXJzZVBhdGggPSByZXF1aXJlKFwiLi4vc2hhcmVkL2xpYi9yb3V0ZXIvdXRpbHMvcGFyc2UtcGF0aFwiKTtcbmNvbnN0IG5vcm1hbGl6ZVBhdGhUcmFpbGluZ1NsYXNoID0gKHBhdGgpPT57XG4gICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgY29uc3QgeyBwYXRobmFtZSAsIHF1ZXJ5ICwgaGFzaCAgfSA9ICgwLCBfcGFyc2VQYXRoKS5wYXJzZVBhdGgocGF0aCk7XG4gICAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9UUkFJTElOR19TTEFTSCkge1xuICAgICAgICBpZiAoL1xcLlteL10rXFwvPyQvLnRlc3QocGF0aG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7KDAsIF9yZW1vdmVUcmFpbGluZ1NsYXNoKS5yZW1vdmVUcmFpbGluZ1NsYXNoKHBhdGhuYW1lKX0ke3F1ZXJ5fSR7aGFzaH1gO1xuICAgICAgICB9IGVsc2UgaWYgKHBhdGhuYW1lLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtwYXRobmFtZX0ke3F1ZXJ5fSR7aGFzaH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGAke3BhdGhuYW1lfS8ke3F1ZXJ5fSR7aGFzaH1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHsoMCwgX3JlbW92ZVRyYWlsaW5nU2xhc2gpLnJlbW92ZVRyYWlsaW5nU2xhc2gocGF0aG5hbWUpfSR7cXVlcnl9JHtoYXNofWA7XG59O1xuZXhwb3J0cy5ub3JtYWxpemVQYXRoVHJhaWxpbmdTbGFzaCA9IG5vcm1hbGl6ZVBhdGhUcmFpbGluZ1NsYXNoO1xuXG5pZiAoKHR5cGVvZiBleHBvcnRzLmRlZmF1bHQgPT09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiBleHBvcnRzLmRlZmF1bHQgPT09ICdvYmplY3QnICYmIGV4cG9ydHMuZGVmYXVsdCAhPT0gbnVsbCkpICYmIHR5cGVvZiBleHBvcnRzLmRlZmF1bHQuX19lc01vZHVsZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMuZGVmYXVsdCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuICBPYmplY3QuYXNzaWduKGV4cG9ydHMuZGVmYXVsdCwgZXhwb3J0cyk7XG4gIG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cy5kZWZhdWx0O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub3JtYWxpemUtdHJhaWxpbmctc2xhc2guanMubWFwIl0sIm5hbWVzIjpbIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZXhwb3J0cyIsInZhbHVlIiwibm9ybWFsaXplUGF0aFRyYWlsaW5nU2xhc2giLCJfcmVtb3ZlVHJhaWxpbmdTbGFzaCIsInJlcXVpcmUiLCJfcGFyc2VQYXRoIiwicGF0aCIsInN0YXJ0c1dpdGgiLCJwYXRobmFtZSIsInF1ZXJ5IiwiaGFzaCIsInBhcnNlUGF0aCIsInByb2Nlc3MiLCJlbnYiLCJfX05FWFRfVFJBSUxJTkdfU0xBU0giLCJ0ZXN0IiwicmVtb3ZlVHJhaWxpbmdTbGFzaCIsImVuZHNXaXRoIiwiZGVmYXVsdCIsIl9fZXNNb2R1bGUiLCJhc3NpZ24iLCJtb2R1bGUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/normalize-trailing-slash.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/remove-base-path.js": -/*!***********************************************************!*\ - !*** ./node_modules/next/dist/client/remove-base-path.js ***! - \***********************************************************/ -/***/ ((module, exports, __webpack_require__) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.removeBasePath = removeBasePath;\nvar _hasBasePath = __webpack_require__(/*! ./has-base-path */ \"./node_modules/next/dist/client/has-base-path.js\");\nconst basePath = false || \"\";\nfunction removeBasePath(path) {\n if (false) {}\n path = path.slice(basePath.length);\n if (!path.startsWith(\"/\")) path = `/${path}`;\n return path;\n}\nif ((typeof exports.default === \"function\" || typeof exports.default === \"object\" && exports.default !== null) && typeof exports.default.__esModule === \"undefined\") {\n Object.defineProperty(exports.default, \"__esModule\", {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=remove-base-path.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9yZW1vdmUtYmFzZS1wYXRoLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2JBLDhDQUE2QztJQUN6Q0csT0FBTyxJQUFJO0FBQ2YsQ0FBQyxFQUFDO0FBQ0ZELHNCQUFzQixHQUFHRTtBQUN6QixJQUFJQyxlQUFlQyxtQkFBT0EsQ0FBQyx5RUFBaUI7QUFDNUMsTUFBTUMsV0FBV0MsTUFBa0MsSUFBSTtBQUN2RCxTQUFTSixlQUFlTyxJQUFJLEVBQUU7SUFDMUIsSUFBSUgsS0FBMEMsRUFBRSxFQUkvQztJQUNERyxPQUFPQSxLQUFLRyxLQUFLLENBQUNQLFNBQVNRLE1BQU07SUFDakMsSUFBSSxDQUFDSixLQUFLSyxVQUFVLENBQUMsTUFBTUwsT0FBTyxDQUFDLENBQUMsRUFBRUEsS0FBSyxDQUFDO0lBQzVDLE9BQU9BO0FBQ1g7QUFFQSxJQUFJLENBQUMsT0FBT1QsUUFBUWUsT0FBTyxLQUFLLGNBQWUsT0FBT2YsUUFBUWUsT0FBTyxLQUFLLFlBQVlmLFFBQVFlLE9BQU8sS0FBSyxJQUFJLEtBQU0sT0FBT2YsUUFBUWUsT0FBTyxDQUFDQyxVQUFVLEtBQUssYUFBYTtJQUNyS2xCLE9BQU9DLGNBQWMsQ0FBQ0MsUUFBUWUsT0FBTyxFQUFFLGNBQWM7UUFBRWQsT0FBTyxJQUFJO0lBQUM7SUFDbkVILE9BQU9tQixNQUFNLENBQUNqQixRQUFRZSxPQUFPLEVBQUVmO0lBQy9Ca0IsT0FBT2xCLE9BQU8sR0FBR0EsUUFBUWUsT0FBTztBQUNsQyxDQUFDLENBRUQsNENBQTRDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWNncG9ydGZvLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9jbGllbnQvcmVtb3ZlLWJhc2UtcGF0aC5qcz9iNGYxIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5yZW1vdmVCYXNlUGF0aCA9IHJlbW92ZUJhc2VQYXRoO1xudmFyIF9oYXNCYXNlUGF0aCA9IHJlcXVpcmUoXCIuL2hhcy1iYXNlLXBhdGhcIik7XG5jb25zdCBiYXNlUGF0aCA9IHByb2Nlc3MuZW52Ll9fTkVYVF9ST1VURVJfQkFTRVBBVEggfHwgJyc7XG5mdW5jdGlvbiByZW1vdmVCYXNlUGF0aChwYXRoKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9NQU5VQUxfQ0xJRU5UX0JBU0VfUEFUSCkge1xuICAgICAgICBpZiAoISgwLCBfaGFzQmFzZVBhdGgpLmhhc0Jhc2VQYXRoKHBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYXRoID0gcGF0aC5zbGljZShiYXNlUGF0aC5sZW5ndGgpO1xuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCcvJykpIHBhdGggPSBgLyR7cGF0aH1gO1xuICAgIHJldHVybiBwYXRoO1xufVxuXG5pZiAoKHR5cGVvZiBleHBvcnRzLmRlZmF1bHQgPT09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiBleHBvcnRzLmRlZmF1bHQgPT09ICdvYmplY3QnICYmIGV4cG9ydHMuZGVmYXVsdCAhPT0gbnVsbCkpICYmIHR5cGVvZiBleHBvcnRzLmRlZmF1bHQuX19lc01vZHVsZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMuZGVmYXVsdCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuICBPYmplY3QuYXNzaWduKGV4cG9ydHMuZGVmYXVsdCwgZXhwb3J0cyk7XG4gIG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cy5kZWZhdWx0O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZW1vdmUtYmFzZS1wYXRoLmpzLm1hcCJdLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsInJlbW92ZUJhc2VQYXRoIiwiX2hhc0Jhc2VQYXRoIiwicmVxdWlyZSIsImJhc2VQYXRoIiwicHJvY2VzcyIsImVudiIsIl9fTkVYVF9ST1VURVJfQkFTRVBBVEgiLCJwYXRoIiwiX19ORVhUX01BTlVBTF9DTElFTlRfQkFTRV9QQVRIIiwiaGFzQmFzZVBhdGgiLCJzbGljZSIsImxlbmd0aCIsInN0YXJ0c1dpdGgiLCJkZWZhdWx0IiwiX19lc01vZHVsZSIsImFzc2lnbiIsIm1vZHVsZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/remove-base-path.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/remove-locale.js": -/*!********************************************************!*\ - !*** ./node_modules/next/dist/client/remove-locale.js ***! - \********************************************************/ -/***/ ((module, exports, __webpack_require__) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.removeLocale = removeLocale;\nvar _parsePath = __webpack_require__(/*! ../shared/lib/router/utils/parse-path */ \"../shared/lib/router/utils/parse-path\");\nfunction removeLocale(path, locale) {\n if (false) {}\n return path;\n}\nif ((typeof exports.default === \"function\" || typeof exports.default === \"object\" && exports.default !== null) && typeof exports.default.__esModule === \"undefined\") {\n Object.defineProperty(exports.default, \"__esModule\", {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=remove-locale.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9yZW1vdmUtbG9jYWxlLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2JBLDhDQUE2QztJQUN6Q0csT0FBTyxJQUFJO0FBQ2YsQ0FBQyxFQUFDO0FBQ0ZELG9CQUFvQixHQUFHRTtBQUN2QixJQUFJQyxhQUFhQyxtQkFBT0EsQ0FBQyxvRkFBdUM7QUFDaEUsU0FBU0YsYUFBYUcsSUFBSSxFQUFFQyxNQUFNLEVBQUU7SUFDaEMsSUFBSUMsS0FBK0IsRUFBRSxFQUtwQztJQUNELE9BQU9GO0FBQ1g7QUFFQSxJQUFJLENBQUMsT0FBT0wsUUFBUWtCLE9BQU8sS0FBSyxjQUFlLE9BQU9sQixRQUFRa0IsT0FBTyxLQUFLLFlBQVlsQixRQUFRa0IsT0FBTyxLQUFLLElBQUksS0FBTSxPQUFPbEIsUUFBUWtCLE9BQU8sQ0FBQ0MsVUFBVSxLQUFLLGFBQWE7SUFDcktyQixPQUFPQyxjQUFjLENBQUNDLFFBQVFrQixPQUFPLEVBQUUsY0FBYztRQUFFakIsT0FBTyxJQUFJO0lBQUM7SUFDbkVILE9BQU9zQixNQUFNLENBQUNwQixRQUFRa0IsT0FBTyxFQUFFbEI7SUFDL0JxQixPQUFPckIsT0FBTyxHQUFHQSxRQUFRa0IsT0FBTztBQUNsQyxDQUFDLENBRUQseUNBQXlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWNncG9ydGZvLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9jbGllbnQvcmVtb3ZlLWxvY2FsZS5qcz80NzUzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5yZW1vdmVMb2NhbGUgPSByZW1vdmVMb2NhbGU7XG52YXIgX3BhcnNlUGF0aCA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvbGliL3JvdXRlci91dGlscy9wYXJzZS1wYXRoXCIpO1xuZnVuY3Rpb24gcmVtb3ZlTG9jYWxlKHBhdGgsIGxvY2FsZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5fX05FWFRfSTE4Tl9TVVBQT1JUKSB7XG4gICAgICAgIGNvbnN0IHsgcGF0aG5hbWUgIH0gPSAoMCwgX3BhcnNlUGF0aCkucGFyc2VQYXRoKHBhdGgpO1xuICAgICAgICBjb25zdCBwYXRoTG93ZXIgPSBwYXRobmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBsb2NhbGVMb3dlciA9IGxvY2FsZSA9PSBudWxsID8gdm9pZCAwIDogbG9jYWxlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBsb2NhbGUgJiYgKHBhdGhMb3dlci5zdGFydHNXaXRoKGAvJHtsb2NhbGVMb3dlcn0vYCkgfHwgcGF0aExvd2VyID09PSBgLyR7bG9jYWxlTG93ZXJ9YCkgPyBgJHtwYXRobmFtZS5sZW5ndGggPT09IGxvY2FsZS5sZW5ndGggKyAxID8gYC9gIDogYGB9JHtwYXRoLnNsaWNlKGxvY2FsZS5sZW5ndGggKyAxKX1gIDogcGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59XG5cbmlmICgodHlwZW9mIGV4cG9ydHMuZGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJyB8fCAodHlwZW9mIGV4cG9ydHMuZGVmYXVsdCA9PT0gJ29iamVjdCcgJiYgZXhwb3J0cy5kZWZhdWx0ICE9PSBudWxsKSkgJiYgdHlwZW9mIGV4cG9ydHMuZGVmYXVsdC5fX2VzTW9kdWxlID09PSAndW5kZWZpbmVkJykge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cy5kZWZhdWx0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gIE9iamVjdC5hc3NpZ24oZXhwb3J0cy5kZWZhdWx0LCBleHBvcnRzKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzLmRlZmF1bHQ7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlbW92ZS1sb2NhbGUuanMubWFwIl0sIm5hbWVzIjpbIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZXhwb3J0cyIsInZhbHVlIiwicmVtb3ZlTG9jYWxlIiwiX3BhcnNlUGF0aCIsInJlcXVpcmUiLCJwYXRoIiwibG9jYWxlIiwicHJvY2VzcyIsImVudiIsIl9fTkVYVF9JMThOX1NVUFBPUlQiLCJwYXRobmFtZSIsInBhcnNlUGF0aCIsInBhdGhMb3dlciIsInRvTG93ZXJDYXNlIiwibG9jYWxlTG93ZXIiLCJzdGFydHNXaXRoIiwibGVuZ3RoIiwic2xpY2UiLCJkZWZhdWx0IiwiX19lc01vZHVsZSIsImFzc2lnbiIsIm1vZHVsZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/remove-locale.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/request-idle-callback.js": -/*!****************************************************************!*\ - !*** ./node_modules/next/dist/client/request-idle-callback.js ***! - \****************************************************************/ -/***/ ((module, exports) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.cancelIdleCallback = exports.requestIdleCallback = void 0;\nconst requestIdleCallback = typeof self !== \"undefined\" && self.requestIdleCallback && self.requestIdleCallback.bind(window) || function(cb) {\n let start = Date.now();\n return setTimeout(function() {\n cb({\n didTimeout: false,\n timeRemaining: function() {\n return Math.max(0, 50 - (Date.now() - start));\n }\n });\n }, 1);\n};\nexports.requestIdleCallback = requestIdleCallback;\nconst cancelIdleCallback = typeof self !== \"undefined\" && self.cancelIdleCallback && self.cancelIdleCallback.bind(window) || function(id) {\n return clearTimeout(id);\n};\nexports.cancelIdleCallback = cancelIdleCallback;\nif ((typeof exports.default === \"function\" || typeof exports.default === \"object\" && exports.default !== null) && typeof exports.default.__esModule === \"undefined\") {\n Object.defineProperty(exports.default, \"__esModule\", {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=request-idle-callback.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9yZXF1ZXN0LWlkbGUtY2FsbGJhY2suanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYkEsOENBQTZDO0lBQ3pDRyxPQUFPLElBQUk7QUFDZixDQUFDLEVBQUM7QUFDRkQsMEJBQTBCLEdBQUdBLDJCQUEyQixHQUFHLEtBQUs7QUFDaEUsTUFBTUcsc0JBQXNCLE9BQU9DLFNBQVMsZUFBZUEsS0FBS0QsbUJBQW1CLElBQUlDLEtBQUtELG1CQUFtQixDQUFDRSxJQUFJLENBQUNDLFdBQVcsU0FBU0MsRUFBRSxFQUFFO0lBQ3pJLElBQUlDLFFBQVFDLEtBQUtDLEdBQUc7SUFDcEIsT0FBT0MsV0FBVyxXQUFXO1FBQ3pCSixHQUFHO1lBQ0NLLFlBQVksS0FBSztZQUNqQkMsZUFBZSxXQUFXO2dCQUN0QixPQUFPQyxLQUFLQyxHQUFHLENBQUMsR0FBRyxLQUFNTixDQUFBQSxLQUFLQyxHQUFHLEtBQUtGLEtBQUk7WUFDOUM7UUFDSjtJQUNKLEdBQUc7QUFDUDtBQUNBUiwyQkFBMkIsR0FBR0c7QUFDOUIsTUFBTUQscUJBQXFCLE9BQU9FLFNBQVMsZUFBZUEsS0FBS0Ysa0JBQWtCLElBQUlFLEtBQUtGLGtCQUFrQixDQUFDRyxJQUFJLENBQUNDLFdBQVcsU0FBU1UsRUFBRSxFQUFFO0lBQ3RJLE9BQU9DLGFBQWFEO0FBQ3hCO0FBQ0FoQiwwQkFBMEIsR0FBR0U7QUFFN0IsSUFBSSxDQUFDLE9BQU9GLFFBQVFrQixPQUFPLEtBQUssY0FBZSxPQUFPbEIsUUFBUWtCLE9BQU8sS0FBSyxZQUFZbEIsUUFBUWtCLE9BQU8sS0FBSyxJQUFJLEtBQU0sT0FBT2xCLFFBQVFrQixPQUFPLENBQUNDLFVBQVUsS0FBSyxhQUFhO0lBQ3JLckIsT0FBT0MsY0FBYyxDQUFDQyxRQUFRa0IsT0FBTyxFQUFFLGNBQWM7UUFBRWpCLE9BQU8sSUFBSTtJQUFDO0lBQ25FSCxPQUFPc0IsTUFBTSxDQUFDcEIsUUFBUWtCLE9BQU8sRUFBRWxCO0lBQy9CcUIsT0FBT3JCLE9BQU8sR0FBR0EsUUFBUWtCLE9BQU87QUFDbEMsQ0FBQyxDQUVELGlEQUFpRCIsInNvdXJjZXMiOlsid2VicGFjazovL21jZ3BvcnRmby8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L3JlcXVlc3QtaWRsZS1jYWxsYmFjay5qcz8xZTIwIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jYW5jZWxJZGxlQ2FsbGJhY2sgPSBleHBvcnRzLnJlcXVlc3RJZGxlQ2FsbGJhY2sgPSB2b2lkIDA7XG5jb25zdCByZXF1ZXN0SWRsZUNhbGxiYWNrID0gdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjayAmJiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2suYmluZCh3aW5kb3cpIHx8IGZ1bmN0aW9uKGNiKSB7XG4gICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgY2Ioe1xuICAgICAgICAgICAgZGlkVGltZW91dDogZmFsc2UsXG4gICAgICAgICAgICB0aW1lUmVtYWluaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgNTAgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sIDEpO1xufTtcbmV4cG9ydHMucmVxdWVzdElkbGVDYWxsYmFjayA9IHJlcXVlc3RJZGxlQ2FsbGJhY2s7XG5jb25zdCBjYW5jZWxJZGxlQ2FsbGJhY2sgPSB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5jYW5jZWxJZGxlQ2FsbGJhY2sgJiYgc2VsZi5jYW5jZWxJZGxlQ2FsbGJhY2suYmluZCh3aW5kb3cpIHx8IGZ1bmN0aW9uKGlkKSB7XG4gICAgcmV0dXJuIGNsZWFyVGltZW91dChpZCk7XG59O1xuZXhwb3J0cy5jYW5jZWxJZGxlQ2FsbGJhY2sgPSBjYW5jZWxJZGxlQ2FsbGJhY2s7XG5cbmlmICgodHlwZW9mIGV4cG9ydHMuZGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJyB8fCAodHlwZW9mIGV4cG9ydHMuZGVmYXVsdCA9PT0gJ29iamVjdCcgJiYgZXhwb3J0cy5kZWZhdWx0ICE9PSBudWxsKSkgJiYgdHlwZW9mIGV4cG9ydHMuZGVmYXVsdC5fX2VzTW9kdWxlID09PSAndW5kZWZpbmVkJykge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cy5kZWZhdWx0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gIE9iamVjdC5hc3NpZ24oZXhwb3J0cy5kZWZhdWx0LCBleHBvcnRzKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzLmRlZmF1bHQ7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlcXVlc3QtaWRsZS1jYWxsYmFjay5qcy5tYXAiXSwibmFtZXMiOlsiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJleHBvcnRzIiwidmFsdWUiLCJjYW5jZWxJZGxlQ2FsbGJhY2siLCJyZXF1ZXN0SWRsZUNhbGxiYWNrIiwic2VsZiIsImJpbmQiLCJ3aW5kb3ciLCJjYiIsInN0YXJ0IiwiRGF0ZSIsIm5vdyIsInNldFRpbWVvdXQiLCJkaWRUaW1lb3V0IiwidGltZVJlbWFpbmluZyIsIk1hdGgiLCJtYXgiLCJpZCIsImNsZWFyVGltZW91dCIsImRlZmF1bHQiLCJfX2VzTW9kdWxlIiwiYXNzaWduIiwibW9kdWxlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/request-idle-callback.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/route-loader.js": -/*!*******************************************************!*\ - !*** ./node_modules/next/dist/client/route-loader.js ***! - \*******************************************************/ -/***/ ((module, exports, __webpack_require__) => { - -"use strict"; -eval("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.markAssetError = markAssetError;\nexports.isAssetError = isAssetError;\nexports.getClientBuildManifest = getClientBuildManifest;\nexports.createRouteLoader = createRouteLoader;\nvar _interop_require_default = (__webpack_require__(/*! @swc/helpers/lib/_interop_require_default.js */ \"./node_modules/@swc/helpers/lib/_interop_require_default.js\")[\"default\"]);\nvar _getAssetPathFromRoute = _interop_require_default(__webpack_require__(/*! ../shared/lib/router/utils/get-asset-path-from-route */ \"../shared/lib/router/utils/get-asset-path-from-route\"));\nvar _trustedTypes = __webpack_require__(/*! ./trusted-types */ \"./node_modules/next/dist/client/trusted-types.js\");\nvar _requestIdleCallback = __webpack_require__(/*! ./request-idle-callback */ \"./node_modules/next/dist/client/request-idle-callback.js\");\n// 3.8s was arbitrarily chosen as it's what https://web.dev/interactive\n// considers as \"Good\" time-to-interactive. We must assume something went\n// wrong beyond this point, and then fall-back to a full page transition to\n// show the user something of value.\nconst MS_MAX_IDLE_DELAY = 3800;\nfunction withFuture(key, map, generator) {\n let entry = map.get(key);\n if (entry) {\n if (\"future\" in entry) {\n return entry.future;\n }\n return Promise.resolve(entry);\n }\n let resolver;\n const prom = new Promise((resolve)=>{\n resolver = resolve;\n });\n map.set(key, entry = {\n resolve: resolver,\n future: prom\n });\n return generator ? generator() // eslint-disable-next-line no-sequences\n .then((value)=>(resolver(value), value)).catch((err)=>{\n map.delete(key);\n throw err;\n }) : prom;\n}\nconst ASSET_LOAD_ERROR = Symbol(\"ASSET_LOAD_ERROR\");\nfunction markAssetError(err) {\n return Object.defineProperty(err, ASSET_LOAD_ERROR, {});\n}\nfunction isAssetError(err) {\n return err && ASSET_LOAD_ERROR in err;\n}\nfunction hasPrefetch(link) {\n try {\n link = document.createElement(\"link\");\n return(// with relList.support\n !!window.MSInputMethodContext && !!document.documentMode || link.relList.supports(\"prefetch\"));\n } catch (e) {\n return false;\n }\n}\nconst canPrefetch = hasPrefetch();\nfunction prefetchViaDom(href, as, link) {\n return new Promise((resolve, reject)=>{\n const selector = `\n link[rel=\"prefetch\"][href^=\"${href}\"],\n link[rel=\"preload\"][href^=\"${href}\"],\n script[src^=\"${href}\"]`;\n if (document.querySelector(selector)) {\n return resolve();\n }\n link = document.createElement(\"link\");\n // The order of property assignment here is intentional:\n if (as) link.as = as;\n link.rel = `prefetch`;\n link.crossOrigin = undefined;\n link.onload = resolve;\n link.onerror = ()=>reject(markAssetError(new Error(`Failed to prefetch: ${href}`)));\n // `href` should always be last:\n link.href = href;\n document.head.appendChild(link);\n });\n}\nfunction appendScript(src, script) {\n return new Promise((resolve, reject)=>{\n script = document.createElement(\"script\");\n // The order of property assignment here is intentional.\n // 1. Setup success/failure hooks in case the browser synchronously\n // executes when `src` is set.\n script.onload = resolve;\n script.onerror = ()=>reject(markAssetError(new Error(`Failed to load script: ${src}`)));\n // 2. Configure the cross-origin attribute before setting `src` in case the\n // browser begins to fetch.\n script.crossOrigin = undefined;\n // 3. Finally, set the source and inject into the DOM in case the child\n // must be appended for fetching to start.\n script.src = src;\n document.body.appendChild(script);\n });\n}\n// We wait for pages to be built in dev before we start the route transition\n// timeout to prevent an un-necessary hard navigation in development.\nlet devBuildPromise;\n// Resolve a promise that times out after given amount of milliseconds.\nfunction resolvePromiseWithTimeout(p, ms, err) {\n return new Promise((resolve, reject)=>{\n let cancelled = false;\n p.then((r)=>{\n // Resolved, cancel the timeout\n cancelled = true;\n resolve(r);\n }).catch(reject);\n // We wrap these checks separately for better dead-code elimination in\n // production bundles.\n if (true) {\n (devBuildPromise || Promise.resolve()).then(()=>{\n (0, _requestIdleCallback).requestIdleCallback(()=>setTimeout(()=>{\n if (!cancelled) {\n reject(err);\n }\n }, ms));\n });\n }\n if (false) {}\n });\n}\nfunction getClientBuildManifest() {\n if (self.__BUILD_MANIFEST) {\n return Promise.resolve(self.__BUILD_MANIFEST);\n }\n const onBuildManifest = new Promise((resolve)=>{\n // Mandatory because this is not concurrent safe:\n const cb = self.__BUILD_MANIFEST_CB;\n self.__BUILD_MANIFEST_CB = ()=>{\n resolve(self.__BUILD_MANIFEST);\n cb && cb();\n };\n });\n return resolvePromiseWithTimeout(onBuildManifest, MS_MAX_IDLE_DELAY, markAssetError(new Error(\"Failed to load client build manifest\")));\n}\nfunction getFilesForRoute(assetPrefix, route) {\n if (true) {\n const scriptUrl = assetPrefix + \"/_next/static/chunks/pages\" + encodeURI((0, _getAssetPathFromRoute).default(route, \".js\"));\n return Promise.resolve({\n scripts: [\n (0, _trustedTypes).__unsafeCreateTrustedScriptURL(scriptUrl)\n ],\n // Styles are handled by `style-loader` in development:\n css: []\n });\n }\n return getClientBuildManifest().then((manifest)=>{\n if (!(route in manifest)) {\n throw markAssetError(new Error(`Failed to lookup route: ${route}`));\n }\n const allFiles = manifest[route].map((entry)=>assetPrefix + \"/_next/\" + encodeURI(entry));\n return {\n scripts: allFiles.filter((v)=>v.endsWith(\".js\")).map((v)=>(0, _trustedTypes).__unsafeCreateTrustedScriptURL(v)),\n css: allFiles.filter((v)=>v.endsWith(\".css\"))\n };\n });\n}\nfunction createRouteLoader(assetPrefix) {\n const entrypoints = new Map();\n const loadedScripts = new Map();\n const styleSheets = new Map();\n const routes = new Map();\n function maybeExecuteScript(src) {\n // With HMR we might need to \"reload\" scripts when they are\n // disposed and readded. Executing scripts twice has no functional\n // differences\n if (false) {} else {\n return appendScript(src);\n }\n }\n function fetchStyleSheet(href) {\n let prom = styleSheets.get(href);\n if (prom) {\n return prom;\n }\n styleSheets.set(href, prom = fetch(href).then((res)=>{\n if (!res.ok) {\n throw new Error(`Failed to load stylesheet: ${href}`);\n }\n return res.text().then((text)=>({\n href: href,\n content: text\n }));\n }).catch((err)=>{\n throw markAssetError(err);\n }));\n return prom;\n }\n return {\n whenEntrypoint (route) {\n return withFuture(route, entrypoints);\n },\n onEntrypoint (route, execute) {\n (execute ? Promise.resolve().then(()=>execute()).then((exports1)=>({\n component: exports1 && exports1.default || exports1,\n exports: exports1\n }), (err)=>({\n error: err\n })) : Promise.resolve(undefined)).then((input)=>{\n const old = entrypoints.get(route);\n if (old && \"resolve\" in old) {\n if (input) {\n entrypoints.set(route, input);\n old.resolve(input);\n }\n } else {\n if (input) {\n entrypoints.set(route, input);\n } else {\n entrypoints.delete(route);\n }\n // when this entrypoint has been resolved before\n // the route is outdated and we want to invalidate\n // this cache entry\n routes.delete(route);\n }\n });\n },\n loadRoute (route, prefetch) {\n return withFuture(route, routes, ()=>{\n let devBuildPromiseResolve;\n if (true) {\n devBuildPromise = new Promise((resolve)=>{\n devBuildPromiseResolve = resolve;\n });\n }\n return resolvePromiseWithTimeout(getFilesForRoute(assetPrefix, route).then(({ scripts , css })=>{\n return Promise.all([\n entrypoints.has(route) ? [] : Promise.all(scripts.map(maybeExecuteScript)),\n Promise.all(css.map(fetchStyleSheet))\n ]);\n }).then((res)=>{\n return this.whenEntrypoint(route).then((entrypoint)=>({\n entrypoint,\n styles: res[1]\n }));\n }), MS_MAX_IDLE_DELAY, markAssetError(new Error(`Route did not complete loading: ${route}`))).then(({ entrypoint , styles })=>{\n const res = Object.assign({\n styles: styles\n }, entrypoint);\n return \"error\" in entrypoint ? entrypoint : res;\n }).catch((err)=>{\n if (prefetch) {\n // we don't want to cache errors during prefetch\n throw err;\n }\n return {\n error: err\n };\n }).finally(()=>{\n return devBuildPromiseResolve == null ? void 0 : devBuildPromiseResolve();\n });\n });\n },\n prefetch (route) {\n // https://github.com/GoogleChromeLabs/quicklink/blob/453a661fa1fa940e2d2e044452398e38c67a98fb/src/index.mjs#L115-L118\n // License: Apache 2.0\n let cn;\n if (cn = navigator.connection) {\n // Don't prefetch if using 2G or if Save-Data is enabled.\n if (cn.saveData || /2g/.test(cn.effectiveType)) return Promise.resolve();\n }\n return getFilesForRoute(assetPrefix, route).then((output)=>Promise.all(canPrefetch ? output.scripts.map((script)=>prefetchViaDom(script.toString(), \"script\")) : [])).then(()=>{\n (0, _requestIdleCallback).requestIdleCallback(()=>this.loadRoute(route, true).catch(()=>{}));\n }).catch(()=>{});\n }\n };\n}\nif ((typeof exports.default === \"function\" || typeof exports.default === \"object\" && exports.default !== null) && typeof exports.default.__esModule === \"undefined\") {\n Object.defineProperty(exports.default, \"__esModule\", {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=route-loader.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9yb3V0ZS1sb2FkZXIuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYkEsOENBQTZDO0lBQ3pDRyxPQUFPLElBQUk7QUFDZixDQUFDLEVBQUM7QUFDRkQsc0JBQXNCLEdBQUdFO0FBQ3pCRixvQkFBb0IsR0FBR0c7QUFDdkJILDhCQUE4QixHQUFHSTtBQUNqQ0oseUJBQXlCLEdBQUdLO0FBQzVCLElBQUlDLDJCQUEyQkMsbUpBQStEO0FBQzlGLElBQUlFLHlCQUF5QkgseUJBQXlCQyxtQkFBT0EsQ0FBQyxrSEFBc0Q7QUFDcEgsSUFBSUcsZ0JBQWdCSCxtQkFBT0EsQ0FBQyx5RUFBaUI7QUFDN0MsSUFBSUksdUJBQXVCSixtQkFBT0EsQ0FBQyx5RkFBeUI7QUFDNUQsdUVBQXVFO0FBQ3ZFLHlFQUF5RTtBQUN6RSwyRUFBMkU7QUFDM0Usb0NBQW9DO0FBQ3BDLE1BQU1LLG9CQUFvQjtBQUMxQixTQUFTQyxXQUFXQyxHQUFHLEVBQUVDLEdBQUcsRUFBRUMsU0FBUyxFQUFFO0lBQ3JDLElBQUlDLFFBQVFGLElBQUlHLEdBQUcsQ0FBQ0o7SUFDcEIsSUFBSUcsT0FBTztRQUNQLElBQUksWUFBWUEsT0FBTztZQUNuQixPQUFPQSxNQUFNRSxNQUFNO1FBQ3ZCLENBQUM7UUFDRCxPQUFPQyxRQUFRQyxPQUFPLENBQUNKO0lBQzNCLENBQUM7SUFDRCxJQUFJSztJQUNKLE1BQU1DLE9BQU8sSUFBSUgsUUFBUSxDQUFDQyxVQUFVO1FBQ2hDQyxXQUFXRDtJQUNmO0lBQ0FOLElBQUlTLEdBQUcsQ0FBQ1YsS0FBS0csUUFBUTtRQUNqQkksU0FBU0M7UUFDVEgsUUFBUUk7SUFDWjtJQUNBLE9BQU9QLFlBQVlBLFlBQVcsd0NBQXdDO0tBQ3JFUyxJQUFJLENBQUMsQ0FBQ3hCLFFBQVNxQixDQUFBQSxTQUFTckIsUUFBUUEsS0FBSyxHQUFHeUIsS0FBSyxDQUFDLENBQUNDLE1BQU07UUFDbERaLElBQUlhLE1BQU0sQ0FBQ2Q7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Q0FBd0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tY2dwb3J0Zm8vLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9yb3V0ZS1sb2FkZXIuanM/ZWEzNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMubWFya0Fzc2V0RXJyb3IgPSBtYXJrQXNzZXRFcnJvcjtcbmV4cG9ydHMuaXNBc3NldEVycm9yID0gaXNBc3NldEVycm9yO1xuZXhwb3J0cy5nZXRDbGllbnRCdWlsZE1hbmlmZXN0ID0gZ2V0Q2xpZW50QnVpbGRNYW5pZmVzdDtcbmV4cG9ydHMuY3JlYXRlUm91dGVMb2FkZXIgPSBjcmVhdGVSb3V0ZUxvYWRlcjtcbnZhciBfaW50ZXJvcF9yZXF1aXJlX2RlZmF1bHQgPSByZXF1aXJlKFwiQHN3Yy9oZWxwZXJzL2xpYi9faW50ZXJvcF9yZXF1aXJlX2RlZmF1bHQuanNcIikuZGVmYXVsdDtcbnZhciBfZ2V0QXNzZXRQYXRoRnJvbVJvdXRlID0gX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0KHJlcXVpcmUoXCIuLi9zaGFyZWQvbGliL3JvdXRlci91dGlscy9nZXQtYXNzZXQtcGF0aC1mcm9tLXJvdXRlXCIpKTtcbnZhciBfdHJ1c3RlZFR5cGVzID0gcmVxdWlyZShcIi4vdHJ1c3RlZC10eXBlc1wiKTtcbnZhciBfcmVxdWVzdElkbGVDYWxsYmFjayA9IHJlcXVpcmUoXCIuL3JlcXVlc3QtaWRsZS1jYWxsYmFja1wiKTtcbi8vIDMuOHMgd2FzIGFyYml0cmFyaWx5IGNob3NlbiBhcyBpdCdzIHdoYXQgaHR0cHM6Ly93ZWIuZGV2L2ludGVyYWN0aXZlXG4vLyBjb25zaWRlcnMgYXMgXCJHb29kXCIgdGltZS10by1pbnRlcmFjdGl2ZS4gV2UgbXVzdCBhc3N1bWUgc29tZXRoaW5nIHdlbnRcbi8vIHdyb25nIGJleW9uZCB0aGlzIHBvaW50LCBhbmQgdGhlbiBmYWxsLWJhY2sgdG8gYSBmdWxsIHBhZ2UgdHJhbnNpdGlvbiB0b1xuLy8gc2hvdyB0aGUgdXNlciBzb21ldGhpbmcgb2YgdmFsdWUuXG5jb25zdCBNU19NQVhfSURMRV9ERUxBWSA9IDM4MDA7XG5mdW5jdGlvbiB3aXRoRnV0dXJlKGtleSwgbWFwLCBnZW5lcmF0b3IpIHtcbiAgICBsZXQgZW50cnkgPSBtYXAuZ2V0KGtleSk7XG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGlmICgnZnV0dXJlJyBpbiBlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmZ1dHVyZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudHJ5KTtcbiAgICB9XG4gICAgbGV0IHJlc29sdmVyO1xuICAgIGNvbnN0IHByb20gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PntcbiAgICAgICAgcmVzb2x2ZXIgPSByZXNvbHZlO1xuICAgIH0pO1xuICAgIG1hcC5zZXQoa2V5LCBlbnRyeSA9IHtcbiAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZXIsXG4gICAgICAgIGZ1dHVyZTogcHJvbVxuICAgIH0pO1xuICAgIHJldHVybiBnZW5lcmF0b3IgPyBnZW5lcmF0b3IoKS8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZXF1ZW5jZXNcbiAgICAudGhlbigodmFsdWUpPT4ocmVzb2x2ZXIodmFsdWUpLCB2YWx1ZSkpLmNhdGNoKChlcnIpPT57XG4gICAgICAgIG1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH0pIDogcHJvbTtcbn1cbmNvbnN0IEFTU0VUX0xPQURfRVJST1IgPSBTeW1ib2woJ0FTU0VUX0xPQURfRVJST1InKTtcbmZ1bmN0aW9uIG1hcmtBc3NldEVycm9yKGVycikge1xuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyLCBBU1NFVF9MT0FEX0VSUk9SLCB7fSk7XG59XG5mdW5jdGlvbiBpc0Fzc2V0RXJyb3IoZXJyKSB7XG4gICAgcmV0dXJuIGVyciAmJiBBU1NFVF9MT0FEX0VSUk9SIGluIGVycjtcbn1cbmZ1bmN0aW9uIGhhc1ByZWZldGNoKGxpbmspIHtcbiAgICB0cnkge1xuICAgICAgICBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICByZXR1cm4oLy8gZGV0ZWN0IElFMTEgc2luY2UgaXQgc3VwcG9ydHMgcHJlZmV0Y2ggYnV0IGlzbid0IGRldGVjdGVkXG4gICAgICAgIC8vIHdpdGggcmVsTGlzdC5zdXBwb3J0XG4gICAgICAgICghIXdpbmRvdy5NU0lucHV0TWV0aG9kQ29udGV4dCAmJiAhIWRvY3VtZW50LmRvY3VtZW50TW9kZSkgfHwgbGluay5yZWxMaXN0LnN1cHBvcnRzKCdwcmVmZXRjaCcpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5jb25zdCBjYW5QcmVmZXRjaCA9IGhhc1ByZWZldGNoKCk7XG5mdW5jdGlvbiBwcmVmZXRjaFZpYURvbShocmVmLCBhcywgbGluaykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+e1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9IGBcbiAgICAgIGxpbmtbcmVsPVwicHJlZmV0Y2hcIl1baHJlZl49XCIke2hyZWZ9XCJdLFxuICAgICAgbGlua1tyZWw9XCJwcmVsb2FkXCJdW2hyZWZePVwiJHtocmVmfVwiXSxcbiAgICAgIHNjcmlwdFtzcmNePVwiJHtocmVmfVwiXWA7XG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAvLyBUaGUgb3JkZXIgb2YgcHJvcGVydHkgYXNzaWdubWVudCBoZXJlIGlzIGludGVudGlvbmFsOlxuICAgICAgICBpZiAoYXMpIGxpbmsuYXMgPSBhcztcbiAgICAgICAgbGluay5yZWwgPSBgcHJlZmV0Y2hgO1xuICAgICAgICBsaW5rLmNyb3NzT3JpZ2luID0gcHJvY2Vzcy5lbnYuX19ORVhUX0NST1NTX09SSUdJTjtcbiAgICAgICAgbGluay5vbmxvYWQgPSByZXNvbHZlO1xuICAgICAgICBsaW5rLm9uZXJyb3IgPSAoKT0+cmVqZWN0KG1hcmtBc3NldEVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIHByZWZldGNoOiAke2hyZWZ9YCkpKTtcbiAgICAgICAgLy8gYGhyZWZgIHNob3VsZCBhbHdheXMgYmUgbGFzdDpcbiAgICAgICAgbGluay5ocmVmID0gaHJlZjtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGFwcGVuZFNjcmlwdChzcmMsIHNjcmlwdCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+e1xuICAgICAgICBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgLy8gVGhlIG9yZGVyIG9mIHByb3BlcnR5IGFzc2lnbm1lbnQgaGVyZSBpcyBpbnRlbnRpb25hbC5cbiAgICAgICAgLy8gMS4gU2V0dXAgc3VjY2Vzcy9mYWlsdXJlIGhvb2tzIGluIGNhc2UgdGhlIGJyb3dzZXIgc3luY2hyb25vdXNseVxuICAgICAgICAvLyAgICBleGVjdXRlcyB3aGVuIGBzcmNgIGlzIHNldC5cbiAgICAgICAgc2NyaXB0Lm9ubG9hZCA9IHJlc29sdmU7XG4gICAgICAgIHNjcmlwdC5vbmVycm9yID0gKCk9PnJlamVjdChtYXJrQXNzZXRFcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHNjcmlwdDogJHtzcmN9YCkpKTtcbiAgICAgICAgLy8gMi4gQ29uZmlndXJlIHRoZSBjcm9zcy1vcmlnaW4gYXR0cmlidXRlIGJlZm9yZSBzZXR0aW5nIGBzcmNgIGluIGNhc2UgdGhlXG4gICAgICAgIC8vICAgIGJyb3dzZXIgYmVnaW5zIHRvIGZldGNoLlxuICAgICAgICBzY3JpcHQuY3Jvc3NPcmlnaW4gPSBwcm9jZXNzLmVudi5fX05FWFRfQ1JPU1NfT1JJR0lOO1xuICAgICAgICAvLyAzLiBGaW5hbGx5LCBzZXQgdGhlIHNvdXJjZSBhbmQgaW5qZWN0IGludG8gdGhlIERPTSBpbiBjYXNlIHRoZSBjaGlsZFxuICAgICAgICAvLyAgICBtdXN0IGJlIGFwcGVuZGVkIGZvciBmZXRjaGluZyB0byBzdGFydC5cbiAgICAgICAgc2NyaXB0LnNyYyA9IHNyYztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgIH0pO1xufVxuLy8gV2Ugd2FpdCBmb3IgcGFnZXMgdG8gYmUgYnVpbHQgaW4gZGV2IGJlZm9yZSB3ZSBzdGFydCB0aGUgcm91dGUgdHJhbnNpdGlvblxuLy8gdGltZW91dCB0byBwcmV2ZW50IGFuIHVuLW5lY2Vzc2FyeSBoYXJkIG5hdmlnYXRpb24gaW4gZGV2ZWxvcG1lbnQuXG5sZXQgZGV2QnVpbGRQcm9taXNlO1xuLy8gUmVzb2x2ZSBhIHByb21pc2UgdGhhdCB0aW1lcyBvdXQgYWZ0ZXIgZ2l2ZW4gYW1vdW50IG9mIG1pbGxpc2Vjb25kcy5cbmZ1bmN0aW9uIHJlc29sdmVQcm9taXNlV2l0aFRpbWVvdXQocCwgbXMsIGVycikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+e1xuICAgICAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICAgIHAudGhlbigocik9PntcbiAgICAgICAgICAgIC8vIFJlc29sdmVkLCBjYW5jZWwgdGhlIHRpbWVvdXRcbiAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICByZXNvbHZlKHIpO1xuICAgICAgICB9KS5jYXRjaChyZWplY3QpO1xuICAgICAgICAvLyBXZSB3cmFwIHRoZXNlIGNoZWNrcyBzZXBhcmF0ZWx5IGZvciBiZXR0ZXIgZGVhZC1jb2RlIGVsaW1pbmF0aW9uIGluXG4gICAgICAgIC8vIHByb2R1Y3Rpb24gYnVuZGxlcy5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgICAgICAoZGV2QnVpbGRQcm9taXNlIHx8IFByb21pc2UucmVzb2x2ZSgpKS50aGVuKCgpPT57XG4gICAgICAgICAgICAgICAgKDAsIF9yZXF1ZXN0SWRsZUNhbGxiYWNrKS5yZXF1ZXN0SWRsZUNhbGxiYWNrKCgpPT5zZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCBtcykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgICAgICAoMCwgX3JlcXVlc3RJZGxlQ2FsbGJhY2spLnJlcXVlc3RJZGxlQ2FsbGJhY2soKCk9PnNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgbXMpKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0Q2xpZW50QnVpbGRNYW5pZmVzdCgpIHtcbiAgICBpZiAoc2VsZi5fX0JVSUxEX01BTklGRVNUKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc2VsZi5fX0JVSUxEX01BTklGRVNUKTtcbiAgICB9XG4gICAgY29uc3Qgb25CdWlsZE1hbmlmZXN0ID0gbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgIC8vIE1hbmRhdG9yeSBiZWNhdXNlIHRoaXMgaXMgbm90IGNvbmN1cnJlbnQgc2FmZTpcbiAgICAgICAgY29uc3QgY2IgPSBzZWxmLl9fQlVJTERfTUFOSUZFU1RfQ0I7XG4gICAgICAgIHNlbGYuX19CVUlMRF9NQU5JRkVTVF9DQiA9ICgpPT57XG4gICAgICAgICAgICByZXNvbHZlKHNlbGYuX19CVUlMRF9NQU5JRkVTVCk7XG4gICAgICAgICAgICBjYiAmJiBjYigpO1xuICAgICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiByZXNvbHZlUHJvbWlzZVdpdGhUaW1lb3V0KG9uQnVpbGRNYW5pZmVzdCwgTVNfTUFYX0lETEVfREVMQVksIG1hcmtBc3NldEVycm9yKG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgY2xpZW50IGJ1aWxkIG1hbmlmZXN0JykpKTtcbn1cbmZ1bmN0aW9uIGdldEZpbGVzRm9yUm91dGUoYXNzZXRQcmVmaXgsIHJvdXRlKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIGNvbnN0IHNjcmlwdFVybCA9IGFzc2V0UHJlZml4ICsgJy9fbmV4dC9zdGF0aWMvY2h1bmtzL3BhZ2VzJyArIGVuY29kZVVSSSgoMCwgX2dldEFzc2V0UGF0aEZyb21Sb3V0ZSkuZGVmYXVsdChyb3V0ZSwgJy5qcycpKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICBzY3JpcHRzOiBbXG4gICAgICAgICAgICAgICAgKDAsIF90cnVzdGVkVHlwZXMpLl9fdW5zYWZlQ3JlYXRlVHJ1c3RlZFNjcmlwdFVSTChzY3JpcHRVcmwpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgLy8gU3R5bGVzIGFyZSBoYW5kbGVkIGJ5IGBzdHlsZS1sb2FkZXJgIGluIGRldmVsb3BtZW50OlxuICAgICAgICAgICAgY3NzOiBbXVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGdldENsaWVudEJ1aWxkTWFuaWZlc3QoKS50aGVuKChtYW5pZmVzdCk9PntcbiAgICAgICAgaWYgKCEocm91dGUgaW4gbWFuaWZlc3QpKSB7XG4gICAgICAgICAgICB0aHJvdyBtYXJrQXNzZXRFcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byBsb29rdXAgcm91dGU6ICR7cm91dGV9YCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFsbEZpbGVzID0gbWFuaWZlc3Rbcm91dGVdLm1hcCgoZW50cnkpPT5hc3NldFByZWZpeCArICcvX25leHQvJyArIGVuY29kZVVSSShlbnRyeSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2NyaXB0czogYWxsRmlsZXMuZmlsdGVyKCh2KT0+di5lbmRzV2l0aCgnLmpzJykpLm1hcCgodik9PigwLCBfdHJ1c3RlZFR5cGVzKS5fX3Vuc2FmZUNyZWF0ZVRydXN0ZWRTY3JpcHRVUkwodikpLFxuICAgICAgICAgICAgY3NzOiBhbGxGaWxlcy5maWx0ZXIoKHYpPT52LmVuZHNXaXRoKCcuY3NzJykpXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVSb3V0ZUxvYWRlcihhc3NldFByZWZpeCkge1xuICAgIGNvbnN0IGVudHJ5cG9pbnRzID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGxvYWRlZFNjcmlwdHMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3Qgc3R5bGVTaGVldHMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3Qgcm91dGVzID0gbmV3IE1hcCgpO1xuICAgIGZ1bmN0aW9uIG1heWJlRXhlY3V0ZVNjcmlwdChzcmMpIHtcbiAgICAgICAgLy8gV2l0aCBITVIgd2UgbWlnaHQgbmVlZCB0byBcInJlbG9hZFwiIHNjcmlwdHMgd2hlbiB0aGV5IGFyZVxuICAgICAgICAvLyBkaXNwb3NlZCBhbmQgcmVhZGRlZC4gRXhlY3V0aW5nIHNjcmlwdHMgdHdpY2UgaGFzIG5vIGZ1bmN0aW9uYWxcbiAgICAgICAgLy8gZGlmZmVyZW5jZXNcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgICAgICBsZXQgcHJvbSA9IGxvYWRlZFNjcmlwdHMuZ2V0KHNyYy50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChwcm9tKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb207XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTa2lwIGV4ZWN1dGluZyBzY3JpcHQgaWYgaXQncyBhbHJlYWR5IGluIHRoZSBET006XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihgc2NyaXB0W3NyY149XCIke3NyY31cIl1gKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvYWRlZFNjcmlwdHMuc2V0KHNyYy50b1N0cmluZygpLCBwcm9tID0gYXBwZW5kU2NyaXB0KHNyYykpO1xuICAgICAgICAgICAgcmV0dXJuIHByb207XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwZW5kU2NyaXB0KHNyYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZmV0Y2hTdHlsZVNoZWV0KGhyZWYpIHtcbiAgICAgICAgbGV0IHByb20gPSBzdHlsZVNoZWV0cy5nZXQoaHJlZik7XG4gICAgICAgIGlmIChwcm9tKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbTtcbiAgICAgICAgfVxuICAgICAgICBzdHlsZVNoZWV0cy5zZXQoaHJlZiwgcHJvbSA9IGZldGNoKGhyZWYpLnRoZW4oKHJlcyk9PntcbiAgICAgICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBzdHlsZXNoZWV0OiAke2hyZWZ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzLnRleHQoKS50aGVuKCh0ZXh0KT0+KHtcbiAgICAgICAgICAgICAgICAgICAgaHJlZjogaHJlZixcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogdGV4dFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkuY2F0Y2goKGVycik9PntcbiAgICAgICAgICAgIHRocm93IG1hcmtBc3NldEVycm9yKGVycik7XG4gICAgICAgIH0pKTtcbiAgICAgICAgcmV0dXJuIHByb207XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHdoZW5FbnRyeXBvaW50IChyb3V0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhGdXR1cmUocm91dGUsIGVudHJ5cG9pbnRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FbnRyeXBvaW50IChyb3V0ZSwgZXhlY3V0ZSkge1xuICAgICAgICAgICAgKGV4ZWN1dGUgPyBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5leGVjdXRlKCkpLnRoZW4oKGV4cG9ydHMpPT4oe1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IGV4cG9ydHMgJiYgZXhwb3J0cy5kZWZhdWx0IHx8IGV4cG9ydHMsXG4gICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IGV4cG9ydHNcbiAgICAgICAgICAgICAgICB9KSwgKGVycik9Pih7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJcbiAgICAgICAgICAgICAgICB9KSkgOiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKSkudGhlbigoaW5wdXQpPT57XG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkID0gZW50cnlwb2ludHMuZ2V0KHJvdXRlKTtcbiAgICAgICAgICAgICAgICBpZiAob2xkICYmICdyZXNvbHZlJyBpbiBvbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeXBvaW50cy5zZXQocm91dGUsIGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5yZXNvbHZlKGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlwb2ludHMuc2V0KHJvdXRlLCBpbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeXBvaW50cy5kZWxldGUocm91dGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhpcyBlbnRyeXBvaW50IGhhcyBiZWVuIHJlc29sdmVkIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcm91dGUgaXMgb3V0ZGF0ZWQgYW5kIHdlIHdhbnQgdG8gaW52YWxpZGF0ZVxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhY2hlIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgIHJvdXRlcy5kZWxldGUocm91dGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBsb2FkUm91dGUgKHJvdXRlLCBwcmVmZXRjaCkge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhGdXR1cmUocm91dGUsIHJvdXRlcywgKCk9PntcbiAgICAgICAgICAgICAgICBsZXQgZGV2QnVpbGRQcm9taXNlUmVzb2x2ZTtcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZGV2QnVpbGRQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXZCdWlsZFByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlUHJvbWlzZVdpdGhUaW1lb3V0KGdldEZpbGVzRm9yUm91dGUoYXNzZXRQcmVmaXgsIHJvdXRlKS50aGVuKCh7IHNjcmlwdHMgLCBjc3MgIH0pPT57XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeXBvaW50cy5oYXMocm91dGUpID8gW10gOiBQcm9taXNlLmFsbChzY3JpcHRzLm1hcChtYXliZUV4ZWN1dGVTY3JpcHQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGNzcy5tYXAoZmV0Y2hTdHlsZVNoZWV0KSksIFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB9KS50aGVuKChyZXMpPT57XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndoZW5FbnRyeXBvaW50KHJvdXRlKS50aGVuKChlbnRyeXBvaW50KT0+KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeXBvaW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlczogcmVzWzFdXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSksIE1TX01BWF9JRExFX0RFTEFZLCBtYXJrQXNzZXRFcnJvcihuZXcgRXJyb3IoYFJvdXRlIGRpZCBub3QgY29tcGxldGUgbG9hZGluZzogJHtyb3V0ZX1gKSkpLnRoZW4oKHsgZW50cnlwb2ludCAsIHN0eWxlcyAgfSk9PntcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXM6IHN0eWxlc1xuICAgICAgICAgICAgICAgICAgICB9LCBlbnRyeXBvaW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdlcnJvcicgaW4gZW50cnlwb2ludCA/IGVudHJ5cG9pbnQgOiByZXM7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycik9PntcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZldGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIGNhY2hlIGVycm9ycyBkdXJpbmcgcHJlZmV0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVyclxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pLmZpbmFsbHkoKCk9PntcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldkJ1aWxkUHJvbWlzZVJlc29sdmUgPT0gbnVsbCA/IHZvaWQgMCA6IGRldkJ1aWxkUHJvbWlzZVJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwcmVmZXRjaCAocm91dGUpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWVMYWJzL3F1aWNrbGluay9ibG9iLzQ1M2E2NjFmYTFmYTk0MGUyZDJlMDQ0NDUyMzk4ZTM4YzY3YTk4ZmIvc3JjL2luZGV4Lm1qcyNMMTE1LUwxMThcbiAgICAgICAgICAgIC8vIExpY2Vuc2U6IEFwYWNoZSAyLjBcbiAgICAgICAgICAgIGxldCBjbjtcbiAgICAgICAgICAgIGlmIChjbiA9IG5hdmlnYXRvci5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgcHJlZmV0Y2ggaWYgdXNpbmcgMkcgb3IgaWYgU2F2ZS1EYXRhIGlzIGVuYWJsZWQuXG4gICAgICAgICAgICAgICAgaWYgKGNuLnNhdmVEYXRhIHx8IC8yZy8udGVzdChjbi5lZmZlY3RpdmVUeXBlKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGdldEZpbGVzRm9yUm91dGUoYXNzZXRQcmVmaXgsIHJvdXRlKS50aGVuKChvdXRwdXQpPT5Qcm9taXNlLmFsbChjYW5QcmVmZXRjaCA/IG91dHB1dC5zY3JpcHRzLm1hcCgoc2NyaXB0KT0+cHJlZmV0Y2hWaWFEb20oc2NyaXB0LnRvU3RyaW5nKCksICdzY3JpcHQnKSkgOiBbXSkpLnRoZW4oKCk9PntcbiAgICAgICAgICAgICAgICAoMCwgX3JlcXVlc3RJZGxlQ2FsbGJhY2spLnJlcXVlc3RJZGxlQ2FsbGJhY2soKCk9PnRoaXMubG9hZFJvdXRlKHJvdXRlLCB0cnVlKS5jYXRjaCgoKT0+e30pKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKC8vIHN3YWxsb3cgcHJlZmV0Y2ggZXJyb3JzXG4gICAgICAgICAgICAoKT0+e30pO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuaWYgKCh0eXBlb2YgZXhwb3J0cy5kZWZhdWx0ID09PSAnZnVuY3Rpb24nIHx8ICh0eXBlb2YgZXhwb3J0cy5kZWZhdWx0ID09PSAnb2JqZWN0JyAmJiBleHBvcnRzLmRlZmF1bHQgIT09IG51bGwpKSAmJiB0eXBlb2YgZXhwb3J0cy5kZWZhdWx0Ll9fZXNNb2R1bGUgPT09ICd1bmRlZmluZWQnKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLmRlZmF1bHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiAgT2JqZWN0LmFzc2lnbihleHBvcnRzLmRlZmF1bHQsIGV4cG9ydHMpO1xuICBtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMuZGVmYXVsdDtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm91dGUtbG9hZGVyLmpzLm1hcCJdLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsIm1hcmtBc3NldEVycm9yIiwiaXNBc3NldEVycm9yIiwiZ2V0Q2xpZW50QnVpbGRNYW5pZmVzdCIsImNyZWF0ZVJvdXRlTG9hZGVyIiwiX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0IiwicmVxdWlyZSIsImRlZmF1bHQiLCJfZ2V0QXNzZXRQYXRoRnJvbVJvdXRlIiwiX3RydXN0ZWRUeXBlcyIsIl9yZXF1ZXN0SWRsZUNhbGxiYWNrIiwiTVNfTUFYX0lETEVfREVMQVkiLCJ3aXRoRnV0dXJlIiwia2V5IiwibWFwIiwiZ2VuZXJhdG9yIiwiZW50cnkiLCJnZXQiLCJmdXR1cmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlc29sdmVyIiwicHJvbSIsInNldCIsInRoZW4iLCJjYXRjaCIsImVyciIsImRlbGV0ZSIsIkFTU0VUX0xPQURfRVJST1IiLCJTeW1ib2wiLCJoYXNQcmVmZXRjaCIsImxpbmsiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJ3aW5kb3ciLCJNU0lucHV0TWV0aG9kQ29udGV4dCIsImRvY3VtZW50TW9kZSIsInJlbExpc3QiLCJzdXBwb3J0cyIsImUiLCJjYW5QcmVmZXRjaCIsInByZWZldGNoVmlhRG9tIiwiaHJlZiIsImFzIiwicmVqZWN0Iiwic2VsZWN0b3IiLCJxdWVyeVNlbGVjdG9yIiwicmVsIiwiY3Jvc3NPcmlnaW4iLCJwcm9jZXNzIiwiZW52IiwiX19ORVhUX0NST1NTX09SSUdJTiIsIm9ubG9hZCIsIm9uZXJyb3IiLCJFcnJvciIsImhlYWQiLCJhcHBlbmRDaGlsZCIsImFwcGVuZFNjcmlwdCIsInNyYyIsInNjcmlwdCIsImJvZHkiLCJkZXZCdWlsZFByb21pc2UiLCJyZXNvbHZlUHJvbWlzZVdpdGhUaW1lb3V0IiwicCIsIm1zIiwiY2FuY2VsbGVkIiwiciIsInJlcXVlc3RJZGxlQ2FsbGJhY2siLCJzZXRUaW1lb3V0Iiwic2VsZiIsIl9fQlVJTERfTUFOSUZFU1QiLCJvbkJ1aWxkTWFuaWZlc3QiLCJjYiIsIl9fQlVJTERfTUFOSUZFU1RfQ0IiLCJnZXRGaWxlc0ZvclJvdXRlIiwiYXNzZXRQcmVmaXgiLCJyb3V0ZSIsInNjcmlwdFVybCIsImVuY29kZVVSSSIsInNjcmlwdHMiLCJfX3Vuc2FmZUNyZWF0ZVRydXN0ZWRTY3JpcHRVUkwiLCJjc3MiLCJtYW5pZmVzdCIsImFsbEZpbGVzIiwiZmlsdGVyIiwidiIsImVuZHNXaXRoIiwiZW50cnlwb2ludHMiLCJNYXAiLCJsb2FkZWRTY3JpcHRzIiwic3R5bGVTaGVldHMiLCJyb3V0ZXMiLCJtYXliZUV4ZWN1dGVTY3JpcHQiLCJ0b1N0cmluZyIsImZldGNoU3R5bGVTaGVldCIsImZldGNoIiwicmVzIiwib2siLCJ0ZXh0IiwiY29udGVudCIsIndoZW5FbnRyeXBvaW50Iiwib25FbnRyeXBvaW50IiwiZXhlY3V0ZSIsImNvbXBvbmVudCIsImVycm9yIiwidW5kZWZpbmVkIiwiaW5wdXQiLCJvbGQiLCJsb2FkUm91dGUiLCJwcmVmZXRjaCIsImRldkJ1aWxkUHJvbWlzZVJlc29sdmUiLCJhbGwiLCJoYXMiLCJlbnRyeXBvaW50Iiwic3R5bGVzIiwiYXNzaWduIiwiZmluYWxseSIsImNuIiwibmF2aWdhdG9yIiwiY29ubmVjdGlvbiIsInNhdmVEYXRhIiwidGVzdCIsImVmZmVjdGl2ZVR5cGUiLCJvdXRwdXQiLCJfX2VzTW9kdWxlIiwibW9kdWxlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/next/dist/client/route-loader.js\n"); - -/***/ }), - -/***/ "./node_modules/next/dist/client/script.js": -/*!*************************************************!*\ - !*** ./node_modules/next/dist/client/script.js ***! - \*************************************************/ -/***/ ((module, exports, __webpack_require__) => { - -"use strict"; -eval("\n\"use client\";\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.handleClientScriptLoad = handleClientScriptLoad;\nexports.initScriptLoader = initScriptLoader;\nexports[\"default\"] = void 0;\nvar _extends = (__webpack_require__(/*! @swc/helpers/lib/_extends.js */ \"./node_modules/@swc/helpers/lib/_extends.js\")[\"default\"]);\nvar _interop_require_default = (__webpack_require__(/*! @swc/helpers/lib/_interop_require_default.js */ \"./node_modules/@swc/helpers/lib/_interop_require_default.js\")[\"default\"]);\nvar _interop_require_wildcard = (__webpack_require__(/*! @swc/helpers/lib/_interop_require_wildcard.js */ \"./node_modules/@swc/helpers/lib/_interop_require_wildcard.js\")[\"default\"]);\nvar _object_without_properties_loose = (__webpack_require__(/*! @swc/helpers/lib/_object_without_properties_loose.js */ \"./node_modules/@swc/helpers/lib/_object_without_properties_loose.js\")[\"default\"]);\nvar _reactDom = _interop_require_default(__webpack_require__(/*! react-dom */ \"react-dom\"));\nvar _react = _interop_require_wildcard(__webpack_require__(/*! react */ \"react\"));\nvar _headManagerContext = __webpack_require__(/*! ../shared/lib/head-manager-context */ \"../shared/lib/head-manager-context\");\nvar _headManager = __webpack_require__(/*! ./head-manager */ \"./node_modules/next/dist/client/head-manager.js\");\nvar _requestIdleCallback = __webpack_require__(/*! ./request-idle-callback */ \"./node_modules/next/dist/client/request-idle-callback.js\");\n\"use client\";\nconst ScriptCache = new Map();\nconst LoadCache = new Set();\nconst ignoreProps = [\n \"onLoad\",\n \"onReady\",\n \"dangerouslySetInnerHTML\",\n \"children\",\n \"onError\",\n \"strategy\"\n];\nconst loadScript = (props)=>{\n const { src , id , onLoad =()=>{} , onReady =null , dangerouslySetInnerHTML , children =\"\" , strategy =\"afterInteractive\" , onError } = props;\n const cacheKey = id || src;\n // Script has already loaded\n if (cacheKey && LoadCache.has(cacheKey)) {\n return;\n }\n // Contents of this script are already loading/loaded\n if (ScriptCache.has(src)) {\n LoadCache.add(cacheKey);\n // It is possible that multiple `next/script` components all have same \"src\", but has different \"onLoad\"\n // This is to make sure the same remote script will only load once, but \"onLoad\" are executed in order\n ScriptCache.get(src).then(onLoad, onError);\n return;\n }\n /** Execute after the script first loaded */ const afterLoad = ()=>{\n // Run onReady for the first time after load event\n if (onReady) {\n onReady();\n }\n // add cacheKey to LoadCache when load successfully\n LoadCache.add(cacheKey);\n };\n const el = document.createElement(\"script\");\n const loadPromise = new Promise((resolve, reject)=>{\n el.addEventListener(\"load\", function(e) {\n resolve();\n if (onLoad) {\n onLoad.call(this, e);\n }\n afterLoad();\n });\n el.addEventListener(\"error\", function(e) {\n reject(e);\n });\n }).catch(function(e) {\n if (onError) {\n onError(e);\n }\n });\n if (dangerouslySetInnerHTML) {\n el.innerHTML = dangerouslySetInnerHTML.__html || \"\";\n afterLoad();\n } else if (children) {\n el.textContent = typeof children === \"string\" ? children : Array.isArray(children) ? children.join(\"\") : \"\";\n afterLoad();\n } else if (src) {\n el.src = src;\n // do not add cacheKey into LoadCache for remote script here\n // cacheKey will be added to LoadCache when it is actually loaded (see loadPromise above)\n ScriptCache.set(src, loadPromise);\n }\n for (const [k, value] of Object.entries(props)){\n if (value === undefined || ignoreProps.includes(k)) {\n continue;\n }\n const attr = _headManager.DOMAttributeNames[k] || k.toLowerCase();\n el.setAttribute(attr, value);\n }\n if (strategy === \"worker\") {\n el.setAttribute(\"type\", \"text/partytown\");\n }\n el.setAttribute(\"data-nscript\", strategy);\n document.body.appendChild(el);\n};\nfunction handleClientScriptLoad(props) {\n const { strategy =\"afterInteractive\" } = props;\n if (strategy === \"lazyOnload\") {\n window.addEventListener(\"load\", ()=>{\n (0, _requestIdleCallback).requestIdleCallback(()=>loadScript(props));\n });\n } else {\n loadScript(props);\n }\n}\nfunction loadLazyScript(props) {\n if (document.readyState === \"complete\") {\n (0, _requestIdleCallback).requestIdleCallback(()=>loadScript(props));\n } else {\n window.addEventListener(\"load\", ()=>{\n (0, _requestIdleCallback).requestIdleCallback(()=>loadScript(props));\n });\n }\n}\nfunction addBeforeInteractiveToCache() {\n const scripts = [\n ...document.querySelectorAll('[data-nscript=\"beforeInteractive\"]'),\n ...document.querySelectorAll('[data-nscript=\"beforePageRender\"]')\n ];\n scripts.forEach((script)=>{\n const cacheKey = script.id || script.getAttribute(\"src\");\n LoadCache.add(cacheKey);\n });\n}\nfunction initScriptLoader(scriptLoaderItems) {\n scriptLoaderItems.forEach(handleClientScriptLoad);\n addBeforeInteractiveToCache();\n}\nfunction Script(props) {\n const { id , src =\"\" , onLoad =()=>{} , onReady =null , strategy =\"afterInteractive\" , onError } = props, restProps = _object_without_properties_loose(props, [\n \"id\",\n \"src\",\n \"onLoad\",\n \"onReady\",\n \"strategy\",\n \"onError\"\n ]);\n // Context is available only during SSR\n const { updateScripts , scripts , getIsSsr , appDir , nonce } = (0, _react).useContext(_headManagerContext.HeadManagerContext);\n /**\n * - First mount:\n * 1. The useEffect for onReady executes\n * 2. hasOnReadyEffectCalled.current is false, but the script hasn't loaded yet (not in LoadCache)\n * onReady is skipped, set hasOnReadyEffectCalled.current to true\n * 3. The useEffect for loadScript executes\n * 4. hasLoadScriptEffectCalled.current is false, loadScript executes\n * Once the script is loaded, the onLoad and onReady will be called by then\n * [If strict mode is enabled / is wrapped in component]\n * 5. The useEffect for onReady executes again\n * 6. hasOnReadyEffectCalled.current is true, so entire effect is skipped\n * 7. The useEffect for loadScript executes again\n * 8. hasLoadScriptEffectCalled.current is true, so entire effect is skipped\n *\n * - Second mount:\n * 1. The useEffect for onReady executes\n * 2. hasOnReadyEffectCalled.current is false, but the script has already loaded (found in LoadCache)\n * onReady is called, set hasOnReadyEffectCalled.current to true\n * 3. The useEffect for loadScript executes\n * 4. The script is already loaded, loadScript bails out\n * [If strict mode is enabled / is wrapped in component]\n * 5. The useEffect for onReady executes again\n * 6. hasOnReadyEffectCalled.current is true, so entire effect is skipped\n * 7. The useEffect for loadScript executes again\n * 8. hasLoadScriptEffectCalled.current is true, so entire effect is skipped\n */ const hasOnReadyEffectCalled = (0, _react).useRef(false);\n (0, _react).useEffect(()=>{\n const cacheKey = id || src;\n if (!hasOnReadyEffectCalled.current) {\n // Run onReady if script has loaded before but component is re-mounted\n if (onReady && cacheKey && LoadCache.has(cacheKey)) {\n onReady();\n }\n hasOnReadyEffectCalled.current = true;\n }\n }, [\n onReady,\n id,\n src\n ]);\n const hasLoadScriptEffectCalled = (0, _react).useRef(false);\n (0, _react).useEffect(()=>{\n if (!hasLoadScriptEffectCalled.current) {\n if (strategy === \"afterInteractive\") {\n loadScript(props);\n } else if (strategy === \"lazyOnload\") {\n loadLazyScript(props);\n }\n hasLoadScriptEffectCalled.current = true;\n }\n }, [\n props,\n strategy\n ]);\n if (strategy === \"beforeInteractive\" || strategy === \"worker\") {\n if (updateScripts) {\n scripts[strategy] = (scripts[strategy] || []).concat([\n _extends({\n id,\n src,\n onLoad,\n onReady,\n onError\n }, restProps)\n ]);\n updateScripts(scripts);\n } else if (getIsSsr && getIsSsr()) {\n // Script has already loaded during SSR\n LoadCache.add(id || src);\n } else if (getIsSsr && !getIsSsr()) {\n loadScript(props);\n }\n }\n // For the app directory, we need React Float to preload these scripts.\n if (appDir) {\n // Before interactive scripts need to be loaded by Next.js' runtime instead\n // of native