From 9b56727361d037803437012b46616a6ad567cf70 Mon Sep 17 00:00:00 2001 From: Christian Meffert Date: Thu, 20 Feb 2025 07:13:55 +0100 Subject: [PATCH 01/11] [spotify] Fix possible deadlock during Spotify scan (#1859) --- src/library/spotify_webapi.c | 482 ++++++++++++++++++++--------------- 1 file changed, 278 insertions(+), 204 deletions(-) diff --git a/src/library/spotify_webapi.c b/src/library/spotify_webapi.c index c028d7c4..24f825ef 100644 --- a/src/library/spotify_webapi.c +++ b/src/library/spotify_webapi.c @@ -202,18 +202,179 @@ parse_type_from_uri(const char *uri) } static void -credentials_clear(struct spotify_credentials *credentials) +credentials_update_token(const char *access_token, const char *refresh_token, const char *scope, int32_t expires_in) { - if (!credentials) - return; + CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); - free(credentials->access_token); - free(credentials->refresh_token); - free(credentials->granted_scope); - free(credentials->user_country); - free(credentials->user); + free(spotify_credentials.access_token); + free(spotify_credentials.refresh_token); + free(spotify_credentials.granted_scope); - memset(credentials, 0, sizeof(struct spotify_credentials)); + spotify_credentials.access_token = safe_strdup(access_token); + spotify_credentials.refresh_token = safe_strdup(refresh_token); + spotify_credentials.granted_scope = safe_strdup(scope); + if (expires_in > 0) + spotify_credentials.token_expires_in = expires_in; + else + spotify_credentials.token_expires_in = 3600; + spotify_credentials.token_time_requested = time(NULL); + + CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); +} + +static void +credentials_update_user(const char *user, const char *country) +{ + CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); + + free(spotify_credentials.user); + free(spotify_credentials.user_country); + + spotify_credentials.user = safe_strdup(user); + spotify_credentials.user_country = safe_strdup(country); + + CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); +} + +static void +credentials_get_auth_header(char *header, size_t header_size) +{ + CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); + + snprintf(header, header_size, "Authorization: Bearer %s", spotify_credentials.access_token); + + CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); +} + +static char * +credentials_query_param_market(const char *href) +{ + char *next_href = NULL; + + CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); + + if (!spotify_credentials.user_country) + { + next_href = safe_strdup(href); + } + else + { + if (strchr(href, '?')) + next_href = safe_asprintf("%s&market=%s", href, spotify_credentials.user_country); + else + next_href = safe_asprintf("%s?market=%s", href, spotify_credentials.user_country); + } + + CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); + + return next_href; +} + +static bool +credentials_token_valid(void) +{ + bool valid = false; + + CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); + + if (spotify_credentials.access_token + && spotify_credentials.token_time_requested + && difftime(time(NULL), spotify_credentials.token_time_requested) < spotify_credentials.token_expires_in) + { + valid = true; // Spotify token still valid + } + + CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); + + return valid; +} + +static bool +credentials_token_exists(void) +{ + bool exists = false; + + CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); + + exists = (spotify_credentials.access_token != NULL); + + CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); + + return exists; +} + +static void +credentials_user_token_get(char **user, char **token) +{ + CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); + + if (user) + *user = safe_strdup(spotify_credentials.user); + if (token) + *token = safe_strdup(spotify_credentials.access_token); + + CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); +} + +static void +credentials_token_info(struct spotifywebapi_access_token *info) +{ + memset(info, 0, sizeof(struct spotifywebapi_access_token)); + + CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); + + if (spotify_credentials.token_time_requested > 0) + info->expires_in = spotify_credentials.token_expires_in - difftime(time(NULL), spotify_credentials.token_time_requested); + else + info->expires_in = 0; + + info->token = safe_strdup(spotify_credentials.access_token); + + CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); +} + +static void +credentials_status_info(struct spotifywebapi_status_info *info) +{ + memset(info, 0, sizeof(struct spotifywebapi_status_info)); + + CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); + + info->token_valid = (spotify_credentials.access_token != NULL); + if (spotify_credentials.user) + { + strncpy(info->user, spotify_credentials.user, (sizeof(info->user) - 1)); + } + if (spotify_credentials.user_country) + { + strncpy(info->country, spotify_credentials.user_country, (sizeof(info->country) - 1)); + } + if (spotify_credentials.granted_scope) + { + strncpy(info->granted_scope, spotify_credentials.granted_scope, (sizeof(info->granted_scope) - 1)); + } + if (spotify_scope) + { + strncpy(info->required_scope, spotify_scope, (sizeof(info->required_scope) - 1)); + } + + CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); +} + +static void +credentials_clear() +{ + CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); + + free(spotify_credentials.access_token); + free(spotify_credentials.refresh_token); + free(spotify_credentials.granted_scope); + free(spotify_credentials.user_country); + free(spotify_credentials.user); + + memset(&spotify_credentials, 0, sizeof(struct spotify_credentials)); + + CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); } static void @@ -232,20 +393,17 @@ free_http_client_ctx(struct http_client_ctx *ctx) free(ctx); } -static bool -token_valid(struct spotify_credentials *credentials) -{ - return (credentials->access_token != NULL); -} - static int -request_access_tokens(struct spotify_credentials *credentials, struct keyval *kv, const char **err) +request_access_tokens(struct keyval *kv, const char **err) { struct http_client_ctx ctx; char *param; char *body; - json_object *haystack; - const char *tmp; + json_object *haystack = NULL; + const char *access_token; + const char *refresh_token; + const char *scope; + uint32_t expires_in; int ret; param = http_form_urlencode(kv); @@ -289,34 +447,8 @@ request_access_tokens(struct spotify_credentials *credentials, struct keyval *kv goto out_free_input_body; } - free(credentials->access_token); - credentials->access_token = NULL; - - tmp = jparse_str_from_obj(haystack, "access_token"); - if (tmp) - credentials->access_token = strdup(tmp); - - tmp = jparse_str_from_obj(haystack, "refresh_token"); - if (tmp) - { - free(credentials->refresh_token); - credentials->refresh_token = strdup(tmp); - } - - tmp = jparse_str_from_obj(haystack, "scope"); - if (tmp) - { - free(credentials->granted_scope); - credentials->granted_scope = strdup(tmp); - } - - credentials->token_expires_in = jparse_int_from_obj(haystack, "expires_in"); - if (credentials->token_expires_in == 0) - credentials->token_expires_in = 3600; - - jparse_free(haystack); - - if (!credentials->access_token) + access_token = jparse_str_from_obj(haystack, "access_token"); + if (!access_token) { DPRINTF(E_LOG, L_SPOTIFY, "Could not find access token in reply: %s\n", body); @@ -325,16 +457,21 @@ request_access_tokens(struct spotify_credentials *credentials, struct keyval *kv goto out_free_input_body; } - credentials->token_time_requested = time(NULL); + refresh_token = jparse_str_from_obj(haystack, "refresh_token"); + if (refresh_token) + db_admin_set(DB_ADMIN_SPOTIFY_REFRESH_TOKEN, refresh_token); - if (credentials->refresh_token) - db_admin_set(DB_ADMIN_SPOTIFY_REFRESH_TOKEN, credentials->refresh_token); + scope = jparse_str_from_obj(haystack, "scope"); + expires_in = jparse_int_from_obj(haystack, "expires_in"); + + credentials_update_token(access_token, refresh_token, scope, expires_in); ret = 0; out_free_input_body: - evbuffer_free(ctx.input_body); - free(param); + jparse_free(haystack); + evbuffer_free(ctx.input_body); + free(param); out_clear_kv: return ret; @@ -348,7 +485,7 @@ request_access_tokens(struct spotify_credentials *credentials, struct keyval *kv * @return Response as JSON object or NULL */ static json_object * -request_endpoint(const char *uri, const char *access_token) +request_endpoint(const char *uri) { struct http_client_ctx *ctx; char bearer_token[1024]; @@ -362,7 +499,7 @@ request_endpoint(const char *uri, const char *access_token) ctx->url = uri; - snprintf(bearer_token, sizeof(bearer_token), "Bearer %s", access_token); + credentials_get_auth_header(bearer_token, sizeof(bearer_token)); if (keyval_add(ctx->output_headers, "Authorization", bearer_token) < 0) { DPRINTF(E_LOG, L_SPOTIFY, "Add bearer_token to keyval failed for request '%s'\n", uri); @@ -410,25 +547,22 @@ request_endpoint(const char *uri, const char *access_token) * API endpoint: https://api.spotify.com/v1/me */ static int -request_user_info(struct spotify_credentials *credentials) +request_user_info() { json_object *response; + const char *user = NULL; + const char *user_country = NULL; - free(credentials->user_country); - credentials->user_country = NULL; - free(credentials->user); - credentials->user = NULL; - - response = request_endpoint(spotify_me_uri, credentials->access_token); - + response = request_endpoint(spotify_me_uri); if (response) { - credentials->user = safe_strdup(jparse_str_from_obj(response, "id")); - credentials->user_country = safe_strdup(jparse_str_from_obj(response, "country")); + user = jparse_str_from_obj(response, "id"); + user_country = jparse_str_from_obj(response, "country"); + + DPRINTF(E_DBG, L_SPOTIFY, "User '%s', country '%s'\n", user, user_country); + credentials_update_user(user, user_country); jparse_free(response); - - DPRINTF(E_DBG, L_SPOTIFY, "User '%s', country '%s'\n", credentials->user, credentials->user_country); } return 0; @@ -440,7 +574,7 @@ request_user_info(struct spotify_credentials *credentials) * @return 0 on success, -1 on failure */ static int -token_get(struct spotify_credentials *credentials, const char *code, const char *redirect_uri, const char **err) +token_get(const char *code, const char *redirect_uri, const char **err) { struct keyval kv = { 0 }; int ret; @@ -458,12 +592,12 @@ token_get(struct spotify_credentials *credentials, const char *code, const char ret = -1; } else - ret = request_access_tokens(credentials, &kv, err); + ret = request_access_tokens(&kv, err); keyval_clear(&kv); if (ret == 0) - request_user_info(credentials); + request_user_info(); return ret; } @@ -478,14 +612,14 @@ token_get(struct spotify_credentials *credentials, const char *code, const char * @return 0 on success, -1 on failure */ static int -token_refresh(struct spotify_credentials *credentials) +token_refresh(void) { struct keyval kv = { 0 }; char *refresh_token = NULL; const char *err; int ret; - if (credentials->token_time_requested && difftime(time(NULL), credentials->token_time_requested) < credentials->token_expires_in) + if (credentials_token_valid()) { return 0; // Spotify token still valid } @@ -508,14 +642,14 @@ token_refresh(struct spotify_credentials *credentials) goto error; } - ret = request_access_tokens(credentials, &kv, &err); + ret = request_access_tokens(&kv, &err); if (ret < 0) { DPRINTF(E_LOG, L_SPOTIFY, "Error requesting access token: %s", err); goto error; } - request_user_info(credentials); + request_user_info(); free(refresh_token); keyval_clear(&kv); @@ -541,18 +675,18 @@ token_refresh(struct spotify_credentials *credentials) * @return Response as JSON object or NULL */ static json_object * -request_endpoint_with_token_refresh(struct spotify_credentials *credentials, const char *href) +request_endpoint_with_token_refresh(const char *href) { - if (0 > token_refresh(credentials)) + if (0 > token_refresh()) { return NULL; } - return request_endpoint(href, credentials->access_token); + return request_endpoint(href); } typedef int (*paging_request_cb)(void *arg); -typedef int (*paging_item_cb)(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg, struct spotify_credentials *); +typedef int (*paging_item_cb)(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg); /* * Request the spotify endpoint at 'href' @@ -584,7 +718,7 @@ typedef int (*paging_item_cb)(json_object *item, int index, int total, enum spot */ static int request_pagingobject_endpoint(const char *href, paging_item_cb item_cb, paging_request_cb pre_request_cb, paging_request_cb post_request_cb, - bool with_market, struct spotify_credentials *credentials, enum spotify_request_type request_type, void *arg) + bool with_market, enum spotify_request_type request_type, void *arg) { char *next_href; json_object *response; @@ -596,24 +730,17 @@ request_pagingobject_endpoint(const char *href, paging_item_cb item_cb, paging_r int total; int ret; - if (!with_market || !credentials->user_country) - { - next_href = safe_strdup(href); - } + if (!with_market) + next_href = safe_strdup(href); else - { - if (strchr(href, '?')) - next_href = safe_asprintf("%s&market=%s", href, credentials->user_country); - else - next_href = safe_asprintf("%s?market=%s", href, credentials->user_country); - } + next_href = credentials_query_param_market(href); while (next_href) { if (pre_request_cb) pre_request_cb(arg); - response = request_endpoint_with_token_refresh(credentials, next_href); + response = request_endpoint_with_token_refresh(next_href); if (!response) { @@ -645,7 +772,7 @@ request_pagingobject_endpoint(const char *href, paging_item_cb item_cb, paging_r continue; } - ret = item_cb(item, (i + offset), total, request_type, arg, credentials); + ret = item_cb(item, (i + offset), total, request_type, arg); if (ret < 0) { DPRINTF(E_LOG, L_SPOTIFY, "Couldn't add item at index %d '%s' (API endpoint: '%s')\n", @@ -1028,26 +1155,26 @@ get_episode_endpoint_uri(const char *uri) } static json_object * -request_track(const char *path, struct spotify_credentials *credentials) +request_track(const char *path) { char *endpoint_uri; json_object *response; endpoint_uri = get_track_endpoint_uri(path); - response = request_endpoint_with_token_refresh(credentials, endpoint_uri); + response = request_endpoint_with_token_refresh(endpoint_uri); free(endpoint_uri); return response; } static json_object * -request_episode(const char *path, struct spotify_credentials *credentials) +request_episode(const char *path) { char *endpoint_uri; json_object *response; endpoint_uri = get_episode_endpoint_uri(path); - response = request_endpoint_with_token_refresh(credentials, endpoint_uri); + response = request_endpoint_with_token_refresh(endpoint_uri); free(endpoint_uri); return response; @@ -1105,7 +1232,7 @@ map_track_to_queueitem(struct db_queue_item *item, const struct spotify_track *t } static int -queue_add_track(int *count, int *new_item_id, const char *uri, int position, char reshuffle, uint32_t item_id, struct spotify_credentials *credentials) +queue_add_track(int *count, int *new_item_id, const char *uri, int position, char reshuffle, uint32_t item_id) { json_object *response = NULL; struct spotify_track track; @@ -1113,7 +1240,7 @@ queue_add_track(int *count, int *new_item_id, const char *uri, int position, cha struct db_queue_add_info queue_add_info; int ret; - response = request_track(uri, credentials); + response = request_track(uri); if (!response) goto error; @@ -1153,7 +1280,7 @@ struct queue_add_album_param { }; static int -queue_add_album_tracks(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg, struct spotify_credentials *credentials) +queue_add_album_tracks(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg) { struct queue_add_album_param *param; struct spotify_track track; @@ -1180,7 +1307,7 @@ queue_add_album_tracks(json_object *item, int index, int total, enum spotify_req } static int -queue_add_album(int *count, int *new_item_id, const char *uri, int position, char reshuffle, uint32_t item_id, struct spotify_credentials *credentials) +queue_add_album(int *count, int *new_item_id, const char *uri, int position, char reshuffle, uint32_t item_id) { char *album_endpoint_uri = NULL; char *endpoint_uri = NULL; @@ -1189,7 +1316,7 @@ queue_add_album(int *count, int *new_item_id, const char *uri, int position, cha int ret; album_endpoint_uri = get_album_endpoint_uri(uri); - json_album = request_endpoint_with_token_refresh(credentials, album_endpoint_uri); + json_album = request_endpoint_with_token_refresh(album_endpoint_uri); parse_metadata_album(json_album, ¶m.album, ART_DEFAULT_WIDTH); ret = db_queue_add_start(¶m.queue_add_info, position); @@ -1198,7 +1325,7 @@ queue_add_album(int *count, int *new_item_id, const char *uri, int position, cha endpoint_uri = get_album_tracks_endpoint_uri(uri); - ret = request_pagingobject_endpoint(endpoint_uri, queue_add_album_tracks, NULL, NULL, true, credentials, SPOTIFY_REQUEST_TYPE_DEFAULT, ¶m); + ret = request_pagingobject_endpoint(endpoint_uri, queue_add_album_tracks, NULL, NULL, true, SPOTIFY_REQUEST_TYPE_DEFAULT, ¶m); ret = db_queue_add_end(¶m.queue_add_info, reshuffle, item_id, ret); if (ret < 0) @@ -1216,7 +1343,7 @@ queue_add_album(int *count, int *new_item_id, const char *uri, int position, cha } static int -queue_add_albums(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg, struct spotify_credentials *credentials) +queue_add_albums(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg) { struct db_queue_add_info *param; struct queue_add_album_param param_add_album; @@ -1229,7 +1356,7 @@ queue_add_albums(json_object *item, int index, int total, enum spotify_request_t parse_metadata_album(item, ¶m_add_album.album, ART_DEFAULT_WIDTH); endpoint_uri = get_album_tracks_endpoint_uri(param_add_album.album.uri); - ret = request_pagingobject_endpoint(endpoint_uri, queue_add_album_tracks, NULL, NULL, true, credentials, SPOTIFY_REQUEST_TYPE_DEFAULT, ¶m_add_album); + ret = request_pagingobject_endpoint(endpoint_uri, queue_add_album_tracks, NULL, NULL, true, SPOTIFY_REQUEST_TYPE_DEFAULT, ¶m_add_album); *param = param_add_album.queue_add_info; @@ -1239,7 +1366,7 @@ queue_add_albums(json_object *item, int index, int total, enum spotify_request_t } static int -queue_add_artist(int *count, int *new_item_id, const char *uri, int position, char reshuffle, uint32_t item_id, struct spotify_credentials *credentials) +queue_add_artist(int *count, int *new_item_id, const char *uri, int position, char reshuffle, uint32_t item_id) { struct db_queue_add_info queue_add_info; char *endpoint_uri = NULL; @@ -1250,7 +1377,7 @@ queue_add_artist(int *count, int *new_item_id, const char *uri, int position, ch goto out; endpoint_uri = get_artist_albums_endpoint_uri(uri); - ret = request_pagingobject_endpoint(endpoint_uri, queue_add_albums, NULL, NULL, true, credentials, SPOTIFY_REQUEST_TYPE_DEFAULT, &queue_add_info); + ret = request_pagingobject_endpoint(endpoint_uri, queue_add_albums, NULL, NULL, true, SPOTIFY_REQUEST_TYPE_DEFAULT, &queue_add_info); ret = db_queue_add_end(&queue_add_info, reshuffle, item_id, ret); if (ret < 0) @@ -1265,7 +1392,7 @@ queue_add_artist(int *count, int *new_item_id, const char *uri, int position, ch } static int -queue_add_playlist_tracks(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg, struct spotify_credentials *credentials) +queue_add_playlist_tracks(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg) { struct db_queue_add_info *queue_add_info; struct spotify_track track; @@ -1301,7 +1428,7 @@ queue_add_playlist_tracks(json_object *item, int index, int total, enum spotify_ } static int -queue_add_playlist(int *count, int *new_item_id, const char *uri, int position, char reshuffle, uint32_t item_id, struct spotify_credentials *credentials) +queue_add_playlist(int *count, int *new_item_id, const char *uri, int position, char reshuffle, uint32_t item_id) { char *endpoint_uri = NULL; struct db_queue_add_info queue_add_info; @@ -1313,7 +1440,7 @@ queue_add_playlist(int *count, int *new_item_id, const char *uri, int position, endpoint_uri = get_playlist_tracks_endpoint_uri(uri); - ret = request_pagingobject_endpoint(endpoint_uri, queue_add_playlist_tracks, NULL, NULL, true, credentials, SPOTIFY_REQUEST_TYPE_DEFAULT, &queue_add_info); + ret = request_pagingobject_endpoint(endpoint_uri, queue_add_playlist_tracks, NULL, NULL, true, SPOTIFY_REQUEST_TYPE_DEFAULT, &queue_add_info); ret = db_queue_add_end(&queue_add_info, reshuffle, item_id, ret); if (ret < 0) @@ -1495,7 +1622,7 @@ playlist_add_or_update(struct playlist_info *pli) * Add a saved album to the library */ static int -saved_album_add(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg, struct spotify_credentials *credentials) +saved_album_add(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg) { json_object *jsonalbum; struct spotify_album album; @@ -1561,11 +1688,11 @@ saved_album_add(json_object *item, int index, int total, enum spotify_request_ty * Scan users saved albums into the library */ static int -scan_saved_albums(enum spotify_request_type request_type, struct spotify_credentials *credentials) +scan_saved_albums(enum spotify_request_type request_type) { int ret; - ret = request_pagingobject_endpoint(spotify_albums_uri, saved_album_add, NULL, NULL, true, credentials, request_type, NULL); + ret = request_pagingobject_endpoint(spotify_albums_uri, saved_album_add, NULL, NULL, true, request_type, NULL); return ret; } @@ -1574,7 +1701,7 @@ scan_saved_albums(enum spotify_request_type request_type, struct spotify_credent * Add a saved podcast show to the library */ static int -saved_episodes_add(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg, struct spotify_credentials *credentials) +saved_episodes_add(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg) { struct spotify_album *show = arg; struct spotify_track episode; @@ -1597,7 +1724,7 @@ saved_episodes_add(json_object *item, int index, int total, enum spotify_request * Add a saved podcast show to the library */ static int -saved_show_add(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg, struct spotify_credentials *credentials) +saved_show_add(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg) { json_object *jsonshow; struct spotify_album show; @@ -1619,7 +1746,7 @@ saved_show_add(json_object *item, int index, int total, enum spotify_request_typ // Now map the show episodes and insert/update them in the files database endpoint_uri = safe_asprintf(spotify_shows_episodes_uri, show.id); - request_pagingobject_endpoint(endpoint_uri, saved_episodes_add, transaction_start, transaction_end, true, credentials, request_type, &show); + request_pagingobject_endpoint(endpoint_uri, saved_episodes_add, transaction_start, transaction_end, true, request_type, &show); free(endpoint_uri); if ((index + 1) >= total || ((index + 1) % 10 == 0)) @@ -1634,11 +1761,11 @@ saved_show_add(json_object *item, int index, int total, enum spotify_request_typ * Scan users saved podcast shows into the library */ static int -scan_saved_shows(enum spotify_request_type request_type, struct spotify_credentials *credentials) +scan_saved_shows(enum spotify_request_type request_type) { int ret; - ret = request_pagingobject_endpoint(spotify_shows_uri, saved_show_add, NULL, NULL, true, credentials, request_type, NULL); + ret = request_pagingobject_endpoint(spotify_shows_uri, saved_show_add, NULL, NULL, true, request_type, NULL); return ret; } @@ -1647,7 +1774,7 @@ scan_saved_shows(enum spotify_request_type request_type, struct spotify_credenti * Add a saved playlist's tracks to the library */ static int -saved_playlist_tracks_add(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg, struct spotify_credentials *credentials) +saved_playlist_tracks_add(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg) { struct spotify_track track; struct spotify_album album; @@ -1695,11 +1822,11 @@ saved_playlist_tracks_add(json_object *item, int index, int total, enum spotify_ /* Thread: library */ static int -scan_playlist_tracks(const char *playlist_tracks_endpoint_uri, struct playlist_info *pli, enum spotify_request_type request_type, struct spotify_credentials *credentials) +scan_playlist_tracks(const char *playlist_tracks_endpoint_uri, struct playlist_info *pli, enum spotify_request_type request_type) { int ret; - ret = request_pagingobject_endpoint(playlist_tracks_endpoint_uri, saved_playlist_tracks_add, transaction_start, transaction_end, true, credentials, request_type, pli); + ret = request_pagingobject_endpoint(playlist_tracks_endpoint_uri, saved_playlist_tracks_add, transaction_start, transaction_end, true, request_type, pli); return ret; } @@ -1727,7 +1854,7 @@ map_playlist_to_pli(struct playlist_info *pli, struct spotify_playlist *playlist * Add a saved playlist to the library */ static int -saved_playlist_add(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg, struct spotify_credentials *credentials) +saved_playlist_add(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg) { struct spotify_playlist playlist; struct playlist_info pli; @@ -1750,7 +1877,7 @@ saved_playlist_add(json_object *item, int index, int total, enum spotify_request pli.id = pl_id; if (pl_id > 0) - scan_playlist_tracks(playlist.tracks_href, &pli, request_type, credentials); + scan_playlist_tracks(playlist.tracks_href, &pli, request_type); else DPRINTF(E_LOG, L_SPOTIFY, "Error adding playlist: '%s' (%s) \n", playlist.name, playlist.uri); @@ -1767,11 +1894,11 @@ saved_playlist_add(json_object *item, int index, int total, enum spotify_request * Scan users saved playlists into the library */ static int -scan_playlists(enum spotify_request_type request_type, struct spotify_credentials *credentials) +scan_playlists(enum spotify_request_type request_type) { int ret; - ret = request_pagingobject_endpoint(spotify_playlists_uri, saved_playlist_add, NULL, NULL, false, credentials, request_type, NULL); + ret = request_pagingobject_endpoint(spotify_playlists_uri, saved_playlist_add, NULL, NULL, false, request_type, NULL); return ret; } @@ -1810,13 +1937,13 @@ create_base_playlist(void) } static void -scan(enum spotify_request_type request_type, struct spotify_credentials *credentials) +scan(enum spotify_request_type request_type) { struct spotify_status sp_status; time_t start; time_t end; - if (!token_valid(&spotify_credentials) || scanning) + if (!credentials_token_exists() || scanning) { DPRINTF(E_DBG, L_SPOTIFY, "No valid web api token or scan already in progress, rescan ignored\n"); return; @@ -1828,11 +1955,11 @@ scan(enum spotify_request_type request_type, struct spotify_credentials *credent db_directory_enable_bypath("/spotify:"); create_base_playlist(); - scan_saved_albums(request_type, credentials); - scan_playlists(request_type, credentials); + scan_saved_albums(request_type); + scan_playlists(request_type); spotify_status_get(&sp_status); if (sp_status.has_podcast_support) - scan_saved_shows(request_type, credentials); + scan_saved_shows(request_type); scanning = false; end = time(NULL); @@ -1849,35 +1976,31 @@ spotifywebapi_library_queue_item_add(const char *uri, int position, char reshuff { enum spotify_item_type type; - CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); - type = parse_type_from_uri(uri); if (type == SPOTIFY_ITEM_TYPE_TRACK) { - queue_add_track(count, new_item_id, uri, position, reshuffle, item_id, &spotify_credentials); + queue_add_track(count, new_item_id, uri, position, reshuffle, item_id); goto out; } else if (type == SPOTIFY_ITEM_TYPE_ARTIST) { - queue_add_artist(count, new_item_id, uri, position, reshuffle, item_id, &spotify_credentials); + queue_add_artist(count, new_item_id, uri, position, reshuffle, item_id); goto out; } else if (type == SPOTIFY_ITEM_TYPE_ALBUM) { - queue_add_album(count, new_item_id, uri, position, reshuffle, item_id, &spotify_credentials); + queue_add_album(count, new_item_id, uri, position, reshuffle, item_id); goto out; } else if (type == SPOTIFY_ITEM_TYPE_PLAYLIST) { - queue_add_playlist(count, new_item_id, uri, position, reshuffle, item_id, &spotify_credentials); + queue_add_playlist(count, new_item_id, uri, position, reshuffle, item_id); goto out; } - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); return LIBRARY_PATH_INVALID; out: - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); return LIBRARY_OK; } @@ -1887,9 +2010,7 @@ spotifywebapi_library_initscan(void) int ret; /* Refresh access token for the spotify webapi */ - CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); - ret = token_refresh(&spotify_credentials); - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); + ret = token_refresh(); if (ret < 0) { // User not logged in or error refreshing token @@ -1914,27 +2035,21 @@ spotifywebapi_library_initscan(void) /* * Scan saved tracks from the web api */ - CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); - scan(SPOTIFY_REQUEST_TYPE_RESCAN, &spotify_credentials); - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); + scan(SPOTIFY_REQUEST_TYPE_RESCAN); return 0; } static int spotifywebapi_library_rescan(void) { - CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); - scan(SPOTIFY_REQUEST_TYPE_RESCAN, &spotify_credentials); - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); + scan(SPOTIFY_REQUEST_TYPE_RESCAN); return 0; } static int spotifywebapi_library_metarescan(void) { - CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); - scan(SPOTIFY_REQUEST_TYPE_METARESCAN, &spotify_credentials); - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); + scan(SPOTIFY_REQUEST_TYPE_METARESCAN); return 0; } @@ -1943,9 +2058,7 @@ spotifywebapi_library_fullrescan(void) { db_spotify_purge(); - CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); - scan(SPOTIFY_REQUEST_TYPE_RESCAN, &spotify_credentials); - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); + scan(SPOTIFY_REQUEST_TYPE_RESCAN); return 0; } @@ -1973,9 +2086,7 @@ spotifywebapi_library_deinit() http_client_session_deinit(&spotify_http_session.session); CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_http_session.lock)); - CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); - credentials_clear(&spotify_credentials); - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); + credentials_clear(); } struct library_source spotifyscanner = @@ -2012,9 +2123,7 @@ webapi_rescan(void *arg, int *ret) static enum command_state webapi_purge(void *arg, int *ret) { - CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); - credentials_clear(&spotify_credentials); - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); + credentials_clear(); db_spotify_purge(); db_admin_delete(DB_ADMIN_SPOTIFY_REFRESH_TOKEN); @@ -2069,6 +2178,8 @@ int spotifywebapi_oauth_callback(struct evkeyvalq *param, const char *redirect_uri, const char **errmsg) { const char *code; + char *user = NULL; + char *access_token = NULL; int ret; *errmsg = NULL; @@ -2082,18 +2193,19 @@ spotifywebapi_oauth_callback(struct evkeyvalq *param, const char *redirect_uri, DPRINTF(E_DBG, L_SPOTIFY, "Received OAuth code: %s\n", code); - CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); - - ret = token_get(&spotify_credentials, code, redirect_uri, errmsg); + ret = token_get(code, redirect_uri, errmsg); if (ret < 0) goto error; - ret = spotify_login_token(spotify_credentials.user, spotify_credentials.access_token, errmsg); + credentials_user_token_get(&user, &access_token); + ret = spotify_login_token(user, access_token, errmsg); + + free(user); + free(access_token); + if (ret < 0) goto error; - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); - // Trigger scan after successful access to spotifywebapi spotifywebapi_fullrescan(); @@ -2102,7 +2214,6 @@ spotifywebapi_oauth_callback(struct evkeyvalq *param, const char *redirect_uri, return 0; error: - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); return -1; } @@ -2135,17 +2246,13 @@ spotifywebapi_artwork_url_get(const char *uri, int max_w, int max_h) type = parse_type_from_uri(uri); if (type == SPOTIFY_ITEM_TYPE_TRACK) { - CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); - response = request_track(uri, &spotify_credentials); - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); + response = request_track(uri); if (response) parse_metadata_track(response, &track, max_w); } else if (type == SPOTIFY_ITEM_TYPE_EPISODE) { - CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); - response = request_episode(uri, &spotify_credentials); - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); + response = request_episode(uri); if (response) parse_metadata_episode(response, &track, max_w); } @@ -2171,45 +2278,12 @@ spotifywebapi_artwork_url_get(const char *uri, int max_w, int max_h) void spotifywebapi_status_info_get(struct spotifywebapi_status_info *info) { - memset(info, 0, sizeof(struct spotifywebapi_status_info)); - - CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); - - info->token_valid = token_valid(&spotify_credentials); - if (spotify_credentials.user) - { - strncpy(info->user, spotify_credentials.user, (sizeof(info->user) - 1)); - } - if (spotify_credentials.user_country) - { - strncpy(info->country, spotify_credentials.user_country, (sizeof(info->country) - 1)); - } - if (spotify_credentials.granted_scope) - { - strncpy(info->granted_scope, spotify_credentials.granted_scope, (sizeof(info->granted_scope) - 1)); - } - if (spotify_scope) - { - strncpy(info->required_scope, spotify_scope, (sizeof(info->required_scope) - 1)); - } - - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); + credentials_status_info(info); } void spotifywebapi_access_token_get(struct spotifywebapi_access_token *info) { - memset(info, 0, sizeof(struct spotifywebapi_access_token)); - - CHECK_ERR(L_SPOTIFY, pthread_mutex_lock(&spotify_credentials_lock)); - token_refresh(&spotify_credentials); - - if (spotify_credentials.token_time_requested > 0) - info->expires_in = spotify_credentials.token_expires_in - difftime(time(NULL), spotify_credentials.token_time_requested); - else - info->expires_in = 0; - - info->token = safe_strdup(spotify_credentials.access_token); - - CHECK_ERR(L_SPOTIFY, pthread_mutex_unlock(&spotify_credentials_lock)); + token_refresh(); + credentials_token_info(info); } From 8cfb3db6dd3ba87ed42bf7acd75264316a50d357 Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Sat, 22 Feb 2025 09:06:02 +0100 Subject: [PATCH 02/11] ChangeLog for OwnTone 28.12 --- ChangeLog | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ChangeLog b/ChangeLog index cf00b3c2..8a5cde75 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,16 @@ # Changelog +## Version 28.12 - 2025-02-22 + +- fix: possible deadlock during Spotify scan +- fix: armv7 compile warnings +- fix: stop playback when last queue item removed +- fix: "Invalid token" when authorising Spotify +- fix: mpd enable/disable erroneously toggles +- fix: cover art not being displayed in album lists +- new: logging includes thread info +- new: support for ListenBrainz + ## Version 28.11 - 2025-01-26 - fix: retrieval of artwork from online sources From 7eac8adb8393085d7d2467ecbae56660f0c1b92a Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Sat, 22 Feb 2025 09:07:03 +0100 Subject: [PATCH 03/11] Bump to version 28.12 --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 8c17ad8e..c4c2b1b4 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ dnl Process this file with autoconf to produce a configure script. AC_PREREQ([2.60]) -AC_INIT([owntone], [28.11]) +AC_INIT([owntone], [28.12]) AC_CONFIG_SRCDIR([config.h.in]) AC_CONFIG_MACRO_DIR([m4]) From 3f9e400dbde92483fd1226b5f6c8b7d64c9606d2 Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Fri, 29 Nov 2024 17:42:20 +0100 Subject: [PATCH 04/11] [spotify] Import version 0.4 of librespot-c and remove password-based login Experimental version to test new protocol --- src/inputs/librespot-c/Makefile.am | 21 +- src/inputs/librespot-c/configure.ac | 5 + src/inputs/librespot-c/librespot-c.h | 17 +- src/inputs/librespot-c/src/channel.c | 63 +- src/inputs/librespot-c/src/channel.h | 3 + src/inputs/librespot-c/src/connection.c | 1497 +++++++++++---- src/inputs/librespot-c/src/connection.h | 38 +- src/inputs/librespot-c/src/crypto.c | 141 +- src/inputs/librespot-c/src/crypto.h | 24 + src/inputs/librespot-c/src/http.c | 216 +++ src/inputs/librespot-c/src/http.h | 83 + .../librespot-c/src/librespot-c-internal.h | 142 +- src/inputs/librespot-c/src/librespot-c.c | 339 ++-- .../src/proto/ad-hermes-proxy.proto | 51 - .../librespot-c/src/proto/appstore.proto | 95 - .../librespot-c/src/proto/clienttoken.pb-c.c | 1676 +++++++++++++++++ .../librespot-c/src/proto/clienttoken.pb-c.h | 678 +++++++ .../librespot-c/src/proto/clienttoken.proto | 122 ++ .../librespot-c/src/proto/connectivity.pb-c.c | 1091 +++++++++++ .../librespot-c/src/proto/connectivity.pb-c.h | 378 ++++ .../librespot-c/src/proto/connectivity.proto | 73 + .../src/proto/facebook-publish.proto | 51 - .../librespot-c/src/proto/facebook.proto | 183 -- .../src/proto/google_duration.pb-c.c | 105 ++ .../src/proto/google_duration.pb-c.h | 72 + .../src/proto/google_duration.proto | 8 + .../librespot-c/src/proto/login5.pb-c.c | 947 ++++++++++ .../librespot-c/src/proto/login5.pb-c.h | 373 ++++ src/inputs/librespot-c/src/proto/login5.proto | 87 + .../src/proto/login5_challenges_code.pb-c.c | 242 +++ .../src/proto/login5_challenges_code.pb-c.h | 114 ++ .../src/proto/login5_challenges_code.proto | 19 + .../proto/login5_challenges_hashcash.pb-c.c | 201 ++ .../proto/login5_challenges_hashcash.pb-c.h | 108 ++ .../proto/login5_challenges_hashcash.proto | 15 + .../src/proto/login5_client_info.pb-c.c | 105 ++ .../src/proto/login5_client_info.pb-c.h | 72 + .../src/proto/login5_client_info.proto | 8 + .../src/proto/login5_credentials.pb-c.c | 816 ++++++++ .../src/proto/login5_credentials.pb-c.h | 320 ++++ .../src/proto/login5_credentials.proto | 46 + .../src/proto/login5_identifiers.pb-c.c | 118 ++ .../src/proto/login5_identifiers.pb-c.h | 73 + .../src/proto/login5_identifiers.proto | 9 + .../src/proto/login5_user_info.pb-c.c | 215 +++ .../src/proto/login5_user_info.pb-c.h | 86 + .../src/proto/login5_user_info.proto | 22 + .../librespot-c/src/proto/mergedprofile.proto | 10 - .../src/proto/playlist4changes.proto | 87 - .../src/proto/playlist4content.proto | 37 - .../src/proto/playlist4issues.proto | 43 - .../librespot-c/src/proto/playlist4meta.proto | 52 - .../librespot-c/src/proto/playlist4ops.proto | 103 - .../librespot-c/src/proto/popcount.proto | 13 - .../librespot-c/src/proto/presence.proto | 94 - src/inputs/librespot-c/src/proto/pubsub.proto | 8 - src/inputs/librespot-c/src/proto/radio.proto | 58 - src/inputs/librespot-c/src/proto/search.proto | 44 - src/inputs/librespot-c/src/proto/social.proto | 12 - .../librespot-c/src/proto/socialgraph.proto | 49 - .../src/proto/storage_resolve.pb-c.c | 149 ++ .../src/proto/storage_resolve.pb-c.h | 81 + .../src/proto/storage_resolve.proto | 15 + .../librespot-c/src/proto/suggest.proto | 43 - .../librespot-c/src/proto/toplist.proto | 6 - src/inputs/librespot-c/tests/.gitignore | 1 + src/inputs/librespot-c/tests/Makefile.am | 6 +- src/inputs/librespot-c/tests/test1.c | 120 +- src/inputs/librespot-c/tests/test2.c | 283 +++ src/inputs/spotify.c | 6 +- src/inputs/spotify.h | 5 +- src/inputs/spotify_librespotc.c | 71 +- src/library/spotify_webapi.c | 11 +- 73 files changed, 10829 insertions(+), 1746 deletions(-) create mode 100644 src/inputs/librespot-c/src/http.c create mode 100644 src/inputs/librespot-c/src/http.h delete mode 100644 src/inputs/librespot-c/src/proto/ad-hermes-proxy.proto delete mode 100644 src/inputs/librespot-c/src/proto/appstore.proto create mode 100644 src/inputs/librespot-c/src/proto/clienttoken.pb-c.c create mode 100644 src/inputs/librespot-c/src/proto/clienttoken.pb-c.h create mode 100644 src/inputs/librespot-c/src/proto/clienttoken.proto create mode 100644 src/inputs/librespot-c/src/proto/connectivity.pb-c.c create mode 100644 src/inputs/librespot-c/src/proto/connectivity.pb-c.h create mode 100644 src/inputs/librespot-c/src/proto/connectivity.proto delete mode 100644 src/inputs/librespot-c/src/proto/facebook-publish.proto delete mode 100644 src/inputs/librespot-c/src/proto/facebook.proto create mode 100644 src/inputs/librespot-c/src/proto/google_duration.pb-c.c create mode 100644 src/inputs/librespot-c/src/proto/google_duration.pb-c.h create mode 100644 src/inputs/librespot-c/src/proto/google_duration.proto create mode 100644 src/inputs/librespot-c/src/proto/login5.pb-c.c create mode 100644 src/inputs/librespot-c/src/proto/login5.pb-c.h create mode 100644 src/inputs/librespot-c/src/proto/login5.proto create mode 100644 src/inputs/librespot-c/src/proto/login5_challenges_code.pb-c.c create mode 100644 src/inputs/librespot-c/src/proto/login5_challenges_code.pb-c.h create mode 100644 src/inputs/librespot-c/src/proto/login5_challenges_code.proto create mode 100644 src/inputs/librespot-c/src/proto/login5_challenges_hashcash.pb-c.c create mode 100644 src/inputs/librespot-c/src/proto/login5_challenges_hashcash.pb-c.h create mode 100644 src/inputs/librespot-c/src/proto/login5_challenges_hashcash.proto create mode 100644 src/inputs/librespot-c/src/proto/login5_client_info.pb-c.c create mode 100644 src/inputs/librespot-c/src/proto/login5_client_info.pb-c.h create mode 100644 src/inputs/librespot-c/src/proto/login5_client_info.proto create mode 100644 src/inputs/librespot-c/src/proto/login5_credentials.pb-c.c create mode 100644 src/inputs/librespot-c/src/proto/login5_credentials.pb-c.h create mode 100644 src/inputs/librespot-c/src/proto/login5_credentials.proto create mode 100644 src/inputs/librespot-c/src/proto/login5_identifiers.pb-c.c create mode 100644 src/inputs/librespot-c/src/proto/login5_identifiers.pb-c.h create mode 100644 src/inputs/librespot-c/src/proto/login5_identifiers.proto create mode 100644 src/inputs/librespot-c/src/proto/login5_user_info.pb-c.c create mode 100644 src/inputs/librespot-c/src/proto/login5_user_info.pb-c.h create mode 100644 src/inputs/librespot-c/src/proto/login5_user_info.proto delete mode 100644 src/inputs/librespot-c/src/proto/mergedprofile.proto delete mode 100644 src/inputs/librespot-c/src/proto/playlist4changes.proto delete mode 100644 src/inputs/librespot-c/src/proto/playlist4content.proto delete mode 100644 src/inputs/librespot-c/src/proto/playlist4issues.proto delete mode 100644 src/inputs/librespot-c/src/proto/playlist4meta.proto delete mode 100644 src/inputs/librespot-c/src/proto/playlist4ops.proto delete mode 100644 src/inputs/librespot-c/src/proto/popcount.proto delete mode 100644 src/inputs/librespot-c/src/proto/presence.proto delete mode 100644 src/inputs/librespot-c/src/proto/pubsub.proto delete mode 100644 src/inputs/librespot-c/src/proto/radio.proto delete mode 100644 src/inputs/librespot-c/src/proto/search.proto delete mode 100644 src/inputs/librespot-c/src/proto/social.proto delete mode 100644 src/inputs/librespot-c/src/proto/socialgraph.proto create mode 100644 src/inputs/librespot-c/src/proto/storage_resolve.pb-c.c create mode 100644 src/inputs/librespot-c/src/proto/storage_resolve.pb-c.h create mode 100644 src/inputs/librespot-c/src/proto/storage_resolve.proto delete mode 100644 src/inputs/librespot-c/src/proto/suggest.proto delete mode 100644 src/inputs/librespot-c/src/proto/toplist.proto create mode 100644 src/inputs/librespot-c/tests/test2.c diff --git a/src/inputs/librespot-c/Makefile.am b/src/inputs/librespot-c/Makefile.am index 08106ab9..6916a28a 100644 --- a/src/inputs/librespot-c/Makefile.am +++ b/src/inputs/librespot-c/Makefile.am @@ -11,16 +11,31 @@ PROTO_SRC = \ src/proto/mercury.pb-c.c src/proto/mercury.pb-c.h \ src/proto/metadata.pb-c.c src/proto/metadata.pb-c.h +HTTP_PROTO_SRC = \ + src/proto/connectivity.pb-c.c src/proto/connectivity.pb-c.h \ + src/proto/clienttoken.pb-c.c src/proto/clienttoken.pb-c.h \ + src/proto/login5_user_info.pb-c.h src/proto/login5_user_info.pb-c.c \ + src/proto/login5.pb-c.h src/proto/login5.pb-c.c \ + src/proto/login5_identifiers.pb-c.h src/proto/login5_identifiers.pb-c.c \ + src/proto/login5_credentials.pb-c.h src/proto/login5_credentials.pb-c.c \ + src/proto/login5_client_info.pb-c.h src/proto/login5_client_info.pb-c.c \ + src/proto/login5_challenges_hashcash.pb-c.h src/proto/login5_challenges_hashcash.pb-c.c \ + src/proto/login5_challenges_code.pb-c.h src/proto/login5_challenges_code.pb-c.c \ + src/proto/google_duration.pb-c.h src/proto/google_duration.pb-c.c \ + src/proto/storage_resolve.pb-c.h src/proto/storage_resolve.pb-c.c + CORE_SRC = \ - src/librespot-c.c src/connection.c src/channel.c src/crypto.c src/commands.c + src/librespot-c.c src/connection.c src/channel.c src/crypto.c src/commands.c \ + src/http.c librespot_c_a_SOURCES = \ $(CORE_SRC) \ $(SHANNON_SRC) \ - $(PROTO_SRC) + $(PROTO_SRC) \ + $(HTTP_PROTO_SRC) noinst_HEADERS = \ librespot-c.h src/librespot-c-internal.h src/connection.h \ - src/channel.h src/crypto.h src/commands.h + src/channel.h src/crypto.h src/commands.h src/http.h EXTRA_DIST = README.md LICENSE diff --git a/src/inputs/librespot-c/configure.ac b/src/inputs/librespot-c/configure.ac index 10b76dfa..9b0647f8 100644 --- a/src/inputs/librespot-c/configure.ac +++ b/src/inputs/librespot-c/configure.ac @@ -1,10 +1,15 @@ AC_INIT([librespot-c], [0.1]) AC_CONFIG_AUX_DIR([.]) AM_INIT_AUTOMAKE([foreign subdir-objects]) +AM_SILENT_RULES([yes]) + AC_PROG_CC AM_PROG_AR AC_PROG_RANLIB +AM_CPPFLAGS="-Wall" +AC_SUBST([AM_CPPFLAGS]) + AC_CHECK_HEADERS_ONCE([sys/utsname.h]) AC_CHECK_HEADERS([endian.h sys/endian.h libkern/OSByteOrder.h], [found_endian_headers=yes; break;]) diff --git a/src/inputs/librespot-c/librespot-c.h b/src/inputs/librespot-c/librespot-c.h index ab4f224f..37306470 100644 --- a/src/inputs/librespot-c/librespot-c.h +++ b/src/inputs/librespot-c/librespot-c.h @@ -6,7 +6,7 @@ #include #define LIBRESPOT_C_VERSION_MAJOR 0 -#define LIBRESPOT_C_VERSION_MINOR 2 +#define LIBRESPOT_C_VERSION_MINOR 4 struct sp_session; @@ -37,9 +37,13 @@ struct sp_metadata size_t file_len; }; +// How to identify towards Spotify. The device_id can be set to an actual value +// identifying the client, but the rest are unfortunately best left as zeroes, +// which will make librespot-c use defaults that spoof whitelisted clients. struct sp_sysinfo { char client_name[16]; + char client_id[33]; char client_version[16]; char client_build_id[16]; char device_id[41]; // librespot gives a 20 byte id (so 40 char hex + 1 zero term) @@ -47,8 +51,7 @@ struct sp_sysinfo struct sp_callbacks { - // Bring your own https client and tcp connector - int (*https_get)(char **body, const char *url); + // Bring your own tcp connector int (*tcp_connect)(const char *address, unsigned short port); void (*tcp_disconnect)(int fd); @@ -60,10 +63,9 @@ struct sp_callbacks void (*logmsg)(const char *fmt, ...); }; - - +// Deprecated, use login_token and login_stored_cred instead struct sp_session * -librespotc_login_password(const char *username, const char *password); +librespotc_login_password(const char *username, const char *password) __attribute__ ((deprecated)); struct sp_session * librespotc_login_stored_cred(const char *username, uint8_t *stored_cred, size_t stored_cred_len); @@ -74,6 +76,9 @@ librespotc_login_token(const char *username, const char *token); int librespotc_logout(struct sp_session *session); +int +librespotc_legacy_set(struct sp_session *session, int use_legacy); + int librespotc_bitrate_set(struct sp_session *session, enum sp_bitrates bitrate); diff --git a/src/inputs/librespot-c/src/channel.c b/src/inputs/librespot-c/src/channel.c index fb4255e5..659fe61d 100644 --- a/src/inputs/librespot-c/src/channel.c +++ b/src/inputs/librespot-c/src/channel.c @@ -63,6 +63,8 @@ channel_get(uint32_t channel_id, struct sp_session *session) void channel_free(struct sp_channel *channel) { + int i; + if (!channel || channel->state == SP_CHANNEL_STATE_UNALLOCATED) return; @@ -82,6 +84,9 @@ channel_free(struct sp_channel *channel) free(channel->file.path); + for (i = 0; i < ARRAY_SIZE(channel->file.cdnurl); i++) + free(channel->file.cdnurl[i]); + memset(channel, 0, sizeof(struct sp_channel)); channel->audio_fd[0] = -1; @@ -208,7 +213,8 @@ channel_seek_internal(struct sp_channel *channel, size_t pos, bool do_flush) channel->seek_pos = pos; // If seek + header isn't word aligned we will get up to 3 bytes before the - // actual seek position. We will remove those when they are received. + // actual seek position with the legacy protocol. We will remove those when + // they are received. channel->seek_align = (pos + SP_OGG_HEADER_LEN) % 4; seek_words = (pos + SP_OGG_HEADER_LEN) / 4; @@ -218,8 +224,8 @@ channel_seek_internal(struct sp_channel *channel, size_t pos, bool do_flush) RETURN_ERROR(SP_ERR_DECRYPTION, sp_errmsg); // Set the offset and received counter to match the seek - channel->file.offset_words = seek_words; - channel->file.received_words = seek_words; + channel->file.offset_bytes = 4 * seek_words; + channel->file.received_bytes = 4 * seek_words; return 0; @@ -241,14 +247,14 @@ channel_pause(struct sp_channel *channel) channel->state = SP_CHANNEL_STATE_PAUSED; } -// After a disconnect we connect to another one and try to resume. To make that -// work some data elements need to be reset. +// After a disconnect we connect to another AP and try to resume. To make that +// work during playback some data elements need to be reset. void channel_retry(struct sp_channel *channel) { size_t pos; - if (!channel) + if (!channel || channel->state != SP_CHANNEL_STATE_PLAYING) return; channel->is_data_mode = false; @@ -256,7 +262,7 @@ channel_retry(struct sp_channel *channel) memset(&channel->header, 0, sizeof(struct sp_channel_header)); memset(&channel->body, 0, sizeof(struct sp_channel_body)); - pos = 4 * channel->file.received_words - SP_OGG_HEADER_LEN; + pos = channel->file.received_bytes - SP_OGG_HEADER_LEN; channel_seek_internal(channel, pos, false); // false => don't flush } @@ -316,12 +322,12 @@ channel_header_handle(struct sp_channel *channel, struct sp_channel_header *head } memcpy(&be32, header->data, sizeof(be32)); - channel->file.len_words = be32toh(be32); + channel->file.len_bytes = 4 * be32toh(be32); } } static ssize_t -channel_header_trailer_read(struct sp_channel *channel, uint8_t *msg, size_t msg_len, struct sp_session *session) +channel_header_trailer_read(struct sp_channel *channel, uint8_t *msg, size_t msg_len) { ssize_t parsed_len; ssize_t consumed_len; @@ -333,10 +339,10 @@ channel_header_trailer_read(struct sp_channel *channel, uint8_t *msg, size_t msg if (msg_len == 0) { channel->file.end_of_chunk = true; - channel->file.end_of_file = (channel->file.received_words >= channel->file.len_words); + channel->file.end_of_file = (channel->file.received_bytes >= channel->file.len_bytes); // In preparation for next chunk - channel->file.offset_words += SP_CHUNK_LEN_WORDS; + channel->file.offset_bytes += SP_CHUNK_LEN; channel->is_data_mode = false; return 0; @@ -369,22 +375,19 @@ channel_header_trailer_read(struct sp_channel *channel, uint8_t *msg, size_t msg return ret; } -static ssize_t -channel_data_read(struct sp_channel *channel, uint8_t *msg, size_t msg_len, struct sp_session *session) +static int +channel_data_read(struct sp_channel *channel, uint8_t *msg, size_t msg_len) { const char *errmsg; int ret; - assert (msg_len % 4 == 0); - - channel->file.received_words += msg_len / 4; + channel->file.received_bytes += msg_len; ret = crypto_aes_decrypt(msg, msg_len, &channel->file.decrypt, &errmsg); if (ret < 0) RETURN_ERROR(SP_ERR_DECRYPTION, errmsg); // Skip Spotify header - // TODO What to do here when seeking if (!channel->is_spotify_header_received) { if (msg_len < SP_OGG_HEADER_LEN) @@ -464,7 +467,7 @@ channel_msg_read(uint16_t *channel_id, uint8_t *msg, size_t msg_len, struct sp_s msg_len -= sizeof(be); // Will set data_mode, end_of_file and end_of_chunk as appropriate - consumed_len = channel_header_trailer_read(channel, msg, msg_len, session); + consumed_len = channel_header_trailer_read(channel, msg, msg_len); if (consumed_len < 0) RETURN_ERROR((int)consumed_len, sp_errmsg); @@ -477,9 +480,9 @@ channel_msg_read(uint16_t *channel_id, uint8_t *msg, size_t msg_len, struct sp_s if (!channel->is_data_mode || !(msg_len > 0)) return 0; // Not in data mode or no data to read - consumed_len = channel_data_read(channel, msg, msg_len, session); - if (consumed_len < 0) - RETURN_ERROR((int)consumed_len, sp_errmsg); + ret = channel_data_read(channel, msg, msg_len); + if (ret < 0) + RETURN_ERROR(ret, sp_errmsg); return 0; @@ -487,3 +490,21 @@ channel_msg_read(uint16_t *channel_id, uint8_t *msg, size_t msg_len, struct sp_s return ret; } +// With http there is the Spotify Ogg header, but no chunk header/trailer +int +channel_http_body_read(struct sp_channel *channel, uint8_t *body, size_t body_len) +{ + int ret; + + ret = channel_data_read(channel, body, body_len); + if (ret < 0) + goto error; + + channel->file.end_of_chunk = true; + channel->file.end_of_file = (channel->file.received_bytes >= channel->file.len_bytes); + channel->file.offset_bytes += SP_CHUNK_LEN; + return 0; + + error: + return ret; +} diff --git a/src/inputs/librespot-c/src/channel.h b/src/inputs/librespot-c/src/channel.h index db664e66..be406f7f 100644 --- a/src/inputs/librespot-c/src/channel.h +++ b/src/inputs/librespot-c/src/channel.h @@ -30,3 +30,6 @@ channel_retry(struct sp_channel *channel); int channel_msg_read(uint16_t *channel_id, uint8_t *msg, size_t msg_len, struct sp_session *session); + +int +channel_http_body_read(struct sp_channel *channel, uint8_t *body, size_t body_len); diff --git a/src/inputs/librespot-c/src/connection.c b/src/inputs/librespot-c/src/connection.c index d021daf6..47a72e00 100644 --- a/src/inputs/librespot-c/src/connection.c +++ b/src/inputs/librespot-c/src/connection.c @@ -1,3 +1,5 @@ +#define _GNU_SOURCE // For asprintf and vasprintf + #include #include #include @@ -15,6 +17,12 @@ #include "librespot-c-internal.h" #include "connection.h" #include "channel.h" +#include "http.h" + +#define MERCURY_REQ_SIZE_MAX 4096 + +// Forgot how I arrived at this upper bound +#define HASHCASH_ITERATIONS_MAX 100000 static struct timeval sp_idle_tv = { SP_AP_DISCONNECT_SECS, 0 }; @@ -34,6 +42,23 @@ static struct sp_err_map sp_login_errors[] = { { ERROR_CODE__ApplicationBanned, "Application banned" }, }; +static struct sp_err_map sp_login5_warning_map[] = { + { SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__WARNINGS__UNKNOWN_WARNING, "Unknown warning" }, + { SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__WARNINGS__DEPRECATED_PROTOCOL_VERSION, "Deprecated protocol" }, +}; + +static struct sp_err_map sp_login5_error_map[] = { + { SPOTIFY__LOGIN5__V3__LOGIN_ERROR__UNKNOWN_ERROR, "Unknown error" }, + { SPOTIFY__LOGIN5__V3__LOGIN_ERROR__INVALID_CREDENTIALS, "Invalid credentials" }, + { SPOTIFY__LOGIN5__V3__LOGIN_ERROR__BAD_REQUEST, "Bad request" }, + { SPOTIFY__LOGIN5__V3__LOGIN_ERROR__UNSUPPORTED_LOGIN_PROTOCOL, "Unsupported login protocol" }, + { SPOTIFY__LOGIN5__V3__LOGIN_ERROR__TIMEOUT, "Timeout" }, + { SPOTIFY__LOGIN5__V3__LOGIN_ERROR__UNKNOWN_IDENTIFIER, "Unknown identifier" }, + { SPOTIFY__LOGIN5__V3__LOGIN_ERROR__TOO_MANY_ATTEMPTS, "Too many attempts" }, + { SPOTIFY__LOGIN5__V3__LOGIN_ERROR__INVALID_PHONENUMBER, "Invalid phonenumber" }, + { SPOTIFY__LOGIN5__V3__LOGIN_ERROR__TRY_AGAIN_LATER, "Try again later" }, +}; + /* ---------------------------------- MOCKING ------------------------------- */ #ifdef DEBUG_MOCK @@ -87,6 +112,23 @@ debug_mock_response(struct sp_message *msg, struct sp_connection *conn) /* --------------------------------- Helpers -------------------------------- */ +static char * +asprintf_or_die(const char *fmt, ...) +{ + char *ret = NULL; + va_list va; + + va_start(va, fmt); + if (vasprintf(&ret, fmt, va) < 0) + { + sp_cb.logmsg("Out of memory for asprintf\n"); + abort(); + } + va_end(va); + + return ret; +} + #ifdef HAVE_SYS_UTSNAME_H static void system_info_from_uname(SystemInfo *system_info) @@ -185,76 +227,22 @@ file_select(uint8_t *out, size_t out_len, Track *track, enum sp_bitrates bitrate return 0; } +static const char * +err2txt(int err, struct sp_err_map *map, size_t map_size) +{ + for (int i = 0; i < map_size; i++) + { + if (err == map[i].errorcode) + return map[i].errmsg; + } + + return "(unknown error code)"; +} /* --------------------------- Connection handling -------------------------- */ -// Connects to access point resolver and selects the first access point (unless -// it matches "avoid", i.e. an access point that previously failed) -static int -ap_resolve(char **address, unsigned short *port, const char *avoid) -{ - char *body = NULL; - json_object *jresponse = NULL; - json_object *ap_list; - json_object *ap; - char *ap_address = NULL; - char *ap_port; - int ap_num; - int ret; - int i; - - free(*address); - *address = NULL; - - ret = sp_cb.https_get(&body, SP_AP_RESOLVE_URL); - if (ret < 0) - RETURN_ERROR(SP_ERR_NOCONNECTION, "Could not connect to access point resolver"); - - jresponse = json_tokener_parse(body); - if (!jresponse) - RETURN_ERROR(SP_ERR_NOCONNECTION, "Could not parse reply from access point resolver"); - - if (! (json_object_object_get_ex(jresponse, SP_AP_RESOLVE_KEY, &ap_list) || json_object_get_type(ap_list) == json_type_array)) - RETURN_ERROR(SP_ERR_NOCONNECTION, "Unexpected reply from access point resolver"); - - ap_num = json_object_array_length(ap_list); - - for (i = 0; i < ap_num; i++) - { - ap = json_object_array_get_idx(ap_list, i); - if (! (ap && json_object_get_type(ap) == json_type_string)) - RETURN_ERROR(SP_ERR_NOCONNECTION, "Unexpected reply from access point resolver"); - - if (avoid && strncmp(avoid, json_object_get_string(ap), strlen(avoid)) == 0) - continue; // This AP has failed on us previously, so avoid - - ap_address = strdup(json_object_get_string(ap)); - break; - } - - if (!ap_address) - RETURN_ERROR(SP_ERR_NOCONNECTION, "Unexpected reply from access point resolver, no suitable access point"); - if (! (ap_port = strchr(ap_address, ':'))) - RETURN_ERROR(SP_ERR_NOCONNECTION, "Unexpected reply from access point resolver, missing port"); - *ap_port = '\0'; - ap_port += 1; - - *address = ap_address; - *port = (unsigned short)atoi(ap_port); - - json_object_put(jresponse); - free(body); - return 0; - - error: - free(ap_address); - json_object_put(jresponse); - free(body); - return ret; -} - static void -connection_clear(struct sp_connection *conn) +tcp_connection_clear(struct sp_connection *conn) { if (!conn) return; @@ -271,24 +259,14 @@ connection_clear(struct sp_connection *conn) if (conn->incoming) evbuffer_free(conn->incoming); - free(conn->ap_address); free(conn->keys.shared_secret); memset(conn, 0, sizeof(struct sp_connection)); conn->response_fd = -1; } -void -ap_disconnect(struct sp_connection *conn) -{ - if (conn->is_connected) - sp_cb.tcp_disconnect(conn->response_fd); - - connection_clear(conn); -} - static void -connection_idle_cb(int fd, short what, void *arg) +tcp_connection_idle_cb(int fd, short what, void *arg) { struct sp_connection *conn = arg; @@ -298,20 +276,13 @@ connection_idle_cb(int fd, short what, void *arg) } static int -connection_make(struct sp_connection *conn, const char *ap_avoid, struct sp_conn_callbacks *cb, void *response_cb_arg) +tcp_connection_make(struct sp_connection *conn, struct sp_server *server, struct sp_conn_callbacks *cb, void *cb_arg) { int response_fd; int ret; - if (!conn->ap_address || !conn->ap_port) - { - ret = ap_resolve(&conn->ap_address, &conn->ap_port, ap_avoid); - if (ret < 0) - RETURN_ERROR(ret, sp_errmsg); - } - #ifndef DEBUG_MOCK - response_fd = sp_cb.tcp_connect(conn->ap_address, conn->ap_port); + response_fd = sp_cb.tcp_connect(server->address, server->port); if (response_fd < 0) RETURN_ERROR(SP_ERR_NOCONNECTION, "Could not connect to access point"); #else @@ -319,11 +290,14 @@ connection_make(struct sp_connection *conn, const char *ap_avoid, struct sp_conn response_fd = debug_mock_pipe[0]; #endif - conn->response_fd = response_fd; - conn->response_ev = event_new(cb->evbase, response_fd, EV_READ | EV_PERSIST, cb->response_cb, response_cb_arg); - conn->timeout_ev = evtimer_new(cb->evbase, cb->timeout_cb, conn); + server->last_connect_ts = time(NULL); + conn->server = server; - conn->idle_ev = evtimer_new(cb->evbase, connection_idle_cb, conn); + conn->response_fd = response_fd; + conn->response_ev = event_new(cb->evbase, response_fd, EV_READ | EV_PERSIST, cb->response_cb, cb_arg); + conn->timeout_ev = evtimer_new(cb->evbase, cb->timeout_cb, cb_arg); + + conn->idle_ev = evtimer_new(cb->evbase, tcp_connection_idle_cb, conn); conn->handshake_packets = evbuffer_new(); conn->incoming = evbuffer_new(); @@ -339,47 +313,65 @@ connection_make(struct sp_connection *conn, const char *ap_avoid, struct sp_conn return 0; error: + server->last_failed_ts = time(NULL); return ret; } +static int +must_resolve(struct sp_server *server) +{ + time_t now = time(NULL); + + return (server->last_resolved_ts == 0) || (server->last_failed_ts + SP_AP_AVOID_SECS > now); +} + +void +ap_disconnect(struct sp_connection *conn) +{ + if (conn->is_connected) + sp_cb.tcp_disconnect(conn->response_fd); + + tcp_connection_clear(conn); +} + enum sp_error -ap_connect(struct sp_connection *conn, enum sp_msg_type type, time_t *cooldown_ts, const char *ap_avoid, struct sp_conn_callbacks *cb, void *cb_arg) +ap_connect(struct sp_connection *conn, struct sp_server *server, time_t *cooldown_ts, struct sp_conn_callbacks *cb, void *cb_arg) { int ret; time_t now; - if (!conn->is_connected) - { - // Protection against flooding the access points with reconnection attempts - // Note that cooldown_ts can't be part of the connection struct because - // the struct is reset between connection attempts. - now = time(NULL); - if (now > *cooldown_ts + SP_AP_COOLDOWN_SECS) // Last attempt was a long time ago - *cooldown_ts = now; - else if (now >= *cooldown_ts) // Last attempt was recent, so disallow more attempts for a while - *cooldown_ts = now + SP_AP_COOLDOWN_SECS; - else - RETURN_ERROR(SP_ERR_NOCONNECTION, "Cannot connect to access point, cooldown after disconnect is in effect"); + if (must_resolve(server)) + RETURN_ERROR(SP_ERR_NOCONNECTION, "Cannot connect to access point, it has recently failed"); - ret = connection_make(conn, ap_avoid, cb, cb_arg); - if (ret < 0) - RETURN_ERROR(ret, sp_errmsg); - } + // Protection against flooding the access points with reconnection attempts + // Note that cooldown_ts can't be part of the connection struct because + // the struct is reset between connection attempts. + now = time(NULL); + if (now > *cooldown_ts + SP_AP_COOLDOWN_SECS) // Last attempt was a long time ago + *cooldown_ts = now; + else if (now >= *cooldown_ts) // Last attempt was recent, so disallow more attempts for a while + *cooldown_ts = now + SP_AP_COOLDOWN_SECS; + else + RETURN_ERROR(SP_ERR_NOCONNECTION, "Cannot connect to access point, cooldown after disconnect is in effect"); - if (msg_is_handshake(type) || conn->handshake_completed) - return SP_OK_DONE; // Proceed right away + if (conn->is_connected) + ap_disconnect(conn); - return SP_OK_WAIT; // Caller must login again + ret = tcp_connection_make(conn, server, cb, cb_arg); + if (ret < 0) + RETURN_ERROR(ret, sp_errmsg); + + return SP_OK_DONE; error: ap_disconnect(conn); return ret; } -const char * -ap_address_get(struct sp_connection *conn) +void +ap_blacklist(struct sp_server *server) { - return conn->ap_address; + server->last_failed_ts = time(NULL); } /* ------------------------------ Raw packets ------------------------------- */ @@ -561,17 +553,161 @@ mercury_parse(struct sp_mercury *mercury, uint8_t *payload, size_t payload_len) } +/* ---------------------Request preparation (dependencies) ------------------ */ + +static enum sp_error +prepare_tcp_handshake(struct sp_seq_request *request, struct sp_conn_callbacks *cb, struct sp_session *session) +{ + int ret; + + if (!session->conn.is_connected) + { + ret = ap_connect(&session->conn, &session->accesspoint, &session->cooldown_ts, cb, session); + if (ret == SP_ERR_NOCONNECTION) + { + seq_next_set(session, request->seq_type); + session->request = seq_request_get(SP_SEQ_LOGIN, 0, session->use_legacy); + return SP_OK_WAIT; + } + else if (ret < 0) + RETURN_ERROR(ret, sp_errmsg); + } + + return SP_OK_DONE; + + error: + return ret; +} + +static enum sp_error +prepare_tcp(struct sp_seq_request *request, struct sp_conn_callbacks *cb, struct sp_session *session) +{ + int ret; + + ret = prepare_tcp_handshake(request, cb, session); + if (ret != SP_OK_DONE) + return ret; // SP_OK_WAIT if the current AP failed and we need to try a new one + + if (!session->conn.handshake_completed) + { + // Queue the current request + seq_next_set(session, request->seq_type); + session->request = seq_request_get(SP_SEQ_LOGIN, 0, session->use_legacy); + return SP_OK_WAIT; + } + + return SP_OK_DONE; +} + + /* --------------------------- Incoming messages ---------------------------- */ static enum sp_error -response_client_hello(uint8_t *msg, size_t msg_len, struct sp_session *session) +resolve_server_info_set(struct sp_server *server, const char *key, json_object *jresponse) { - struct sp_connection *conn = &session->conn; - APResponseMessage *apresponse; - size_t header_len = 4; // TODO make a define + json_object *list; + json_object *instance; + size_t address_len; + const char *s; + char *colon; + bool is_same; + bool has_failed; + int ret; + int n; + int i; + + has_failed = (server->last_failed_ts + SP_AP_AVOID_SECS > time(NULL)); + + if (! (json_object_object_get_ex(jresponse, key, &list) || json_object_get_type(list) == json_type_array)) + RETURN_ERROR(SP_ERR_NOCONNECTION, "No address list in response from access point resolver"); + + n = json_object_array_length(list); + for (i = 0, s = NULL; i < n && !s; i++) + { + instance = json_object_array_get_idx(list, i); + if (! (instance && json_object_get_type(instance) == json_type_string)) + RETURN_ERROR(SP_ERR_NOCONNECTION, "Unexpected data in response from access point resolver"); + + s = json_object_get_string(instance); // This string includes the port + address_len = strlen(server->address); + is_same = (address_len > 0) && (strncmp(s, server->address, address_len) == 0); + + if (is_same && has_failed) + s = NULL; // This AP has failed on us recently, so avoid + } + + if (!s) + RETURN_ERROR(SP_ERR_NOCONNECTION, "Response from access port resolver had no valid servers"); + + if (!is_same) + { + memset(server, 0, sizeof(struct sp_server)); + ret = snprintf(server->address, sizeof(server->address), "%s", s); + if (ret < 0 || ret >= sizeof(server->address)) + RETURN_ERROR(SP_ERR_INVALID, "AP resolver returned an address that is too long"); + + colon = strchr(server->address, ':'); + if (colon) + *colon = '\0'; + + server->port = colon ? (unsigned short)atoi(colon + 1) : 443; + } + + server->last_resolved_ts = time(NULL); + return SP_OK_DONE; + + error: + return ret; +} + +static enum sp_error +handle_ap_resolve(struct sp_message *msg, struct sp_session *session) +{ + struct http_response *hres = &msg->payload.hres; + json_object *jresponse = NULL; int ret; - apresponse = apresponse_message__unpack(NULL, msg_len - header_len, msg + header_len); + if (hres->code != HTTP_OK) + RETURN_ERROR(SP_ERR_NOCONNECTION, "AP resolver returned an error"); + + jresponse = json_tokener_parse((char *)hres->body); + if (!jresponse) + RETURN_ERROR(SP_ERR_NOCONNECTION, "Could not parse reply from access point resolver"); + + ret = resolve_server_info_set(&session->accesspoint, "accesspoint", jresponse); + if (ret < 0) + goto error; + + ret = resolve_server_info_set(&session->spclient, "spclient", jresponse); + if (ret < 0) + goto error; + + ret = resolve_server_info_set(&session->dealer, "dealer", jresponse); + if (ret < 0) + goto error; + + json_object_put(jresponse); + return SP_OK_DONE; + + error: + json_object_put(jresponse); + return ret; +} + +static enum sp_error +handle_client_hello(struct sp_message *msg, struct sp_session *session) +{ + uint8_t *payload = msg->payload.tmsg.data; + size_t payload_len = msg->payload.tmsg.len; + APResponseMessage *apresponse; + struct sp_connection *conn = &session->conn; + int ret; + + // The first 4 bytes should be the size of the message + if (payload_len < 4) + RETURN_ERROR(SP_ERR_INVALID, "Invalid apresponse from access point"); + + apresponse = apresponse_message__unpack(NULL, payload_len - 4, payload + 4); if (!apresponse) RETURN_ERROR(SP_ERR_INVALID, "Could not unpack apresponse from access point"); @@ -597,7 +733,7 @@ response_client_hello(uint8_t *msg, size_t msg_len, struct sp_session *session) } static enum sp_error -response_apwelcome(uint8_t *payload, size_t payload_len, struct sp_session *session) +handle_apwelcome(uint8_t *payload, size_t payload_len, struct sp_session *session) { APWelcome *apwelcome; int ret; @@ -627,7 +763,7 @@ response_apwelcome(uint8_t *payload, size_t payload_len, struct sp_session *sess } static enum sp_error -response_aplogin_failed(uint8_t *payload, size_t payload_len, struct sp_session *session) +handle_aplogin_failed(uint8_t *payload, size_t payload_len, struct sp_session *session) { APLoginFailed *aplogin_failed; @@ -638,15 +774,7 @@ response_aplogin_failed(uint8_t *payload, size_t payload_len, struct sp_session return SP_ERR_LOGINFAILED; } - sp_errmsg = "(unknown login error)"; - for (int i = 0; i < sizeof(sp_login_errors)/sizeof(sp_login_errors[0]); i++) - { - if (sp_login_errors[i].errorcode != aplogin_failed->error_code) - continue; - - sp_errmsg = sp_login_errors[i].errmsg; - break; - } + sp_errmsg = err2txt(aplogin_failed->error_code, sp_login_errors, ARRAY_SIZE(sp_login_errors)); aplogin_failed__free_unpacked(aplogin_failed, NULL); @@ -654,7 +782,7 @@ response_aplogin_failed(uint8_t *payload, size_t payload_len, struct sp_session } static enum sp_error -response_chunk_res(uint8_t *payload, size_t payload_len, struct sp_session *session) +handle_chunk_res(uint8_t *payload, size_t payload_len, struct sp_session *session) { struct sp_channel *channel; uint16_t channel_id; @@ -679,7 +807,7 @@ response_chunk_res(uint8_t *payload, size_t payload_len, struct sp_session *sess } static enum sp_error -response_aes_key(uint8_t *payload, size_t payload_len, struct sp_session *session) +handle_aes_key(uint8_t *payload, size_t payload_len, struct sp_session *session) { struct sp_channel *channel; const char *errmsg; @@ -711,7 +839,7 @@ response_aes_key(uint8_t *payload, size_t payload_len, struct sp_session *sessio } static enum sp_error -response_aes_key_error(uint8_t *payload, size_t payload_len, struct sp_session *session) +handle_aes_key_error(uint8_t *payload, size_t payload_len, struct sp_session *session) { sp_errmsg = "Did not get key for decrypting track"; @@ -723,7 +851,7 @@ response_aes_key_error(uint8_t *payload, size_t payload_len, struct sp_session * // (see response_cb) retry with another access point. An example of this issue // is here https://github.com/librespot-org/librespot/issues/972 static enum sp_error -response_channel_error(uint8_t *payload, size_t payload_len, struct sp_session *session) +handle_channel_error(uint8_t *payload, size_t payload_len, struct sp_session *session) { sp_errmsg = "The accces point returned a channel error"; @@ -731,7 +859,7 @@ response_channel_error(uint8_t *payload, size_t payload_len, struct sp_session * } static enum sp_error -response_mercury_req(uint8_t *payload, size_t payload_len, struct sp_session *session) +handle_mercury_req(uint8_t *payload, size_t payload_len, struct sp_session *session) { struct sp_mercury mercury = { 0 }; struct sp_channel *channel; @@ -768,7 +896,7 @@ response_mercury_req(uint8_t *payload, size_t payload_len, struct sp_session *se } static enum sp_error -response_ping(uint8_t *payload, size_t payload_len, struct sp_session *session) +handle_ping(uint8_t *payload, size_t payload_len, struct sp_session *session) { msg_pong(session); @@ -776,46 +904,297 @@ response_ping(uint8_t *payload, size_t payload_len, struct sp_session *session) } static enum sp_error -response_generic(uint8_t *msg, size_t msg_len, struct sp_session *session) +handle_clienttoken(struct sp_message *msg, struct sp_session *session) { - enum sp_cmd_type cmd; - uint8_t *payload; - size_t payload_len; + struct http_response *hres = &msg->payload.hres; + struct sp_token *token = &session->http_clienttoken; + Spotify__Clienttoken__Http__V0__ClientTokenResponse *response = NULL; int ret; - cmd = msg[0]; - payload = msg + 3; - payload_len = msg_len - 3 - 4; + if (hres->code != HTTP_OK) + RETURN_ERROR(SP_ERR_INVALID, "Request to clienttoken returned an error"); + + response = spotify__clienttoken__http__v0__client_token_response__unpack(NULL, hres->body_len, hres->body); + if (!response) + RETURN_ERROR(SP_ERR_INVALID, "Could not parse clienttoken response"); + + if (response->response_type == SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE_TYPE__RESPONSE_GRANTED_TOKEN_RESPONSE) + { + ret = snprintf(token->value, sizeof(token->value), "%s", response->granted_token->token); + if (ret < 0 || ret >= sizeof(token->value)) + RETURN_ERROR(SP_ERR_INVALID, "Unexpected clienttoken length"); + + token->expires_after_seconds = response->granted_token->expires_after_seconds; + token->refresh_after_seconds = response->granted_token->refresh_after_seconds; + token->received_ts = time(NULL); + } + else if (response->response_type == SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE_TYPE__RESPONSE_CHALLENGES_RESPONSE) + RETURN_ERROR(SP_ERR_INVALID, "Unsupported clienttoken response"); + else + RETURN_ERROR(SP_ERR_INVALID, "Unknown clienttoken response"); + + spotify__clienttoken__http__v0__client_token_response__free_unpacked(response, NULL); + return SP_OK_DONE; + + error: + spotify__clienttoken__http__v0__client_token_response__free_unpacked(response, NULL); + return ret; +} + +static void +hashcash_challenges_free(struct crypto_hashcash_challenge **challenges, int *n_challenges) +{ + for (int i = 0; i < *n_challenges; i++) + free(challenges[i]->ctx); + + free(*challenges); + *challenges = NULL; + *n_challenges = 0; +} + +static enum sp_error +handle_login5_challenges(Spotify__Login5__V3__Challenges *challenges, uint8_t *login_ctx, size_t login_ctx_len, struct sp_session *session) +{ + Spotify__Login5__V3__Challenge *this_challenge; + struct crypto_hashcash_challenge *crypto_challenge; + int ret; + int i; + + session->n_hashcash_challenges = challenges->n_challenges; + session->hashcash_challenges = calloc(challenges->n_challenges, sizeof(struct crypto_hashcash_challenge)); + + for (i = 0, crypto_challenge = session->hashcash_challenges; i < session->n_hashcash_challenges; i++, crypto_challenge++) + { + this_challenge = challenges->challenges[i]; + + if (this_challenge->challenge_case != SPOTIFY__LOGIN5__V3__CHALLENGE__CHALLENGE_HASHCASH) + RETURN_ERROR(SP_ERR_INVALID, "Received unsupported login5 challenge"); + + if (this_challenge->hashcash->prefix.len != sizeof(crypto_challenge->prefix)) + RETURN_ERROR(SP_ERR_INVALID, "Received hashcash challenge with unexpected prefix length"); + + crypto_challenge->ctx_len = login_ctx_len; + crypto_challenge->ctx = malloc(login_ctx_len); + memcpy(crypto_challenge->ctx, login_ctx, login_ctx_len); + + memcpy(crypto_challenge->prefix, this_challenge->hashcash->prefix.data, sizeof(crypto_challenge->prefix)); + crypto_challenge->wanted_zero_bits = this_challenge->hashcash->length; + crypto_challenge->max_iterations = HASHCASH_ITERATIONS_MAX; + + } + + return SP_OK_DONE; + + error: + hashcash_challenges_free(&session->hashcash_challenges, &session->n_hashcash_challenges); + return ret; +} + +static enum sp_error +handle_login5(struct sp_message *msg, struct sp_session *session) +{ + struct http_response *hres = &msg->payload.hres; + struct sp_token *token = &session->http_accesstoken; + Spotify__Login5__V3__LoginResponse *response = NULL; + int ret; + int i; + + if (hres->code != HTTP_OK) + RETURN_ERROR(SP_ERR_INVALID, "Request to login5 returned an error"); + + response = spotify__login5__v3__login_response__unpack(NULL, hres->body_len, hres->body); + if (!response) + RETURN_ERROR(SP_ERR_INVALID, "Could not parse login5 response"); + + for (i = 0; i < response->n_warnings; i++) + sp_cb.logmsg("Got login5 warning '%s'", err2txt(response->warnings[i], sp_login5_warning_map, ARRAY_SIZE(sp_login5_warning_map))); + + switch (response->response_case) + { + case SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__RESPONSE_OK: + ret = snprintf(token->value, sizeof(token->value), "%s", response->ok->access_token); + if (ret < 0 || ret >= sizeof(token->value)) + RETURN_ERROR(SP_ERR_INVALID, "Unexpected access_token length"); + + token->expires_after_seconds = response->ok->access_token_expires_in; + token->received_ts = time(NULL); + break; + case SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__RESPONSE_CHALLENGES: + sp_cb.logmsg("Login %zu challenges\n", response->challenges->n_challenges); + ret = handle_login5_challenges(response->challenges, response->login_context.data, response->login_context.len, session); + if (ret != SP_OK_DONE) + goto error; + break; + case SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__RESPONSE_ERROR: + RETURN_ERROR(SP_ERR_LOGINFAILED, err2txt(response->error, sp_login5_error_map, ARRAY_SIZE(sp_login5_error_map))); + default: + RETURN_ERROR(SP_ERR_LOGINFAILED, "Login5 failed with unknown error type"); + } + + spotify__login5__v3__login_response__free_unpacked(response, NULL); + return SP_OK_DONE; + + error: + spotify__login5__v3__login_response__free_unpacked(response, NULL); + return ret; +} + +static enum sp_error +handle_metadata_get(struct sp_message *msg, struct sp_session *session) +{ + struct http_response *hres = &msg->payload.hres; + struct sp_channel *channel = session->now_streaming_channel; + Track *response = NULL; + int ret; + + if (hres->code != HTTP_OK) + RETURN_ERROR(SP_ERR_INVALID, "Request for metadata returned an error"); + + // FIXME Use Episode object for file.media_type == SP_MEDIA_EPISODE + response = track__unpack(NULL, hres->body_len, hres->body); + if (!response) + RETURN_ERROR(SP_ERR_INVALID, "Could not parse metadata response"); + + ret = file_select(channel->file.id, sizeof(channel->file.id), response, session->bitrate_preferred); + if (ret < 0) + RETURN_ERROR(SP_ERR_INVALID, "Could not find track data"); + + track__free_unpacked(response, NULL); + return SP_OK_DONE; + + error: + track__free_unpacked(response, NULL); + return ret; +} + +static enum sp_error +handle_storage_resolve(struct sp_message *msg, struct sp_session *session) +{ + struct http_response *hres = &msg->payload.hres; + Spotify__Download__Proto__StorageResolveResponse *response = NULL; + struct sp_channel *channel = session->now_streaming_channel; + int i; + int ret; + + if (hres->code != HTTP_OK) + RETURN_ERROR(SP_ERR_INVALID, "Request to storage-resolve returned an error"); + + response = spotify__download__proto__storage_resolve_response__unpack(NULL, hres->body_len, hres->body); + if (!response) + RETURN_ERROR(SP_ERR_INVALID, "Could not parse storage-resolve response"); + + switch (response->result) + { + case SPOTIFY__DOWNLOAD__PROTO__STORAGE_RESOLVE_RESPONSE__RESULT__CDN: + for (i = 0; i < response->n_cdnurl && i < ARRAY_SIZE(channel->file.cdnurl); i++) + channel->file.cdnurl[i] = strdup(response->cdnurl[i]); + break; + case SPOTIFY__DOWNLOAD__PROTO__STORAGE_RESOLVE_RESPONSE__RESULT__STORAGE: + RETURN_ERROR(SP_ERR_INVALID, "Track not available via CDN storage"); + case SPOTIFY__DOWNLOAD__PROTO__STORAGE_RESOLVE_RESPONSE__RESULT__RESTRICTED: + RETURN_ERROR(SP_ERR_INVALID, "Can't resolve storage, track access restricted"); + default: + RETURN_ERROR(SP_ERR_INVALID, "Can't resolve storage, unknown error"); + } + + spotify__download__proto__storage_resolve_response__free_unpacked(response, NULL); + return SP_OK_DONE; + + error: + spotify__download__proto__storage_resolve_response__free_unpacked(response, NULL); + return ret; +} + +static int +file_size_get(struct sp_channel *channel, struct http_response *hres) +{ + char *content_range; + const char *colon; + int sz; + + content_range = http_response_header_find("Content-Range", hres); + if (!content_range || !(colon = strchr(content_range, '/'))) + return -1; + + sz = atoi(colon + 1); + if (sz <= 0) + return -1; + + channel->file.len_bytes = sz; + return 0; +} + +// Ref. chunked_reader.go +static enum sp_error +handle_media_get(struct sp_message *msg, struct sp_session *session) +{ + struct http_response *hres = &msg->payload.hres; + struct sp_channel *channel = session->now_streaming_channel; + int ret; + + if (hres->code != HTTP_PARTIALCONTENT) + RETURN_ERROR(SP_ERR_NOCONNECTION, "Request for Spotify media returned an error"); + + if (channel->file.len_bytes == 0 && file_size_get(channel, hres) < 0) + RETURN_ERROR(SP_ERR_INVALID, "Invalid content-range, can't determine media size"); + + sp_cb.logmsg("Received %zu bytes, size is %d\n", hres->body_len, channel->file.len_bytes); + + // Not sure if the channel concept even makes sense for http, but nonetheless + // we use it to stay consistent with the old tcp protocol + ret = channel_http_body_read(channel, hres->body, hres->body_len); + if (ret < 0) + goto error; + + // Save any audio data to a buffer that will be written to audio_fd[1] when + // it is writable. Note that request for next chunk will also happen then. + evbuffer_add(channel->audio_buf, channel->body.data, channel->body.data_len); + + return SP_OK_DATA; + + error: + return ret; +} + +static enum sp_error +handle_tcp_generic(struct sp_message *msg, struct sp_session *session) +{ + uint8_t *data = msg->payload.tmsg.data; + size_t data_len = msg->payload.tmsg.len; + enum sp_cmd_type cmd = data[0]; + uint8_t *payload = data + 3; + size_t payload_len = data_len - 3 - 4; + int ret; switch (cmd) { case CmdAPWelcome: - ret = response_apwelcome(payload, payload_len, session); + ret = handle_apwelcome(payload, payload_len, session); break; case CmdAuthFailure: - ret = response_aplogin_failed(payload, payload_len, session); + ret = handle_aplogin_failed(payload, payload_len, session); break; case CmdPing: - ret = response_ping(payload, payload_len, session); + ret = handle_ping(payload, payload_len, session); break; case CmdStreamChunkRes: - ret = response_chunk_res(payload, payload_len, session); + ret = handle_chunk_res(payload, payload_len, session); break; case CmdCountryCode: memcpy(session->country, payload, sizeof(session->country) - 1); ret = SP_OK_OTHER; break; case CmdAesKey: - ret = response_aes_key(payload, payload_len, session); + ret = handle_aes_key(payload, payload_len, session); break; case CmdAesKeyError: - ret = response_aes_key_error(payload, payload_len, session); + ret = handle_aes_key_error(payload, payload_len, session); break; case CmdMercuryReq: - ret = response_mercury_req(payload, payload_len, session); + ret = handle_mercury_req(payload, payload_len, session); break; case CmdChannelError: - ret = response_channel_error(payload, payload_len, session); + ret = handle_channel_error(payload, payload_len, session); break; case CmdLegacyWelcome: // 0 bytes, ignored by librespot case CmdSecretBlock: // ignored by librespot @@ -829,8 +1208,59 @@ response_generic(uint8_t *msg, size_t msg_len, struct sp_session *session) } static enum sp_error -msg_read_one(uint8_t **out, size_t *out_len, uint8_t *in, size_t in_len, struct sp_connection *conn) +msg_tcp_handle(struct sp_message *msg, struct sp_session *session) { + struct sp_seq_request *request = session->request; + + // We have a tcp request waiting for a response + if (request && request->proto == SP_PROTO_TCP && request->response_handler) + { +// sp_cb.logmsg("Handling response to %s\n", request->name); + return request->response_handler(msg, session); + } + +// sp_cb.logmsg("Handling incoming tcp message\n"); + // Not waiting for anything, could be a ping + return handle_tcp_generic(msg, session); +} + +static enum sp_error +msg_http_handle(struct sp_message *msg, struct sp_session *session) +{ + struct sp_seq_request *request = session->request; + + // We have a http request waiting for a response + if (request && request->proto == SP_PROTO_HTTP && request->response_handler) + { +// sp_cb.logmsg("Handling response to %s\n", request->name); + return request->response_handler(msg, session); + } + + sp_errmsg = "Received unexpected http response"; + return SP_ERR_INVALID; +} + +// Handler must return SP_OK_DONE if the message is a response to a request. +// It must return SP_OK_OTHER if the message is something else (e.g. a ping), +// SP_ERR_xxx if the response indicates an error. Finally, SP_OK_DATA is like +// DONE except it also means that there is new audio data to write. +enum sp_error +msg_handle(struct sp_message *msg, struct sp_session *session) +{ + if (msg->type == SP_MSG_TYPE_TCP) + return msg_tcp_handle(msg, session); + else if (msg->type == SP_MSG_TYPE_HTTP_RES) + return msg_http_handle(msg, session); + + sp_errmsg = "Invalid message passed to msg_handle()"; + return SP_ERR_INVALID; +} + +enum sp_error +msg_tcp_read_one(struct sp_tcp_message *tmsg, struct sp_connection *conn) +{ + size_t in_len = evbuffer_get_length(conn->incoming); + uint8_t *in = evbuffer_pullup(conn->incoming, -1); uint32_t be32; ssize_t msg_len; int ret; @@ -844,9 +1274,9 @@ msg_read_one(uint8_t **out, size_t *out_len, uint8_t *in, size_t in_len, struct if (msg_len > in_len) return SP_OK_WAIT; - *out = malloc(msg_len); - *out_len = msg_len; - evbuffer_remove(conn->incoming, *out, msg_len); + tmsg->data = malloc(msg_len); + tmsg->len = msg_len; + evbuffer_remove(conn->incoming, tmsg->data, msg_len); return SP_OK_DONE; } @@ -877,9 +1307,9 @@ msg_read_one(uint8_t **out, size_t *out_len, uint8_t *in, size_t in_len, struct } // At this point we have a complete, decrypted message. - *out = malloc(msg_len); - *out_len = msg_len; - evbuffer_remove(conn->incoming, *out, msg_len); + tmsg->data = malloc(msg_len); + tmsg->len = msg_len; + evbuffer_remove(conn->incoming, tmsg->data, msg_len); return SP_OK_DONE; @@ -887,51 +1317,26 @@ msg_read_one(uint8_t **out, size_t *out_len, uint8_t *in, size_t in_len, struct return ret; } -enum sp_error -response_read(struct sp_session *session) -{ - struct sp_connection *conn = &session->conn; - uint8_t *in; - size_t in_len; - uint8_t *msg; - size_t msg_len; - int ret; - - in_len = evbuffer_get_length(conn->incoming); - in = evbuffer_pullup(conn->incoming, -1); - - ret = msg_read_one(&msg, &msg_len, in, in_len, conn); - if (ret != SP_OK_DONE) - goto error; - - if (msg_len < 128) - sp_cb.hexdump("Received message\n", msg, msg_len); - else - sp_cb.hexdump("Received message (truncated)\n", msg, 128); - - if (!session->response_handler) - RETURN_ERROR(SP_ERR_INVALID, "Unexpected response from Spotify, aborting"); - - // Handler must return SP_OK_DONE if the message is a response to a request. - // It must return SP_OK_OTHER if the message is something else (e.g. a ping), - // SP_ERR_xxx if the response indicates an error. Finally, SP_OK_DATA is like - // DONE except it also means that there is new audio data to write. - ret = session->response_handler(msg, msg_len, session); - free(msg); - - return ret; - - error: - return ret; -} - /* --------------------------- Outgoing messages ---------------------------- */ -// This message is constructed like librespot does it, see handshake.rs -static ssize_t -msg_make_client_hello(uint8_t *out, size_t out_len, struct sp_session *session) +static int +msg_make_ap_resolve(struct sp_message *msg, struct sp_session *session) { + struct http_request *hreq = &msg->payload.hreq; + + if (!must_resolve(&session->accesspoint) && !must_resolve(&session->spclient) && !must_resolve(&session->dealer)) + return 1; // Skip + + hreq->url = strdup("https://apresolve.spotify.com/?type=accesspoint&type=spclient&type=dealer"); + return 0; +} + +// This message is constructed like librespot does it, see handshake.rs +static int +msg_make_client_hello(struct sp_message *msg, struct sp_session *session) +{ + struct sp_tcp_message *tmsg = &msg->payload.tmsg; ClientHello client_hello = CLIENT_HELLO__INIT; BuildInfo build_info = BUILD_INFO__INIT; LoginCryptoHelloUnion login_crypto = LOGIN_CRYPTO_HELLO_UNION__INIT; @@ -939,7 +1344,6 @@ msg_make_client_hello(uint8_t *out, size_t out_len, struct sp_session *session) Cryptosuite crypto_suite = CRYPTOSUITE__CRYPTO_SUITE_SHANNON; uint8_t padding[1] = { 0x1e }; uint8_t nonce[16] = { 0 }; - size_t len; build_info.product = PRODUCT__PRODUCT_PARTNER; build_info.platform = PLATFORM__PLATFORM_LINUX_X86; @@ -961,13 +1365,14 @@ msg_make_client_hello(uint8_t *out, size_t out_len, struct sp_session *session) client_hello.padding.len = sizeof(padding); client_hello.padding.data = padding; - len = client_hello__get_packed_size(&client_hello); - if (len > out_len) - return -1; + tmsg->len = client_hello__get_packed_size(&client_hello); + tmsg->data = malloc(tmsg->len); - client_hello__pack(&client_hello, out); + client_hello__pack(&client_hello, tmsg->data); - return len; + tmsg->add_version_header = true; + + return 0; } static int @@ -992,15 +1397,15 @@ client_response_crypto(uint8_t **challenge, size_t *challenge_len, struct sp_con return ret; } -static ssize_t -msg_make_client_response_plaintext(uint8_t *out, size_t out_len, struct sp_session *session) +static int +msg_make_client_response_plaintext(struct sp_message *msg, struct sp_session *session) { + struct sp_tcp_message *tmsg = &msg->payload.tmsg; ClientResponsePlaintext client_response = CLIENT_RESPONSE_PLAINTEXT__INIT; LoginCryptoResponseUnion login_crypto_response = LOGIN_CRYPTO_RESPONSE_UNION__INIT; LoginCryptoDiffieHellmanResponse diffie_hellman = LOGIN_CRYPTO_DIFFIE_HELLMAN_RESPONSE__INIT; uint8_t *challenge; size_t challenge_len; - ssize_t len; int ret; ret = client_response_crypto(&challenge, &challenge_len, &session->conn); @@ -1014,28 +1419,24 @@ msg_make_client_response_plaintext(uint8_t *out, size_t out_len, struct sp_sessi client_response.login_crypto_response = &login_crypto_response; - len = client_response_plaintext__get_packed_size(&client_response); - if (len > out_len) - { - free(challenge); - return -1; - } + tmsg->len = client_response_plaintext__get_packed_size(&client_response); + tmsg->data = malloc(tmsg->len); - client_response_plaintext__pack(&client_response, out); + client_response_plaintext__pack(&client_response, tmsg->data); free(challenge); - return len; + return 0; } -static ssize_t -msg_make_client_response_encrypted(uint8_t *out, size_t out_len, struct sp_session *session) +static int +msg_make_client_response_encrypted(struct sp_message *msg, struct sp_session *session) { + struct sp_tcp_message *tmsg = &msg->payload.tmsg; ClientResponseEncrypted client_response = CLIENT_RESPONSE_ENCRYPTED__INIT; LoginCredentials login_credentials = LOGIN_CREDENTIALS__INIT; SystemInfo system_info = SYSTEM_INFO__INIT; char system_information_string[64]; char version_string[64]; - ssize_t len; login_credentials.has_auth_data = 1; login_credentials.username = session->credentials.username; @@ -1076,21 +1477,23 @@ msg_make_client_response_encrypted(uint8_t *out, size_t out_len, struct sp_sessi client_response.system_info = &system_info; client_response.version_string = version_string; - len = client_response_encrypted__get_packed_size(&client_response); - if (len > out_len) - return -1; + tmsg->len = client_response_encrypted__get_packed_size(&client_response); + tmsg->data = malloc(tmsg->len); - client_response_encrypted__pack(&client_response, out); + client_response_encrypted__pack(&client_response, tmsg->data); - return len; + tmsg->cmd = CmdLogin; + tmsg->encrypt = true; + + return 0; } // From librespot-golang: // Mercury is the protocol implementation for Spotify Connect playback control and metadata fetching. It works as a // PUB/SUB system, where you, as an audio sink, subscribes to the events of a specified user (playlist changes) but // also access various metadata normally fetched by external players (tracks metadata, playlists, artists, etc). -static ssize_t -msg_make_mercury_req(uint8_t *out, size_t out_len, struct sp_mercury *mercury) +static int +msg_make_mercury_req(size_t *total_len, uint8_t *out, size_t out_len, struct sp_mercury *mercury) { Header header = HEADER__INIT; uint8_t *ptr; @@ -1158,12 +1561,14 @@ msg_make_mercury_req(uint8_t *out, size_t out_len, struct sp_mercury *mercury) assert(ptr - out == header_len + prefix_len + body_len); - return header_len + prefix_len + body_len; + *total_len = header_len + prefix_len + body_len; + return 0; } -static ssize_t -msg_make_mercury_track_get(uint8_t *out, size_t out_len, struct sp_session *session) +static int +msg_make_mercury_track_get(struct sp_message *msg, struct sp_session *session) { + struct sp_tcp_message *tmsg = &msg->payload.tmsg; struct sp_mercury mercury = { 0 }; struct sp_channel *channel = session->now_streaming_channel; char uri[256]; @@ -1182,12 +1587,17 @@ msg_make_mercury_track_get(uint8_t *out, size_t out_len, struct sp_session *sess mercury.seq = channel->id; mercury.uri = uri; - return msg_make_mercury_req(out, out_len, &mercury); + tmsg->data = malloc(MERCURY_REQ_SIZE_MAX); + tmsg->cmd = CmdMercuryReq; + tmsg->encrypt = true; + + return msg_make_mercury_req(&tmsg->len, tmsg->data, MERCURY_REQ_SIZE_MAX, &mercury); } -static ssize_t -msg_make_mercury_episode_get(uint8_t *out, size_t out_len, struct sp_session *session) +static int +msg_make_mercury_episode_get(struct sp_message *msg, struct sp_session *session) { + struct sp_tcp_message *tmsg = &msg->payload.tmsg; struct sp_mercury mercury = { 0 }; struct sp_channel *channel = session->now_streaming_channel; char uri[256]; @@ -1206,24 +1616,39 @@ msg_make_mercury_episode_get(uint8_t *out, size_t out_len, struct sp_session *se mercury.seq = channel->id; mercury.uri = uri; - return msg_make_mercury_req(out, out_len, &mercury); + tmsg->data = malloc(MERCURY_REQ_SIZE_MAX); + tmsg->cmd = CmdMercuryReq; + tmsg->encrypt = true; + + return msg_make_mercury_req(&tmsg->len, tmsg->data, MERCURY_REQ_SIZE_MAX, &mercury); } -static ssize_t -msg_make_audio_key_get(uint8_t *out, size_t out_len, struct sp_session *session) +static int +msg_make_mercury_metadata_get(struct sp_message *msg, struct sp_session *session) { struct sp_channel *channel = session->now_streaming_channel; - size_t required_len; + + if (channel->file.media_type == SP_MEDIA_TRACK) + return msg_make_mercury_track_get(msg, session); + else if (channel->file.media_type == SP_MEDIA_EPISODE) + return msg_make_mercury_episode_get(msg, session); + + return -1; +} + +static int +msg_make_audio_key_get(struct sp_message *msg, struct sp_session *session) +{ + struct sp_tcp_message *tmsg = &msg->payload.tmsg; + struct sp_channel *channel = session->now_streaming_channel; + uint8_t *ptr; uint32_t be32; uint16_t be; - uint8_t *ptr; - required_len = sizeof(channel->file.id) + sizeof(channel->file.media_id) + sizeof(be32) + sizeof(be); + tmsg->len = sizeof(channel->file.id) + sizeof(channel->file.media_id) + sizeof(be32) + sizeof(be); + tmsg->data = malloc(tmsg->len); - if (required_len > out_len) - return -1; - - ptr = out; + ptr = tmsg->data; memcpy(ptr, channel->file.id, sizeof(channel->file.id)); ptr += sizeof(channel->file.id); @@ -1239,26 +1664,28 @@ msg_make_audio_key_get(uint8_t *out, size_t out_len, struct sp_session *session) memcpy(ptr, &be, sizeof(be)); ptr += sizeof(be); - return required_len; + tmsg->cmd = CmdRequestKey; + tmsg->encrypt = true; + + return 0; } -static ssize_t -msg_make_chunk_request(uint8_t *out, size_t out_len, struct sp_session *session) +static int +msg_make_chunk_request(struct sp_message *msg, struct sp_session *session) { + struct sp_tcp_message *tmsg = &msg->payload.tmsg; struct sp_channel *channel = session->now_streaming_channel; uint8_t *ptr; uint16_t be; uint32_t be32; - size_t required_len; if (!channel) return -1; - ptr = out; + tmsg->len = 3 * sizeof(be) + sizeof(channel->file.id) + 5 * sizeof(be32); + tmsg->data = malloc(tmsg->len); - required_len = 3 * sizeof(be) + sizeof(channel->file.id) + 5 * sizeof(be32); - if (required_len > out_len) - return -1; + ptr = tmsg->data; be = htobe16(channel->id); memcpy(ptr, &be, sizeof(be)); @@ -1287,104 +1714,490 @@ msg_make_chunk_request(uint8_t *out, size_t out_len, struct sp_session *session) memcpy(ptr, channel->file.id, sizeof(channel->file.id)); ptr += sizeof(channel->file.id); - be32 = htobe32(channel->file.offset_words); + be32 = htobe32(channel->file.offset_bytes / 4); memcpy(ptr, &be32, sizeof(be32)); ptr += sizeof(be32); // x4 - be32 = htobe32(channel->file.offset_words + SP_CHUNK_LEN_WORDS); + be32 = htobe32(channel->file.offset_bytes / 4 + SP_CHUNK_LEN / 4); memcpy(ptr, &be32, sizeof(be32)); ptr += sizeof(be32); // x5 - assert(required_len == ptr - out); - assert(required_len == 46); + assert(tmsg->len == ptr - tmsg->data); + assert(tmsg->len == 46); - return required_len; + tmsg->cmd = CmdStreamChunk; + tmsg->encrypt = true; + + return 0; } -bool -msg_is_handshake(enum sp_msg_type type) +static int +msg_make_pong(struct sp_message *msg, struct sp_session *session) { - return ( type == MSG_TYPE_CLIENT_HELLO || - type == MSG_TYPE_CLIENT_RESPONSE_PLAINTEXT || - type == MSG_TYPE_CLIENT_RESPONSE_ENCRYPTED ); + struct sp_tcp_message *tmsg = &msg->payload.tmsg; + + tmsg->len = 4; + tmsg->data = calloc(1, tmsg->len); // librespot just replies with zeroes + + tmsg->cmd = CmdPong; + tmsg->encrypt = true; + + return 0; } -int -msg_make(struct sp_message *msg, enum sp_msg_type type, struct sp_session *session) +// Ref. session/clienttoken.go +static int +msg_make_clienttoken(struct sp_message *msg, struct sp_session *session) { - memset(msg, 0, sizeof(struct sp_message)); - msg->type = type; + struct http_request *hreq = &msg->payload.hreq; + Spotify__Clienttoken__Http__V0__ClientTokenRequest treq = SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST__INIT; + Spotify__Clienttoken__Http__V0__ClientDataRequest dreq = SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_DATA_REQUEST__INIT; + Spotify__Clienttoken__Data__V0__ConnectivitySdkData sdk_data = SPOTIFY__CLIENTTOKEN__DATA__V0__CONNECTIVITY_SDK_DATA__INIT; + Spotify__Clienttoken__Data__V0__PlatformSpecificData platform_data = SPOTIFY__CLIENTTOKEN__DATA__V0__PLATFORM_SPECIFIC_DATA__INIT; + struct sp_token *token = &session->http_clienttoken; + time_t now = time(NULL); + bool must_refresh; - switch (type) + must_refresh = (now > token->received_ts + token->expires_after_seconds) || (now > token->received_ts + token->refresh_after_seconds); + if (!must_refresh) + return 1; // We have a valid token, tell caller to go to next request + +#ifdef HAVE_SYS_UTSNAME_H + Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData desktop_macos = SPOTIFY__CLIENTTOKEN__DATA__V0__NATIVE_DESKTOP_MAC_OSDATA__INIT; + Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData desktop_linux = SPOTIFY__CLIENTTOKEN__DATA__V0__NATIVE_DESKTOP_LINUX_DATA__INIT; + struct utsname uts = { 0 }; + + uname(&uts); + if (strcmp(uts.sysname, "Linux") == 0) { - case MSG_TYPE_CLIENT_HELLO: - msg->len = msg_make_client_hello(msg->data, sizeof(msg->data), session); - msg->type_next = MSG_TYPE_CLIENT_RESPONSE_PLAINTEXT; - msg->add_version_header = true; - msg->response_handler = response_client_hello; - break; - case MSG_TYPE_CLIENT_RESPONSE_PLAINTEXT: - msg->len = msg_make_client_response_plaintext(msg->data, sizeof(msg->data), session); - msg->type_next = MSG_TYPE_CLIENT_RESPONSE_ENCRYPTED; - msg->response_handler = NULL; // No response expected - break; - case MSG_TYPE_CLIENT_RESPONSE_ENCRYPTED: - msg->len = msg_make_client_response_encrypted(msg->data, sizeof(msg->data), session); - msg->cmd = CmdLogin; - msg->encrypt = true; - msg->response_handler = response_generic; - break; - case MSG_TYPE_MERCURY_TRACK_GET: - msg->len = msg_make_mercury_track_get(msg->data, sizeof(msg->data), session); - msg->cmd = CmdMercuryReq; - msg->encrypt = true; - msg->type_next = MSG_TYPE_AUDIO_KEY_GET; - msg->response_handler = response_generic; - break; - case MSG_TYPE_MERCURY_EPISODE_GET: - msg->len = msg_make_mercury_episode_get(msg->data, sizeof(msg->data), session); - msg->cmd = CmdMercuryReq; - msg->encrypt = true; - msg->type_next = MSG_TYPE_AUDIO_KEY_GET; - msg->response_handler = response_generic; - break; - case MSG_TYPE_AUDIO_KEY_GET: - msg->len = msg_make_audio_key_get(msg->data, sizeof(msg->data), session); - msg->cmd = CmdRequestKey; - msg->encrypt = true; - msg->type_next = MSG_TYPE_CHUNK_REQUEST; - msg->response_handler = response_generic; - break; - case MSG_TYPE_CHUNK_REQUEST: - msg->len = msg_make_chunk_request(msg->data, sizeof(msg->data), session); - msg->cmd = CmdStreamChunk; - msg->encrypt = true; - msg->response_handler = response_generic; - break; - case MSG_TYPE_PONG: - msg->len = 4; - msg->cmd = CmdPong; - msg->encrypt = true; - memset(msg->data, 0, msg->len); // librespot just replies with zeroes - break; - default: - msg->len = -1; + desktop_linux.system_name = uts.sysname; + desktop_linux.system_release = uts.release; + desktop_linux.system_version = uts.version; + desktop_linux.hardware = uts.machine; + platform_data.desktop_linux = &desktop_linux; + platform_data.data_case = SPOTIFY__CLIENTTOKEN__DATA__V0__PLATFORM_SPECIFIC_DATA__DATA_DESKTOP_LINUX; + } + else if (strcmp(uts.sysname, "Darwin") == 0) + { + desktop_macos.system_version = uts.version; + desktop_macos.hw_model = uts.machine; + desktop_macos.compiled_cpu_type = uts.machine; + platform_data.desktop_macos = &desktop_macos; + platform_data.data_case = SPOTIFY__CLIENTTOKEN__DATA__V0__PLATFORM_SPECIFIC_DATA__DATA_DESKTOP_MACOS; + } +#endif + + sdk_data.platform_specific_data = &platform_data; + sdk_data.device_id = sp_sysinfo.device_id; // e.g. "bcbae1f3062baac486045f13935c6c95ad4191ff" + + dreq.connectivity_sdk_data = &sdk_data; + dreq.data_case = SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_DATA_REQUEST__DATA_CONNECTIVITY_SDK_DATA; + dreq.client_version = sp_sysinfo.client_version; // e.g. "0.0.0" (SpotifyLikeClient) + dreq.client_id = sp_sysinfo.client_id; + + treq.client_data = &dreq; + treq.request_type = SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST_TYPE__REQUEST_CLIENT_DATA_REQUEST; + treq.request_case = SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST__REQUEST_CLIENT_DATA; + + hreq->body_len = spotify__clienttoken__http__v0__client_token_request__get_packed_size(&treq); + hreq->body = malloc(hreq->body_len); + + spotify__clienttoken__http__v0__client_token_request__pack(&treq, hreq->body); + + hreq->url = strdup("https://clienttoken.spotify.com/v1/clienttoken"); + + hreq->headers[0] = strdup("Accept: application/x-protobuf"); + hreq->headers[1] = strdup("Content-Type: application/x-protobuf"); + + return 0; +} + +static void +challenge_solutions_clear(Spotify__Login5__V3__ChallengeSolutions *solutions) +{ + Spotify__Login5__V3__ChallengeSolution *this_solution; + int i; + + if (!solutions->solutions) + return; + + for (i = 0; i < solutions->n_solutions; i++) + { + this_solution = solutions->solutions[i]; + if (!this_solution) + continue; + + free(this_solution->hashcash->duration); + free(this_solution->hashcash->suffix.data); + free(this_solution->hashcash); + free(this_solution); } - return (msg->len < 0) ? -1 : 0; + free(solutions->solutions); +} + +// Finds solutions to the challenges stored in *challenges and adds them to *solutions +static int +challenge_solutions_append(Spotify__Login5__V3__ChallengeSolutions *solutions, struct crypto_hashcash_challenge *challenges, int n_challenges) +{ + Spotify__Login5__V3__ChallengeSolution *this_solution; + struct crypto_hashcash_challenge *crypto_challenge; + struct crypto_hashcash_solution crypto_solution; + size_t suffix_len = sizeof(crypto_solution.suffix); + int ret; + int i; + + solutions->n_solutions = n_challenges; + solutions->solutions = calloc(n_challenges, sizeof(Spotify__Login5__V3__ChallengeSolution *)); + if (!solutions->solutions) + RETURN_ERROR(SP_ERR_OOM, "Out of memory allocating hashcash solutions"); + + for (i = 0, crypto_challenge = challenges; i < n_challenges; i++, crypto_challenge++) + { + ret = crypto_hashcash_solve(&crypto_solution, crypto_challenge, &sp_errmsg); + if (ret < 0) + RETURN_ERROR(SP_ERR_INVALID, sp_errmsg); + + this_solution = malloc(sizeof(Spotify__Login5__V3__ChallengeSolution)); + spotify__login5__v3__challenge_solution__init(this_solution); + this_solution->solution_case = SPOTIFY__LOGIN5__V3__CHALLENGE_SOLUTION__SOLUTION_HASHCASH; + + this_solution->hashcash = malloc(sizeof(Spotify__Login5__V3__Challenges__HashcashSolution)); + spotify__login5__v3__challenges__hashcash_solution__init(this_solution->hashcash); + + this_solution->hashcash->duration = malloc(sizeof(Google__Protobuf__Duration)); + google__protobuf__duration__init(this_solution->hashcash->duration); + + this_solution->hashcash->suffix.len = suffix_len; + this_solution->hashcash->suffix.data = malloc(suffix_len); + memcpy(this_solution->hashcash->suffix.data, crypto_solution.suffix, suffix_len); + + this_solution->hashcash->duration->seconds = crypto_solution.duration.tv_sec; + this_solution->hashcash->duration->nanos = crypto_solution.duration.tv_nsec; + + solutions->solutions[i] = this_solution; + } + + return 0; + + error: + challenge_solutions_clear(solutions); + return ret; +} + +// Ref. login5/login5.go +static int +msg_make_login5(struct sp_message *msg, struct sp_session *session) +{ + struct http_request *hreq = &msg->payload.hreq; + Spotify__Login5__V3__LoginRequest req = SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__INIT; + Spotify__Login5__V3__ChallengeSolutions solutions = SPOTIFY__LOGIN5__V3__CHALLENGE_SOLUTIONS__INIT; + Spotify__Login5__V3__ClientInfo client_info = SPOTIFY__LOGIN5__V3__CLIENT_INFO__INIT; + Spotify__Login5__V3__Credentials__StoredCredential stored_credential = SPOTIFY__LOGIN5__V3__CREDENTIALS__STORED_CREDENTIAL__INIT; + struct sp_token *token = &session->http_accesstoken; + uint8_t *login_context = NULL; + size_t login_context_len; + time_t now = time(NULL); + bool must_refresh; + int ret; + + must_refresh = (now > token->received_ts + token->expires_after_seconds); + if (!must_refresh) + return 1; // We have a valid token, tell caller to go to next request + + if (session->credentials.stored_cred_len == 0) + return -1; + + // This is our second login5 request - Spotify returned challenges after the first. + // The login_context is echoed from Spotify's response to the first login5. + if (session->hashcash_challenges) + { + login_context_len = session->hashcash_challenges->ctx_len; + login_context = malloc(login_context_len); + memcpy(login_context, session->hashcash_challenges->ctx, login_context_len); + + ret = challenge_solutions_append(&solutions, session->hashcash_challenges, session->n_hashcash_challenges); + hashcash_challenges_free(&session->hashcash_challenges, &session->n_hashcash_challenges); + if (ret < 0) + goto error; + + req.challenge_solutions = &solutions; + req.login_context.data = login_context; + req.login_context.len = login_context_len; + } + + client_info.client_id = sp_sysinfo.client_id; + client_info.device_id = sp_sysinfo.device_id; + + req.client_info = &client_info; + + stored_credential.username = session->credentials.username; + stored_credential.data.data = session->credentials.stored_cred; + stored_credential.data.len = session->credentials.stored_cred_len; + + req.login_method_case = SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__LOGIN_METHOD_STORED_CREDENTIAL; + req.stored_credential = &stored_credential; + + hreq->body_len = spotify__login5__v3__login_request__get_packed_size(&req); + hreq->body = malloc(hreq->body_len); + + spotify__login5__v3__login_request__pack(&req, hreq->body); + + hreq->url = strdup("https://login5.spotify.com/v3/login"); + + hreq->headers[0] = asprintf_or_die("Accept: application/x-protobuf"); + hreq->headers[1] = asprintf_or_die("Content-Type: application/x-protobuf"); + hreq->headers[2] = asprintf_or_die("Client-Token: %s", session->http_clienttoken.value); + + challenge_solutions_clear(&solutions); + free(login_context); + return 0; + + error: + challenge_solutions_clear(&solutions); + free(login_context); + return -1; +} + +static int +msg_make_login5_challenges(struct sp_message *msg, struct sp_session *session) +{ + // Spotify didn't give us any challenges during login5, so we can just proceed + if (!session->hashcash_challenges) + return 1; // Continue to next message + + // Otherwise make another login5 request that includes the challenge responses + return msg_make_login5(msg, session); +} + +// Ref. spclient/spclient.go +static int +msg_make_metadata_get(struct sp_message *msg, struct sp_session *session) +{ + struct http_request *hreq = &msg->payload.hreq; + struct sp_server *server = &session->spclient; + struct sp_channel *channel = session->now_streaming_channel; + const char *path; + char *media_id = NULL; + char *ptr; + int i; + + if (channel->file.media_type == SP_MEDIA_TRACK) + path = "metadata/4/track"; + else if (channel->file.media_type == SP_MEDIA_EPISODE) + path = "metadata/4/episode"; + else + return -1; + + media_id = malloc(2 * sizeof(channel->file.media_id) + 1); + for (i = 0, ptr = media_id; i < sizeof(channel->file.media_id); i++) + ptr += sprintf(ptr, "%02x", channel->file.media_id[i]); + + hreq->url = asprintf_or_die("https://%s:%d/%s/%s", server->address, server->port, path, media_id); + + hreq->headers[0] = asprintf_or_die("Accept: application/x-protobuf"); + hreq->headers[1] = asprintf_or_die("Client-Token: %s", session->http_clienttoken.value); + hreq->headers[2] = asprintf_or_die("Authorization: Bearer %s", session->http_accesstoken.value); + + free(media_id); + return 0; +} + +// Resolve storage, this will just be a GET request +// Ref. spclient/spclient.go +static int +msg_make_storage_resolve(struct sp_message *msg, struct sp_session *session) +{ + struct http_request *hreq = &msg->payload.hreq; + struct sp_server *server = &session->spclient; + struct sp_channel *channel = session->now_streaming_channel; + char *track_id = NULL; + char *ptr; + int i; + + track_id = malloc(2 * sizeof(channel->file.id) + 1); + for (i = 0, ptr = track_id; i < sizeof(channel->file.id); i++) + ptr += sprintf(ptr, "%02x", channel->file.id[i]); + + hreq->url = asprintf_or_die("https://%s:%d/storage-resolve/files/audio/interactive/%s", server->address, server->port, track_id); + + hreq->headers[0] = asprintf_or_die("Accept: application/x-protobuf"); + hreq->headers[1] = asprintf_or_die("Client-Token: %s", session->http_clienttoken.value); + hreq->headers[2] = asprintf_or_die("Authorization: Bearer %s", session->http_accesstoken.value); + + free(track_id); + return 0; +} + +static int +msg_make_media_get(struct sp_message *msg, struct sp_session *session) +{ + struct http_request *hreq = &msg->payload.hreq; + struct sp_channel *channel = session->now_streaming_channel; + size_t bytes_from; + size_t bytes_to; + + bytes_from = channel->file.offset_bytes; + + if (!channel->file.len_bytes || channel->file.len_bytes > channel->file.offset_bytes + SP_CHUNK_LEN) + bytes_to = channel->file.offset_bytes + SP_CHUNK_LEN - 1; + else + bytes_to = channel->file.len_bytes - 1; + + hreq->url = strdup(channel->file.cdnurl[0]); + + hreq->headers[0] = asprintf_or_die("Range: bytes=%zu-%zu", bytes_from, bytes_to); + +// sp_cb.logmsg("Asking for %s\n", hreq->headers[0]); + + return 0; +} + +// Must be large enough to also include null terminating elements +static struct sp_seq_request seq_requests[][7] = +{ + { + // Just a dummy so that the array is aligned with the enum + { SP_SEQ_STOP }, + }, + { + // Resolve will be skipped if already done and servers haven't failed on us + { SP_SEQ_LOGIN, "AP_RESOLVE", SP_PROTO_HTTP, msg_make_ap_resolve, NULL, handle_ap_resolve, }, + { SP_SEQ_LOGIN, "CLIENT_HELLO", SP_PROTO_TCP, msg_make_client_hello, prepare_tcp_handshake, handle_client_hello, }, + { SP_SEQ_LOGIN, "CLIENT_RESPONSE_PLAINTEXT", SP_PROTO_TCP, msg_make_client_response_plaintext, prepare_tcp_handshake, NULL, }, + { SP_SEQ_LOGIN, "CLIENT_RESPONSE_ENCRYPTED", SP_PROTO_TCP, msg_make_client_response_encrypted, prepare_tcp_handshake, handle_tcp_generic, }, + }, + { + // The first two will be skipped if valid tokens already exist + { SP_SEQ_MEDIA_OPEN, "CLIENTTOKEN", SP_PROTO_HTTP, msg_make_clienttoken, NULL, handle_clienttoken, }, + { SP_SEQ_MEDIA_OPEN, "LOGIN5", SP_PROTO_HTTP, msg_make_login5, NULL, handle_login5, }, + { SP_SEQ_MEDIA_OPEN, "LOGIN5_CHALLENGES", SP_PROTO_HTTP, msg_make_login5_challenges, NULL, handle_login5, }, + { SP_SEQ_MEDIA_OPEN, "METADATA_GET", SP_PROTO_HTTP, msg_make_metadata_get, NULL, handle_metadata_get, }, + { SP_SEQ_MEDIA_OPEN, "AUDIO_KEY_GET", SP_PROTO_TCP, msg_make_audio_key_get, prepare_tcp, handle_tcp_generic, }, + { SP_SEQ_MEDIA_OPEN, "STORAGE_RESOLVE", SP_PROTO_HTTP, msg_make_storage_resolve, NULL, handle_storage_resolve, }, + { SP_SEQ_MEDIA_OPEN, "MEDIA_PREFETCH", SP_PROTO_HTTP, msg_make_media_get, NULL, handle_media_get, }, + }, + { + { SP_SEQ_MEDIA_GET, "MEDIA_GET", SP_PROTO_HTTP, msg_make_media_get, NULL, handle_media_get, }, + }, + { + { SP_SEQ_PONG, "PONG", SP_PROTO_TCP, msg_make_pong, prepare_tcp, NULL, }, + }, +}; + +// Must be large enough to also include null terminating elements +static struct sp_seq_request seq_requests_legacy[][7] = +{ + { + // Just a dummy so that the array is aligned with the enum + { SP_SEQ_STOP }, + }, + { + { SP_SEQ_LOGIN, "AP_RESOLVE", SP_PROTO_HTTP, msg_make_ap_resolve, NULL, handle_ap_resolve, }, + { SP_SEQ_LOGIN, "CLIENT_HELLO", SP_PROTO_TCP, msg_make_client_hello, prepare_tcp_handshake, handle_client_hello, }, + { SP_SEQ_LOGIN, "CLIENT_RESPONSE_PLAINTEXT", SP_PROTO_TCP, msg_make_client_response_plaintext, prepare_tcp_handshake, NULL, }, + { SP_SEQ_LOGIN, "CLIENT_RESPONSE_ENCRYPTED", SP_PROTO_TCP, msg_make_client_response_encrypted, prepare_tcp_handshake, handle_tcp_generic, }, + }, + { + { SP_SEQ_MEDIA_OPEN, "MERCURY_METADATA_GET", SP_PROTO_TCP, msg_make_mercury_metadata_get, prepare_tcp, handle_tcp_generic, }, + { SP_SEQ_MEDIA_OPEN, "AUDIO_KEY_GET", SP_PROTO_TCP, msg_make_audio_key_get, prepare_tcp, handle_tcp_generic, }, + { SP_SEQ_MEDIA_OPEN, "CHUNK_PREFETCH", SP_PROTO_TCP, msg_make_chunk_request, prepare_tcp, handle_tcp_generic, }, + }, + { + { SP_SEQ_MEDIA_GET, "CHUNK_REQUEST", SP_PROTO_TCP, msg_make_chunk_request, prepare_tcp, handle_tcp_generic, }, + }, + { + { SP_SEQ_PONG, "PONG", SP_PROTO_TCP, msg_make_pong, prepare_tcp, NULL, }, + }, +}; + +int +seq_requests_check(void) +{ + for (int i = 0; i < ARRAY_SIZE(seq_requests); i++) + { + if (i != seq_requests[i]->seq_type) + return -1; + } + for (int i = 0; i < ARRAY_SIZE(seq_requests_legacy); i++) + { + if (i != seq_requests_legacy[i]->seq_type) + return -1; + } + + return 0; +} + +struct sp_seq_request * +seq_request_get(enum sp_seq_type seq_type, int n, bool use_legacy) +{ + if (use_legacy) + return &seq_requests_legacy[seq_type][n]; + + return &seq_requests[seq_type][n]; +} + +// This is just a wrapper to help debug if we are unintentionally overwriting +// a queued sequence +void +seq_next_set(struct sp_session *session, enum sp_seq_type seq_type) +{ + bool will_overwrite = (seq_type != SP_SEQ_STOP && session->next_seq != SP_SEQ_STOP && seq_type != session->next_seq); + + if (will_overwrite) + sp_cb.logmsg("Bug! Sequence is being overwritten (prev %d, new %d)", session->next_seq, seq_type); + + assert(!will_overwrite); + + session->next_seq = seq_type; +} + +enum sp_error +seq_request_prepare(struct sp_seq_request *request, struct sp_conn_callbacks *cb, struct sp_session *session) +{ + if (!request->request_prepare) + return SP_OK_DONE; + + return request->request_prepare(request, cb, session); +} + +void +msg_clear(struct sp_message *msg) +{ + if (!msg) + return; + + if (msg->type == SP_MSG_TYPE_HTTP_REQ) + http_request_free(&msg->payload.hreq, true); + else if (msg->type == SP_MSG_TYPE_HTTP_RES) + http_response_free(&msg->payload.hres, true); + else if (msg->type == SP_MSG_TYPE_TCP) + free(msg->payload.tmsg.data); + + memset(msg, 0, sizeof(struct sp_message)); } int -msg_send(struct sp_message *msg, struct sp_connection *conn) +msg_make(struct sp_message *msg, struct sp_seq_request *req, struct sp_session *session) +{ + memset(msg, 0, sizeof(struct sp_message)); + + msg->type = (req->proto == SP_PROTO_HTTP) ? SP_MSG_TYPE_HTTP_REQ : SP_MSG_TYPE_TCP; + + return req->payload_make(msg, session); +} + +enum sp_error +msg_tcp_send(struct sp_tcp_message *tmsg, struct sp_connection *conn) { uint8_t pkt[4096]; ssize_t pkt_len; int ret; if (conn->is_encrypted) - pkt_len = packet_make_encrypted(pkt, sizeof(pkt), msg->cmd, msg->data, msg->len, &conn->encrypt); + pkt_len = packet_make_encrypted(pkt, sizeof(pkt), tmsg->cmd, tmsg->data, tmsg->len, &conn->encrypt); else - pkt_len = packet_make_plain(pkt, sizeof(pkt), msg->data, msg->len, msg->add_version_header); + pkt_len = packet_make_plain(pkt, sizeof(pkt), tmsg->data, tmsg->len, tmsg->add_version_header); if (pkt_len < 0) RETURN_ERROR(SP_ERR_INVALID, "Error constructing packet to Spotify"); @@ -1394,13 +2207,13 @@ msg_send(struct sp_message *msg, struct sp_connection *conn) if (ret != pkt_len) RETURN_ERROR(SP_ERR_NOCONNECTION, "Error sending packet to Spotify"); -// sp_cb.logmsg("Sent pkt type %d (cmd=0x%02x) with size %zu (fd=%d)\n", msg->type, msg->cmd, pkt_len, conn->response_fd); +// sp_cb.logmsg("Sent pkt type %d (cmd=0x%02x) with size %zu (fd=%d)\n", tmsg->type, tmsg->cmd, pkt_len, conn->response_fd); #else ret = debug_mock_response(msg, conn); if (ret < 0) RETURN_ERROR(SP_ERR_NOCONNECTION, "Error mocking send packet to Spotify"); - sp_cb.logmsg("Mocked send/response pkt type %d (cmd=0x%02x) with size %zu\n", msg->type, msg->cmd, pkt_len); + sp_cb.logmsg("Mocked send/response pkt type %d (cmd=0x%02x) with size %zu\n", tmsg->type, tmsg->cmd, pkt_len); #endif // Save sent packet for MAC calculation later @@ -1410,28 +2223,54 @@ msg_send(struct sp_message *msg, struct sp_connection *conn) // Reset the disconnect timer event_add(conn->idle_ev, &sp_idle_tv); - return 0; + return SP_OK_DONE; error: return ret; } -int -msg_pong(struct sp_session *session) +enum sp_error +msg_http_send(struct http_response *hres, struct http_request *hreq, struct http_session *hses) { - struct sp_message msg; int ret; - ret = msg_make(&msg, MSG_TYPE_PONG, session); + hreq->user_agent = sp_sysinfo.client_name; + +// sp_cb.logmsg("Making http request to %s\n", hreq->url); + + ret = http_request(hres, hreq, hses); + if (ret < 0) + RETURN_ERROR(SP_ERR_NOCONNECTION, "No connection to Spotify for http request"); + + return SP_OK_DONE; + + error: + return ret; +} + +enum sp_error +msg_pong(struct sp_session *session) +{ + struct sp_seq_request *req; + struct sp_message msg = { 0 }; + int ret; + + req = seq_request_get(SP_SEQ_PONG, 0, session->use_legacy); + + ret = msg_make(&msg, req, session); if (ret < 0) RETURN_ERROR(SP_ERR_INVALID, "Error constructing pong message to Spotify"); - ret = msg_send(&msg, &session->conn); + ret = msg_tcp_send(&msg.payload.tmsg, &session->conn); if (ret < 0) RETURN_ERROR(ret, sp_errmsg); - return 0; + msg_clear(&msg); + + return SP_OK_DONE; error: + msg_clear(&msg); + return ret; } diff --git a/src/inputs/librespot-c/src/connection.h b/src/inputs/librespot-c/src/connection.h index 5f1aa8bf..cb804b7e 100644 --- a/src/inputs/librespot-c/src/connection.h +++ b/src/inputs/librespot-c/src/connection.h @@ -2,22 +2,40 @@ void ap_disconnect(struct sp_connection *conn); enum sp_error -ap_connect(struct sp_connection *conn, enum sp_msg_type type, time_t *cooldown_ts, const char *ap_address, struct sp_conn_callbacks *cb, void *cb_arg); +ap_connect(struct sp_connection *conn, struct sp_server *server, time_t *cooldown_ts, struct sp_conn_callbacks *cb, void *cb_arg); -const char * -ap_address_get(struct sp_connection *conn); +void +ap_blacklist(struct sp_server *server); + +int +seq_requests_check(void); + +struct sp_seq_request * +seq_request_get(enum sp_seq_type seq_type, int n, bool use_legacy); + +void +seq_next_set(struct sp_session *session, enum sp_seq_type seq_type); enum sp_error -response_read(struct sp_session *session); +seq_request_prepare(struct sp_seq_request *request, struct sp_conn_callbacks *cb, struct sp_session *session); -bool -msg_is_handshake(enum sp_msg_type type); +enum sp_error +msg_tcp_read_one(struct sp_tcp_message *tmsg, struct sp_connection *conn); + +enum sp_error +msg_handle(struct sp_message *msg, struct sp_session *session); + +void +msg_clear(struct sp_message *msg); int -msg_make(struct sp_message *msg, enum sp_msg_type type, struct sp_session *session); +msg_make(struct sp_message *msg, struct sp_seq_request *req, struct sp_session *session); -int -msg_send(struct sp_message *msg, struct sp_connection *conn); +enum sp_error +msg_tcp_send(struct sp_tcp_message *tmsg, struct sp_connection *conn); -int +enum sp_error +msg_http_send(struct http_response *hres, struct http_request *hreq, struct http_session *hses); + +enum sp_error msg_pong(struct sp_session *session); diff --git a/src/inputs/librespot-c/src/crypto.c b/src/inputs/librespot-c/src/crypto.c index b056cf45..5ef29374 100644 --- a/src/inputs/librespot-c/src/crypto.c +++ b/src/inputs/librespot-c/src/crypto.c @@ -13,6 +13,7 @@ /* ----------------------------------- Crypto ------------------------------- */ #define SHA512_DIGEST_LENGTH 64 +#define SHA1_DIGEST_LENGTH 20 #define bnum_new(bn) \ do { \ if (!gcry_control(GCRYCTL_INITIALIZATION_FINISHED_P)) { \ @@ -56,7 +57,7 @@ static const uint8_t prime_bytes[] = }; static void -crypto_log(const char *fmt, ...) +crypto_debug(const char *fmt, ...) { return; } @@ -237,14 +238,14 @@ crypto_decrypt(uint8_t *encrypted, size_t encrypted_len, struct crypto_cipher *c size_t header_len = sizeof(cipher->last_header); size_t payload_len; - crypto_log("Decrypting %zu bytes with nonce %u\n", encrypted_len, cipher->nonce); + crypto_debug("Decrypting %zu bytes with nonce %u\n", encrypted_len, cipher->nonce); // crypto_hexdump("Key\n", cipher->key, sizeof(cipher->key)); // crypto_hexdump("Encrypted\n", encrypted, encrypted_len); // In case we didn't even receive the basics, header and mac, then return. if (encrypted_len < header_len + sizeof(mac)) { - crypto_log("Waiting for %zu header bytes, have %zu\n", header_len + sizeof(mac), encrypted_len); + crypto_debug("Waiting for %zu header bytes, have %zu\n", header_len + sizeof(mac), encrypted_len); return 0; } @@ -264,7 +265,7 @@ crypto_decrypt(uint8_t *encrypted, size_t encrypted_len, struct crypto_cipher *c payload_len = payload_len_get(cipher->last_header); -// crypto_log("Payload len is %zu\n", payload_len); +// crypto_debug("Payload len is %zu\n", payload_len); // crypto_hexdump("Decrypted header\n", encrypted, header_len); } @@ -275,7 +276,7 @@ crypto_decrypt(uint8_t *encrypted, size_t encrypted_len, struct crypto_cipher *c // Not enough data for decrypting the entire packet if (payload_len > encrypted_len) { - crypto_log("Waiting for %zu payload bytes, have %zu\n", payload_len, encrypted_len); + crypto_debug("Waiting for %zu payload bytes, have %zu\n", payload_len, encrypted_len); return 0; } @@ -288,7 +289,7 @@ crypto_decrypt(uint8_t *encrypted, size_t encrypted_len, struct crypto_cipher *c // crypto_hexdump("mac our\n", mac, sizeof(mac)); if (memcmp(mac, encrypted + payload_len, sizeof(mac)) != 0) { - crypto_log("MAC VALIDATION FAILED\n"); // TODO + crypto_debug("MAC validation failed\n"); memset(cipher->last_header, 0, header_len); return -1; } @@ -354,6 +355,8 @@ crypto_aes_seek(struct crypto_aes_cipher *cipher, size_t seek, const char **errm size_t num_blocks; size_t offset; + assert(cipher->aes); + iv_len = gcry_cipher_get_algo_blklen(GCRY_CIPHER_AES128); assert(iv_len == sizeof(iv)); @@ -462,3 +465,129 @@ crypto_base62_to_bin(uint8_t *out, size_t out_len, const char *in) bnum_free(base); return -1; } + +static int +count_trailing_zero_bits(uint8_t *data, size_t data_len) +{ + int zero_bits = 0; + size_t idx; + int bit; + + for (idx = data_len - 1; idx >= 0; idx--) + { + for (bit = 0; bit < 8; bit++) + { + if (data[idx] & (1 << bit)) + return zero_bits; + + zero_bits++; + } + } + + return zero_bits; +} + +static void +sha1_sum(uint8_t *digest, uint8_t *data, size_t data_len, gcry_md_hd_t hdl) +{ + gcry_md_reset(hdl); + + gcry_md_write(hdl, data, data_len); + gcry_md_final(hdl); + + memcpy(digest, gcry_md_read(hdl, GCRY_MD_SHA1), SHA1_DIGEST_LENGTH); +} + +static void +sha1_two_part_sum(uint8_t *digest, uint8_t *data1, size_t data1_len, uint8_t *data2, size_t data2_len, gcry_md_hd_t hdl) +{ + gcry_md_reset(hdl); + + gcry_md_write(hdl, data1, data1_len); + gcry_md_write(hdl, data2, data2_len); + gcry_md_final(hdl); + + memcpy(digest, gcry_md_read(hdl, GCRY_MD_SHA1), SHA1_DIGEST_LENGTH); +} + +static inline void +increase_hashcash(uint8_t *data, int idx) +{ + while (++data[idx] == 0 && idx > 0) + idx--; +} + +static void +timespec_sub(struct timespec *a, struct timespec *b, struct timespec *result) +{ + result->tv_sec = a->tv_sec - b->tv_sec; + result->tv_nsec = a->tv_nsec - b->tv_nsec; + if (result->tv_nsec < 0) + { + --result->tv_sec; + result->tv_nsec += 1000000000L; + } +} + +// Example challenge: +// - loginctx 0300c798435c4b0beb91e3b1db591d0a7f2e32816744a007af41cc7c8043b9295e1ed8a13cc323e4af2d0a3c42463b7a358ed116c33695989e0bfade0dab9c6bc6f7f928df5d49069e8ca4c04c34034669fc97e93da1ca17a7c11b2ffbb9b85f2265b10f6c83f7ef672240cb535eb122265da9b6f8d1a55af522fcbb40efc4eb753756ea38a63aff95d3228219afb0ab887075ac2fe941f7920fd19d32226052fe0956c71f0cb63ba702dd72d50d769920cd99ec6a45e00c85af5287b5d0031d6be4072efe71c59dffa5baa4077cd2eab4f22143eff18c31c69b8647e7f517468c84ed9548943fb1ba6b750ef63cdf9ce0a0fd07cb22d19484f4baa8ee6fa35fc573d9 +// - prefix 48859603d6c16c3202292df155501c55 +// - length (difficulty) 10 +// Solution: +// - suffix 7f7e558bd10c37d200000000000002c7 +int +crypto_hashcash_solve(struct crypto_hashcash_solution *solution, struct crypto_hashcash_challenge *challenge, const char **errmsg) +{ + gcry_md_hd_t hdl; + struct timespec start_ts; + struct timespec stop_ts; + uint8_t digest[SHA1_DIGEST_LENGTH]; + bool solution_found = false; + int i; + + // 1. Hash loginctx + // 2. Create a 16 byte suffix, fill first 8 bytes with last 8 bytes of hash, last with zeroes + // 3. Hash challenge prefix + suffix + // 4. Check if X last bits of hash is zeroes, where X is challenge length + // 5. If not, increment both 8-byte parts of suffix and goto 3 + + memset(solution, 0, sizeof(struct crypto_hashcash_solution)); + + if (gcry_md_open(&hdl, GCRY_MD_SHA1, 0) != GPG_ERR_NO_ERROR) + { + *errmsg = "Error initialising SHA1 hasher"; + return -1; + } + + sha1_sum(digest, challenge->ctx, challenge->ctx_len, hdl); + + memcpy(solution->suffix, digest + SHA1_DIGEST_LENGTH - 8, 8); + + clock_gettime(CLOCK_MONOTONIC, &start_ts); + + for (i = 0; i < challenge->max_iterations; i++) + { + sha1_two_part_sum(digest, challenge->prefix, sizeof(challenge->prefix), solution->suffix, sizeof(solution->suffix), hdl); + + solution_found = (count_trailing_zero_bits(digest, SHA1_DIGEST_LENGTH) >= challenge->wanted_zero_bits); + if (solution_found) + break; + + increase_hashcash(solution->suffix, 7); + increase_hashcash(solution->suffix + 8, 7); + } + + clock_gettime(CLOCK_MONOTONIC, &stop_ts); + + timespec_sub(&stop_ts, &start_ts, &solution->duration); + + gcry_md_close(hdl); + + if (!solution_found) + { + *errmsg = "Could not find a hashcash solution"; + return -1; + } + + return 0; +} diff --git a/src/inputs/librespot-c/src/crypto.h b/src/inputs/librespot-c/src/crypto.h index 2cba11b6..f9721a3d 100644 --- a/src/inputs/librespot-c/src/crypto.h +++ b/src/inputs/librespot-c/src/crypto.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "shannon/Shannon.h" @@ -33,6 +34,26 @@ struct crypto_keys size_t shared_secret_len; }; +struct crypto_hashcash_challenge +{ + uint8_t *ctx; + size_t ctx_len; + uint8_t prefix[16]; + + // Required number of trailing zero bits in the SHA1 of prefix and suffix. + // More bits -> more difficult. + int wanted_zero_bits; + + // Give up limit + int max_iterations; +}; + +struct crypto_hashcash_solution +{ + uint8_t suffix[16]; + struct timespec duration; +}; + void crypto_shared_secret(uint8_t **shared_secret_bytes, size_t *shared_secret_bytes_len, @@ -72,4 +93,7 @@ crypto_aes_decrypt(uint8_t *encrypted, size_t encrypted_len, struct crypto_aes_c int crypto_base62_to_bin(uint8_t *out, size_t out_len, const char *in); +int +crypto_hashcash_solve(struct crypto_hashcash_solution *solution, struct crypto_hashcash_challenge *challenge, const char **errmsg); + #endif /* __CRYPTO_H__ */ diff --git a/src/inputs/librespot-c/src/http.c b/src/inputs/librespot-c/src/http.c new file mode 100644 index 00000000..39bae6e7 --- /dev/null +++ b/src/inputs/librespot-c/src/http.c @@ -0,0 +1,216 @@ +#define _GNU_SOURCE // For asprintf and vasprintf +#include +#include +#include +#include // strncasecmp +#include +#include +#include +#include + +#include +#include + +#include "http.h" + +// Number of seconds the client will wait for a response before aborting +#define HTTP_CLIENT_TIMEOUT 8 + +void +http_session_init(struct http_session *session) +{ + session->internal = curl_easy_init(); +} + +void +http_session_deinit(struct http_session *session) +{ + curl_easy_cleanup(session->internal); +} + +void +http_request_free(struct http_request *request, bool only_content) +{ + int i; + + if (!request) + return; + + free(request->url); + free(request->body); + + for (i = 0; request->headers[i]; i++) + free(request->headers[i]); + + if (only_content) + memset(request, 0, sizeof(struct http_request)); + else + free(request); +} + +void +http_response_free(struct http_response *response, bool only_content) +{ + int i; + + if (!response) + return; + + free(response->body); + + for (i = 0; response->headers[i]; i++) + free(response->headers[i]); + + if (only_content) + memset(response, 0, sizeof(struct http_response)); + else + free(response); +} + +static void +headers_save(struct http_response *response, CURL *curl) +{ + struct curl_header *prev = NULL; + struct curl_header *header; + int i = 0; + + while ((header = curl_easy_nextheader(curl, CURLH_HEADER, 0, prev)) && i < HTTP_MAX_HEADERS) + { + if (asprintf(&response->headers[i], "%s:%s", header->name, header->value) < 0) + return; + + prev = header; + i++; + } + } + +static size_t +body_cb(char *ptr, size_t size, size_t nmemb, void *userdata) +{ + struct http_response *response = userdata; + size_t realsize = size * nmemb; + size_t new_size; + uint8_t *new; + + if (realsize == 0) + { + return 0; + } + + // Make sure the size is +1 larger than needed so we can zero terminate for safety + new_size = response->body_len + realsize + 1; + new = realloc(response->body, new_size); + if (!new) + { + free(response->body); + response->body = NULL; + response->body_len = 0; + return 0; + } + + memcpy(new + response->body_len, ptr, realsize); + response->body_len += realsize; + + memset(new + response->body_len, 0, 1); // Zero terminate in case we need to address as C string + response->body = new; + return nmemb; +} + +int +http_request(struct http_response *response, struct http_request *request, struct http_session *session) +{ + CURL *curl; + CURLcode res; + struct curl_slist *headers = NULL; + long response_code; + long opt; + curl_off_t content_length; + int i; + + if (session) + { + curl = session->internal; + curl_easy_reset(curl); + } + else + { + curl = curl_easy_init(); + } + if (!curl) + return -1; + + memset(response, 0, sizeof(struct http_response)); + + curl_easy_setopt(curl, CURLOPT_URL, request->url); + + // Set optional params + if (request->user_agent) + curl_easy_setopt(curl, CURLOPT_USERAGENT, request->user_agent); + for (i = 0; i < HTTP_MAX_HEADERS && request->headers[i]; i++) + headers = curl_slist_append(headers, request->headers[i]); + if (headers) + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + if ((opt = request->ssl_verify_peer)) + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, opt); + + if (request->headers_only) + { + curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); // Makes curl make a HEAD request + } + else if (request->body && request->body_len > 0) + { + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request->body); + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, request->body_len); + } + + curl_easy_setopt(curl, CURLOPT_TIMEOUT, HTTP_CLIENT_TIMEOUT); + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, body_cb); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, response); + + // Allow redirects + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5); + + res = curl_easy_perform(curl); + if (res != CURLE_OK) + goto error; + + res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code); + response->code = (res == CURLE_OK) ? (int) response_code : -1; + + res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, &content_length); + response->content_length = (res == CURLE_OK) ? (ssize_t)content_length : -1; + + headers_save(response, curl); + + curl_slist_free_all(headers); + if (!session) + curl_easy_cleanup(curl); + + return 0; + + error: + curl_slist_free_all(headers); + if (!session) + curl_easy_cleanup(curl); + + return -1; +} + +char * +http_response_header_find(const char *key, struct http_response *response) +{ + char **header; + size_t key_len; + + key_len = strlen(key); + + for (header = response->headers; *header; header++) + { + if (strncasecmp(key, *header, key_len) == 0 && (*header)[key_len] == ':') + return *header + key_len + 1; + } + + return NULL; +} diff --git a/src/inputs/librespot-c/src/http.h b/src/inputs/librespot-c/src/http.h new file mode 100644 index 00000000..30183803 --- /dev/null +++ b/src/inputs/librespot-c/src/http.h @@ -0,0 +1,83 @@ +#ifndef __HTTP_H__ +#define __HTTP_H__ + +#include +#include + +#define HTTP_MAX_HEADERS 32 + +/* Response codes from event2/http.h with 206 added */ +#define HTTP_CONTINUE 100 /**< client should proceed to send */ +#define HTTP_SWITCH_PROTOCOLS 101 /**< switching to another protocol */ +#define HTTP_PROCESSING 102 /**< processing the request, but no response is available yet */ +#define HTTP_EARLYHINTS 103 /**< return some response headers */ +#define HTTP_OK 200 /**< request completed ok */ +#define HTTP_CREATED 201 /**< new resource is created */ +#define HTTP_ACCEPTED 202 /**< accepted for processing */ +#define HTTP_NONAUTHORITATIVE 203 /**< returning a modified version of the origin's response */ +#define HTTP_NOCONTENT 204 /**< request does not have content */ +#define HTTP_PARTIALCONTENT 206 /**< partial content returned*/ +#define HTTP_MOVEPERM 301 /**< the uri moved permanently */ +#define HTTP_MOVETEMP 302 /**< the uri moved temporarily */ +#define HTTP_NOTMODIFIED 304 /**< page was not modified from last */ +#define HTTP_BADREQUEST 400 /**< invalid http request was made */ +#define HTTP_UNAUTHORIZED 401 /**< authentication is required */ +#define HTTP_PAYMENTREQUIRED 402 /**< user exceeded limit on requests */ +#define HTTP_FORBIDDEN 403 /**< user not having the necessary permissions */ +#define HTTP_NOTFOUND 404 /**< could not find content for uri */ +#define HTTP_BADMETHOD 405 /**< method not allowed for this uri */ +#define HTTP_ENTITYTOOLARGE 413 /**< request is larger than the server is able to process */ +#define HTTP_EXPECTATIONFAILED 417 /**< we can't handle this expectation */ +#define HTTP_INTERNAL 500 /**< internal error */ +#define HTTP_NOTIMPLEMENTED 501 /**< not implemented */ +#define HTTP_BADGATEWAY 502 /**< received an invalid response from the upstream */ +#define HTTP_SERVUNAVAIL 503 /**< the server is not available */ + +struct http_session +{ + void *internal; +}; + +struct http_request +{ + char *url; + + const char *user_agent; + bool headers_only; // HEAD request + bool ssl_verify_peer; + + char *headers[HTTP_MAX_HEADERS]; + uint8_t *body; // If not NULL and body_len > 0 -> POST request + size_t body_len; +}; + +struct http_response +{ + int code; + ssize_t content_length; // -1 = unknown + + char *headers[HTTP_MAX_HEADERS]; + uint8_t *body; // Allocated, must be freed by caller + size_t body_len; +}; + +void +http_session_init(struct http_session *session); + +void +http_session_deinit(struct http_session *session); + +void +http_request_free(struct http_request *request, bool only_content); + +void +http_response_free(struct http_response *response, bool only_content); + +// The session is optional but increases performance when making many requests. +int +http_request(struct http_response *response, struct http_request *request, struct http_session *session); + +char * +http_response_header_find(const char *key, struct http_response *response); + +#endif /* !__HTTP_H__ */ diff --git a/src/inputs/librespot-c/src/librespot-c-internal.h b/src/inputs/librespot-c/src/librespot-c-internal.h index f5add799..45d51040 100644 --- a/src/inputs/librespot-c/src/librespot-c-internal.h +++ b/src/inputs/librespot-c/src/librespot-c-internal.h @@ -27,16 +27,19 @@ #define be64toh(x) OSSwapBigToHostInt64(x) #endif +#define ARRAY_SIZE(x) ((unsigned int)(sizeof(x) / sizeof((x)[0]))) + #include "librespot-c.h" #include "crypto.h" +#include "http.h" #include "proto/keyexchange.pb-c.h" #include "proto/authentication.pb-c.h" #include "proto/mercury.pb-c.h" #include "proto/metadata.pb-c.h" - -#define SP_AP_RESOLVE_URL "https://APResolve.spotify.com/" -#define SP_AP_RESOLVE_KEY "ap_list" +#include "proto/clienttoken.pb-c.h" +#include "proto/login5.pb-c.h" +#include "proto/storage_resolve.pb-c.h" // Disconnect from AP after this number of secs idle #define SP_AP_DISCONNECT_SECS 60 @@ -48,6 +51,9 @@ // we get the hint and won't try reconnecting again until after this cooldown #define SP_AP_COOLDOWN_SECS 30 +// How long after a connection failure we try to avoid an AP +#define SP_AP_AVOID_SECS 3600 + // If client hasn't requested anything in particular #define SP_BITRATE_DEFAULT SP_BITRATE_320 @@ -68,15 +74,22 @@ // Download in chunks of 32768 bytes. The chunks shouldn't be too large because // it makes seeking slow (seeking involves jumping around in the file), but // large enough that the file can be probed from the first chunk. -#define SP_CHUNK_LEN_WORDS 1024 * 8 +// For comparison, Spotify for Windows seems to request 7300 byte chunks. +#define SP_CHUNK_LEN 32768 // Used to create default sysinfo, which should be librespot_[short sha]_[random 8 characters build id], // ref https://github.com/plietar/librespot/pull/218. User may override, but // as of 20220516 Spotify seems to have whitelisting of client name. #define SP_CLIENT_NAME_DEFAULT "librespot" -#define SP_CLIENT_VERSION_DEFAULT "000000" +#define SP_CLIENT_VERSION_DEFAULT "0.0.0" #define SP_CLIENT_BUILD_ID_DEFAULT "aabbccdd" +// ClientIdHex from client_id.go. This seems to be the id that Spotify's own app +// uses. It is used in the call to https://clienttoken.spotify.com/v1/clienttoken. +// The endpoint doesn't accept client ID's of app registered at +// develop.spotify.com, so unfortunately spoofing is required. +#define SP_CLIENT_ID_DEFAULT "65b708073fc0480ea92a077233ca87bd" + // Shorthand for error handling #define RETURN_ERROR(r, m) \ do { ret = (r); sp_errmsg = (m); goto error; } while(0) @@ -100,15 +113,24 @@ enum sp_error enum sp_msg_type { - MSG_TYPE_NONE, - MSG_TYPE_CLIENT_HELLO, - MSG_TYPE_CLIENT_RESPONSE_PLAINTEXT, - MSG_TYPE_CLIENT_RESPONSE_ENCRYPTED, - MSG_TYPE_PONG, - MSG_TYPE_MERCURY_TRACK_GET, - MSG_TYPE_MERCURY_EPISODE_GET, - MSG_TYPE_AUDIO_KEY_GET, - MSG_TYPE_CHUNK_REQUEST, + SP_MSG_TYPE_HTTP_REQ, + SP_MSG_TYPE_HTTP_RES, + SP_MSG_TYPE_TCP, +}; + +enum sp_seq_type +{ + SP_SEQ_STOP = 0, + SP_SEQ_LOGIN, + SP_SEQ_MEDIA_OPEN, + SP_SEQ_MEDIA_GET, + SP_SEQ_PONG, +}; + +enum sp_proto +{ + SP_PROTO_TCP, + SP_PROTO_HTTP, }; enum sp_media_type @@ -177,6 +199,7 @@ struct sp_cmdargs int fd_write; size_t seek_pos; enum sp_bitrates bitrate; + int use_legacy; sp_progress_cb progress_cb; void *cb_arg; @@ -190,32 +213,45 @@ struct sp_conn_callbacks event_callback_fn timeout_cb; }; -struct sp_message +struct sp_tcp_message { - enum sp_msg_type type; enum sp_cmd_type cmd; bool encrypt; bool add_version_header; - enum sp_msg_type type_next; - enum sp_msg_type type_queued; + size_t len; + uint8_t *data; +}; - int (*response_handler)(uint8_t *msg, size_t msg_len, struct sp_session *session); +struct sp_message +{ + enum sp_msg_type type; - ssize_t len; - uint8_t data[4096]; + union payload + { + struct sp_tcp_message tmsg; + struct http_request hreq; + struct http_response hres; + } payload; +}; + +struct sp_server +{ + char address[256]; // e.g. ap-gue1.spotify.com + unsigned short port; // normally 433 or 4070 + time_t last_connect_ts; + time_t last_resolved_ts; + time_t last_failed_ts; }; struct sp_connection { + struct sp_server *server; // NULL or pointer to session.accesspoint + bool is_connected; bool is_encrypted; - // Resolved access point - char *ap_address; - unsigned short ap_port; - // Where we receive data from Spotify int response_fd; struct event *response_ev; @@ -237,6 +273,14 @@ struct sp_connection struct crypto_cipher decrypt; }; +struct sp_token +{ + char value[512]; // base64 string, actual size 360 bytes + int32_t expires_after_seconds; + int32_t refresh_after_seconds; + time_t received_ts; +}; + struct sp_mercury { char *uri; @@ -263,14 +307,18 @@ struct sp_file uint8_t media_id[16]; // Decoded value of the URIs base62 enum sp_media_type media_type; // track or episode from URI + // For files that are served via http/"new protocol" (we may receive multiple + // urls). + char *cdnurl[4]; + uint8_t key[16]; uint16_t channel_id; // Length and download progress - size_t len_words; // Length of file in words (32 bit) - size_t offset_words; - size_t received_words; + size_t len_bytes; + size_t offset_bytes; + size_t received_bytes; bool end_of_file; bool end_of_chunk; bool open; @@ -326,11 +374,22 @@ struct sp_channel // Linked list of sessions struct sp_session { + struct sp_server accesspoint; + struct sp_server spclient; + struct sp_server dealer; + struct sp_connection conn; time_t cooldown_ts; - // Address of an access point we want to avoid due to previous failure - char *ap_avoid; + // Use legacy protocol (non http, see seq_requests_legacy) + bool use_legacy; + + struct http_session http_session; + struct sp_token http_clienttoken; + struct sp_token http_accesstoken; + + int n_hashcash_challenges; + struct crypto_hashcash_challenge *hashcash_challenges; bool is_logged_in; struct sp_credentials credentials; @@ -344,24 +403,35 @@ struct sp_session // the current track is also available struct sp_channel *now_streaming_channel; + // Current request in the sequence + struct sp_seq_request *request; + // Go to next step in a request sequence struct event *continue_ev; - // Current, next and subsequent message being processed - enum sp_msg_type msg_type_last; - enum sp_msg_type msg_type_next; - enum sp_msg_type msg_type_queued; - int (*response_handler)(uint8_t *, size_t, struct sp_session *); + // Which sequence comes next + enum sp_seq_type next_seq; struct sp_session *next; }; +struct sp_seq_request +{ + enum sp_seq_type seq_type; + const char *name; // Name of request (for logging) + enum sp_proto proto; + int (*payload_make)(struct sp_message *, struct sp_session *); + enum sp_error (*request_prepare)(struct sp_seq_request *, struct sp_conn_callbacks *, struct sp_session *); + enum sp_error (*response_handler)(struct sp_message *, struct sp_session *); +}; + struct sp_err_map { - ErrorCode errorcode; + int errorcode; const char *errmsg; }; + extern struct sp_callbacks sp_cb; extern struct sp_sysinfo sp_sysinfo; extern const char *sp_errmsg; diff --git a/src/inputs/librespot-c/src/librespot-c.c b/src/inputs/librespot-c/src/librespot-c.c index fb404d6e..c57e0ae2 100644 --- a/src/inputs/librespot-c/src/librespot-c.c +++ b/src/inputs/librespot-c/src/librespot-c.c @@ -23,8 +23,8 @@ /* -Illustration of the general flow, where receive and writing the result are async -operations. For some commands, e.g. open and seek, the entire sequence is +Illustration of the general tcp flow, where receive and writing the result are +async operations. For some commands, e.g. open and seek, the entire sequence is encapsulated in a sync command, which doesn't return until final "done, error or timeout". The command play is async, so all "done/error/timeout" is returned via callbacks. Also, play will loop the flow, i.e. after writing a chunk of data it @@ -79,9 +79,8 @@ static int debug_disconnect_counter; #endif // Forwards -static int -request_make(enum sp_msg_type type, struct sp_session *session); - +static void +sequence_continue(struct sp_session *session); /* -------------------------------- Session --------------------------------- */ @@ -97,7 +96,8 @@ session_free(struct sp_session *session) event_free(session->continue_ev); - free(session->ap_avoid); + http_session_deinit(&session->http_session); + free(session); } @@ -133,6 +133,8 @@ session_new(struct sp_session **out, struct sp_cmdargs *cmdargs, event_callback_ if (!session) RETURN_ERROR(SP_ERR_OOM, "Out of memory creating session"); + http_session_init(&session->http_session); + session->continue_ev = evtimer_new(sp_evbase, cb, session); if (!session->continue_ev) RETURN_ERROR(SP_ERR_OOM, "Out of memory creating session event"); @@ -227,7 +229,7 @@ session_return(struct sp_session *session, enum sp_error err) static void session_error(struct sp_session *session, enum sp_error err) { - sp_cb.logmsg("Session error: %d (occurred before msg %d, queue %d)\n", err, session->msg_type_next, session->msg_type_queued); + sp_cb.logmsg("Session error %d: %s\n", err, sp_errmsg); session_return(session, err); @@ -245,71 +247,32 @@ session_error(struct sp_session *session, enum sp_error err) // Called if an access point disconnects. Will clear current connection and // start a flow where the same request will be made to another access point. +// This is currently only implemented for the non-http connection. static void session_retry(struct sp_session *session) { struct sp_channel *channel = session->now_streaming_channel; - enum sp_msg_type type = session->msg_type_last; - const char *ap_address = ap_address_get(&session->conn); - int ret; - sp_cb.logmsg("Retrying after disconnect (occurred at msg %d)\n", type); + sp_cb.logmsg("Retrying after disconnect\n"); channel_retry(channel); - free(session->ap_avoid); - session->ap_avoid = strdup(ap_address); + ap_blacklist(session->conn.server); ap_disconnect(&session->conn); - // If we were in the middle of a handshake when disconnected we must restart - if (msg_is_handshake(type)) - type = MSG_TYPE_CLIENT_HELLO; + // If we were doing something other than login, queue that + if (session->request->seq_type != SP_SEQ_LOGIN) + seq_next_set(session, session->request->seq_type); - ret = request_make(type, session); - if (ret < 0) - session_error(session, ret); + // Trigger login on a new server + session->request = seq_request_get(SP_SEQ_LOGIN, 0, session->use_legacy); + sequence_continue(session); } + /* ------------------------ Main sequence control --------------------------- */ -// This callback must determine if a new request should be made, or if we are -// done and should return to caller -static void -continue_cb(int fd, short what, void *arg) -{ - struct sp_session *session = arg; - enum sp_msg_type type = MSG_TYPE_NONE; - int ret; - - // type_next has priority, since this is what we use to chain a sequence, e.g. - // the handshake sequence. type_queued is what comes after, e.g. first a - // handshake (type_next) and then a chunk request (type_queued) - if (session->msg_type_next != MSG_TYPE_NONE) - { -// sp_cb.logmsg(">>> msg_next >>>\n"); - - type = session->msg_type_next; - session->msg_type_next = MSG_TYPE_NONE; - } - else if (session->msg_type_queued != MSG_TYPE_NONE) - { -// sp_cb.logmsg(">>> msg_queued >>>\n"); - - type = session->msg_type_queued; - session->msg_type_queued = MSG_TYPE_NONE; - } - - if (type != MSG_TYPE_NONE) - { - ret = request_make(type, session); - if (ret < 0) - session_error(session, ret); - } - else - session_return(session, SP_OK_DONE); // All done, yay! -} - // This callback is triggered by response_cb when the message response handler // said that there was data to write. If not all data can be written in one pass // it will re-add the event. @@ -343,7 +306,7 @@ audio_write_cb(int fd, short what, void *arg) } static void -timeout_cb(int fd, short what, void *arg) +timeout_tcp_cb(int fd, short what, void *arg) { struct sp_session *session = arg; @@ -353,11 +316,24 @@ timeout_cb(int fd, short what, void *arg) } static void -response_cb(int fd, short what, void *arg) +audio_data_received(struct sp_session *session) +{ + struct sp_channel *channel = session->now_streaming_channel; + + if (channel->state == SP_CHANNEL_STATE_PLAYING && !channel->file.end_of_file) + seq_next_set(session, SP_SEQ_MEDIA_GET); + if (channel->progress_cb) + channel->progress_cb(channel->audio_fd[0], channel->cb_arg, channel->file.received_bytes - SP_OGG_HEADER_LEN, channel->file.len_bytes - SP_OGG_HEADER_LEN); + + event_add(channel->audio_write_ev, NULL); +} + +static void +incoming_tcp_cb(int fd, short what, void *arg) { struct sp_session *session = arg; struct sp_connection *conn = &session->conn; - struct sp_channel *channel = session->now_streaming_channel; + struct sp_message msg = { .type = SP_MSG_TYPE_TCP }; int ret; if (what == EV_READ) @@ -367,7 +343,7 @@ response_cb(int fd, short what, void *arg) debug_disconnect_counter++; if (debug_disconnect_counter == 1000) { - sp_cb.logmsg("Simulating a disconnection from the access point (last request type was %d)\n", session->msg_type_last); + sp_cb.logmsg("Simulating a disconnection from the access point (last request was %s)\n", session->request->name); ret = 0; } #endif @@ -376,23 +352,29 @@ response_cb(int fd, short what, void *arg) RETURN_ERROR(SP_ERR_NOCONNECTION, "The access point disconnected"); else if (ret < 0) RETURN_ERROR(SP_ERR_NOCONNECTION, "Connection to Spotify returned an error"); - -// sp_cb.logmsg("Received data len %d\n", ret); } - ret = response_read(session); + // Allocates *data in msg + ret = msg_tcp_read_one(&msg.payload.tmsg, conn); + if (ret == SP_OK_WAIT) + return; + else if (ret < 0) + goto error; + + if (msg.payload.tmsg.len < 128) + sp_cb.hexdump("Received tcp message\n", msg.payload.tmsg.data, msg.payload.tmsg.len); + else + sp_cb.hexdump("Received tcp message (truncated)\n", msg.payload.tmsg.data, 128); + + ret = msg_handle(&msg, session); switch (ret) { case SP_OK_WAIT: // Incomplete, wait for more data break; case SP_OK_DATA: - if (channel->state == SP_CHANNEL_STATE_PLAYING && !channel->file.end_of_file) - session->msg_type_next = MSG_TYPE_CHUNK_REQUEST; - if (channel->progress_cb) - channel->progress_cb(channel->audio_fd[0], channel->cb_arg, 4 * channel->file.received_words - SP_OGG_HEADER_LEN, 4 * channel->file.len_words - SP_OGG_HEADER_LEN); + audio_data_received(session); event_del(conn->timeout_ev); - event_add(channel->audio_write_ev, NULL); break; case SP_OK_DONE: // Got the response we expected, but possibly more to process if (evbuffer_get_length(conn->incoming) > 0) @@ -410,77 +392,140 @@ response_cb(int fd, short what, void *arg) goto error; } + msg_clear(&msg); return; error: + msg_clear(&msg); + if (ret == SP_ERR_NOCONNECTION) session_retry(session); else session_error(session, ret); } -static int -relogin(enum sp_msg_type type, struct sp_session *session) +static enum sp_error +msg_send(struct sp_message *msg, struct sp_session *session) { - int ret; + struct sp_message res; + struct sp_connection *conn = &session->conn; + enum sp_error ret; - ret = request_make(MSG_TYPE_CLIENT_HELLO, session); - if (ret < 0) - RETURN_ERROR(ret, sp_errmsg); + if (session->request->proto == SP_PROTO_TCP) + { + if (msg->payload.tmsg.encrypt) + conn->is_encrypted = true; - // In case we lost connection to the AP we have to make a new handshake for - // the non-handshake message types. So queue the message until the handshake - // is complete. - session->msg_type_queued = type; - return 0; + ret = msg_tcp_send(&msg->payload.tmsg, conn); + if (ret < 0) + RETURN_ERROR(ret, sp_errmsg); + + // Only start timeout timer if a response is expected, otherwise go + // straight to next message + if (session->request->response_handler) + event_add(conn->timeout_ev, &sp_response_timeout_tv); + else + event_active(session->continue_ev, 0, 0); + } + else if (session->request->proto == SP_PROTO_HTTP) + { + res.type = SP_MSG_TYPE_HTTP_RES; + + // Using http_session ensures that Curl will use keepalive and doesn't + // need to reconnect with every request + ret = msg_http_send(&res.payload.hres, &msg->payload.hreq, &session->http_session); + if (ret < 0) + RETURN_ERROR(ret, sp_errmsg); + + // Since http requests are currently sync we can handle the response right + // away. In an async future we would need to make an incoming event and + // have a callback func for msg_handle, like for tcp. + ret = msg_handle(&res, session); + msg_clear(&res); + if (ret < 0) + RETURN_ERROR(ret, sp_errmsg); + else if (ret == SP_OK_DATA) + audio_data_received(session); + else + event_active(session->continue_ev, 0, 0); + } + else + RETURN_ERROR(SP_ERR_INVALID, "Bug! Request is missing protocol type"); + + return SP_OK_DONE; error: return ret; } -static int -request_make(enum sp_msg_type type, struct sp_session *session) +static void +sequence_continue(struct sp_session *session) { - struct sp_message msg; - struct sp_connection *conn = &session->conn; - struct sp_conn_callbacks cb = { sp_evbase, response_cb, timeout_cb }; + struct sp_conn_callbacks cb = { sp_evbase, incoming_tcp_cb, timeout_tcp_cb }; + struct sp_message msg = { 0 }; int ret; -// sp_cb.logmsg("Making request %d\n", type); +// sp_cb.logmsg("Preparing request '%s'\n", session->request->name); - // Make sure the connection is in a state suitable for sending this message - ret = ap_connect(&session->conn, type, &session->cooldown_ts, session->ap_avoid, &cb, session); + // Checks if the dependencies for making the request are met - e.g. do we have + // a connection and a valid token. If not, tries to satisfy them. + ret = seq_request_prepare(session->request, &cb, session); if (ret == SP_OK_WAIT) - return relogin(type, session); // Can't proceed right now, the handshake needs to complete first + sp_cb.logmsg("Sequence queued, first making request '%s'\n", session->request->name); else if (ret < 0) RETURN_ERROR(ret, sp_errmsg); - ret = msg_make(&msg, type, session); - if (ret < 0) + ret = msg_make(&msg, session->request, session); + if (ret > 0) + { + event_active(session->continue_ev, 0, 0); + return; + } + else if (ret < 0) RETURN_ERROR(SP_ERR_INVALID, "Error constructing message to Spotify"); - if (msg.encrypt) - conn->is_encrypted = true; - - ret = msg_send(&msg, conn); + ret = msg_send(&msg, session); if (ret < 0) RETURN_ERROR(ret, sp_errmsg); - // Only start timeout timer if a response is expected, otherwise go straight - // to next message - if (msg.response_handler) - event_add(conn->timeout_ev, &sp_response_timeout_tv); - else - event_active(session->continue_ev, 0, 0); - - session->msg_type_last = type; - session->msg_type_next = msg.type_next; - session->response_handler = msg.response_handler; - - return 0; + msg_clear(&msg); + return; // Proceed in sequence_continue_cb error: - return ret; + msg_clear(&msg); + session_error(session, ret); +} + +static void +sequence_continue_cb(int fd, short what, void *arg) +{ + struct sp_session *session = arg; + + // If set, we are in a sequence and should proceed to the next request + if (session->request) + session->request++; + + // Starting a sequence, or ending one and should possibly start the next + if (!session->request || !session->request->name) + { + session->request = seq_request_get(session->next_seq, 0, session->use_legacy); + seq_next_set(session, SP_SEQ_STOP); + } + + if (session->request && session->request->name) + sequence_continue(session); + else + session_return(session, SP_OK_DONE); // All done, yay! +} + +// All errors that may occur during a sequence are called back async +static void +sequence_start(enum sp_seq_type seq_type, struct sp_session *session) +{ + session->request = NULL; + seq_next_set(session, seq_type); + + event_active(session->continue_ev, 0, 0); } @@ -507,9 +552,7 @@ track_write(void *arg, int *retval) channel_play(channel); - ret = request_make(MSG_TYPE_CHUNK_REQUEST, session); - if (ret < 0) - RETURN_ERROR(ret, sp_errmsg); + sequence_start(SP_SEQ_MEDIA_GET, session); channel->progress_cb = cmdargs->progress_cb; channel->cb_arg = cmdargs->cb_arg; @@ -517,7 +560,7 @@ track_write(void *arg, int *retval) return COMMAND_END; error: - sp_cb.logmsg("Error %d: %s", ret, sp_errmsg); + sp_cb.logmsg("Error %d: %s\n", ret, sp_errmsg); return COMMAND_END; } @@ -548,7 +591,7 @@ track_pause(void *arg, int *retval) } channel_pause(channel); - session->msg_type_next = MSG_TYPE_NONE; + seq_next_set(session, SP_SEQ_STOP); // TODO test if this will work *retval = 1; return COMMAND_PENDING; @@ -580,9 +623,7 @@ track_seek(void *arg, int *retval) // AES decryptor to match the new position. It also flushes the pipe. channel_seek(channel, cmdargs->seek_pos); - ret = request_make(MSG_TYPE_CHUNK_REQUEST, session); - if (ret < 0) - RETURN_ERROR(ret, sp_errmsg); + sequence_start(SP_SEQ_MEDIA_GET, session); *retval = 1; return COMMAND_PENDING; @@ -620,7 +661,6 @@ media_open(void *arg, int *retval) struct sp_cmdargs *cmdargs = arg; struct sp_session *session = cmdargs->session; struct sp_channel *channel = NULL; - enum sp_msg_type type; int ret; ret = session_check(session); @@ -636,22 +676,13 @@ media_open(void *arg, int *retval) cmdargs->fd_read = channel->audio_fd[0]; - // Must be set before calling request_make() because this info is needed for + // Must be set before calling sequence_start() because this info is needed for // making the request session->now_streaming_channel = channel; - if (channel->file.media_type == SP_MEDIA_TRACK) - type = MSG_TYPE_MERCURY_TRACK_GET; - else if (channel->file.media_type == SP_MEDIA_EPISODE) - type = MSG_TYPE_MERCURY_EPISODE_GET; - else - RETURN_ERROR(SP_ERR_INVALID, "Unknown media type in Spotify path"); - // Kicks of a sequence where we first get file info, then get the AES key and // then the first chunk (incl. headers) - ret = request_make(type, session); - if (ret < 0) - RETURN_ERROR(ret, sp_errmsg); + sequence_start(SP_SEQ_MEDIA_OPEN, session); *retval = 1; return COMMAND_PENDING; @@ -685,13 +716,11 @@ login(void *arg, int *retval) struct sp_session *session = NULL; int ret; - ret = session_new(&session, cmdargs, continue_cb); + ret = session_new(&session, cmdargs, sequence_continue_cb); if (ret < 0) goto error; - ret = request_make(MSG_TYPE_CLIENT_HELLO, session); - if (ret < 0) - goto error; + sequence_start(SP_SEQ_LOGIN, session); cmdargs->session = session; @@ -736,6 +765,27 @@ logout(void *arg, int *retval) return COMMAND_END; } +static enum command_state +legacy_set(void *arg, int *retval) +{ + struct sp_cmdargs *cmdargs = arg; + struct sp_session *session = cmdargs->session; + int ret; + + ret = session_check(session); + if (ret < 0) + RETURN_ERROR(SP_ERR_NOSESSION, "Session has disappeared, cannot set legacy mode"); + + if (session->request && session->request->name) + RETURN_ERROR(SP_ERR_INVALID, "Can't switch mode while session is active"); + + session->use_legacy = cmdargs->use_legacy; + + error: + *retval = ret; + return COMMAND_END; +} + static enum command_state metadata_get(void *arg, int *retval) { @@ -749,7 +799,7 @@ metadata_get(void *arg, int *retval) RETURN_ERROR(SP_ERR_NOSESSION, "Session has disappeared, cannot get metadata"); memset(metadata, 0, sizeof(struct sp_metadata)); - metadata->file_len = 4 * session->now_streaming_channel->file.len_words - SP_OGG_HEADER_LEN;; + metadata->file_len = session->now_streaming_channel->file.len_bytes - SP_OGG_HEADER_LEN;; error: *retval = ret; @@ -909,6 +959,17 @@ librespotc_logout(struct sp_session *session) return commands_exec_sync(sp_cmdbase, logout, NULL, &cmdargs); } +int +librespotc_legacy_set(struct sp_session *session, int use_legacy) +{ + struct sp_cmdargs cmdargs = { 0 }; + + cmdargs.session = session; + cmdargs.use_legacy = use_legacy; + + return commands_exec_sync(sp_cmdbase, legacy_set, NULL, &cmdargs); +} + int librespotc_metadata_get(struct sp_metadata *metadata, int fd) { @@ -953,11 +1014,13 @@ system_info_set(struct sp_sysinfo *si_out, struct sp_sysinfo *si_user) { memcpy(si_out, si_user, sizeof(struct sp_sysinfo)); - if (si_out->client_name[9] == '\0') + if (si_out->client_name[0] == '\0') snprintf(si_out->client_name, sizeof(si_out->client_name), SP_CLIENT_NAME_DEFAULT); - if (si_out->client_version[9] == '\0') + if (si_out->client_id[0] == '\0') + snprintf(si_out->client_id, sizeof(si_out->client_id), SP_CLIENT_ID_DEFAULT); + if (si_out->client_version[0] == '\0') snprintf(si_out->client_version, sizeof(si_out->client_version), SP_CLIENT_VERSION_DEFAULT); - if (si_out->client_build_id[9] == '\0') + if (si_out->client_build_id[0] == '\0') snprintf(si_out->client_build_id, sizeof(si_out->client_build_id), SP_CLIENT_BUILD_ID_DEFAULT); } @@ -969,8 +1032,11 @@ librespotc_init(struct sp_sysinfo *sysinfo, struct sp_callbacks *callbacks) if (sp_initialized) RETURN_ERROR(SP_ERR_INVALID, "librespot-c already initialized"); + ret = seq_requests_check(); + if (ret < 0) + RETURN_ERROR(SP_ERR_INVALID, "Bug! Misalignment between enum seq_type and seq_requests"); + sp_cb = *callbacks; - sp_initialized = true; system_info_set(&sp_sysinfo, sysinfo); @@ -989,6 +1055,7 @@ librespotc_init(struct sp_sysinfo *sysinfo, struct sp_callbacks *callbacks) if (sp_cb.thread_name_set) sp_cb.thread_name_set(sp_tid); + sp_initialized = true; return 0; error: diff --git a/src/inputs/librespot-c/src/proto/ad-hermes-proxy.proto b/src/inputs/librespot-c/src/proto/ad-hermes-proxy.proto deleted file mode 100644 index 219bbcbf..00000000 --- a/src/inputs/librespot-c/src/proto/ad-hermes-proxy.proto +++ /dev/null @@ -1,51 +0,0 @@ -syntax = "proto2"; - -message Rule { - optional string type = 0x1; - optional uint32 times = 0x2; - optional uint64 interval = 0x3; -} - -message AdRequest { - optional string client_language = 0x1; - optional string product = 0x2; - optional uint32 version = 0x3; - optional string type = 0x4; - repeated string avoidAds = 0x5; -} - -message AdQueueResponse { - repeated AdQueueEntry adQueueEntry = 0x1; -} - -message AdFile { - optional string id = 0x1; - optional string format = 0x2; -} - -message AdQueueEntry { - optional uint64 start_time = 0x1; - optional uint64 end_time = 0x2; - optional double priority = 0x3; - optional string token = 0x4; - optional uint32 ad_version = 0x5; - optional string id = 0x6; - optional string type = 0x7; - optional string campaign = 0x8; - optional string advertiser = 0x9; - optional string url = 0xa; - optional uint64 duration = 0xb; - optional uint64 expiry = 0xc; - optional string tracking_url = 0xd; - optional string banner_type = 0xe; - optional string html = 0xf; - optional string image = 0x10; - optional string background_image = 0x11; - optional string background_url = 0x12; - optional string background_color = 0x13; - optional string title = 0x14; - optional string caption = 0x15; - repeated AdFile file = 0x16; - repeated Rule rule = 0x17; -} - diff --git a/src/inputs/librespot-c/src/proto/appstore.proto b/src/inputs/librespot-c/src/proto/appstore.proto deleted file mode 100644 index bddaaf30..00000000 --- a/src/inputs/librespot-c/src/proto/appstore.proto +++ /dev/null @@ -1,95 +0,0 @@ -syntax = "proto2"; - -message AppInfo { - optional string identifier = 0x1; - optional int32 version_int = 0x2; -} - -message AppInfoList { - repeated AppInfo items = 0x1; -} - -message SemanticVersion { - optional int32 major = 0x1; - optional int32 minor = 0x2; - optional int32 patch = 0x3; -} - -message RequestHeader { - optional string market = 0x1; - optional Platform platform = 0x2; - enum Platform { - WIN32_X86 = 0x0; - OSX_X86 = 0x1; - LINUX_X86 = 0x2; - IPHONE_ARM = 0x3; - SYMBIANS60_ARM = 0x4; - OSX_POWERPC = 0x5; - ANDROID_ARM = 0x6; - WINCE_ARM = 0x7; - LINUX_X86_64 = 0x8; - OSX_X86_64 = 0x9; - PALM_ARM = 0xa; - LINUX_SH = 0xb; - FREEBSD_X86 = 0xc; - FREEBSD_X86_64 = 0xd; - BLACKBERRY_ARM = 0xe; - SONOS_UNKNOWN = 0xf; - LINUX_MIPS = 0x10; - LINUX_ARM = 0x11; - LOGITECH_ARM = 0x12; - LINUX_BLACKFIN = 0x13; - ONKYO_ARM = 0x15; - QNXNTO_ARM = 0x16; - BADPLATFORM = 0xff; - } - optional AppInfoList app_infos = 0x6; - optional string bridge_identifier = 0x7; - optional SemanticVersion bridge_version = 0x8; - optional DeviceClass device_class = 0x9; - enum DeviceClass { - DESKTOP = 0x1; - TABLET = 0x2; - MOBILE = 0x3; - WEB = 0x4; - TV = 0x5; - } -} - -message AppItem { - optional string identifier = 0x1; - optional Requirement requirement = 0x2; - enum Requirement { - REQUIRED_INSTALL = 0x1; - LAZYLOAD = 0x2; - OPTIONAL_INSTALL = 0x3; - } - optional string manifest = 0x4; - optional string checksum = 0x5; - optional string bundle_uri = 0x6; - optional string small_icon_uri = 0x7; - optional string large_icon_uri = 0x8; - optional string medium_icon_uri = 0x9; - optional Type bundle_type = 0xa; - enum Type { - APPLICATION = 0x0; - FRAMEWORK = 0x1; - BRIDGE = 0x2; - } - optional SemanticVersion version = 0xb; - optional uint32 ttl_in_seconds = 0xc; - optional IdentifierList categories = 0xd; -} - -message AppList { - repeated AppItem items = 0x1; -} - -message IdentifierList { - repeated string identifiers = 0x1; -} - -message BannerConfig { - optional string json = 0x1; -} - diff --git a/src/inputs/librespot-c/src/proto/clienttoken.pb-c.c b/src/inputs/librespot-c/src/proto/clienttoken.pb-c.c new file mode 100644 index 00000000..2902ba53 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/clienttoken.pb-c.c @@ -0,0 +1,1676 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: clienttoken.proto */ + +/* Do not generate deprecated warnings for self */ +#ifndef PROTOBUF_C__NO_DEPRECATED +#define PROTOBUF_C__NO_DEPRECATED +#endif + +#include "clienttoken.pb-c.h" +void spotify__clienttoken__http__v0__client_token_request__init + (Spotify__Clienttoken__Http__V0__ClientTokenRequest *message) +{ + static const Spotify__Clienttoken__Http__V0__ClientTokenRequest init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__client_token_request__get_packed_size + (const Spotify__Clienttoken__Http__V0__ClientTokenRequest *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_token_request__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__client_token_request__pack + (const Spotify__Clienttoken__Http__V0__ClientTokenRequest *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_token_request__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__client_token_request__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ClientTokenRequest *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_token_request__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__ClientTokenRequest * + spotify__clienttoken__http__v0__client_token_request__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__ClientTokenRequest *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__client_token_request__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__client_token_request__free_unpacked + (Spotify__Clienttoken__Http__V0__ClientTokenRequest *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_token_request__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__client_data_request__init + (Spotify__Clienttoken__Http__V0__ClientDataRequest *message) +{ + static const Spotify__Clienttoken__Http__V0__ClientDataRequest init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_DATA_REQUEST__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__client_data_request__get_packed_size + (const Spotify__Clienttoken__Http__V0__ClientDataRequest *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_data_request__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__client_data_request__pack + (const Spotify__Clienttoken__Http__V0__ClientDataRequest *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_data_request__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__client_data_request__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ClientDataRequest *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_data_request__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__ClientDataRequest * + spotify__clienttoken__http__v0__client_data_request__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__ClientDataRequest *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__client_data_request__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__client_data_request__free_unpacked + (Spotify__Clienttoken__Http__V0__ClientDataRequest *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_data_request__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__challenge_answers_request__init + (Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest *message) +{ + static const Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_ANSWERS_REQUEST__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__challenge_answers_request__get_packed_size + (const Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenge_answers_request__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__challenge_answers_request__pack + (const Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenge_answers_request__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__challenge_answers_request__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenge_answers_request__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest * + spotify__clienttoken__http__v0__challenge_answers_request__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__challenge_answers_request__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__challenge_answers_request__free_unpacked + (Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenge_answers_request__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__client_token_response__init + (Spotify__Clienttoken__Http__V0__ClientTokenResponse *message) +{ + static const Spotify__Clienttoken__Http__V0__ClientTokenResponse init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__client_token_response__get_packed_size + (const Spotify__Clienttoken__Http__V0__ClientTokenResponse *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_token_response__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__client_token_response__pack + (const Spotify__Clienttoken__Http__V0__ClientTokenResponse *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_token_response__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__client_token_response__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ClientTokenResponse *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_token_response__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__ClientTokenResponse * + spotify__clienttoken__http__v0__client_token_response__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__ClientTokenResponse *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__client_token_response__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__client_token_response__free_unpacked + (Spotify__Clienttoken__Http__V0__ClientTokenResponse *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_token_response__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__token_domain__init + (Spotify__Clienttoken__Http__V0__TokenDomain *message) +{ + static const Spotify__Clienttoken__Http__V0__TokenDomain init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__TOKEN_DOMAIN__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__token_domain__get_packed_size + (const Spotify__Clienttoken__Http__V0__TokenDomain *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__token_domain__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__token_domain__pack + (const Spotify__Clienttoken__Http__V0__TokenDomain *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__token_domain__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__token_domain__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__TokenDomain *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__token_domain__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__TokenDomain * + spotify__clienttoken__http__v0__token_domain__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__TokenDomain *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__token_domain__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__token_domain__free_unpacked + (Spotify__Clienttoken__Http__V0__TokenDomain *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__token_domain__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__granted_token_response__init + (Spotify__Clienttoken__Http__V0__GrantedTokenResponse *message) +{ + static const Spotify__Clienttoken__Http__V0__GrantedTokenResponse init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__GRANTED_TOKEN_RESPONSE__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__granted_token_response__get_packed_size + (const Spotify__Clienttoken__Http__V0__GrantedTokenResponse *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__granted_token_response__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__granted_token_response__pack + (const Spotify__Clienttoken__Http__V0__GrantedTokenResponse *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__granted_token_response__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__granted_token_response__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__GrantedTokenResponse *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__granted_token_response__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__GrantedTokenResponse * + spotify__clienttoken__http__v0__granted_token_response__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__GrantedTokenResponse *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__granted_token_response__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__granted_token_response__free_unpacked + (Spotify__Clienttoken__Http__V0__GrantedTokenResponse *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__granted_token_response__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__challenges_response__init + (Spotify__Clienttoken__Http__V0__ChallengesResponse *message) +{ + static const Spotify__Clienttoken__Http__V0__ChallengesResponse init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGES_RESPONSE__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__challenges_response__get_packed_size + (const Spotify__Clienttoken__Http__V0__ChallengesResponse *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenges_response__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__challenges_response__pack + (const Spotify__Clienttoken__Http__V0__ChallengesResponse *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenges_response__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__challenges_response__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ChallengesResponse *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenges_response__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__ChallengesResponse * + spotify__clienttoken__http__v0__challenges_response__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__ChallengesResponse *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__challenges_response__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__challenges_response__free_unpacked + (Spotify__Clienttoken__Http__V0__ChallengesResponse *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenges_response__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__client_secret_parameters__init + (Spotify__Clienttoken__Http__V0__ClientSecretParameters *message) +{ + static const Spotify__Clienttoken__Http__V0__ClientSecretParameters init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_SECRET_PARAMETERS__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__client_secret_parameters__get_packed_size + (const Spotify__Clienttoken__Http__V0__ClientSecretParameters *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_secret_parameters__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__client_secret_parameters__pack + (const Spotify__Clienttoken__Http__V0__ClientSecretParameters *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_secret_parameters__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__client_secret_parameters__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ClientSecretParameters *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_secret_parameters__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__ClientSecretParameters * + spotify__clienttoken__http__v0__client_secret_parameters__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__ClientSecretParameters *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__client_secret_parameters__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__client_secret_parameters__free_unpacked + (Spotify__Clienttoken__Http__V0__ClientSecretParameters *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_secret_parameters__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__evaluate_jsparameters__init + (Spotify__Clienttoken__Http__V0__EvaluateJSParameters *message) +{ + static const Spotify__Clienttoken__Http__V0__EvaluateJSParameters init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__EVALUATE_JSPARAMETERS__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__evaluate_jsparameters__get_packed_size + (const Spotify__Clienttoken__Http__V0__EvaluateJSParameters *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__evaluate_jsparameters__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__evaluate_jsparameters__pack + (const Spotify__Clienttoken__Http__V0__EvaluateJSParameters *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__evaluate_jsparameters__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__evaluate_jsparameters__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__EvaluateJSParameters *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__evaluate_jsparameters__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__EvaluateJSParameters * + spotify__clienttoken__http__v0__evaluate_jsparameters__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__EvaluateJSParameters *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__evaluate_jsparameters__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__evaluate_jsparameters__free_unpacked + (Spotify__Clienttoken__Http__V0__EvaluateJSParameters *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__evaluate_jsparameters__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__hash_cash_parameters__init + (Spotify__Clienttoken__Http__V0__HashCashParameters *message) +{ + static const Spotify__Clienttoken__Http__V0__HashCashParameters init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__HASH_CASH_PARAMETERS__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__hash_cash_parameters__get_packed_size + (const Spotify__Clienttoken__Http__V0__HashCashParameters *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__hash_cash_parameters__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__hash_cash_parameters__pack + (const Spotify__Clienttoken__Http__V0__HashCashParameters *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__hash_cash_parameters__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__hash_cash_parameters__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__HashCashParameters *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__hash_cash_parameters__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__HashCashParameters * + spotify__clienttoken__http__v0__hash_cash_parameters__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__HashCashParameters *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__hash_cash_parameters__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__hash_cash_parameters__free_unpacked + (Spotify__Clienttoken__Http__V0__HashCashParameters *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__hash_cash_parameters__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__challenge__init + (Spotify__Clienttoken__Http__V0__Challenge *message) +{ + static const Spotify__Clienttoken__Http__V0__Challenge init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__challenge__get_packed_size + (const Spotify__Clienttoken__Http__V0__Challenge *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenge__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__challenge__pack + (const Spotify__Clienttoken__Http__V0__Challenge *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenge__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__challenge__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__Challenge *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenge__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__Challenge * + spotify__clienttoken__http__v0__challenge__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__Challenge *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__challenge__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__challenge__free_unpacked + (Spotify__Clienttoken__Http__V0__Challenge *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenge__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__client_secret_hmacanswer__init + (Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer *message) +{ + static const Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_SECRET_HMACANSWER__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__client_secret_hmacanswer__get_packed_size + (const Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_secret_hmacanswer__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__client_secret_hmacanswer__pack + (const Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_secret_hmacanswer__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__client_secret_hmacanswer__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_secret_hmacanswer__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer * + spotify__clienttoken__http__v0__client_secret_hmacanswer__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__client_secret_hmacanswer__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__client_secret_hmacanswer__free_unpacked + (Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_secret_hmacanswer__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__evaluate_jsanswer__init + (Spotify__Clienttoken__Http__V0__EvaluateJSAnswer *message) +{ + static const Spotify__Clienttoken__Http__V0__EvaluateJSAnswer init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__EVALUATE_JSANSWER__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__evaluate_jsanswer__get_packed_size + (const Spotify__Clienttoken__Http__V0__EvaluateJSAnswer *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__evaluate_jsanswer__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__evaluate_jsanswer__pack + (const Spotify__Clienttoken__Http__V0__EvaluateJSAnswer *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__evaluate_jsanswer__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__evaluate_jsanswer__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__EvaluateJSAnswer *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__evaluate_jsanswer__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__EvaluateJSAnswer * + spotify__clienttoken__http__v0__evaluate_jsanswer__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__EvaluateJSAnswer *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__evaluate_jsanswer__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__evaluate_jsanswer__free_unpacked + (Spotify__Clienttoken__Http__V0__EvaluateJSAnswer *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__evaluate_jsanswer__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__hash_cash_answer__init + (Spotify__Clienttoken__Http__V0__HashCashAnswer *message) +{ + static const Spotify__Clienttoken__Http__V0__HashCashAnswer init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__HASH_CASH_ANSWER__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__hash_cash_answer__get_packed_size + (const Spotify__Clienttoken__Http__V0__HashCashAnswer *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__hash_cash_answer__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__hash_cash_answer__pack + (const Spotify__Clienttoken__Http__V0__HashCashAnswer *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__hash_cash_answer__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__hash_cash_answer__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__HashCashAnswer *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__hash_cash_answer__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__HashCashAnswer * + spotify__clienttoken__http__v0__hash_cash_answer__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__HashCashAnswer *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__hash_cash_answer__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__hash_cash_answer__free_unpacked + (Spotify__Clienttoken__Http__V0__HashCashAnswer *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__hash_cash_answer__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__challenge_answer__init + (Spotify__Clienttoken__Http__V0__ChallengeAnswer *message) +{ + static const Spotify__Clienttoken__Http__V0__ChallengeAnswer init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_ANSWER__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__challenge_answer__get_packed_size + (const Spotify__Clienttoken__Http__V0__ChallengeAnswer *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenge_answer__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__challenge_answer__pack + (const Spotify__Clienttoken__Http__V0__ChallengeAnswer *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenge_answer__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__challenge_answer__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ChallengeAnswer *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenge_answer__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__ChallengeAnswer * + spotify__clienttoken__http__v0__challenge_answer__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__ChallengeAnswer *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__challenge_answer__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__challenge_answer__free_unpacked + (Spotify__Clienttoken__Http__V0__ChallengeAnswer *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__challenge_answer__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__http__v0__client_token_bad_request__init + (Spotify__Clienttoken__Http__V0__ClientTokenBadRequest *message) +{ + static const Spotify__Clienttoken__Http__V0__ClientTokenBadRequest init_value = SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_BAD_REQUEST__INIT; + *message = init_value; +} +size_t spotify__clienttoken__http__v0__client_token_bad_request__get_packed_size + (const Spotify__Clienttoken__Http__V0__ClientTokenBadRequest *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_token_bad_request__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__http__v0__client_token_bad_request__pack + (const Spotify__Clienttoken__Http__V0__ClientTokenBadRequest *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_token_bad_request__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__http__v0__client_token_bad_request__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ClientTokenBadRequest *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_token_bad_request__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Http__V0__ClientTokenBadRequest * + spotify__clienttoken__http__v0__client_token_bad_request__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Http__V0__ClientTokenBadRequest *) + protobuf_c_message_unpack (&spotify__clienttoken__http__v0__client_token_bad_request__descriptor, + allocator, len, data); +} +void spotify__clienttoken__http__v0__client_token_bad_request__free_unpacked + (Spotify__Clienttoken__Http__V0__ClientTokenBadRequest *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__http__v0__client_token_bad_request__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__client_token_request__field_descriptors[3] = +{ + { + "request_type", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_ENUM, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__ClientTokenRequest, request_type), + &spotify__clienttoken__http__v0__client_token_request_type__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "client_data", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Http__V0__ClientTokenRequest, request_case), + offsetof(Spotify__Clienttoken__Http__V0__ClientTokenRequest, client_data), + &spotify__clienttoken__http__v0__client_data_request__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "challenge_answers", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Http__V0__ClientTokenRequest, request_case), + offsetof(Spotify__Clienttoken__Http__V0__ClientTokenRequest, challenge_answers), + &spotify__clienttoken__http__v0__challenge_answers_request__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__client_token_request__field_indices_by_name[] = { + 2, /* field[2] = challenge_answers */ + 1, /* field[1] = client_data */ + 0, /* field[0] = request_type */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__client_token_request__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 3 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__client_token_request__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.ClientTokenRequest", + "ClientTokenRequest", + "Spotify__Clienttoken__Http__V0__ClientTokenRequest", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__ClientTokenRequest), + 3, + spotify__clienttoken__http__v0__client_token_request__field_descriptors, + spotify__clienttoken__http__v0__client_token_request__field_indices_by_name, + 1, spotify__clienttoken__http__v0__client_token_request__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__client_token_request__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__client_data_request__field_descriptors[3] = +{ + { + "client_version", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__ClientDataRequest, client_version), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "client_id", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__ClientDataRequest, client_id), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "connectivity_sdk_data", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Http__V0__ClientDataRequest, data_case), + offsetof(Spotify__Clienttoken__Http__V0__ClientDataRequest, connectivity_sdk_data), + &spotify__clienttoken__data__v0__connectivity_sdk_data__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__client_data_request__field_indices_by_name[] = { + 1, /* field[1] = client_id */ + 0, /* field[0] = client_version */ + 2, /* field[2] = connectivity_sdk_data */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__client_data_request__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 3 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__client_data_request__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.ClientDataRequest", + "ClientDataRequest", + "Spotify__Clienttoken__Http__V0__ClientDataRequest", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__ClientDataRequest), + 3, + spotify__clienttoken__http__v0__client_data_request__field_descriptors, + spotify__clienttoken__http__v0__client_data_request__field_indices_by_name, + 1, spotify__clienttoken__http__v0__client_data_request__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__client_data_request__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__challenge_answers_request__field_descriptors[2] = +{ + { + "state", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest, state), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "answers", + 2, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest, n_answers), + offsetof(Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest, answers), + &spotify__clienttoken__http__v0__challenge_answer__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__challenge_answers_request__field_indices_by_name[] = { + 1, /* field[1] = answers */ + 0, /* field[0] = state */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__challenge_answers_request__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__challenge_answers_request__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.ChallengeAnswersRequest", + "ChallengeAnswersRequest", + "Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest), + 2, + spotify__clienttoken__http__v0__challenge_answers_request__field_descriptors, + spotify__clienttoken__http__v0__challenge_answers_request__field_indices_by_name, + 1, spotify__clienttoken__http__v0__challenge_answers_request__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__challenge_answers_request__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__client_token_response__field_descriptors[3] = +{ + { + "response_type", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_ENUM, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__ClientTokenResponse, response_type), + &spotify__clienttoken__http__v0__client_token_response_type__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "granted_token", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Http__V0__ClientTokenResponse, response_case), + offsetof(Spotify__Clienttoken__Http__V0__ClientTokenResponse, granted_token), + &spotify__clienttoken__http__v0__granted_token_response__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "challenges", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Http__V0__ClientTokenResponse, response_case), + offsetof(Spotify__Clienttoken__Http__V0__ClientTokenResponse, challenges), + &spotify__clienttoken__http__v0__challenges_response__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__client_token_response__field_indices_by_name[] = { + 2, /* field[2] = challenges */ + 1, /* field[1] = granted_token */ + 0, /* field[0] = response_type */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__client_token_response__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 3 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__client_token_response__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.ClientTokenResponse", + "ClientTokenResponse", + "Spotify__Clienttoken__Http__V0__ClientTokenResponse", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__ClientTokenResponse), + 3, + spotify__clienttoken__http__v0__client_token_response__field_descriptors, + spotify__clienttoken__http__v0__client_token_response__field_indices_by_name, + 1, spotify__clienttoken__http__v0__client_token_response__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__client_token_response__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__token_domain__field_descriptors[1] = +{ + { + "domain", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__TokenDomain, domain), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__token_domain__field_indices_by_name[] = { + 0, /* field[0] = domain */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__token_domain__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 1 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__token_domain__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.TokenDomain", + "TokenDomain", + "Spotify__Clienttoken__Http__V0__TokenDomain", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__TokenDomain), + 1, + spotify__clienttoken__http__v0__token_domain__field_descriptors, + spotify__clienttoken__http__v0__token_domain__field_indices_by_name, + 1, spotify__clienttoken__http__v0__token_domain__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__token_domain__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__granted_token_response__field_descriptors[4] = +{ + { + "token", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__GrantedTokenResponse, token), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "expires_after_seconds", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__GrantedTokenResponse, expires_after_seconds), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "refresh_after_seconds", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__GrantedTokenResponse, refresh_after_seconds), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "domains", + 4, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Http__V0__GrantedTokenResponse, n_domains), + offsetof(Spotify__Clienttoken__Http__V0__GrantedTokenResponse, domains), + &spotify__clienttoken__http__v0__token_domain__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__granted_token_response__field_indices_by_name[] = { + 3, /* field[3] = domains */ + 1, /* field[1] = expires_after_seconds */ + 2, /* field[2] = refresh_after_seconds */ + 0, /* field[0] = token */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__granted_token_response__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 4 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__granted_token_response__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.GrantedTokenResponse", + "GrantedTokenResponse", + "Spotify__Clienttoken__Http__V0__GrantedTokenResponse", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__GrantedTokenResponse), + 4, + spotify__clienttoken__http__v0__granted_token_response__field_descriptors, + spotify__clienttoken__http__v0__granted_token_response__field_indices_by_name, + 1, spotify__clienttoken__http__v0__granted_token_response__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__granted_token_response__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__challenges_response__field_descriptors[2] = +{ + { + "state", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__ChallengesResponse, state), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "challenges", + 2, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Http__V0__ChallengesResponse, n_challenges), + offsetof(Spotify__Clienttoken__Http__V0__ChallengesResponse, challenges), + &spotify__clienttoken__http__v0__challenge__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__challenges_response__field_indices_by_name[] = { + 1, /* field[1] = challenges */ + 0, /* field[0] = state */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__challenges_response__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__challenges_response__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.ChallengesResponse", + "ChallengesResponse", + "Spotify__Clienttoken__Http__V0__ChallengesResponse", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__ChallengesResponse), + 2, + spotify__clienttoken__http__v0__challenges_response__field_descriptors, + spotify__clienttoken__http__v0__challenges_response__field_indices_by_name, + 1, spotify__clienttoken__http__v0__challenges_response__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__challenges_response__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__client_secret_parameters__field_descriptors[1] = +{ + { + "salt", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__ClientSecretParameters, salt), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__client_secret_parameters__field_indices_by_name[] = { + 0, /* field[0] = salt */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__client_secret_parameters__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 1 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__client_secret_parameters__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.ClientSecretParameters", + "ClientSecretParameters", + "Spotify__Clienttoken__Http__V0__ClientSecretParameters", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__ClientSecretParameters), + 1, + spotify__clienttoken__http__v0__client_secret_parameters__field_descriptors, + spotify__clienttoken__http__v0__client_secret_parameters__field_indices_by_name, + 1, spotify__clienttoken__http__v0__client_secret_parameters__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__client_secret_parameters__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__evaluate_jsparameters__field_descriptors[2] = +{ + { + "code", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__EvaluateJSParameters, code), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "libraries", + 2, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_STRING, + offsetof(Spotify__Clienttoken__Http__V0__EvaluateJSParameters, n_libraries), + offsetof(Spotify__Clienttoken__Http__V0__EvaluateJSParameters, libraries), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__evaluate_jsparameters__field_indices_by_name[] = { + 0, /* field[0] = code */ + 1, /* field[1] = libraries */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__evaluate_jsparameters__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__evaluate_jsparameters__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.EvaluateJSParameters", + "EvaluateJSParameters", + "Spotify__Clienttoken__Http__V0__EvaluateJSParameters", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__EvaluateJSParameters), + 2, + spotify__clienttoken__http__v0__evaluate_jsparameters__field_descriptors, + spotify__clienttoken__http__v0__evaluate_jsparameters__field_indices_by_name, + 1, spotify__clienttoken__http__v0__evaluate_jsparameters__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__evaluate_jsparameters__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__hash_cash_parameters__field_descriptors[2] = +{ + { + "length", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__HashCashParameters, length), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "prefix", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__HashCashParameters, prefix), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__hash_cash_parameters__field_indices_by_name[] = { + 0, /* field[0] = length */ + 1, /* field[1] = prefix */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__hash_cash_parameters__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__hash_cash_parameters__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.HashCashParameters", + "HashCashParameters", + "Spotify__Clienttoken__Http__V0__HashCashParameters", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__HashCashParameters), + 2, + spotify__clienttoken__http__v0__hash_cash_parameters__field_descriptors, + spotify__clienttoken__http__v0__hash_cash_parameters__field_indices_by_name, + 1, spotify__clienttoken__http__v0__hash_cash_parameters__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__hash_cash_parameters__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__challenge__field_descriptors[4] = +{ + { + "type", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_ENUM, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__Challenge, type), + &spotify__clienttoken__http__v0__challenge_type__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "client_secret_parameters", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Http__V0__Challenge, parameters_case), + offsetof(Spotify__Clienttoken__Http__V0__Challenge, client_secret_parameters), + &spotify__clienttoken__http__v0__client_secret_parameters__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "evaluate_js_parameters", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Http__V0__Challenge, parameters_case), + offsetof(Spotify__Clienttoken__Http__V0__Challenge, evaluate_js_parameters), + &spotify__clienttoken__http__v0__evaluate_jsparameters__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "evaluate_hashcash_parameters", + 4, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Http__V0__Challenge, parameters_case), + offsetof(Spotify__Clienttoken__Http__V0__Challenge, evaluate_hashcash_parameters), + &spotify__clienttoken__http__v0__hash_cash_parameters__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__challenge__field_indices_by_name[] = { + 1, /* field[1] = client_secret_parameters */ + 3, /* field[3] = evaluate_hashcash_parameters */ + 2, /* field[2] = evaluate_js_parameters */ + 0, /* field[0] = type */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__challenge__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 4 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__challenge__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.Challenge", + "Challenge", + "Spotify__Clienttoken__Http__V0__Challenge", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__Challenge), + 4, + spotify__clienttoken__http__v0__challenge__field_descriptors, + spotify__clienttoken__http__v0__challenge__field_indices_by_name, + 1, spotify__clienttoken__http__v0__challenge__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__challenge__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__client_secret_hmacanswer__field_descriptors[1] = +{ + { + "hmac", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer, hmac), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__client_secret_hmacanswer__field_indices_by_name[] = { + 0, /* field[0] = hmac */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__client_secret_hmacanswer__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 1 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__client_secret_hmacanswer__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.ClientSecretHMACAnswer", + "ClientSecretHMACAnswer", + "Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer), + 1, + spotify__clienttoken__http__v0__client_secret_hmacanswer__field_descriptors, + spotify__clienttoken__http__v0__client_secret_hmacanswer__field_indices_by_name, + 1, spotify__clienttoken__http__v0__client_secret_hmacanswer__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__client_secret_hmacanswer__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__evaluate_jsanswer__field_descriptors[1] = +{ + { + "result", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__EvaluateJSAnswer, result), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__evaluate_jsanswer__field_indices_by_name[] = { + 0, /* field[0] = result */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__evaluate_jsanswer__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 1 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__evaluate_jsanswer__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.EvaluateJSAnswer", + "EvaluateJSAnswer", + "Spotify__Clienttoken__Http__V0__EvaluateJSAnswer", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__EvaluateJSAnswer), + 1, + spotify__clienttoken__http__v0__evaluate_jsanswer__field_descriptors, + spotify__clienttoken__http__v0__evaluate_jsanswer__field_indices_by_name, + 1, spotify__clienttoken__http__v0__evaluate_jsanswer__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__evaluate_jsanswer__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__hash_cash_answer__field_descriptors[1] = +{ + { + "suffix", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__HashCashAnswer, suffix), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__hash_cash_answer__field_indices_by_name[] = { + 0, /* field[0] = suffix */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__hash_cash_answer__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 1 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__hash_cash_answer__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.HashCashAnswer", + "HashCashAnswer", + "Spotify__Clienttoken__Http__V0__HashCashAnswer", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__HashCashAnswer), + 1, + spotify__clienttoken__http__v0__hash_cash_answer__field_descriptors, + spotify__clienttoken__http__v0__hash_cash_answer__field_indices_by_name, + 1, spotify__clienttoken__http__v0__hash_cash_answer__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__hash_cash_answer__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__challenge_answer__field_descriptors[4] = +{ + { + "ChallengeType", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_ENUM, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__ChallengeAnswer, challengetype), + &spotify__clienttoken__http__v0__challenge_type__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "client_secret", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Http__V0__ChallengeAnswer, answer_case), + offsetof(Spotify__Clienttoken__Http__V0__ChallengeAnswer, client_secret), + &spotify__clienttoken__http__v0__client_secret_hmacanswer__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "evaluate_js", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Http__V0__ChallengeAnswer, answer_case), + offsetof(Spotify__Clienttoken__Http__V0__ChallengeAnswer, evaluate_js), + &spotify__clienttoken__http__v0__evaluate_jsanswer__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "hash_cash", + 4, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Http__V0__ChallengeAnswer, answer_case), + offsetof(Spotify__Clienttoken__Http__V0__ChallengeAnswer, hash_cash), + &spotify__clienttoken__http__v0__hash_cash_answer__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__challenge_answer__field_indices_by_name[] = { + 0, /* field[0] = ChallengeType */ + 1, /* field[1] = client_secret */ + 2, /* field[2] = evaluate_js */ + 3, /* field[3] = hash_cash */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__challenge_answer__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 4 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__challenge_answer__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.ChallengeAnswer", + "ChallengeAnswer", + "Spotify__Clienttoken__Http__V0__ChallengeAnswer", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__ChallengeAnswer), + 4, + spotify__clienttoken__http__v0__challenge_answer__field_descriptors, + spotify__clienttoken__http__v0__challenge_answer__field_indices_by_name, + 1, spotify__clienttoken__http__v0__challenge_answer__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__challenge_answer__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__http__v0__client_token_bad_request__field_descriptors[1] = +{ + { + "message", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Http__V0__ClientTokenBadRequest, message), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__http__v0__client_token_bad_request__field_indices_by_name[] = { + 0, /* field[0] = message */ +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__client_token_bad_request__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 1 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__client_token_bad_request__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.ClientTokenBadRequest", + "ClientTokenBadRequest", + "Spotify__Clienttoken__Http__V0__ClientTokenBadRequest", + "spotify.clienttoken.http.v0", + sizeof(Spotify__Clienttoken__Http__V0__ClientTokenBadRequest), + 1, + spotify__clienttoken__http__v0__client_token_bad_request__field_descriptors, + spotify__clienttoken__http__v0__client_token_bad_request__field_indices_by_name, + 1, spotify__clienttoken__http__v0__client_token_bad_request__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__http__v0__client_token_bad_request__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCEnumValue spotify__clienttoken__http__v0__client_token_request_type__enum_values_by_number[3] = +{ + { "REQUEST_UNKNOWN", "SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST_TYPE__REQUEST_UNKNOWN", 0 }, + { "REQUEST_CLIENT_DATA_REQUEST", "SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST_TYPE__REQUEST_CLIENT_DATA_REQUEST", 1 }, + { "REQUEST_CHALLENGE_ANSWERS_REQUEST", "SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST_TYPE__REQUEST_CHALLENGE_ANSWERS_REQUEST", 2 }, +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__client_token_request_type__value_ranges[] = { +{0, 0},{0, 3} +}; +static const ProtobufCEnumValueIndex spotify__clienttoken__http__v0__client_token_request_type__enum_values_by_name[3] = +{ + { "REQUEST_CHALLENGE_ANSWERS_REQUEST", 2 }, + { "REQUEST_CLIENT_DATA_REQUEST", 1 }, + { "REQUEST_UNKNOWN", 0 }, +}; +const ProtobufCEnumDescriptor spotify__clienttoken__http__v0__client_token_request_type__descriptor = +{ + PROTOBUF_C__ENUM_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.ClientTokenRequestType", + "ClientTokenRequestType", + "Spotify__Clienttoken__Http__V0__ClientTokenRequestType", + "spotify.clienttoken.http.v0", + 3, + spotify__clienttoken__http__v0__client_token_request_type__enum_values_by_number, + 3, + spotify__clienttoken__http__v0__client_token_request_type__enum_values_by_name, + 1, + spotify__clienttoken__http__v0__client_token_request_type__value_ranges, + NULL,NULL,NULL,NULL /* reserved[1234] */ +}; +static const ProtobufCEnumValue spotify__clienttoken__http__v0__client_token_response_type__enum_values_by_number[3] = +{ + { "RESPONSE_UNKNOWN", "SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE_TYPE__RESPONSE_UNKNOWN", 0 }, + { "RESPONSE_GRANTED_TOKEN_RESPONSE", "SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE_TYPE__RESPONSE_GRANTED_TOKEN_RESPONSE", 1 }, + { "RESPONSE_CHALLENGES_RESPONSE", "SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE_TYPE__RESPONSE_CHALLENGES_RESPONSE", 2 }, +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__client_token_response_type__value_ranges[] = { +{0, 0},{0, 3} +}; +static const ProtobufCEnumValueIndex spotify__clienttoken__http__v0__client_token_response_type__enum_values_by_name[3] = +{ + { "RESPONSE_CHALLENGES_RESPONSE", 2 }, + { "RESPONSE_GRANTED_TOKEN_RESPONSE", 1 }, + { "RESPONSE_UNKNOWN", 0 }, +}; +const ProtobufCEnumDescriptor spotify__clienttoken__http__v0__client_token_response_type__descriptor = +{ + PROTOBUF_C__ENUM_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.ClientTokenResponseType", + "ClientTokenResponseType", + "Spotify__Clienttoken__Http__V0__ClientTokenResponseType", + "spotify.clienttoken.http.v0", + 3, + spotify__clienttoken__http__v0__client_token_response_type__enum_values_by_number, + 3, + spotify__clienttoken__http__v0__client_token_response_type__enum_values_by_name, + 1, + spotify__clienttoken__http__v0__client_token_response_type__value_ranges, + NULL,NULL,NULL,NULL /* reserved[1234] */ +}; +static const ProtobufCEnumValue spotify__clienttoken__http__v0__challenge_type__enum_values_by_number[4] = +{ + { "CHALLENGE_UNKNOWN", "SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_TYPE__CHALLENGE_UNKNOWN", 0 }, + { "CHALLENGE_CLIENT_SECRET_HMAC", "SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_TYPE__CHALLENGE_CLIENT_SECRET_HMAC", 1 }, + { "CHALLENGE_EVALUATE_JS", "SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_TYPE__CHALLENGE_EVALUATE_JS", 2 }, + { "CHALLENGE_HASH_CASH", "SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_TYPE__CHALLENGE_HASH_CASH", 3 }, +}; +static const ProtobufCIntRange spotify__clienttoken__http__v0__challenge_type__value_ranges[] = { +{0, 0},{0, 4} +}; +static const ProtobufCEnumValueIndex spotify__clienttoken__http__v0__challenge_type__enum_values_by_name[4] = +{ + { "CHALLENGE_CLIENT_SECRET_HMAC", 1 }, + { "CHALLENGE_EVALUATE_JS", 2 }, + { "CHALLENGE_HASH_CASH", 3 }, + { "CHALLENGE_UNKNOWN", 0 }, +}; +const ProtobufCEnumDescriptor spotify__clienttoken__http__v0__challenge_type__descriptor = +{ + PROTOBUF_C__ENUM_DESCRIPTOR_MAGIC, + "spotify.clienttoken.http.v0.ChallengeType", + "ChallengeType", + "Spotify__Clienttoken__Http__V0__ChallengeType", + "spotify.clienttoken.http.v0", + 4, + spotify__clienttoken__http__v0__challenge_type__enum_values_by_number, + 4, + spotify__clienttoken__http__v0__challenge_type__enum_values_by_name, + 1, + spotify__clienttoken__http__v0__challenge_type__value_ranges, + NULL,NULL,NULL,NULL /* reserved[1234] */ +}; diff --git a/src/inputs/librespot-c/src/proto/clienttoken.pb-c.h b/src/inputs/librespot-c/src/proto/clienttoken.pb-c.h new file mode 100644 index 00000000..433cb21e --- /dev/null +++ b/src/inputs/librespot-c/src/proto/clienttoken.pb-c.h @@ -0,0 +1,678 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: clienttoken.proto */ + +#ifndef PROTOBUF_C_clienttoken_2eproto__INCLUDED +#define PROTOBUF_C_clienttoken_2eproto__INCLUDED + +#include + +PROTOBUF_C__BEGIN_DECLS + +#if PROTOBUF_C_VERSION_NUMBER < 1003000 +# error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers. +#elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION +# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c. +#endif + +#include "connectivity.pb-c.h" + +typedef struct Spotify__Clienttoken__Http__V0__ClientTokenRequest Spotify__Clienttoken__Http__V0__ClientTokenRequest; +typedef struct Spotify__Clienttoken__Http__V0__ClientDataRequest Spotify__Clienttoken__Http__V0__ClientDataRequest; +typedef struct Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest; +typedef struct Spotify__Clienttoken__Http__V0__ClientTokenResponse Spotify__Clienttoken__Http__V0__ClientTokenResponse; +typedef struct Spotify__Clienttoken__Http__V0__TokenDomain Spotify__Clienttoken__Http__V0__TokenDomain; +typedef struct Spotify__Clienttoken__Http__V0__GrantedTokenResponse Spotify__Clienttoken__Http__V0__GrantedTokenResponse; +typedef struct Spotify__Clienttoken__Http__V0__ChallengesResponse Spotify__Clienttoken__Http__V0__ChallengesResponse; +typedef struct Spotify__Clienttoken__Http__V0__ClientSecretParameters Spotify__Clienttoken__Http__V0__ClientSecretParameters; +typedef struct Spotify__Clienttoken__Http__V0__EvaluateJSParameters Spotify__Clienttoken__Http__V0__EvaluateJSParameters; +typedef struct Spotify__Clienttoken__Http__V0__HashCashParameters Spotify__Clienttoken__Http__V0__HashCashParameters; +typedef struct Spotify__Clienttoken__Http__V0__Challenge Spotify__Clienttoken__Http__V0__Challenge; +typedef struct Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer; +typedef struct Spotify__Clienttoken__Http__V0__EvaluateJSAnswer Spotify__Clienttoken__Http__V0__EvaluateJSAnswer; +typedef struct Spotify__Clienttoken__Http__V0__HashCashAnswer Spotify__Clienttoken__Http__V0__HashCashAnswer; +typedef struct Spotify__Clienttoken__Http__V0__ChallengeAnswer Spotify__Clienttoken__Http__V0__ChallengeAnswer; +typedef struct Spotify__Clienttoken__Http__V0__ClientTokenBadRequest Spotify__Clienttoken__Http__V0__ClientTokenBadRequest; + + +/* --- enums --- */ + +typedef enum _Spotify__Clienttoken__Http__V0__ClientTokenRequestType { + SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST_TYPE__REQUEST_UNKNOWN = 0, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST_TYPE__REQUEST_CLIENT_DATA_REQUEST = 1, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST_TYPE__REQUEST_CHALLENGE_ANSWERS_REQUEST = 2 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST_TYPE) +} Spotify__Clienttoken__Http__V0__ClientTokenRequestType; +typedef enum _Spotify__Clienttoken__Http__V0__ClientTokenResponseType { + SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE_TYPE__RESPONSE_UNKNOWN = 0, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE_TYPE__RESPONSE_GRANTED_TOKEN_RESPONSE = 1, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE_TYPE__RESPONSE_CHALLENGES_RESPONSE = 2 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE_TYPE) +} Spotify__Clienttoken__Http__V0__ClientTokenResponseType; +typedef enum _Spotify__Clienttoken__Http__V0__ChallengeType { + SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_TYPE__CHALLENGE_UNKNOWN = 0, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_TYPE__CHALLENGE_CLIENT_SECRET_HMAC = 1, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_TYPE__CHALLENGE_EVALUATE_JS = 2, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_TYPE__CHALLENGE_HASH_CASH = 3 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_TYPE) +} Spotify__Clienttoken__Http__V0__ChallengeType; + +/* --- messages --- */ + +typedef enum { + SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST__REQUEST__NOT_SET = 0, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST__REQUEST_CLIENT_DATA = 2, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST__REQUEST_CHALLENGE_ANSWERS = 3 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST__REQUEST__CASE) +} Spotify__Clienttoken__Http__V0__ClientTokenRequest__RequestCase; + +struct Spotify__Clienttoken__Http__V0__ClientTokenRequest +{ + ProtobufCMessage base; + Spotify__Clienttoken__Http__V0__ClientTokenRequestType request_type; + Spotify__Clienttoken__Http__V0__ClientTokenRequest__RequestCase request_case; + union { + Spotify__Clienttoken__Http__V0__ClientDataRequest *client_data; + Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest *challenge_answers; + }; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__client_token_request__descriptor) \ + , SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST_TYPE__REQUEST_UNKNOWN, SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_REQUEST__REQUEST__NOT_SET, {0} } + + +typedef enum { + SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_DATA_REQUEST__DATA__NOT_SET = 0, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_DATA_REQUEST__DATA_CONNECTIVITY_SDK_DATA = 3 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_DATA_REQUEST__DATA__CASE) +} Spotify__Clienttoken__Http__V0__ClientDataRequest__DataCase; + +struct Spotify__Clienttoken__Http__V0__ClientDataRequest +{ + ProtobufCMessage base; + char *client_version; + char *client_id; + Spotify__Clienttoken__Http__V0__ClientDataRequest__DataCase data_case; + union { + Spotify__Clienttoken__Data__V0__ConnectivitySdkData *connectivity_sdk_data; + }; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_DATA_REQUEST__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__client_data_request__descriptor) \ + , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_DATA_REQUEST__DATA__NOT_SET, {0} } + + +struct Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest +{ + ProtobufCMessage base; + char *state; + size_t n_answers; + Spotify__Clienttoken__Http__V0__ChallengeAnswer **answers; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_ANSWERS_REQUEST__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__challenge_answers_request__descriptor) \ + , (char *)protobuf_c_empty_string, 0,NULL } + + +typedef enum { + SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE__RESPONSE__NOT_SET = 0, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE__RESPONSE_GRANTED_TOKEN = 2, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE__RESPONSE_CHALLENGES = 3 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE__RESPONSE__CASE) +} Spotify__Clienttoken__Http__V0__ClientTokenResponse__ResponseCase; + +struct Spotify__Clienttoken__Http__V0__ClientTokenResponse +{ + ProtobufCMessage base; + Spotify__Clienttoken__Http__V0__ClientTokenResponseType response_type; + Spotify__Clienttoken__Http__V0__ClientTokenResponse__ResponseCase response_case; + union { + Spotify__Clienttoken__Http__V0__GrantedTokenResponse *granted_token; + Spotify__Clienttoken__Http__V0__ChallengesResponse *challenges; + }; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__client_token_response__descriptor) \ + , SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE_TYPE__RESPONSE_UNKNOWN, SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_RESPONSE__RESPONSE__NOT_SET, {0} } + + +struct Spotify__Clienttoken__Http__V0__TokenDomain +{ + ProtobufCMessage base; + char *domain; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__TOKEN_DOMAIN__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__token_domain__descriptor) \ + , (char *)protobuf_c_empty_string } + + +struct Spotify__Clienttoken__Http__V0__GrantedTokenResponse +{ + ProtobufCMessage base; + char *token; + int32_t expires_after_seconds; + int32_t refresh_after_seconds; + size_t n_domains; + Spotify__Clienttoken__Http__V0__TokenDomain **domains; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__GRANTED_TOKEN_RESPONSE__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__granted_token_response__descriptor) \ + , (char *)protobuf_c_empty_string, 0, 0, 0,NULL } + + +struct Spotify__Clienttoken__Http__V0__ChallengesResponse +{ + ProtobufCMessage base; + char *state; + size_t n_challenges; + Spotify__Clienttoken__Http__V0__Challenge **challenges; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGES_RESPONSE__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__challenges_response__descriptor) \ + , (char *)protobuf_c_empty_string, 0,NULL } + + +struct Spotify__Clienttoken__Http__V0__ClientSecretParameters +{ + ProtobufCMessage base; + char *salt; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_SECRET_PARAMETERS__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__client_secret_parameters__descriptor) \ + , (char *)protobuf_c_empty_string } + + +struct Spotify__Clienttoken__Http__V0__EvaluateJSParameters +{ + ProtobufCMessage base; + char *code; + size_t n_libraries; + char **libraries; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__EVALUATE_JSPARAMETERS__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__evaluate_jsparameters__descriptor) \ + , (char *)protobuf_c_empty_string, 0,NULL } + + +struct Spotify__Clienttoken__Http__V0__HashCashParameters +{ + ProtobufCMessage base; + int32_t length; + char *prefix; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__HASH_CASH_PARAMETERS__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__hash_cash_parameters__descriptor) \ + , 0, (char *)protobuf_c_empty_string } + + +typedef enum { + SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE__PARAMETERS__NOT_SET = 0, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE__PARAMETERS_CLIENT_SECRET_PARAMETERS = 2, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE__PARAMETERS_EVALUATE_JS_PARAMETERS = 3, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE__PARAMETERS_EVALUATE_HASHCASH_PARAMETERS = 4 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE__PARAMETERS__CASE) +} Spotify__Clienttoken__Http__V0__Challenge__ParametersCase; + +struct Spotify__Clienttoken__Http__V0__Challenge +{ + ProtobufCMessage base; + Spotify__Clienttoken__Http__V0__ChallengeType type; + Spotify__Clienttoken__Http__V0__Challenge__ParametersCase parameters_case; + union { + Spotify__Clienttoken__Http__V0__ClientSecretParameters *client_secret_parameters; + Spotify__Clienttoken__Http__V0__EvaluateJSParameters *evaluate_js_parameters; + Spotify__Clienttoken__Http__V0__HashCashParameters *evaluate_hashcash_parameters; + }; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__challenge__descriptor) \ + , SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_TYPE__CHALLENGE_UNKNOWN, SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE__PARAMETERS__NOT_SET, {0} } + + +struct Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer +{ + ProtobufCMessage base; + char *hmac; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_SECRET_HMACANSWER__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__client_secret_hmacanswer__descriptor) \ + , (char *)protobuf_c_empty_string } + + +struct Spotify__Clienttoken__Http__V0__EvaluateJSAnswer +{ + ProtobufCMessage base; + char *result; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__EVALUATE_JSANSWER__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__evaluate_jsanswer__descriptor) \ + , (char *)protobuf_c_empty_string } + + +struct Spotify__Clienttoken__Http__V0__HashCashAnswer +{ + ProtobufCMessage base; + char *suffix; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__HASH_CASH_ANSWER__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__hash_cash_answer__descriptor) \ + , (char *)protobuf_c_empty_string } + + +typedef enum { + SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_ANSWER__ANSWER__NOT_SET = 0, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_ANSWER__ANSWER_CLIENT_SECRET = 2, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_ANSWER__ANSWER_EVALUATE_JS = 3, + SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_ANSWER__ANSWER_HASH_CASH = 4 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_ANSWER__ANSWER__CASE) +} Spotify__Clienttoken__Http__V0__ChallengeAnswer__AnswerCase; + +struct Spotify__Clienttoken__Http__V0__ChallengeAnswer +{ + ProtobufCMessage base; + Spotify__Clienttoken__Http__V0__ChallengeType challengetype; + Spotify__Clienttoken__Http__V0__ChallengeAnswer__AnswerCase answer_case; + union { + Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer *client_secret; + Spotify__Clienttoken__Http__V0__EvaluateJSAnswer *evaluate_js; + Spotify__Clienttoken__Http__V0__HashCashAnswer *hash_cash; + }; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_ANSWER__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__challenge_answer__descriptor) \ + , SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_TYPE__CHALLENGE_UNKNOWN, SPOTIFY__CLIENTTOKEN__HTTP__V0__CHALLENGE_ANSWER__ANSWER__NOT_SET, {0} } + + +struct Spotify__Clienttoken__Http__V0__ClientTokenBadRequest +{ + ProtobufCMessage base; + char *message; +}; +#define SPOTIFY__CLIENTTOKEN__HTTP__V0__CLIENT_TOKEN_BAD_REQUEST__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__http__v0__client_token_bad_request__descriptor) \ + , (char *)protobuf_c_empty_string } + + +/* Spotify__Clienttoken__Http__V0__ClientTokenRequest methods */ +void spotify__clienttoken__http__v0__client_token_request__init + (Spotify__Clienttoken__Http__V0__ClientTokenRequest *message); +size_t spotify__clienttoken__http__v0__client_token_request__get_packed_size + (const Spotify__Clienttoken__Http__V0__ClientTokenRequest *message); +size_t spotify__clienttoken__http__v0__client_token_request__pack + (const Spotify__Clienttoken__Http__V0__ClientTokenRequest *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__client_token_request__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ClientTokenRequest *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__ClientTokenRequest * + spotify__clienttoken__http__v0__client_token_request__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__client_token_request__free_unpacked + (Spotify__Clienttoken__Http__V0__ClientTokenRequest *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__ClientDataRequest methods */ +void spotify__clienttoken__http__v0__client_data_request__init + (Spotify__Clienttoken__Http__V0__ClientDataRequest *message); +size_t spotify__clienttoken__http__v0__client_data_request__get_packed_size + (const Spotify__Clienttoken__Http__V0__ClientDataRequest *message); +size_t spotify__clienttoken__http__v0__client_data_request__pack + (const Spotify__Clienttoken__Http__V0__ClientDataRequest *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__client_data_request__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ClientDataRequest *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__ClientDataRequest * + spotify__clienttoken__http__v0__client_data_request__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__client_data_request__free_unpacked + (Spotify__Clienttoken__Http__V0__ClientDataRequest *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest methods */ +void spotify__clienttoken__http__v0__challenge_answers_request__init + (Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest *message); +size_t spotify__clienttoken__http__v0__challenge_answers_request__get_packed_size + (const Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest *message); +size_t spotify__clienttoken__http__v0__challenge_answers_request__pack + (const Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__challenge_answers_request__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest * + spotify__clienttoken__http__v0__challenge_answers_request__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__challenge_answers_request__free_unpacked + (Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__ClientTokenResponse methods */ +void spotify__clienttoken__http__v0__client_token_response__init + (Spotify__Clienttoken__Http__V0__ClientTokenResponse *message); +size_t spotify__clienttoken__http__v0__client_token_response__get_packed_size + (const Spotify__Clienttoken__Http__V0__ClientTokenResponse *message); +size_t spotify__clienttoken__http__v0__client_token_response__pack + (const Spotify__Clienttoken__Http__V0__ClientTokenResponse *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__client_token_response__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ClientTokenResponse *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__ClientTokenResponse * + spotify__clienttoken__http__v0__client_token_response__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__client_token_response__free_unpacked + (Spotify__Clienttoken__Http__V0__ClientTokenResponse *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__TokenDomain methods */ +void spotify__clienttoken__http__v0__token_domain__init + (Spotify__Clienttoken__Http__V0__TokenDomain *message); +size_t spotify__clienttoken__http__v0__token_domain__get_packed_size + (const Spotify__Clienttoken__Http__V0__TokenDomain *message); +size_t spotify__clienttoken__http__v0__token_domain__pack + (const Spotify__Clienttoken__Http__V0__TokenDomain *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__token_domain__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__TokenDomain *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__TokenDomain * + spotify__clienttoken__http__v0__token_domain__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__token_domain__free_unpacked + (Spotify__Clienttoken__Http__V0__TokenDomain *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__GrantedTokenResponse methods */ +void spotify__clienttoken__http__v0__granted_token_response__init + (Spotify__Clienttoken__Http__V0__GrantedTokenResponse *message); +size_t spotify__clienttoken__http__v0__granted_token_response__get_packed_size + (const Spotify__Clienttoken__Http__V0__GrantedTokenResponse *message); +size_t spotify__clienttoken__http__v0__granted_token_response__pack + (const Spotify__Clienttoken__Http__V0__GrantedTokenResponse *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__granted_token_response__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__GrantedTokenResponse *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__GrantedTokenResponse * + spotify__clienttoken__http__v0__granted_token_response__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__granted_token_response__free_unpacked + (Spotify__Clienttoken__Http__V0__GrantedTokenResponse *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__ChallengesResponse methods */ +void spotify__clienttoken__http__v0__challenges_response__init + (Spotify__Clienttoken__Http__V0__ChallengesResponse *message); +size_t spotify__clienttoken__http__v0__challenges_response__get_packed_size + (const Spotify__Clienttoken__Http__V0__ChallengesResponse *message); +size_t spotify__clienttoken__http__v0__challenges_response__pack + (const Spotify__Clienttoken__Http__V0__ChallengesResponse *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__challenges_response__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ChallengesResponse *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__ChallengesResponse * + spotify__clienttoken__http__v0__challenges_response__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__challenges_response__free_unpacked + (Spotify__Clienttoken__Http__V0__ChallengesResponse *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__ClientSecretParameters methods */ +void spotify__clienttoken__http__v0__client_secret_parameters__init + (Spotify__Clienttoken__Http__V0__ClientSecretParameters *message); +size_t spotify__clienttoken__http__v0__client_secret_parameters__get_packed_size + (const Spotify__Clienttoken__Http__V0__ClientSecretParameters *message); +size_t spotify__clienttoken__http__v0__client_secret_parameters__pack + (const Spotify__Clienttoken__Http__V0__ClientSecretParameters *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__client_secret_parameters__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ClientSecretParameters *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__ClientSecretParameters * + spotify__clienttoken__http__v0__client_secret_parameters__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__client_secret_parameters__free_unpacked + (Spotify__Clienttoken__Http__V0__ClientSecretParameters *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__EvaluateJSParameters methods */ +void spotify__clienttoken__http__v0__evaluate_jsparameters__init + (Spotify__Clienttoken__Http__V0__EvaluateJSParameters *message); +size_t spotify__clienttoken__http__v0__evaluate_jsparameters__get_packed_size + (const Spotify__Clienttoken__Http__V0__EvaluateJSParameters *message); +size_t spotify__clienttoken__http__v0__evaluate_jsparameters__pack + (const Spotify__Clienttoken__Http__V0__EvaluateJSParameters *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__evaluate_jsparameters__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__EvaluateJSParameters *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__EvaluateJSParameters * + spotify__clienttoken__http__v0__evaluate_jsparameters__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__evaluate_jsparameters__free_unpacked + (Spotify__Clienttoken__Http__V0__EvaluateJSParameters *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__HashCashParameters methods */ +void spotify__clienttoken__http__v0__hash_cash_parameters__init + (Spotify__Clienttoken__Http__V0__HashCashParameters *message); +size_t spotify__clienttoken__http__v0__hash_cash_parameters__get_packed_size + (const Spotify__Clienttoken__Http__V0__HashCashParameters *message); +size_t spotify__clienttoken__http__v0__hash_cash_parameters__pack + (const Spotify__Clienttoken__Http__V0__HashCashParameters *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__hash_cash_parameters__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__HashCashParameters *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__HashCashParameters * + spotify__clienttoken__http__v0__hash_cash_parameters__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__hash_cash_parameters__free_unpacked + (Spotify__Clienttoken__Http__V0__HashCashParameters *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__Challenge methods */ +void spotify__clienttoken__http__v0__challenge__init + (Spotify__Clienttoken__Http__V0__Challenge *message); +size_t spotify__clienttoken__http__v0__challenge__get_packed_size + (const Spotify__Clienttoken__Http__V0__Challenge *message); +size_t spotify__clienttoken__http__v0__challenge__pack + (const Spotify__Clienttoken__Http__V0__Challenge *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__challenge__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__Challenge *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__Challenge * + spotify__clienttoken__http__v0__challenge__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__challenge__free_unpacked + (Spotify__Clienttoken__Http__V0__Challenge *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer methods */ +void spotify__clienttoken__http__v0__client_secret_hmacanswer__init + (Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer *message); +size_t spotify__clienttoken__http__v0__client_secret_hmacanswer__get_packed_size + (const Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer *message); +size_t spotify__clienttoken__http__v0__client_secret_hmacanswer__pack + (const Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__client_secret_hmacanswer__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer * + spotify__clienttoken__http__v0__client_secret_hmacanswer__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__client_secret_hmacanswer__free_unpacked + (Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__EvaluateJSAnswer methods */ +void spotify__clienttoken__http__v0__evaluate_jsanswer__init + (Spotify__Clienttoken__Http__V0__EvaluateJSAnswer *message); +size_t spotify__clienttoken__http__v0__evaluate_jsanswer__get_packed_size + (const Spotify__Clienttoken__Http__V0__EvaluateJSAnswer *message); +size_t spotify__clienttoken__http__v0__evaluate_jsanswer__pack + (const Spotify__Clienttoken__Http__V0__EvaluateJSAnswer *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__evaluate_jsanswer__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__EvaluateJSAnswer *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__EvaluateJSAnswer * + spotify__clienttoken__http__v0__evaluate_jsanswer__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__evaluate_jsanswer__free_unpacked + (Spotify__Clienttoken__Http__V0__EvaluateJSAnswer *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__HashCashAnswer methods */ +void spotify__clienttoken__http__v0__hash_cash_answer__init + (Spotify__Clienttoken__Http__V0__HashCashAnswer *message); +size_t spotify__clienttoken__http__v0__hash_cash_answer__get_packed_size + (const Spotify__Clienttoken__Http__V0__HashCashAnswer *message); +size_t spotify__clienttoken__http__v0__hash_cash_answer__pack + (const Spotify__Clienttoken__Http__V0__HashCashAnswer *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__hash_cash_answer__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__HashCashAnswer *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__HashCashAnswer * + spotify__clienttoken__http__v0__hash_cash_answer__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__hash_cash_answer__free_unpacked + (Spotify__Clienttoken__Http__V0__HashCashAnswer *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__ChallengeAnswer methods */ +void spotify__clienttoken__http__v0__challenge_answer__init + (Spotify__Clienttoken__Http__V0__ChallengeAnswer *message); +size_t spotify__clienttoken__http__v0__challenge_answer__get_packed_size + (const Spotify__Clienttoken__Http__V0__ChallengeAnswer *message); +size_t spotify__clienttoken__http__v0__challenge_answer__pack + (const Spotify__Clienttoken__Http__V0__ChallengeAnswer *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__challenge_answer__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ChallengeAnswer *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__ChallengeAnswer * + spotify__clienttoken__http__v0__challenge_answer__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__challenge_answer__free_unpacked + (Spotify__Clienttoken__Http__V0__ChallengeAnswer *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Http__V0__ClientTokenBadRequest methods */ +void spotify__clienttoken__http__v0__client_token_bad_request__init + (Spotify__Clienttoken__Http__V0__ClientTokenBadRequest *message); +size_t spotify__clienttoken__http__v0__client_token_bad_request__get_packed_size + (const Spotify__Clienttoken__Http__V0__ClientTokenBadRequest *message); +size_t spotify__clienttoken__http__v0__client_token_bad_request__pack + (const Spotify__Clienttoken__Http__V0__ClientTokenBadRequest *message, + uint8_t *out); +size_t spotify__clienttoken__http__v0__client_token_bad_request__pack_to_buffer + (const Spotify__Clienttoken__Http__V0__ClientTokenBadRequest *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Http__V0__ClientTokenBadRequest * + spotify__clienttoken__http__v0__client_token_bad_request__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__http__v0__client_token_bad_request__free_unpacked + (Spotify__Clienttoken__Http__V0__ClientTokenBadRequest *message, + ProtobufCAllocator *allocator); +/* --- per-message closures --- */ + +typedef void (*Spotify__Clienttoken__Http__V0__ClientTokenRequest_Closure) + (const Spotify__Clienttoken__Http__V0__ClientTokenRequest *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__ClientDataRequest_Closure) + (const Spotify__Clienttoken__Http__V0__ClientDataRequest *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest_Closure) + (const Spotify__Clienttoken__Http__V0__ChallengeAnswersRequest *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__ClientTokenResponse_Closure) + (const Spotify__Clienttoken__Http__V0__ClientTokenResponse *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__TokenDomain_Closure) + (const Spotify__Clienttoken__Http__V0__TokenDomain *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__GrantedTokenResponse_Closure) + (const Spotify__Clienttoken__Http__V0__GrantedTokenResponse *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__ChallengesResponse_Closure) + (const Spotify__Clienttoken__Http__V0__ChallengesResponse *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__ClientSecretParameters_Closure) + (const Spotify__Clienttoken__Http__V0__ClientSecretParameters *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__EvaluateJSParameters_Closure) + (const Spotify__Clienttoken__Http__V0__EvaluateJSParameters *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__HashCashParameters_Closure) + (const Spotify__Clienttoken__Http__V0__HashCashParameters *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__Challenge_Closure) + (const Spotify__Clienttoken__Http__V0__Challenge *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer_Closure) + (const Spotify__Clienttoken__Http__V0__ClientSecretHMACAnswer *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__EvaluateJSAnswer_Closure) + (const Spotify__Clienttoken__Http__V0__EvaluateJSAnswer *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__HashCashAnswer_Closure) + (const Spotify__Clienttoken__Http__V0__HashCashAnswer *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__ChallengeAnswer_Closure) + (const Spotify__Clienttoken__Http__V0__ChallengeAnswer *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Http__V0__ClientTokenBadRequest_Closure) + (const Spotify__Clienttoken__Http__V0__ClientTokenBadRequest *message, + void *closure_data); + +/* --- services --- */ + + +/* --- descriptors --- */ + +extern const ProtobufCEnumDescriptor spotify__clienttoken__http__v0__client_token_request_type__descriptor; +extern const ProtobufCEnumDescriptor spotify__clienttoken__http__v0__client_token_response_type__descriptor; +extern const ProtobufCEnumDescriptor spotify__clienttoken__http__v0__challenge_type__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__client_token_request__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__client_data_request__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__challenge_answers_request__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__client_token_response__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__token_domain__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__granted_token_response__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__challenges_response__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__client_secret_parameters__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__evaluate_jsparameters__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__hash_cash_parameters__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__challenge__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__client_secret_hmacanswer__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__evaluate_jsanswer__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__hash_cash_answer__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__challenge_answer__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__http__v0__client_token_bad_request__descriptor; + +PROTOBUF_C__END_DECLS + + +#endif /* PROTOBUF_C_clienttoken_2eproto__INCLUDED */ diff --git a/src/inputs/librespot-c/src/proto/clienttoken.proto b/src/inputs/librespot-c/src/proto/clienttoken.proto new file mode 100644 index 00000000..4b261a09 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/clienttoken.proto @@ -0,0 +1,122 @@ +syntax = "proto3"; + +package spotify.clienttoken.http.v0; + +import "connectivity.proto"; + +message ClientTokenRequest { + ClientTokenRequestType request_type = 1; + + oneof request { + ClientDataRequest client_data = 2; + ChallengeAnswersRequest challenge_answers = 3; + } +} + +message ClientDataRequest { + string client_version = 1; + string client_id = 2; + + oneof data { + spotify.clienttoken.data.v0.ConnectivitySdkData connectivity_sdk_data = 3; + } +} + +message ChallengeAnswersRequest { + string state = 1; + repeated ChallengeAnswer answers = 2; +} + +message ClientTokenResponse { + ClientTokenResponseType response_type = 1; + + oneof response { + GrantedTokenResponse granted_token = 2; + ChallengesResponse challenges = 3; + } +} + +message TokenDomain { + string domain = 1; +} + +message GrantedTokenResponse { + string token = 1; + int32 expires_after_seconds = 2; + int32 refresh_after_seconds = 3; + repeated TokenDomain domains = 4; +} + +message ChallengesResponse { + string state = 1; + repeated Challenge challenges = 2; +} + +message ClientSecretParameters { + string salt = 1; +} + +message EvaluateJSParameters { + string code = 1; + repeated string libraries = 2; +} + +message HashCashParameters { + int32 length = 1; + string prefix = 2; +} + +message Challenge { + ChallengeType type = 1; + + oneof parameters { + ClientSecretParameters client_secret_parameters = 2; + EvaluateJSParameters evaluate_js_parameters = 3; + HashCashParameters evaluate_hashcash_parameters = 4; + } +} + +message ClientSecretHMACAnswer { + string hmac = 1; +} + +message EvaluateJSAnswer { + string result = 1; +} + +message HashCashAnswer { + string suffix = 1; +} + +message ChallengeAnswer { + ChallengeType ChallengeType = 1; + + oneof answer { + ClientSecretHMACAnswer client_secret = 2; + EvaluateJSAnswer evaluate_js = 3; + HashCashAnswer hash_cash = 4; + } +} + +message ClientTokenBadRequest { + string message = 1; +} + +enum ClientTokenRequestType { + REQUEST_UNKNOWN = 0; + REQUEST_CLIENT_DATA_REQUEST = 1; + REQUEST_CHALLENGE_ANSWERS_REQUEST = 2; +} + +enum ClientTokenResponseType { + RESPONSE_UNKNOWN = 0; + RESPONSE_GRANTED_TOKEN_RESPONSE = 1; + RESPONSE_CHALLENGES_RESPONSE = 2; +} + +enum ChallengeType { + CHALLENGE_UNKNOWN = 0; + CHALLENGE_CLIENT_SECRET_HMAC = 1; + CHALLENGE_EVALUATE_JS = 2; + CHALLENGE_HASH_CASH = 3; +} diff --git a/src/inputs/librespot-c/src/proto/connectivity.pb-c.c b/src/inputs/librespot-c/src/proto/connectivity.pb-c.c new file mode 100644 index 00000000..2aa9a257 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/connectivity.pb-c.c @@ -0,0 +1,1091 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: connectivity.proto */ + +/* Do not generate deprecated warnings for self */ +#ifndef PROTOBUF_C__NO_DEPRECATED +#define PROTOBUF_C__NO_DEPRECATED +#endif + +#include "connectivity.pb-c.h" +void spotify__clienttoken__data__v0__connectivity_sdk_data__init + (Spotify__Clienttoken__Data__V0__ConnectivitySdkData *message) +{ + static const Spotify__Clienttoken__Data__V0__ConnectivitySdkData init_value = SPOTIFY__CLIENTTOKEN__DATA__V0__CONNECTIVITY_SDK_DATA__INIT; + *message = init_value; +} +size_t spotify__clienttoken__data__v0__connectivity_sdk_data__get_packed_size + (const Spotify__Clienttoken__Data__V0__ConnectivitySdkData *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__connectivity_sdk_data__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__data__v0__connectivity_sdk_data__pack + (const Spotify__Clienttoken__Data__V0__ConnectivitySdkData *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__connectivity_sdk_data__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__data__v0__connectivity_sdk_data__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__ConnectivitySdkData *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__connectivity_sdk_data__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Data__V0__ConnectivitySdkData * + spotify__clienttoken__data__v0__connectivity_sdk_data__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Data__V0__ConnectivitySdkData *) + protobuf_c_message_unpack (&spotify__clienttoken__data__v0__connectivity_sdk_data__descriptor, + allocator, len, data); +} +void spotify__clienttoken__data__v0__connectivity_sdk_data__free_unpacked + (Spotify__Clienttoken__Data__V0__ConnectivitySdkData *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__data__v0__connectivity_sdk_data__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__data__v0__platform_specific_data__init + (Spotify__Clienttoken__Data__V0__PlatformSpecificData *message) +{ + static const Spotify__Clienttoken__Data__V0__PlatformSpecificData init_value = SPOTIFY__CLIENTTOKEN__DATA__V0__PLATFORM_SPECIFIC_DATA__INIT; + *message = init_value; +} +size_t spotify__clienttoken__data__v0__platform_specific_data__get_packed_size + (const Spotify__Clienttoken__Data__V0__PlatformSpecificData *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__platform_specific_data__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__data__v0__platform_specific_data__pack + (const Spotify__Clienttoken__Data__V0__PlatformSpecificData *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__platform_specific_data__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__data__v0__platform_specific_data__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__PlatformSpecificData *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__platform_specific_data__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Data__V0__PlatformSpecificData * + spotify__clienttoken__data__v0__platform_specific_data__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Data__V0__PlatformSpecificData *) + protobuf_c_message_unpack (&spotify__clienttoken__data__v0__platform_specific_data__descriptor, + allocator, len, data); +} +void spotify__clienttoken__data__v0__platform_specific_data__free_unpacked + (Spotify__Clienttoken__Data__V0__PlatformSpecificData *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__data__v0__platform_specific_data__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__data__v0__native_android_data__init + (Spotify__Clienttoken__Data__V0__NativeAndroidData *message) +{ + static const Spotify__Clienttoken__Data__V0__NativeAndroidData init_value = SPOTIFY__CLIENTTOKEN__DATA__V0__NATIVE_ANDROID_DATA__INIT; + *message = init_value; +} +size_t spotify__clienttoken__data__v0__native_android_data__get_packed_size + (const Spotify__Clienttoken__Data__V0__NativeAndroidData *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_android_data__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__data__v0__native_android_data__pack + (const Spotify__Clienttoken__Data__V0__NativeAndroidData *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_android_data__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__data__v0__native_android_data__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__NativeAndroidData *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_android_data__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Data__V0__NativeAndroidData * + spotify__clienttoken__data__v0__native_android_data__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Data__V0__NativeAndroidData *) + protobuf_c_message_unpack (&spotify__clienttoken__data__v0__native_android_data__descriptor, + allocator, len, data); +} +void spotify__clienttoken__data__v0__native_android_data__free_unpacked + (Spotify__Clienttoken__Data__V0__NativeAndroidData *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_android_data__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__data__v0__native_iosdata__init + (Spotify__Clienttoken__Data__V0__NativeIOSData *message) +{ + static const Spotify__Clienttoken__Data__V0__NativeIOSData init_value = SPOTIFY__CLIENTTOKEN__DATA__V0__NATIVE_IOSDATA__INIT; + *message = init_value; +} +size_t spotify__clienttoken__data__v0__native_iosdata__get_packed_size + (const Spotify__Clienttoken__Data__V0__NativeIOSData *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_iosdata__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__data__v0__native_iosdata__pack + (const Spotify__Clienttoken__Data__V0__NativeIOSData *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_iosdata__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__data__v0__native_iosdata__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__NativeIOSData *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_iosdata__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Data__V0__NativeIOSData * + spotify__clienttoken__data__v0__native_iosdata__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Data__V0__NativeIOSData *) + protobuf_c_message_unpack (&spotify__clienttoken__data__v0__native_iosdata__descriptor, + allocator, len, data); +} +void spotify__clienttoken__data__v0__native_iosdata__free_unpacked + (Spotify__Clienttoken__Data__V0__NativeIOSData *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_iosdata__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__data__v0__native_desktop_windows_data__init + (Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData *message) +{ + static const Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData init_value = SPOTIFY__CLIENTTOKEN__DATA__V0__NATIVE_DESKTOP_WINDOWS_DATA__INIT; + *message = init_value; +} +size_t spotify__clienttoken__data__v0__native_desktop_windows_data__get_packed_size + (const Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_desktop_windows_data__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__data__v0__native_desktop_windows_data__pack + (const Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_desktop_windows_data__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__data__v0__native_desktop_windows_data__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_desktop_windows_data__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData * + spotify__clienttoken__data__v0__native_desktop_windows_data__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData *) + protobuf_c_message_unpack (&spotify__clienttoken__data__v0__native_desktop_windows_data__descriptor, + allocator, len, data); +} +void spotify__clienttoken__data__v0__native_desktop_windows_data__free_unpacked + (Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_desktop_windows_data__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__data__v0__native_desktop_linux_data__init + (Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData *message) +{ + static const Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData init_value = SPOTIFY__CLIENTTOKEN__DATA__V0__NATIVE_DESKTOP_LINUX_DATA__INIT; + *message = init_value; +} +size_t spotify__clienttoken__data__v0__native_desktop_linux_data__get_packed_size + (const Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_desktop_linux_data__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__data__v0__native_desktop_linux_data__pack + (const Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_desktop_linux_data__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__data__v0__native_desktop_linux_data__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_desktop_linux_data__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData * + spotify__clienttoken__data__v0__native_desktop_linux_data__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData *) + protobuf_c_message_unpack (&spotify__clienttoken__data__v0__native_desktop_linux_data__descriptor, + allocator, len, data); +} +void spotify__clienttoken__data__v0__native_desktop_linux_data__free_unpacked + (Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_desktop_linux_data__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__data__v0__native_desktop_mac_osdata__init + (Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData *message) +{ + static const Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData init_value = SPOTIFY__CLIENTTOKEN__DATA__V0__NATIVE_DESKTOP_MAC_OSDATA__INIT; + *message = init_value; +} +size_t spotify__clienttoken__data__v0__native_desktop_mac_osdata__get_packed_size + (const Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_desktop_mac_osdata__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__data__v0__native_desktop_mac_osdata__pack + (const Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_desktop_mac_osdata__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__data__v0__native_desktop_mac_osdata__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_desktop_mac_osdata__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData * + spotify__clienttoken__data__v0__native_desktop_mac_osdata__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData *) + protobuf_c_message_unpack (&spotify__clienttoken__data__v0__native_desktop_mac_osdata__descriptor, + allocator, len, data); +} +void spotify__clienttoken__data__v0__native_desktop_mac_osdata__free_unpacked + (Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__data__v0__native_desktop_mac_osdata__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__clienttoken__data__v0__screen__init + (Spotify__Clienttoken__Data__V0__Screen *message) +{ + static const Spotify__Clienttoken__Data__V0__Screen init_value = SPOTIFY__CLIENTTOKEN__DATA__V0__SCREEN__INIT; + *message = init_value; +} +size_t spotify__clienttoken__data__v0__screen__get_packed_size + (const Spotify__Clienttoken__Data__V0__Screen *message) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__screen__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__clienttoken__data__v0__screen__pack + (const Spotify__Clienttoken__Data__V0__Screen *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__screen__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__clienttoken__data__v0__screen__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__Screen *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__clienttoken__data__v0__screen__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Clienttoken__Data__V0__Screen * + spotify__clienttoken__data__v0__screen__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Clienttoken__Data__V0__Screen *) + protobuf_c_message_unpack (&spotify__clienttoken__data__v0__screen__descriptor, + allocator, len, data); +} +void spotify__clienttoken__data__v0__screen__free_unpacked + (Spotify__Clienttoken__Data__V0__Screen *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__clienttoken__data__v0__screen__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +static const ProtobufCFieldDescriptor spotify__clienttoken__data__v0__connectivity_sdk_data__field_descriptors[2] = +{ + { + "platform_specific_data", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__ConnectivitySdkData, platform_specific_data), + &spotify__clienttoken__data__v0__platform_specific_data__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "device_id", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__ConnectivitySdkData, device_id), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__data__v0__connectivity_sdk_data__field_indices_by_name[] = { + 1, /* field[1] = device_id */ + 0, /* field[0] = platform_specific_data */ +}; +static const ProtobufCIntRange spotify__clienttoken__data__v0__connectivity_sdk_data__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__connectivity_sdk_data__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.data.v0.ConnectivitySdkData", + "ConnectivitySdkData", + "Spotify__Clienttoken__Data__V0__ConnectivitySdkData", + "spotify.clienttoken.data.v0", + sizeof(Spotify__Clienttoken__Data__V0__ConnectivitySdkData), + 2, + spotify__clienttoken__data__v0__connectivity_sdk_data__field_descriptors, + spotify__clienttoken__data__v0__connectivity_sdk_data__field_indices_by_name, + 1, spotify__clienttoken__data__v0__connectivity_sdk_data__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__data__v0__connectivity_sdk_data__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__data__v0__platform_specific_data__field_descriptors[5] = +{ + { + "android", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Data__V0__PlatformSpecificData, data_case), + offsetof(Spotify__Clienttoken__Data__V0__PlatformSpecificData, android), + &spotify__clienttoken__data__v0__native_android_data__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "ios", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Data__V0__PlatformSpecificData, data_case), + offsetof(Spotify__Clienttoken__Data__V0__PlatformSpecificData, ios), + &spotify__clienttoken__data__v0__native_iosdata__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "desktop_macos", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Data__V0__PlatformSpecificData, data_case), + offsetof(Spotify__Clienttoken__Data__V0__PlatformSpecificData, desktop_macos), + &spotify__clienttoken__data__v0__native_desktop_mac_osdata__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "desktop_windows", + 4, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Data__V0__PlatformSpecificData, data_case), + offsetof(Spotify__Clienttoken__Data__V0__PlatformSpecificData, desktop_windows), + &spotify__clienttoken__data__v0__native_desktop_windows_data__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "desktop_linux", + 5, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Clienttoken__Data__V0__PlatformSpecificData, data_case), + offsetof(Spotify__Clienttoken__Data__V0__PlatformSpecificData, desktop_linux), + &spotify__clienttoken__data__v0__native_desktop_linux_data__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__data__v0__platform_specific_data__field_indices_by_name[] = { + 0, /* field[0] = android */ + 4, /* field[4] = desktop_linux */ + 2, /* field[2] = desktop_macos */ + 3, /* field[3] = desktop_windows */ + 1, /* field[1] = ios */ +}; +static const ProtobufCIntRange spotify__clienttoken__data__v0__platform_specific_data__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 5 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__platform_specific_data__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.data.v0.PlatformSpecificData", + "PlatformSpecificData", + "Spotify__Clienttoken__Data__V0__PlatformSpecificData", + "spotify.clienttoken.data.v0", + sizeof(Spotify__Clienttoken__Data__V0__PlatformSpecificData), + 5, + spotify__clienttoken__data__v0__platform_specific_data__field_descriptors, + spotify__clienttoken__data__v0__platform_specific_data__field_indices_by_name, + 1, spotify__clienttoken__data__v0__platform_specific_data__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__data__v0__platform_specific_data__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__data__v0__native_android_data__field_descriptors[8] = +{ + { + "screen_dimensions", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeAndroidData, screen_dimensions), + &spotify__clienttoken__data__v0__screen__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "android_version", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeAndroidData, android_version), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "api_version", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeAndroidData, api_version), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "device_name", + 4, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeAndroidData, device_name), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "model_str", + 5, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeAndroidData, model_str), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "vendor", + 6, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeAndroidData, vendor), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "vendor_2", + 7, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeAndroidData, vendor_2), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "unknown_value_8", + 8, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeAndroidData, unknown_value_8), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__data__v0__native_android_data__field_indices_by_name[] = { + 1, /* field[1] = android_version */ + 2, /* field[2] = api_version */ + 3, /* field[3] = device_name */ + 4, /* field[4] = model_str */ + 0, /* field[0] = screen_dimensions */ + 7, /* field[7] = unknown_value_8 */ + 5, /* field[5] = vendor */ + 6, /* field[6] = vendor_2 */ +}; +static const ProtobufCIntRange spotify__clienttoken__data__v0__native_android_data__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 8 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__native_android_data__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.data.v0.NativeAndroidData", + "NativeAndroidData", + "Spotify__Clienttoken__Data__V0__NativeAndroidData", + "spotify.clienttoken.data.v0", + sizeof(Spotify__Clienttoken__Data__V0__NativeAndroidData), + 8, + spotify__clienttoken__data__v0__native_android_data__field_descriptors, + spotify__clienttoken__data__v0__native_android_data__field_indices_by_name, + 1, spotify__clienttoken__data__v0__native_android_data__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__data__v0__native_android_data__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__data__v0__native_iosdata__field_descriptors[5] = +{ + { + "user_interface_idiom", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeIOSData, user_interface_idiom), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "target_iphone_simulator", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_BOOL, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeIOSData, target_iphone_simulator), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "hw_machine", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeIOSData, hw_machine), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "system_version", + 4, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeIOSData, system_version), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "simulator_model_identifier", + 5, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeIOSData, simulator_model_identifier), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__data__v0__native_iosdata__field_indices_by_name[] = { + 2, /* field[2] = hw_machine */ + 4, /* field[4] = simulator_model_identifier */ + 3, /* field[3] = system_version */ + 1, /* field[1] = target_iphone_simulator */ + 0, /* field[0] = user_interface_idiom */ +}; +static const ProtobufCIntRange spotify__clienttoken__data__v0__native_iosdata__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 5 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__native_iosdata__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.data.v0.NativeIOSData", + "NativeIOSData", + "Spotify__Clienttoken__Data__V0__NativeIOSData", + "spotify.clienttoken.data.v0", + sizeof(Spotify__Clienttoken__Data__V0__NativeIOSData), + 5, + spotify__clienttoken__data__v0__native_iosdata__field_descriptors, + spotify__clienttoken__data__v0__native_iosdata__field_indices_by_name, + 1, spotify__clienttoken__data__v0__native_iosdata__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__data__v0__native_iosdata__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__data__v0__native_desktop_windows_data__field_descriptors[8] = +{ + { + "os_version", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData, os_version), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "os_build", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData, os_build), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "platform_id", + 4, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData, platform_id), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "unknown_value_5", + 5, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData, unknown_value_5), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "unknown_value_6", + 6, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData, unknown_value_6), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "image_file_machine", + 7, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData, image_file_machine), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "pe_machine", + 8, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData, pe_machine), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "unknown_value_10", + 10, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_BOOL, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData, unknown_value_10), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__data__v0__native_desktop_windows_data__field_indices_by_name[] = { + 5, /* field[5] = image_file_machine */ + 1, /* field[1] = os_build */ + 0, /* field[0] = os_version */ + 6, /* field[6] = pe_machine */ + 2, /* field[2] = platform_id */ + 7, /* field[7] = unknown_value_10 */ + 3, /* field[3] = unknown_value_5 */ + 4, /* field[4] = unknown_value_6 */ +}; +static const ProtobufCIntRange spotify__clienttoken__data__v0__native_desktop_windows_data__number_ranges[3 + 1] = +{ + { 1, 0 }, + { 3, 1 }, + { 10, 7 }, + { 0, 8 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__native_desktop_windows_data__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.data.v0.NativeDesktopWindowsData", + "NativeDesktopWindowsData", + "Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData", + "spotify.clienttoken.data.v0", + sizeof(Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData), + 8, + spotify__clienttoken__data__v0__native_desktop_windows_data__field_descriptors, + spotify__clienttoken__data__v0__native_desktop_windows_data__field_indices_by_name, + 3, spotify__clienttoken__data__v0__native_desktop_windows_data__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__data__v0__native_desktop_windows_data__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__data__v0__native_desktop_linux_data__field_descriptors[4] = +{ + { + "system_name", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData, system_name), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "system_release", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData, system_release), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "system_version", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData, system_version), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "hardware", + 4, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData, hardware), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__data__v0__native_desktop_linux_data__field_indices_by_name[] = { + 3, /* field[3] = hardware */ + 0, /* field[0] = system_name */ + 1, /* field[1] = system_release */ + 2, /* field[2] = system_version */ +}; +static const ProtobufCIntRange spotify__clienttoken__data__v0__native_desktop_linux_data__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 4 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__native_desktop_linux_data__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.data.v0.NativeDesktopLinuxData", + "NativeDesktopLinuxData", + "Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData", + "spotify.clienttoken.data.v0", + sizeof(Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData), + 4, + spotify__clienttoken__data__v0__native_desktop_linux_data__field_descriptors, + spotify__clienttoken__data__v0__native_desktop_linux_data__field_indices_by_name, + 1, spotify__clienttoken__data__v0__native_desktop_linux_data__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__data__v0__native_desktop_linux_data__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__data__v0__native_desktop_mac_osdata__field_descriptors[3] = +{ + { + "system_version", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData, system_version), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "hw_model", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData, hw_model), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "compiled_cpu_type", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData, compiled_cpu_type), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__data__v0__native_desktop_mac_osdata__field_indices_by_name[] = { + 2, /* field[2] = compiled_cpu_type */ + 1, /* field[1] = hw_model */ + 0, /* field[0] = system_version */ +}; +static const ProtobufCIntRange spotify__clienttoken__data__v0__native_desktop_mac_osdata__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 3 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__native_desktop_mac_osdata__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.data.v0.NativeDesktopMacOSData", + "NativeDesktopMacOSData", + "Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData", + "spotify.clienttoken.data.v0", + sizeof(Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData), + 3, + spotify__clienttoken__data__v0__native_desktop_mac_osdata__field_descriptors, + spotify__clienttoken__data__v0__native_desktop_mac_osdata__field_indices_by_name, + 1, spotify__clienttoken__data__v0__native_desktop_mac_osdata__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__data__v0__native_desktop_mac_osdata__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__clienttoken__data__v0__screen__field_descriptors[5] = +{ + { + "width", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__Screen, width), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "height", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__Screen, height), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "density", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__Screen, density), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "unknown_value_4", + 4, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__Screen, unknown_value_4), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "unknown_value_5", + 5, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Clienttoken__Data__V0__Screen, unknown_value_5), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__clienttoken__data__v0__screen__field_indices_by_name[] = { + 2, /* field[2] = density */ + 1, /* field[1] = height */ + 3, /* field[3] = unknown_value_4 */ + 4, /* field[4] = unknown_value_5 */ + 0, /* field[0] = width */ +}; +static const ProtobufCIntRange spotify__clienttoken__data__v0__screen__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 5 } +}; +const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__screen__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.clienttoken.data.v0.Screen", + "Screen", + "Spotify__Clienttoken__Data__V0__Screen", + "spotify.clienttoken.data.v0", + sizeof(Spotify__Clienttoken__Data__V0__Screen), + 5, + spotify__clienttoken__data__v0__screen__field_descriptors, + spotify__clienttoken__data__v0__screen__field_indices_by_name, + 1, spotify__clienttoken__data__v0__screen__number_ranges, + (ProtobufCMessageInit) spotify__clienttoken__data__v0__screen__init, + NULL,NULL,NULL /* reserved[123] */ +}; diff --git a/src/inputs/librespot-c/src/proto/connectivity.pb-c.h b/src/inputs/librespot-c/src/proto/connectivity.pb-c.h new file mode 100644 index 00000000..1eaad39f --- /dev/null +++ b/src/inputs/librespot-c/src/proto/connectivity.pb-c.h @@ -0,0 +1,378 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: connectivity.proto */ + +#ifndef PROTOBUF_C_connectivity_2eproto__INCLUDED +#define PROTOBUF_C_connectivity_2eproto__INCLUDED + +#include + +PROTOBUF_C__BEGIN_DECLS + +#if PROTOBUF_C_VERSION_NUMBER < 1003000 +# error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers. +#elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION +# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c. +#endif + + +typedef struct Spotify__Clienttoken__Data__V0__ConnectivitySdkData Spotify__Clienttoken__Data__V0__ConnectivitySdkData; +typedef struct Spotify__Clienttoken__Data__V0__PlatformSpecificData Spotify__Clienttoken__Data__V0__PlatformSpecificData; +typedef struct Spotify__Clienttoken__Data__V0__NativeAndroidData Spotify__Clienttoken__Data__V0__NativeAndroidData; +typedef struct Spotify__Clienttoken__Data__V0__NativeIOSData Spotify__Clienttoken__Data__V0__NativeIOSData; +typedef struct Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData; +typedef struct Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData; +typedef struct Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData; +typedef struct Spotify__Clienttoken__Data__V0__Screen Spotify__Clienttoken__Data__V0__Screen; + + +/* --- enums --- */ + + +/* --- messages --- */ + +struct Spotify__Clienttoken__Data__V0__ConnectivitySdkData +{ + ProtobufCMessage base; + Spotify__Clienttoken__Data__V0__PlatformSpecificData *platform_specific_data; + char *device_id; +}; +#define SPOTIFY__CLIENTTOKEN__DATA__V0__CONNECTIVITY_SDK_DATA__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__data__v0__connectivity_sdk_data__descriptor) \ + , NULL, (char *)protobuf_c_empty_string } + + +typedef enum { + SPOTIFY__CLIENTTOKEN__DATA__V0__PLATFORM_SPECIFIC_DATA__DATA__NOT_SET = 0, + SPOTIFY__CLIENTTOKEN__DATA__V0__PLATFORM_SPECIFIC_DATA__DATA_ANDROID = 1, + SPOTIFY__CLIENTTOKEN__DATA__V0__PLATFORM_SPECIFIC_DATA__DATA_IOS = 2, + SPOTIFY__CLIENTTOKEN__DATA__V0__PLATFORM_SPECIFIC_DATA__DATA_DESKTOP_MACOS = 3, + SPOTIFY__CLIENTTOKEN__DATA__V0__PLATFORM_SPECIFIC_DATA__DATA_DESKTOP_WINDOWS = 4, + SPOTIFY__CLIENTTOKEN__DATA__V0__PLATFORM_SPECIFIC_DATA__DATA_DESKTOP_LINUX = 5 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__CLIENTTOKEN__DATA__V0__PLATFORM_SPECIFIC_DATA__DATA__CASE) +} Spotify__Clienttoken__Data__V0__PlatformSpecificData__DataCase; + +struct Spotify__Clienttoken__Data__V0__PlatformSpecificData +{ + ProtobufCMessage base; + Spotify__Clienttoken__Data__V0__PlatformSpecificData__DataCase data_case; + union { + Spotify__Clienttoken__Data__V0__NativeAndroidData *android; + Spotify__Clienttoken__Data__V0__NativeIOSData *ios; + Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData *desktop_macos; + Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData *desktop_windows; + Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData *desktop_linux; + }; +}; +#define SPOTIFY__CLIENTTOKEN__DATA__V0__PLATFORM_SPECIFIC_DATA__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__data__v0__platform_specific_data__descriptor) \ + , SPOTIFY__CLIENTTOKEN__DATA__V0__PLATFORM_SPECIFIC_DATA__DATA__NOT_SET, {0} } + + +struct Spotify__Clienttoken__Data__V0__NativeAndroidData +{ + ProtobufCMessage base; + Spotify__Clienttoken__Data__V0__Screen *screen_dimensions; + char *android_version; + int32_t api_version; + char *device_name; + char *model_str; + char *vendor; + char *vendor_2; + int32_t unknown_value_8; +}; +#define SPOTIFY__CLIENTTOKEN__DATA__V0__NATIVE_ANDROID_DATA__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__data__v0__native_android_data__descriptor) \ + , NULL, (char *)protobuf_c_empty_string, 0, (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, 0 } + + +struct Spotify__Clienttoken__Data__V0__NativeIOSData +{ + ProtobufCMessage base; + /* + * https://developer.apple.com/documentation/uikit/uiuserinterfaceidiom + */ + int32_t user_interface_idiom; + protobuf_c_boolean target_iphone_simulator; + char *hw_machine; + char *system_version; + char *simulator_model_identifier; +}; +#define SPOTIFY__CLIENTTOKEN__DATA__V0__NATIVE_IOSDATA__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__data__v0__native_iosdata__descriptor) \ + , 0, 0, (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string } + + +struct Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData +{ + ProtobufCMessage base; + int32_t os_version; + int32_t os_build; + /* + * https://docs.microsoft.com/en-us/dotnet/api/system.platformid?view=net-6.0 + */ + int32_t platform_id; + int32_t unknown_value_5; + int32_t unknown_value_6; + /* + * https://docs.microsoft.com/en-us/dotnet/api/system.reflection.imagefilemachine?view=net-6.0 + */ + int32_t image_file_machine; + /* + * https://docs.microsoft.com/en-us/dotnet/api/system.reflection.portableexecutable.machine?view=net-6.0 + */ + int32_t pe_machine; + protobuf_c_boolean unknown_value_10; +}; +#define SPOTIFY__CLIENTTOKEN__DATA__V0__NATIVE_DESKTOP_WINDOWS_DATA__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__data__v0__native_desktop_windows_data__descriptor) \ + , 0, 0, 0, 0, 0, 0, 0, 0 } + + +struct Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData +{ + ProtobufCMessage base; + /* + * uname -s + */ + char *system_name; + /* + * -r + */ + char *system_release; + /* + * -v + */ + char *system_version; + /* + * -i + */ + char *hardware; +}; +#define SPOTIFY__CLIENTTOKEN__DATA__V0__NATIVE_DESKTOP_LINUX_DATA__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__data__v0__native_desktop_linux_data__descriptor) \ + , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string } + + +struct Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData +{ + ProtobufCMessage base; + char *system_version; + char *hw_model; + char *compiled_cpu_type; +}; +#define SPOTIFY__CLIENTTOKEN__DATA__V0__NATIVE_DESKTOP_MAC_OSDATA__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__data__v0__native_desktop_mac_osdata__descriptor) \ + , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string } + + +struct Spotify__Clienttoken__Data__V0__Screen +{ + ProtobufCMessage base; + int32_t width; + int32_t height; + int32_t density; + int32_t unknown_value_4; + int32_t unknown_value_5; +}; +#define SPOTIFY__CLIENTTOKEN__DATA__V0__SCREEN__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__clienttoken__data__v0__screen__descriptor) \ + , 0, 0, 0, 0, 0 } + + +/* Spotify__Clienttoken__Data__V0__ConnectivitySdkData methods */ +void spotify__clienttoken__data__v0__connectivity_sdk_data__init + (Spotify__Clienttoken__Data__V0__ConnectivitySdkData *message); +size_t spotify__clienttoken__data__v0__connectivity_sdk_data__get_packed_size + (const Spotify__Clienttoken__Data__V0__ConnectivitySdkData *message); +size_t spotify__clienttoken__data__v0__connectivity_sdk_data__pack + (const Spotify__Clienttoken__Data__V0__ConnectivitySdkData *message, + uint8_t *out); +size_t spotify__clienttoken__data__v0__connectivity_sdk_data__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__ConnectivitySdkData *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Data__V0__ConnectivitySdkData * + spotify__clienttoken__data__v0__connectivity_sdk_data__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__data__v0__connectivity_sdk_data__free_unpacked + (Spotify__Clienttoken__Data__V0__ConnectivitySdkData *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Data__V0__PlatformSpecificData methods */ +void spotify__clienttoken__data__v0__platform_specific_data__init + (Spotify__Clienttoken__Data__V0__PlatformSpecificData *message); +size_t spotify__clienttoken__data__v0__platform_specific_data__get_packed_size + (const Spotify__Clienttoken__Data__V0__PlatformSpecificData *message); +size_t spotify__clienttoken__data__v0__platform_specific_data__pack + (const Spotify__Clienttoken__Data__V0__PlatformSpecificData *message, + uint8_t *out); +size_t spotify__clienttoken__data__v0__platform_specific_data__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__PlatformSpecificData *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Data__V0__PlatformSpecificData * + spotify__clienttoken__data__v0__platform_specific_data__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__data__v0__platform_specific_data__free_unpacked + (Spotify__Clienttoken__Data__V0__PlatformSpecificData *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Data__V0__NativeAndroidData methods */ +void spotify__clienttoken__data__v0__native_android_data__init + (Spotify__Clienttoken__Data__V0__NativeAndroidData *message); +size_t spotify__clienttoken__data__v0__native_android_data__get_packed_size + (const Spotify__Clienttoken__Data__V0__NativeAndroidData *message); +size_t spotify__clienttoken__data__v0__native_android_data__pack + (const Spotify__Clienttoken__Data__V0__NativeAndroidData *message, + uint8_t *out); +size_t spotify__clienttoken__data__v0__native_android_data__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__NativeAndroidData *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Data__V0__NativeAndroidData * + spotify__clienttoken__data__v0__native_android_data__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__data__v0__native_android_data__free_unpacked + (Spotify__Clienttoken__Data__V0__NativeAndroidData *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Data__V0__NativeIOSData methods */ +void spotify__clienttoken__data__v0__native_iosdata__init + (Spotify__Clienttoken__Data__V0__NativeIOSData *message); +size_t spotify__clienttoken__data__v0__native_iosdata__get_packed_size + (const Spotify__Clienttoken__Data__V0__NativeIOSData *message); +size_t spotify__clienttoken__data__v0__native_iosdata__pack + (const Spotify__Clienttoken__Data__V0__NativeIOSData *message, + uint8_t *out); +size_t spotify__clienttoken__data__v0__native_iosdata__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__NativeIOSData *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Data__V0__NativeIOSData * + spotify__clienttoken__data__v0__native_iosdata__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__data__v0__native_iosdata__free_unpacked + (Spotify__Clienttoken__Data__V0__NativeIOSData *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData methods */ +void spotify__clienttoken__data__v0__native_desktop_windows_data__init + (Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData *message); +size_t spotify__clienttoken__data__v0__native_desktop_windows_data__get_packed_size + (const Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData *message); +size_t spotify__clienttoken__data__v0__native_desktop_windows_data__pack + (const Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData *message, + uint8_t *out); +size_t spotify__clienttoken__data__v0__native_desktop_windows_data__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData * + spotify__clienttoken__data__v0__native_desktop_windows_data__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__data__v0__native_desktop_windows_data__free_unpacked + (Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData methods */ +void spotify__clienttoken__data__v0__native_desktop_linux_data__init + (Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData *message); +size_t spotify__clienttoken__data__v0__native_desktop_linux_data__get_packed_size + (const Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData *message); +size_t spotify__clienttoken__data__v0__native_desktop_linux_data__pack + (const Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData *message, + uint8_t *out); +size_t spotify__clienttoken__data__v0__native_desktop_linux_data__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData * + spotify__clienttoken__data__v0__native_desktop_linux_data__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__data__v0__native_desktop_linux_data__free_unpacked + (Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData methods */ +void spotify__clienttoken__data__v0__native_desktop_mac_osdata__init + (Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData *message); +size_t spotify__clienttoken__data__v0__native_desktop_mac_osdata__get_packed_size + (const Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData *message); +size_t spotify__clienttoken__data__v0__native_desktop_mac_osdata__pack + (const Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData *message, + uint8_t *out); +size_t spotify__clienttoken__data__v0__native_desktop_mac_osdata__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData * + spotify__clienttoken__data__v0__native_desktop_mac_osdata__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__data__v0__native_desktop_mac_osdata__free_unpacked + (Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData *message, + ProtobufCAllocator *allocator); +/* Spotify__Clienttoken__Data__V0__Screen methods */ +void spotify__clienttoken__data__v0__screen__init + (Spotify__Clienttoken__Data__V0__Screen *message); +size_t spotify__clienttoken__data__v0__screen__get_packed_size + (const Spotify__Clienttoken__Data__V0__Screen *message); +size_t spotify__clienttoken__data__v0__screen__pack + (const Spotify__Clienttoken__Data__V0__Screen *message, + uint8_t *out); +size_t spotify__clienttoken__data__v0__screen__pack_to_buffer + (const Spotify__Clienttoken__Data__V0__Screen *message, + ProtobufCBuffer *buffer); +Spotify__Clienttoken__Data__V0__Screen * + spotify__clienttoken__data__v0__screen__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__clienttoken__data__v0__screen__free_unpacked + (Spotify__Clienttoken__Data__V0__Screen *message, + ProtobufCAllocator *allocator); +/* --- per-message closures --- */ + +typedef void (*Spotify__Clienttoken__Data__V0__ConnectivitySdkData_Closure) + (const Spotify__Clienttoken__Data__V0__ConnectivitySdkData *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Data__V0__PlatformSpecificData_Closure) + (const Spotify__Clienttoken__Data__V0__PlatformSpecificData *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Data__V0__NativeAndroidData_Closure) + (const Spotify__Clienttoken__Data__V0__NativeAndroidData *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Data__V0__NativeIOSData_Closure) + (const Spotify__Clienttoken__Data__V0__NativeIOSData *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData_Closure) + (const Spotify__Clienttoken__Data__V0__NativeDesktopWindowsData *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData_Closure) + (const Spotify__Clienttoken__Data__V0__NativeDesktopLinuxData *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData_Closure) + (const Spotify__Clienttoken__Data__V0__NativeDesktopMacOSData *message, + void *closure_data); +typedef void (*Spotify__Clienttoken__Data__V0__Screen_Closure) + (const Spotify__Clienttoken__Data__V0__Screen *message, + void *closure_data); + +/* --- services --- */ + + +/* --- descriptors --- */ + +extern const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__connectivity_sdk_data__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__platform_specific_data__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__native_android_data__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__native_iosdata__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__native_desktop_windows_data__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__native_desktop_linux_data__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__native_desktop_mac_osdata__descriptor; +extern const ProtobufCMessageDescriptor spotify__clienttoken__data__v0__screen__descriptor; + +PROTOBUF_C__END_DECLS + + +#endif /* PROTOBUF_C_connectivity_2eproto__INCLUDED */ diff --git a/src/inputs/librespot-c/src/proto/connectivity.proto b/src/inputs/librespot-c/src/proto/connectivity.proto new file mode 100644 index 00000000..48494a0d --- /dev/null +++ b/src/inputs/librespot-c/src/proto/connectivity.proto @@ -0,0 +1,73 @@ +syntax = "proto3"; + +package spotify.clienttoken.data.v0; + +message ConnectivitySdkData { + PlatformSpecificData platform_specific_data = 1; + string device_id = 2; +} + +message PlatformSpecificData { + oneof data { + NativeAndroidData android = 1; + NativeIOSData ios = 2; + NativeDesktopMacOSData desktop_macos = 3; + NativeDesktopWindowsData desktop_windows = 4; + NativeDesktopLinuxData desktop_linux = 5; + } +} + +message NativeAndroidData { + Screen screen_dimensions = 1; + string android_version = 2; + int32 api_version = 3; + string device_name = 4; + string model_str = 5; + string vendor = 6; + string vendor_2 = 7; + int32 unknown_value_8 = 8; +} + +message NativeIOSData { + // https://developer.apple.com/documentation/uikit/uiuserinterfaceidiom + int32 user_interface_idiom = 1; + bool target_iphone_simulator = 2; + string hw_machine = 3; + string system_version = 4; + string simulator_model_identifier = 5; +} + +message NativeDesktopWindowsData { + int32 os_version = 1; + int32 os_build = 3; + // https://docs.microsoft.com/en-us/dotnet/api/system.platformid?view=net-6.0 + int32 platform_id = 4; + int32 unknown_value_5 = 5; + int32 unknown_value_6 = 6; + // https://docs.microsoft.com/en-us/dotnet/api/system.reflection.imagefilemachine?view=net-6.0 + int32 image_file_machine = 7; + // https://docs.microsoft.com/en-us/dotnet/api/system.reflection.portableexecutable.machine?view=net-6.0 + int32 pe_machine = 8; + bool unknown_value_10 = 10; +} + +message NativeDesktopLinuxData { + string system_name = 1; // uname -s + string system_release = 2; // -r + string system_version = 3; // -v + string hardware = 4; // -i +} + +message NativeDesktopMacOSData { + string system_version = 1; + string hw_model = 2; + string compiled_cpu_type = 3; +} + +message Screen { + int32 width = 1; + int32 height = 2; + int32 density = 3; + int32 unknown_value_4 = 4; + int32 unknown_value_5 = 5; +} diff --git a/src/inputs/librespot-c/src/proto/facebook-publish.proto b/src/inputs/librespot-c/src/proto/facebook-publish.proto deleted file mode 100644 index 4edef249..00000000 --- a/src/inputs/librespot-c/src/proto/facebook-publish.proto +++ /dev/null @@ -1,51 +0,0 @@ -syntax = "proto2"; - -message EventReply { - optional int32 queued = 0x1; - optional RetryInfo retry = 0x2; -} - -message RetryInfo { - optional int32 retry_delay = 0x1; - optional int32 max_retry = 0x2; -} - -message Id { - optional string uri = 0x1; - optional int64 start_time = 0x2; -} - -message Start { - optional int32 length = 0x1; - optional string context_uri = 0x2; - optional int64 end_time = 0x3; -} - -message Seek { - optional int64 end_time = 0x1; -} - -message Pause { - optional int32 seconds_played = 0x1; - optional int64 end_time = 0x2; -} - -message Resume { - optional int32 seconds_played = 0x1; - optional int64 end_time = 0x2; -} - -message End { - optional int32 seconds_played = 0x1; - optional int64 end_time = 0x2; -} - -message Event { - optional Id id = 0x1; - optional Start start = 0x2; - optional Seek seek = 0x3; - optional Pause pause = 0x4; - optional Resume resume = 0x5; - optional End end = 0x6; -} - diff --git a/src/inputs/librespot-c/src/proto/facebook.proto b/src/inputs/librespot-c/src/proto/facebook.proto deleted file mode 100644 index 8227c5a1..00000000 --- a/src/inputs/librespot-c/src/proto/facebook.proto +++ /dev/null @@ -1,183 +0,0 @@ -syntax = "proto2"; - -message Credential { - optional string facebook_uid = 0x1; - optional string access_token = 0x2; -} - -message EnableRequest { - optional Credential credential = 0x1; -} - -message EnableReply { - optional Credential credential = 0x1; -} - -message DisableRequest { - optional Credential credential = 0x1; -} - -message RevokeRequest { - optional Credential credential = 0x1; -} - -message InspectCredentialRequest { - optional Credential credential = 0x1; -} - -message InspectCredentialReply { - optional Credential alternative_credential = 0x1; - optional bool app_user = 0x2; - optional bool permanent_error = 0x3; - optional bool transient_error = 0x4; -} - -message UserState { - optional Credential credential = 0x1; -} - -message UpdateUserStateRequest { - optional Credential credential = 0x1; -} - -message OpenGraphError { - repeated string permanent = 0x1; - repeated string invalid_token = 0x2; - repeated string retries = 0x3; -} - -message OpenGraphScrobble { - optional int32 create_delay = 0x1; -} - -message OpenGraphConfig { - optional OpenGraphError error = 0x1; - optional OpenGraphScrobble scrobble = 0x2; -} - -message AuthConfig { - optional string url = 0x1; - repeated string permissions = 0x2; - repeated string blacklist = 0x3; - repeated string whitelist = 0x4; - repeated string cancel = 0x5; -} - -message ConfigReply { - optional string domain = 0x1; - optional string app_id = 0x2; - optional string app_namespace = 0x3; - optional AuthConfig auth = 0x4; - optional OpenGraphConfig og = 0x5; -} - -message UserFields { - optional bool app_user = 0x1; - optional bool display_name = 0x2; - optional bool first_name = 0x3; - optional bool middle_name = 0x4; - optional bool last_name = 0x5; - optional bool picture_large = 0x6; - optional bool picture_square = 0x7; - optional bool gender = 0x8; - optional bool email = 0x9; -} - -message UserOptions { - optional bool cache_is_king = 0x1; -} - -message UserRequest { - optional UserOptions options = 0x1; - optional UserFields fields = 0x2; -} - -message User { - optional string spotify_username = 0x1; - optional string facebook_uid = 0x2; - optional bool app_user = 0x3; - optional string display_name = 0x4; - optional string first_name = 0x5; - optional string middle_name = 0x6; - optional string last_name = 0x7; - optional string picture_large = 0x8; - optional string picture_square = 0x9; - optional string gender = 0xa; - optional string email = 0xb; -} - -message FriendsFields { - optional bool app_user = 0x1; - optional bool display_name = 0x2; - optional bool picture_large = 0x6; -} - -message FriendsOptions { - optional int32 limit = 0x1; - optional int32 offset = 0x2; - optional bool cache_is_king = 0x3; - optional bool app_friends = 0x4; - optional bool non_app_friends = 0x5; -} - -message FriendsRequest { - optional FriendsOptions options = 0x1; - optional FriendsFields fields = 0x2; -} - -message FriendsReply { - repeated User friends = 0x1; - optional bool more = 0x2; -} - -message ShareRequest { - optional Credential credential = 0x1; - optional string uri = 0x2; - optional string message_text = 0x3; -} - -message ShareReply { - optional string post_id = 0x1; -} - -message InboxRequest { - optional Credential credential = 0x1; - repeated string facebook_uids = 0x3; - optional string message_text = 0x4; - optional string message_link = 0x5; -} - -message InboxReply { - optional string message_id = 0x1; - optional string thread_id = 0x2; -} - -message PermissionsOptions { - optional bool cache_is_king = 0x1; -} - -message PermissionsRequest { - optional Credential credential = 0x1; - optional PermissionsOptions options = 0x2; -} - -message PermissionsReply { - repeated string permissions = 0x1; -} - -message GrantPermissionsRequest { - optional Credential credential = 0x1; - repeated string permissions = 0x2; -} - -message GrantPermissionsReply { - repeated string granted = 0x1; - repeated string failed = 0x2; -} - -message TransferRequest { - optional Credential credential = 0x1; - optional string source_username = 0x2; - optional string target_username = 0x3; -} - diff --git a/src/inputs/librespot-c/src/proto/google_duration.pb-c.c b/src/inputs/librespot-c/src/proto/google_duration.pb-c.c new file mode 100644 index 00000000..893b434e --- /dev/null +++ b/src/inputs/librespot-c/src/proto/google_duration.pb-c.c @@ -0,0 +1,105 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: google_duration.proto */ + +/* Do not generate deprecated warnings for self */ +#ifndef PROTOBUF_C__NO_DEPRECATED +#define PROTOBUF_C__NO_DEPRECATED +#endif + +#include "google_duration.pb-c.h" +void google__protobuf__duration__init + (Google__Protobuf__Duration *message) +{ + static const Google__Protobuf__Duration init_value = GOOGLE__PROTOBUF__DURATION__INIT; + *message = init_value; +} +size_t google__protobuf__duration__get_packed_size + (const Google__Protobuf__Duration *message) +{ + assert(message->base.descriptor == &google__protobuf__duration__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t google__protobuf__duration__pack + (const Google__Protobuf__Duration *message, + uint8_t *out) +{ + assert(message->base.descriptor == &google__protobuf__duration__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t google__protobuf__duration__pack_to_buffer + (const Google__Protobuf__Duration *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &google__protobuf__duration__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Google__Protobuf__Duration * + google__protobuf__duration__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Google__Protobuf__Duration *) + protobuf_c_message_unpack (&google__protobuf__duration__descriptor, + allocator, len, data); +} +void google__protobuf__duration__free_unpacked + (Google__Protobuf__Duration *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &google__protobuf__duration__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +static const ProtobufCFieldDescriptor google__protobuf__duration__field_descriptors[2] = +{ + { + "seconds", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT64, + 0, /* quantifier_offset */ + offsetof(Google__Protobuf__Duration, seconds), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "nanos", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Google__Protobuf__Duration, nanos), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned google__protobuf__duration__field_indices_by_name[] = { + 1, /* field[1] = nanos */ + 0, /* field[0] = seconds */ +}; +static const ProtobufCIntRange google__protobuf__duration__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor google__protobuf__duration__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "google.protobuf.Duration", + "Duration", + "Google__Protobuf__Duration", + "google.protobuf", + sizeof(Google__Protobuf__Duration), + 2, + google__protobuf__duration__field_descriptors, + google__protobuf__duration__field_indices_by_name, + 1, google__protobuf__duration__number_ranges, + (ProtobufCMessageInit) google__protobuf__duration__init, + NULL,NULL,NULL /* reserved[123] */ +}; diff --git a/src/inputs/librespot-c/src/proto/google_duration.pb-c.h b/src/inputs/librespot-c/src/proto/google_duration.pb-c.h new file mode 100644 index 00000000..14600ba7 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/google_duration.pb-c.h @@ -0,0 +1,72 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: google_duration.proto */ + +#ifndef PROTOBUF_C_google_5fduration_2eproto__INCLUDED +#define PROTOBUF_C_google_5fduration_2eproto__INCLUDED + +#include + +PROTOBUF_C__BEGIN_DECLS + +#if PROTOBUF_C_VERSION_NUMBER < 1003000 +# error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers. +#elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION +# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c. +#endif + + +typedef struct Google__Protobuf__Duration Google__Protobuf__Duration; + + +/* --- enums --- */ + + +/* --- messages --- */ + +struct Google__Protobuf__Duration +{ + ProtobufCMessage base; + int64_t seconds; + int32_t nanos; +}; +#define GOOGLE__PROTOBUF__DURATION__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&google__protobuf__duration__descriptor) \ + , 0, 0 } + + +/* Google__Protobuf__Duration methods */ +void google__protobuf__duration__init + (Google__Protobuf__Duration *message); +size_t google__protobuf__duration__get_packed_size + (const Google__Protobuf__Duration *message); +size_t google__protobuf__duration__pack + (const Google__Protobuf__Duration *message, + uint8_t *out); +size_t google__protobuf__duration__pack_to_buffer + (const Google__Protobuf__Duration *message, + ProtobufCBuffer *buffer); +Google__Protobuf__Duration * + google__protobuf__duration__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void google__protobuf__duration__free_unpacked + (Google__Protobuf__Duration *message, + ProtobufCAllocator *allocator); +/* --- per-message closures --- */ + +typedef void (*Google__Protobuf__Duration_Closure) + (const Google__Protobuf__Duration *message, + void *closure_data); + +/* --- services --- */ + + +/* --- descriptors --- */ + +extern const ProtobufCMessageDescriptor google__protobuf__duration__descriptor; + +PROTOBUF_C__END_DECLS + + +#endif /* PROTOBUF_C_google_5fduration_2eproto__INCLUDED */ diff --git a/src/inputs/librespot-c/src/proto/google_duration.proto b/src/inputs/librespot-c/src/proto/google_duration.proto new file mode 100644 index 00000000..39c7907b --- /dev/null +++ b/src/inputs/librespot-c/src/proto/google_duration.proto @@ -0,0 +1,8 @@ +syntax = "proto3"; + +package google.protobuf; + +message Duration { + int64 seconds = 1; + int32 nanos = 2; +} diff --git a/src/inputs/librespot-c/src/proto/login5.pb-c.c b/src/inputs/librespot-c/src/proto/login5.pb-c.c new file mode 100644 index 00000000..17065cde --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5.pb-c.c @@ -0,0 +1,947 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: login5.proto */ + +/* Do not generate deprecated warnings for self */ +#ifndef PROTOBUF_C__NO_DEPRECATED +#define PROTOBUF_C__NO_DEPRECATED +#endif + +#include "login5.pb-c.h" +void spotify__login5__v3__challenges__init + (Spotify__Login5__V3__Challenges *message) +{ + static const Spotify__Login5__V3__Challenges init_value = SPOTIFY__LOGIN5__V3__CHALLENGES__INIT; + *message = init_value; +} +size_t spotify__login5__v3__challenges__get_packed_size + (const Spotify__Login5__V3__Challenges *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__challenges__pack + (const Spotify__Login5__V3__Challenges *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__challenges__pack_to_buffer + (const Spotify__Login5__V3__Challenges *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Challenges * + spotify__login5__v3__challenges__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Challenges *) + protobuf_c_message_unpack (&spotify__login5__v3__challenges__descriptor, + allocator, len, data); +} +void spotify__login5__v3__challenges__free_unpacked + (Spotify__Login5__V3__Challenges *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__challenges__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__challenge__init + (Spotify__Login5__V3__Challenge *message) +{ + static const Spotify__Login5__V3__Challenge init_value = SPOTIFY__LOGIN5__V3__CHALLENGE__INIT; + *message = init_value; +} +size_t spotify__login5__v3__challenge__get_packed_size + (const Spotify__Login5__V3__Challenge *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenge__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__challenge__pack + (const Spotify__Login5__V3__Challenge *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenge__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__challenge__pack_to_buffer + (const Spotify__Login5__V3__Challenge *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenge__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Challenge * + spotify__login5__v3__challenge__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Challenge *) + protobuf_c_message_unpack (&spotify__login5__v3__challenge__descriptor, + allocator, len, data); +} +void spotify__login5__v3__challenge__free_unpacked + (Spotify__Login5__V3__Challenge *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__challenge__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__challenge_solutions__init + (Spotify__Login5__V3__ChallengeSolutions *message) +{ + static const Spotify__Login5__V3__ChallengeSolutions init_value = SPOTIFY__LOGIN5__V3__CHALLENGE_SOLUTIONS__INIT; + *message = init_value; +} +size_t spotify__login5__v3__challenge_solutions__get_packed_size + (const Spotify__Login5__V3__ChallengeSolutions *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenge_solutions__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__challenge_solutions__pack + (const Spotify__Login5__V3__ChallengeSolutions *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenge_solutions__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__challenge_solutions__pack_to_buffer + (const Spotify__Login5__V3__ChallengeSolutions *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenge_solutions__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__ChallengeSolutions * + spotify__login5__v3__challenge_solutions__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__ChallengeSolutions *) + protobuf_c_message_unpack (&spotify__login5__v3__challenge_solutions__descriptor, + allocator, len, data); +} +void spotify__login5__v3__challenge_solutions__free_unpacked + (Spotify__Login5__V3__ChallengeSolutions *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__challenge_solutions__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__challenge_solution__init + (Spotify__Login5__V3__ChallengeSolution *message) +{ + static const Spotify__Login5__V3__ChallengeSolution init_value = SPOTIFY__LOGIN5__V3__CHALLENGE_SOLUTION__INIT; + *message = init_value; +} +size_t spotify__login5__v3__challenge_solution__get_packed_size + (const Spotify__Login5__V3__ChallengeSolution *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenge_solution__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__challenge_solution__pack + (const Spotify__Login5__V3__ChallengeSolution *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenge_solution__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__challenge_solution__pack_to_buffer + (const Spotify__Login5__V3__ChallengeSolution *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenge_solution__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__ChallengeSolution * + spotify__login5__v3__challenge_solution__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__ChallengeSolution *) + protobuf_c_message_unpack (&spotify__login5__v3__challenge_solution__descriptor, + allocator, len, data); +} +void spotify__login5__v3__challenge_solution__free_unpacked + (Spotify__Login5__V3__ChallengeSolution *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__challenge_solution__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__login_request__init + (Spotify__Login5__V3__LoginRequest *message) +{ + static const Spotify__Login5__V3__LoginRequest init_value = SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__INIT; + *message = init_value; +} +size_t spotify__login5__v3__login_request__get_packed_size + (const Spotify__Login5__V3__LoginRequest *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__login_request__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__login_request__pack + (const Spotify__Login5__V3__LoginRequest *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__login_request__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__login_request__pack_to_buffer + (const Spotify__Login5__V3__LoginRequest *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__login_request__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__LoginRequest * + spotify__login5__v3__login_request__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__LoginRequest *) + protobuf_c_message_unpack (&spotify__login5__v3__login_request__descriptor, + allocator, len, data); +} +void spotify__login5__v3__login_request__free_unpacked + (Spotify__Login5__V3__LoginRequest *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__login_request__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__login_ok__init + (Spotify__Login5__V3__LoginOk *message) +{ + static const Spotify__Login5__V3__LoginOk init_value = SPOTIFY__LOGIN5__V3__LOGIN_OK__INIT; + *message = init_value; +} +size_t spotify__login5__v3__login_ok__get_packed_size + (const Spotify__Login5__V3__LoginOk *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__login_ok__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__login_ok__pack + (const Spotify__Login5__V3__LoginOk *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__login_ok__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__login_ok__pack_to_buffer + (const Spotify__Login5__V3__LoginOk *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__login_ok__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__LoginOk * + spotify__login5__v3__login_ok__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__LoginOk *) + protobuf_c_message_unpack (&spotify__login5__v3__login_ok__descriptor, + allocator, len, data); +} +void spotify__login5__v3__login_ok__free_unpacked + (Spotify__Login5__V3__LoginOk *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__login_ok__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__login_response__init + (Spotify__Login5__V3__LoginResponse *message) +{ + static const Spotify__Login5__V3__LoginResponse init_value = SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__INIT; + *message = init_value; +} +size_t spotify__login5__v3__login_response__get_packed_size + (const Spotify__Login5__V3__LoginResponse *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__login_response__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__login_response__pack + (const Spotify__Login5__V3__LoginResponse *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__login_response__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__login_response__pack_to_buffer + (const Spotify__Login5__V3__LoginResponse *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__login_response__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__LoginResponse * + spotify__login5__v3__login_response__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__LoginResponse *) + protobuf_c_message_unpack (&spotify__login5__v3__login_response__descriptor, + allocator, len, data); +} +void spotify__login5__v3__login_response__free_unpacked + (Spotify__Login5__V3__LoginResponse *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__login_response__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +static const ProtobufCFieldDescriptor spotify__login5__v3__challenges__field_descriptors[1] = +{ + { + "challenges", + 1, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__Challenges, n_challenges), + offsetof(Spotify__Login5__V3__Challenges, challenges), + &spotify__login5__v3__challenge__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__challenges__field_indices_by_name[] = { + 0, /* field[0] = challenges */ +}; +static const ProtobufCIntRange spotify__login5__v3__challenges__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 1 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__challenges__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.Challenges", + "Challenges", + "Spotify__Login5__V3__Challenges", + "spotify.login5.v3", + sizeof(Spotify__Login5__V3__Challenges), + 1, + spotify__login5__v3__challenges__field_descriptors, + spotify__login5__v3__challenges__field_indices_by_name, + 1, spotify__login5__v3__challenges__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__challenges__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__challenge__field_descriptors[2] = +{ + { + "hashcash", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__Challenge, challenge_case), + offsetof(Spotify__Login5__V3__Challenge, hashcash), + &spotify__login5__v3__challenges__hashcash_challenge__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "code", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__Challenge, challenge_case), + offsetof(Spotify__Login5__V3__Challenge, code), + &spotify__login5__v3__challenges__code_challenge__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__challenge__field_indices_by_name[] = { + 1, /* field[1] = code */ + 0, /* field[0] = hashcash */ +}; +static const ProtobufCIntRange spotify__login5__v3__challenge__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__challenge__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.Challenge", + "Challenge", + "Spotify__Login5__V3__Challenge", + "spotify.login5.v3", + sizeof(Spotify__Login5__V3__Challenge), + 2, + spotify__login5__v3__challenge__field_descriptors, + spotify__login5__v3__challenge__field_indices_by_name, + 1, spotify__login5__v3__challenge__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__challenge__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__challenge_solutions__field_descriptors[1] = +{ + { + "solutions", + 1, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__ChallengeSolutions, n_solutions), + offsetof(Spotify__Login5__V3__ChallengeSolutions, solutions), + &spotify__login5__v3__challenge_solution__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__challenge_solutions__field_indices_by_name[] = { + 0, /* field[0] = solutions */ +}; +static const ProtobufCIntRange spotify__login5__v3__challenge_solutions__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 1 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__challenge_solutions__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.ChallengeSolutions", + "ChallengeSolutions", + "Spotify__Login5__V3__ChallengeSolutions", + "spotify.login5.v3", + sizeof(Spotify__Login5__V3__ChallengeSolutions), + 1, + spotify__login5__v3__challenge_solutions__field_descriptors, + spotify__login5__v3__challenge_solutions__field_indices_by_name, + 1, spotify__login5__v3__challenge_solutions__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__challenge_solutions__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__challenge_solution__field_descriptors[2] = +{ + { + "hashcash", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__ChallengeSolution, solution_case), + offsetof(Spotify__Login5__V3__ChallengeSolution, hashcash), + &spotify__login5__v3__challenges__hashcash_solution__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "code", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__ChallengeSolution, solution_case), + offsetof(Spotify__Login5__V3__ChallengeSolution, code), + &spotify__login5__v3__challenges__code_solution__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__challenge_solution__field_indices_by_name[] = { + 1, /* field[1] = code */ + 0, /* field[0] = hashcash */ +}; +static const ProtobufCIntRange spotify__login5__v3__challenge_solution__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__challenge_solution__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.ChallengeSolution", + "ChallengeSolution", + "Spotify__Login5__V3__ChallengeSolution", + "spotify.login5.v3", + sizeof(Spotify__Login5__V3__ChallengeSolution), + 2, + spotify__login5__v3__challenge_solution__field_descriptors, + spotify__login5__v3__challenge_solution__field_indices_by_name, + 1, spotify__login5__v3__challenge_solution__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__challenge_solution__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__login_request__field_descriptors[12] = +{ + { + "client_info", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__LoginRequest, client_info), + &spotify__login5__v3__client_info__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "login_context", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_BYTES, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__LoginRequest, login_context), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "challenge_solutions", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__LoginRequest, challenge_solutions), + &spotify__login5__v3__challenge_solutions__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "stored_credential", + 100, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__LoginRequest, login_method_case), + offsetof(Spotify__Login5__V3__LoginRequest, stored_credential), + &spotify__login5__v3__credentials__stored_credential__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "password", + 101, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__LoginRequest, login_method_case), + offsetof(Spotify__Login5__V3__LoginRequest, password), + &spotify__login5__v3__credentials__password__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "facebook_access_token", + 102, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__LoginRequest, login_method_case), + offsetof(Spotify__Login5__V3__LoginRequest, facebook_access_token), + &spotify__login5__v3__credentials__facebook_access_token__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "phone_number", + 103, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__LoginRequest, login_method_case), + offsetof(Spotify__Login5__V3__LoginRequest, phone_number), + &spotify__login5__v3__identifiers__phone_number__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "one_time_token", + 104, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__LoginRequest, login_method_case), + offsetof(Spotify__Login5__V3__LoginRequest, one_time_token), + &spotify__login5__v3__credentials__one_time_token__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "parent_child_credential", + 105, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__LoginRequest, login_method_case), + offsetof(Spotify__Login5__V3__LoginRequest, parent_child_credential), + &spotify__login5__v3__credentials__parent_child_credential__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "apple_sign_in_credential", + 106, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__LoginRequest, login_method_case), + offsetof(Spotify__Login5__V3__LoginRequest, apple_sign_in_credential), + &spotify__login5__v3__credentials__apple_sign_in_credential__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "samsung_sign_in_credential", + 107, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__LoginRequest, login_method_case), + offsetof(Spotify__Login5__V3__LoginRequest, samsung_sign_in_credential), + &spotify__login5__v3__credentials__samsung_sign_in_credential__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "google_sign_in_credential", + 108, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__LoginRequest, login_method_case), + offsetof(Spotify__Login5__V3__LoginRequest, google_sign_in_credential), + &spotify__login5__v3__credentials__google_sign_in_credential__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__login_request__field_indices_by_name[] = { + 9, /* field[9] = apple_sign_in_credential */ + 2, /* field[2] = challenge_solutions */ + 0, /* field[0] = client_info */ + 5, /* field[5] = facebook_access_token */ + 11, /* field[11] = google_sign_in_credential */ + 1, /* field[1] = login_context */ + 7, /* field[7] = one_time_token */ + 8, /* field[8] = parent_child_credential */ + 4, /* field[4] = password */ + 6, /* field[6] = phone_number */ + 10, /* field[10] = samsung_sign_in_credential */ + 3, /* field[3] = stored_credential */ +}; +static const ProtobufCIntRange spotify__login5__v3__login_request__number_ranges[2 + 1] = +{ + { 1, 0 }, + { 100, 3 }, + { 0, 12 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__login_request__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.LoginRequest", + "LoginRequest", + "Spotify__Login5__V3__LoginRequest", + "spotify.login5.v3", + sizeof(Spotify__Login5__V3__LoginRequest), + 12, + spotify__login5__v3__login_request__field_descriptors, + spotify__login5__v3__login_request__field_indices_by_name, + 2, spotify__login5__v3__login_request__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__login_request__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__login_ok__field_descriptors[4] = +{ + { + "username", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__LoginOk, username), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "access_token", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__LoginOk, access_token), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "stored_credential", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_BYTES, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__LoginOk, stored_credential), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "access_token_expires_in", + 4, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__LoginOk, access_token_expires_in), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__login_ok__field_indices_by_name[] = { + 1, /* field[1] = access_token */ + 3, /* field[3] = access_token_expires_in */ + 2, /* field[2] = stored_credential */ + 0, /* field[0] = username */ +}; +static const ProtobufCIntRange spotify__login5__v3__login_ok__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 4 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__login_ok__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.LoginOk", + "LoginOk", + "Spotify__Login5__V3__LoginOk", + "spotify.login5.v3", + sizeof(Spotify__Login5__V3__LoginOk), + 4, + spotify__login5__v3__login_ok__field_descriptors, + spotify__login5__v3__login_ok__field_indices_by_name, + 1, spotify__login5__v3__login_ok__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__login_ok__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCEnumValue spotify__login5__v3__login_response__warnings__enum_values_by_number[2] = +{ + { "UNKNOWN_WARNING", "SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__WARNINGS__UNKNOWN_WARNING", 0 }, + { "DEPRECATED_PROTOCOL_VERSION", "SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__WARNINGS__DEPRECATED_PROTOCOL_VERSION", 1 }, +}; +static const ProtobufCIntRange spotify__login5__v3__login_response__warnings__value_ranges[] = { +{0, 0},{0, 2} +}; +static const ProtobufCEnumValueIndex spotify__login5__v3__login_response__warnings__enum_values_by_name[2] = +{ + { "DEPRECATED_PROTOCOL_VERSION", 1 }, + { "UNKNOWN_WARNING", 0 }, +}; +const ProtobufCEnumDescriptor spotify__login5__v3__login_response__warnings__descriptor = +{ + PROTOBUF_C__ENUM_DESCRIPTOR_MAGIC, + "spotify.login5.v3.LoginResponse.Warnings", + "Warnings", + "Spotify__Login5__V3__LoginResponse__Warnings", + "spotify.login5.v3", + 2, + spotify__login5__v3__login_response__warnings__enum_values_by_number, + 2, + spotify__login5__v3__login_response__warnings__enum_values_by_name, + 1, + spotify__login5__v3__login_response__warnings__value_ranges, + NULL,NULL,NULL,NULL /* reserved[1234] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__login_response__field_descriptors[7] = +{ + { + "ok", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__LoginResponse, response_case), + offsetof(Spotify__Login5__V3__LoginResponse, ok), + &spotify__login5__v3__login_ok__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "error", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_ENUM, + offsetof(Spotify__Login5__V3__LoginResponse, response_case), + offsetof(Spotify__Login5__V3__LoginResponse, error), + &spotify__login5__v3__login_error__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "challenges", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Spotify__Login5__V3__LoginResponse, response_case), + offsetof(Spotify__Login5__V3__LoginResponse, challenges), + &spotify__login5__v3__challenges__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "warnings", + 4, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_ENUM, + offsetof(Spotify__Login5__V3__LoginResponse, n_warnings), + offsetof(Spotify__Login5__V3__LoginResponse, warnings), + &spotify__login5__v3__login_response__warnings__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_PACKED, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "login_context", + 5, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_BYTES, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__LoginResponse, login_context), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "identifier_token", + 6, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__LoginResponse, identifier_token), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "user_info", + 7, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__LoginResponse, user_info), + &spotify__login5__v3__user_info__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__login_response__field_indices_by_name[] = { + 2, /* field[2] = challenges */ + 1, /* field[1] = error */ + 5, /* field[5] = identifier_token */ + 4, /* field[4] = login_context */ + 0, /* field[0] = ok */ + 6, /* field[6] = user_info */ + 3, /* field[3] = warnings */ +}; +static const ProtobufCIntRange spotify__login5__v3__login_response__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 7 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__login_response__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.LoginResponse", + "LoginResponse", + "Spotify__Login5__V3__LoginResponse", + "spotify.login5.v3", + sizeof(Spotify__Login5__V3__LoginResponse), + 7, + spotify__login5__v3__login_response__field_descriptors, + spotify__login5__v3__login_response__field_indices_by_name, + 1, spotify__login5__v3__login_response__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__login_response__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCEnumValue spotify__login5__v3__login_error__enum_values_by_number[9] = +{ + { "UNKNOWN_ERROR", "SPOTIFY__LOGIN5__V3__LOGIN_ERROR__UNKNOWN_ERROR", 0 }, + { "INVALID_CREDENTIALS", "SPOTIFY__LOGIN5__V3__LOGIN_ERROR__INVALID_CREDENTIALS", 1 }, + { "BAD_REQUEST", "SPOTIFY__LOGIN5__V3__LOGIN_ERROR__BAD_REQUEST", 2 }, + { "UNSUPPORTED_LOGIN_PROTOCOL", "SPOTIFY__LOGIN5__V3__LOGIN_ERROR__UNSUPPORTED_LOGIN_PROTOCOL", 3 }, + { "TIMEOUT", "SPOTIFY__LOGIN5__V3__LOGIN_ERROR__TIMEOUT", 4 }, + { "UNKNOWN_IDENTIFIER", "SPOTIFY__LOGIN5__V3__LOGIN_ERROR__UNKNOWN_IDENTIFIER", 5 }, + { "TOO_MANY_ATTEMPTS", "SPOTIFY__LOGIN5__V3__LOGIN_ERROR__TOO_MANY_ATTEMPTS", 6 }, + { "INVALID_PHONENUMBER", "SPOTIFY__LOGIN5__V3__LOGIN_ERROR__INVALID_PHONENUMBER", 7 }, + { "TRY_AGAIN_LATER", "SPOTIFY__LOGIN5__V3__LOGIN_ERROR__TRY_AGAIN_LATER", 8 }, +}; +static const ProtobufCIntRange spotify__login5__v3__login_error__value_ranges[] = { +{0, 0},{0, 9} +}; +static const ProtobufCEnumValueIndex spotify__login5__v3__login_error__enum_values_by_name[9] = +{ + { "BAD_REQUEST", 2 }, + { "INVALID_CREDENTIALS", 1 }, + { "INVALID_PHONENUMBER", 7 }, + { "TIMEOUT", 4 }, + { "TOO_MANY_ATTEMPTS", 6 }, + { "TRY_AGAIN_LATER", 8 }, + { "UNKNOWN_ERROR", 0 }, + { "UNKNOWN_IDENTIFIER", 5 }, + { "UNSUPPORTED_LOGIN_PROTOCOL", 3 }, +}; +const ProtobufCEnumDescriptor spotify__login5__v3__login_error__descriptor = +{ + PROTOBUF_C__ENUM_DESCRIPTOR_MAGIC, + "spotify.login5.v3.LoginError", + "LoginError", + "Spotify__Login5__V3__LoginError", + "spotify.login5.v3", + 9, + spotify__login5__v3__login_error__enum_values_by_number, + 9, + spotify__login5__v3__login_error__enum_values_by_name, + 1, + spotify__login5__v3__login_error__value_ranges, + NULL,NULL,NULL,NULL /* reserved[1234] */ +}; diff --git a/src/inputs/librespot-c/src/proto/login5.pb-c.h b/src/inputs/librespot-c/src/proto/login5.pb-c.h new file mode 100644 index 00000000..b0a98359 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5.pb-c.h @@ -0,0 +1,373 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: login5.proto */ + +#ifndef PROTOBUF_C_login5_2eproto__INCLUDED +#define PROTOBUF_C_login5_2eproto__INCLUDED + +#include + +PROTOBUF_C__BEGIN_DECLS + +#if PROTOBUF_C_VERSION_NUMBER < 1003000 +# error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers. +#elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION +# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c. +#endif + +#include "login5_client_info.pb-c.h" +#include "login5_user_info.pb-c.h" +#include "login5_challenges_code.pb-c.h" +#include "login5_challenges_hashcash.pb-c.h" +#include "login5_credentials.pb-c.h" +#include "login5_identifiers.pb-c.h" + +typedef struct Spotify__Login5__V3__Challenges Spotify__Login5__V3__Challenges; +typedef struct Spotify__Login5__V3__Challenge Spotify__Login5__V3__Challenge; +typedef struct Spotify__Login5__V3__ChallengeSolutions Spotify__Login5__V3__ChallengeSolutions; +typedef struct Spotify__Login5__V3__ChallengeSolution Spotify__Login5__V3__ChallengeSolution; +typedef struct Spotify__Login5__V3__LoginRequest Spotify__Login5__V3__LoginRequest; +typedef struct Spotify__Login5__V3__LoginOk Spotify__Login5__V3__LoginOk; +typedef struct Spotify__Login5__V3__LoginResponse Spotify__Login5__V3__LoginResponse; + + +/* --- enums --- */ + +typedef enum _Spotify__Login5__V3__LoginResponse__Warnings { + SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__WARNINGS__UNKNOWN_WARNING = 0, + SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__WARNINGS__DEPRECATED_PROTOCOL_VERSION = 1 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__WARNINGS) +} Spotify__Login5__V3__LoginResponse__Warnings; +typedef enum _Spotify__Login5__V3__LoginError { + SPOTIFY__LOGIN5__V3__LOGIN_ERROR__UNKNOWN_ERROR = 0, + SPOTIFY__LOGIN5__V3__LOGIN_ERROR__INVALID_CREDENTIALS = 1, + SPOTIFY__LOGIN5__V3__LOGIN_ERROR__BAD_REQUEST = 2, + SPOTIFY__LOGIN5__V3__LOGIN_ERROR__UNSUPPORTED_LOGIN_PROTOCOL = 3, + SPOTIFY__LOGIN5__V3__LOGIN_ERROR__TIMEOUT = 4, + SPOTIFY__LOGIN5__V3__LOGIN_ERROR__UNKNOWN_IDENTIFIER = 5, + SPOTIFY__LOGIN5__V3__LOGIN_ERROR__TOO_MANY_ATTEMPTS = 6, + SPOTIFY__LOGIN5__V3__LOGIN_ERROR__INVALID_PHONENUMBER = 7, + SPOTIFY__LOGIN5__V3__LOGIN_ERROR__TRY_AGAIN_LATER = 8 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__LOGIN5__V3__LOGIN_ERROR) +} Spotify__Login5__V3__LoginError; + +/* --- messages --- */ + +struct Spotify__Login5__V3__Challenges +{ + ProtobufCMessage base; + size_t n_challenges; + Spotify__Login5__V3__Challenge **challenges; +}; +#define SPOTIFY__LOGIN5__V3__CHALLENGES__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__challenges__descriptor) \ + , 0,NULL } + + +typedef enum { + SPOTIFY__LOGIN5__V3__CHALLENGE__CHALLENGE__NOT_SET = 0, + SPOTIFY__LOGIN5__V3__CHALLENGE__CHALLENGE_HASHCASH = 1, + SPOTIFY__LOGIN5__V3__CHALLENGE__CHALLENGE_CODE = 2 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__LOGIN5__V3__CHALLENGE__CHALLENGE__CASE) +} Spotify__Login5__V3__Challenge__ChallengeCase; + +struct Spotify__Login5__V3__Challenge +{ + ProtobufCMessage base; + Spotify__Login5__V3__Challenge__ChallengeCase challenge_case; + union { + Spotify__Login5__V3__Challenges__HashcashChallenge *hashcash; + Spotify__Login5__V3__Challenges__CodeChallenge *code; + }; +}; +#define SPOTIFY__LOGIN5__V3__CHALLENGE__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__challenge__descriptor) \ + , SPOTIFY__LOGIN5__V3__CHALLENGE__CHALLENGE__NOT_SET, {0} } + + +struct Spotify__Login5__V3__ChallengeSolutions +{ + ProtobufCMessage base; + size_t n_solutions; + Spotify__Login5__V3__ChallengeSolution **solutions; +}; +#define SPOTIFY__LOGIN5__V3__CHALLENGE_SOLUTIONS__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__challenge_solutions__descriptor) \ + , 0,NULL } + + +typedef enum { + SPOTIFY__LOGIN5__V3__CHALLENGE_SOLUTION__SOLUTION__NOT_SET = 0, + SPOTIFY__LOGIN5__V3__CHALLENGE_SOLUTION__SOLUTION_HASHCASH = 1, + SPOTIFY__LOGIN5__V3__CHALLENGE_SOLUTION__SOLUTION_CODE = 2 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__LOGIN5__V3__CHALLENGE_SOLUTION__SOLUTION__CASE) +} Spotify__Login5__V3__ChallengeSolution__SolutionCase; + +struct Spotify__Login5__V3__ChallengeSolution +{ + ProtobufCMessage base; + Spotify__Login5__V3__ChallengeSolution__SolutionCase solution_case; + union { + Spotify__Login5__V3__Challenges__HashcashSolution *hashcash; + Spotify__Login5__V3__Challenges__CodeSolution *code; + }; +}; +#define SPOTIFY__LOGIN5__V3__CHALLENGE_SOLUTION__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__challenge_solution__descriptor) \ + , SPOTIFY__LOGIN5__V3__CHALLENGE_SOLUTION__SOLUTION__NOT_SET, {0} } + + +typedef enum { + SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__LOGIN_METHOD__NOT_SET = 0, + SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__LOGIN_METHOD_STORED_CREDENTIAL = 100, + SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__LOGIN_METHOD_PASSWORD = 101, + SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__LOGIN_METHOD_FACEBOOK_ACCESS_TOKEN = 102, + SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__LOGIN_METHOD_PHONE_NUMBER = 103, + SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__LOGIN_METHOD_ONE_TIME_TOKEN = 104, + SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__LOGIN_METHOD_PARENT_CHILD_CREDENTIAL = 105, + SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__LOGIN_METHOD_APPLE_SIGN_IN_CREDENTIAL = 106, + SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__LOGIN_METHOD_SAMSUNG_SIGN_IN_CREDENTIAL = 107, + SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__LOGIN_METHOD_GOOGLE_SIGN_IN_CREDENTIAL = 108 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__LOGIN_METHOD__CASE) +} Spotify__Login5__V3__LoginRequest__LoginMethodCase; + +struct Spotify__Login5__V3__LoginRequest +{ + ProtobufCMessage base; + Spotify__Login5__V3__ClientInfo *client_info; + ProtobufCBinaryData login_context; + Spotify__Login5__V3__ChallengeSolutions *challenge_solutions; + Spotify__Login5__V3__LoginRequest__LoginMethodCase login_method_case; + union { + Spotify__Login5__V3__Credentials__StoredCredential *stored_credential; + Spotify__Login5__V3__Credentials__Password *password; + Spotify__Login5__V3__Credentials__FacebookAccessToken *facebook_access_token; + Spotify__Login5__V3__Identifiers__PhoneNumber *phone_number; + Spotify__Login5__V3__Credentials__OneTimeToken *one_time_token; + Spotify__Login5__V3__Credentials__ParentChildCredential *parent_child_credential; + Spotify__Login5__V3__Credentials__AppleSignInCredential *apple_sign_in_credential; + Spotify__Login5__V3__Credentials__SamsungSignInCredential *samsung_sign_in_credential; + Spotify__Login5__V3__Credentials__GoogleSignInCredential *google_sign_in_credential; + }; +}; +#define SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__login_request__descriptor) \ + , NULL, {0,NULL}, NULL, SPOTIFY__LOGIN5__V3__LOGIN_REQUEST__LOGIN_METHOD__NOT_SET, {0} } + + +struct Spotify__Login5__V3__LoginOk +{ + ProtobufCMessage base; + char *username; + char *access_token; + ProtobufCBinaryData stored_credential; + int32_t access_token_expires_in; +}; +#define SPOTIFY__LOGIN5__V3__LOGIN_OK__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__login_ok__descriptor) \ + , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, {0,NULL}, 0 } + + +typedef enum { + SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__RESPONSE__NOT_SET = 0, + SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__RESPONSE_OK = 1, + SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__RESPONSE_ERROR = 2, + SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__RESPONSE_CHALLENGES = 3 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__RESPONSE__CASE) +} Spotify__Login5__V3__LoginResponse__ResponseCase; + +struct Spotify__Login5__V3__LoginResponse +{ + ProtobufCMessage base; + size_t n_warnings; + Spotify__Login5__V3__LoginResponse__Warnings *warnings; + ProtobufCBinaryData login_context; + char *identifier_token; + Spotify__Login5__V3__UserInfo *user_info; + Spotify__Login5__V3__LoginResponse__ResponseCase response_case; + union { + Spotify__Login5__V3__LoginOk *ok; + Spotify__Login5__V3__LoginError error; + Spotify__Login5__V3__Challenges *challenges; + }; +}; +#define SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__login_response__descriptor) \ + , 0,NULL, {0,NULL}, (char *)protobuf_c_empty_string, NULL, SPOTIFY__LOGIN5__V3__LOGIN_RESPONSE__RESPONSE__NOT_SET, {0} } + + +/* Spotify__Login5__V3__Challenges methods */ +void spotify__login5__v3__challenges__init + (Spotify__Login5__V3__Challenges *message); +size_t spotify__login5__v3__challenges__get_packed_size + (const Spotify__Login5__V3__Challenges *message); +size_t spotify__login5__v3__challenges__pack + (const Spotify__Login5__V3__Challenges *message, + uint8_t *out); +size_t spotify__login5__v3__challenges__pack_to_buffer + (const Spotify__Login5__V3__Challenges *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Challenges * + spotify__login5__v3__challenges__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__challenges__free_unpacked + (Spotify__Login5__V3__Challenges *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__Challenge methods */ +void spotify__login5__v3__challenge__init + (Spotify__Login5__V3__Challenge *message); +size_t spotify__login5__v3__challenge__get_packed_size + (const Spotify__Login5__V3__Challenge *message); +size_t spotify__login5__v3__challenge__pack + (const Spotify__Login5__V3__Challenge *message, + uint8_t *out); +size_t spotify__login5__v3__challenge__pack_to_buffer + (const Spotify__Login5__V3__Challenge *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Challenge * + spotify__login5__v3__challenge__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__challenge__free_unpacked + (Spotify__Login5__V3__Challenge *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__ChallengeSolutions methods */ +void spotify__login5__v3__challenge_solutions__init + (Spotify__Login5__V3__ChallengeSolutions *message); +size_t spotify__login5__v3__challenge_solutions__get_packed_size + (const Spotify__Login5__V3__ChallengeSolutions *message); +size_t spotify__login5__v3__challenge_solutions__pack + (const Spotify__Login5__V3__ChallengeSolutions *message, + uint8_t *out); +size_t spotify__login5__v3__challenge_solutions__pack_to_buffer + (const Spotify__Login5__V3__ChallengeSolutions *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__ChallengeSolutions * + spotify__login5__v3__challenge_solutions__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__challenge_solutions__free_unpacked + (Spotify__Login5__V3__ChallengeSolutions *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__ChallengeSolution methods */ +void spotify__login5__v3__challenge_solution__init + (Spotify__Login5__V3__ChallengeSolution *message); +size_t spotify__login5__v3__challenge_solution__get_packed_size + (const Spotify__Login5__V3__ChallengeSolution *message); +size_t spotify__login5__v3__challenge_solution__pack + (const Spotify__Login5__V3__ChallengeSolution *message, + uint8_t *out); +size_t spotify__login5__v3__challenge_solution__pack_to_buffer + (const Spotify__Login5__V3__ChallengeSolution *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__ChallengeSolution * + spotify__login5__v3__challenge_solution__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__challenge_solution__free_unpacked + (Spotify__Login5__V3__ChallengeSolution *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__LoginRequest methods */ +void spotify__login5__v3__login_request__init + (Spotify__Login5__V3__LoginRequest *message); +size_t spotify__login5__v3__login_request__get_packed_size + (const Spotify__Login5__V3__LoginRequest *message); +size_t spotify__login5__v3__login_request__pack + (const Spotify__Login5__V3__LoginRequest *message, + uint8_t *out); +size_t spotify__login5__v3__login_request__pack_to_buffer + (const Spotify__Login5__V3__LoginRequest *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__LoginRequest * + spotify__login5__v3__login_request__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__login_request__free_unpacked + (Spotify__Login5__V3__LoginRequest *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__LoginOk methods */ +void spotify__login5__v3__login_ok__init + (Spotify__Login5__V3__LoginOk *message); +size_t spotify__login5__v3__login_ok__get_packed_size + (const Spotify__Login5__V3__LoginOk *message); +size_t spotify__login5__v3__login_ok__pack + (const Spotify__Login5__V3__LoginOk *message, + uint8_t *out); +size_t spotify__login5__v3__login_ok__pack_to_buffer + (const Spotify__Login5__V3__LoginOk *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__LoginOk * + spotify__login5__v3__login_ok__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__login_ok__free_unpacked + (Spotify__Login5__V3__LoginOk *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__LoginResponse methods */ +void spotify__login5__v3__login_response__init + (Spotify__Login5__V3__LoginResponse *message); +size_t spotify__login5__v3__login_response__get_packed_size + (const Spotify__Login5__V3__LoginResponse *message); +size_t spotify__login5__v3__login_response__pack + (const Spotify__Login5__V3__LoginResponse *message, + uint8_t *out); +size_t spotify__login5__v3__login_response__pack_to_buffer + (const Spotify__Login5__V3__LoginResponse *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__LoginResponse * + spotify__login5__v3__login_response__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__login_response__free_unpacked + (Spotify__Login5__V3__LoginResponse *message, + ProtobufCAllocator *allocator); +/* --- per-message closures --- */ + +typedef void (*Spotify__Login5__V3__Challenges_Closure) + (const Spotify__Login5__V3__Challenges *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__Challenge_Closure) + (const Spotify__Login5__V3__Challenge *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__ChallengeSolutions_Closure) + (const Spotify__Login5__V3__ChallengeSolutions *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__ChallengeSolution_Closure) + (const Spotify__Login5__V3__ChallengeSolution *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__LoginRequest_Closure) + (const Spotify__Login5__V3__LoginRequest *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__LoginOk_Closure) + (const Spotify__Login5__V3__LoginOk *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__LoginResponse_Closure) + (const Spotify__Login5__V3__LoginResponse *message, + void *closure_data); + +/* --- services --- */ + + +/* --- descriptors --- */ + +extern const ProtobufCEnumDescriptor spotify__login5__v3__login_error__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__challenges__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__challenge__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__challenge_solutions__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__challenge_solution__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__login_request__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__login_ok__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__login_response__descriptor; +extern const ProtobufCEnumDescriptor spotify__login5__v3__login_response__warnings__descriptor; + +PROTOBUF_C__END_DECLS + + +#endif /* PROTOBUF_C_login5_2eproto__INCLUDED */ diff --git a/src/inputs/librespot-c/src/proto/login5.proto b/src/inputs/librespot-c/src/proto/login5.proto new file mode 100644 index 00000000..f2cc95f1 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5.proto @@ -0,0 +1,87 @@ +syntax = "proto3"; + +package spotify.login5.v3; + +import "login5_client_info.proto"; +import "login5_user_info.proto"; +import "login5_challenges_code.proto"; +import "login5_challenges_hashcash.proto"; +import "login5_credentials.proto"; +import "login5_identifiers.proto"; + +message Challenges { + repeated Challenge challenges = 1; +} + +message Challenge { + oneof challenge { + challenges.HashcashChallenge hashcash = 1; + challenges.CodeChallenge code = 2; + } +} + +message ChallengeSolutions { + repeated ChallengeSolution solutions = 1; +} + +message ChallengeSolution { + oneof solution { + challenges.HashcashSolution hashcash = 1; + challenges.CodeSolution code = 2; + } +} + +message LoginRequest { + ClientInfo client_info = 1; + bytes login_context = 2; + ChallengeSolutions challenge_solutions = 3; + + oneof login_method { + credentials.StoredCredential stored_credential = 100; + credentials.Password password = 101; + credentials.FacebookAccessToken facebook_access_token = 102; + identifiers.PhoneNumber phone_number = 103; + credentials.OneTimeToken one_time_token = 104; + credentials.ParentChildCredential parent_child_credential = 105; + credentials.AppleSignInCredential apple_sign_in_credential = 106; + credentials.SamsungSignInCredential samsung_sign_in_credential = 107; + credentials.GoogleSignInCredential google_sign_in_credential = 108; + } +} + +message LoginOk { + string username = 1; + string access_token = 2; + bytes stored_credential = 3; + int32 access_token_expires_in = 4; +} + +message LoginResponse { + repeated Warnings warnings = 4; + enum Warnings { + UNKNOWN_WARNING = 0; + DEPRECATED_PROTOCOL_VERSION = 1; + } + + bytes login_context = 5; + string identifier_token = 6; + UserInfo user_info = 7; + + oneof response { + LoginOk ok = 1; + LoginError error = 2; + Challenges challenges = 3; + } +} + +enum LoginError { + UNKNOWN_ERROR = 0; + INVALID_CREDENTIALS = 1; + BAD_REQUEST = 2; + UNSUPPORTED_LOGIN_PROTOCOL = 3; + TIMEOUT = 4; + UNKNOWN_IDENTIFIER = 5; + TOO_MANY_ATTEMPTS = 6; + INVALID_PHONENUMBER = 7; + TRY_AGAIN_LATER = 8; +} diff --git a/src/inputs/librespot-c/src/proto/login5_challenges_code.pb-c.c b/src/inputs/librespot-c/src/proto/login5_challenges_code.pb-c.c new file mode 100644 index 00000000..429b6d08 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_challenges_code.pb-c.c @@ -0,0 +1,242 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: login5_challenges_code.proto */ + +/* Do not generate deprecated warnings for self */ +#ifndef PROTOBUF_C__NO_DEPRECATED +#define PROTOBUF_C__NO_DEPRECATED +#endif + +#include "login5_challenges_code.pb-c.h" +void spotify__login5__v3__challenges__code_challenge__init + (Spotify__Login5__V3__Challenges__CodeChallenge *message) +{ + static const Spotify__Login5__V3__Challenges__CodeChallenge init_value = SPOTIFY__LOGIN5__V3__CHALLENGES__CODE_CHALLENGE__INIT; + *message = init_value; +} +size_t spotify__login5__v3__challenges__code_challenge__get_packed_size + (const Spotify__Login5__V3__Challenges__CodeChallenge *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__code_challenge__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__challenges__code_challenge__pack + (const Spotify__Login5__V3__Challenges__CodeChallenge *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__code_challenge__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__challenges__code_challenge__pack_to_buffer + (const Spotify__Login5__V3__Challenges__CodeChallenge *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__code_challenge__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Challenges__CodeChallenge * + spotify__login5__v3__challenges__code_challenge__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Challenges__CodeChallenge *) + protobuf_c_message_unpack (&spotify__login5__v3__challenges__code_challenge__descriptor, + allocator, len, data); +} +void spotify__login5__v3__challenges__code_challenge__free_unpacked + (Spotify__Login5__V3__Challenges__CodeChallenge *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__challenges__code_challenge__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__challenges__code_solution__init + (Spotify__Login5__V3__Challenges__CodeSolution *message) +{ + static const Spotify__Login5__V3__Challenges__CodeSolution init_value = SPOTIFY__LOGIN5__V3__CHALLENGES__CODE_SOLUTION__INIT; + *message = init_value; +} +size_t spotify__login5__v3__challenges__code_solution__get_packed_size + (const Spotify__Login5__V3__Challenges__CodeSolution *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__code_solution__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__challenges__code_solution__pack + (const Spotify__Login5__V3__Challenges__CodeSolution *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__code_solution__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__challenges__code_solution__pack_to_buffer + (const Spotify__Login5__V3__Challenges__CodeSolution *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__code_solution__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Challenges__CodeSolution * + spotify__login5__v3__challenges__code_solution__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Challenges__CodeSolution *) + protobuf_c_message_unpack (&spotify__login5__v3__challenges__code_solution__descriptor, + allocator, len, data); +} +void spotify__login5__v3__challenges__code_solution__free_unpacked + (Spotify__Login5__V3__Challenges__CodeSolution *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__challenges__code_solution__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +static const ProtobufCEnumValue spotify__login5__v3__challenges__code_challenge__method__enum_values_by_number[2] = +{ + { "UNKNOWN", "SPOTIFY__LOGIN5__V3__CHALLENGES__CODE_CHALLENGE__METHOD__UNKNOWN", 0 }, + { "SMS", "SPOTIFY__LOGIN5__V3__CHALLENGES__CODE_CHALLENGE__METHOD__SMS", 1 }, +}; +static const ProtobufCIntRange spotify__login5__v3__challenges__code_challenge__method__value_ranges[] = { +{0, 0},{0, 2} +}; +static const ProtobufCEnumValueIndex spotify__login5__v3__challenges__code_challenge__method__enum_values_by_name[2] = +{ + { "SMS", 1 }, + { "UNKNOWN", 0 }, +}; +const ProtobufCEnumDescriptor spotify__login5__v3__challenges__code_challenge__method__descriptor = +{ + PROTOBUF_C__ENUM_DESCRIPTOR_MAGIC, + "spotify.login5.v3.challenges.CodeChallenge.Method", + "Method", + "Spotify__Login5__V3__Challenges__CodeChallenge__Method", + "spotify.login5.v3.challenges", + 2, + spotify__login5__v3__challenges__code_challenge__method__enum_values_by_number, + 2, + spotify__login5__v3__challenges__code_challenge__method__enum_values_by_name, + 1, + spotify__login5__v3__challenges__code_challenge__method__value_ranges, + NULL,NULL,NULL,NULL /* reserved[1234] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__challenges__code_challenge__field_descriptors[4] = +{ + { + "method", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_ENUM, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Challenges__CodeChallenge, method), + &spotify__login5__v3__challenges__code_challenge__method__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "code_length", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Challenges__CodeChallenge, code_length), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "expires_in", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Challenges__CodeChallenge, expires_in), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "canonical_phone_number", + 4, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Challenges__CodeChallenge, canonical_phone_number), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__challenges__code_challenge__field_indices_by_name[] = { + 3, /* field[3] = canonical_phone_number */ + 1, /* field[1] = code_length */ + 2, /* field[2] = expires_in */ + 0, /* field[0] = method */ +}; +static const ProtobufCIntRange spotify__login5__v3__challenges__code_challenge__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 4 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__challenges__code_challenge__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.challenges.CodeChallenge", + "CodeChallenge", + "Spotify__Login5__V3__Challenges__CodeChallenge", + "spotify.login5.v3.challenges", + sizeof(Spotify__Login5__V3__Challenges__CodeChallenge), + 4, + spotify__login5__v3__challenges__code_challenge__field_descriptors, + spotify__login5__v3__challenges__code_challenge__field_indices_by_name, + 1, spotify__login5__v3__challenges__code_challenge__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__challenges__code_challenge__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__challenges__code_solution__field_descriptors[1] = +{ + { + "code", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Challenges__CodeSolution, code), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__challenges__code_solution__field_indices_by_name[] = { + 0, /* field[0] = code */ +}; +static const ProtobufCIntRange spotify__login5__v3__challenges__code_solution__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 1 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__challenges__code_solution__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.challenges.CodeSolution", + "CodeSolution", + "Spotify__Login5__V3__Challenges__CodeSolution", + "spotify.login5.v3.challenges", + sizeof(Spotify__Login5__V3__Challenges__CodeSolution), + 1, + spotify__login5__v3__challenges__code_solution__field_descriptors, + spotify__login5__v3__challenges__code_solution__field_indices_by_name, + 1, spotify__login5__v3__challenges__code_solution__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__challenges__code_solution__init, + NULL,NULL,NULL /* reserved[123] */ +}; diff --git a/src/inputs/librespot-c/src/proto/login5_challenges_code.pb-c.h b/src/inputs/librespot-c/src/proto/login5_challenges_code.pb-c.h new file mode 100644 index 00000000..6cbdcf03 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_challenges_code.pb-c.h @@ -0,0 +1,114 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: login5_challenges_code.proto */ + +#ifndef PROTOBUF_C_login5_5fchallenges_5fcode_2eproto__INCLUDED +#define PROTOBUF_C_login5_5fchallenges_5fcode_2eproto__INCLUDED + +#include + +PROTOBUF_C__BEGIN_DECLS + +#if PROTOBUF_C_VERSION_NUMBER < 1003000 +# error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers. +#elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION +# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c. +#endif + + +typedef struct Spotify__Login5__V3__Challenges__CodeChallenge Spotify__Login5__V3__Challenges__CodeChallenge; +typedef struct Spotify__Login5__V3__Challenges__CodeSolution Spotify__Login5__V3__Challenges__CodeSolution; + + +/* --- enums --- */ + +typedef enum _Spotify__Login5__V3__Challenges__CodeChallenge__Method { + SPOTIFY__LOGIN5__V3__CHALLENGES__CODE_CHALLENGE__METHOD__UNKNOWN = 0, + SPOTIFY__LOGIN5__V3__CHALLENGES__CODE_CHALLENGE__METHOD__SMS = 1 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__LOGIN5__V3__CHALLENGES__CODE_CHALLENGE__METHOD) +} Spotify__Login5__V3__Challenges__CodeChallenge__Method; + +/* --- messages --- */ + +struct Spotify__Login5__V3__Challenges__CodeChallenge +{ + ProtobufCMessage base; + Spotify__Login5__V3__Challenges__CodeChallenge__Method method; + int32_t code_length; + int32_t expires_in; + char *canonical_phone_number; +}; +#define SPOTIFY__LOGIN5__V3__CHALLENGES__CODE_CHALLENGE__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__challenges__code_challenge__descriptor) \ + , SPOTIFY__LOGIN5__V3__CHALLENGES__CODE_CHALLENGE__METHOD__UNKNOWN, 0, 0, (char *)protobuf_c_empty_string } + + +struct Spotify__Login5__V3__Challenges__CodeSolution +{ + ProtobufCMessage base; + char *code; +}; +#define SPOTIFY__LOGIN5__V3__CHALLENGES__CODE_SOLUTION__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__challenges__code_solution__descriptor) \ + , (char *)protobuf_c_empty_string } + + +/* Spotify__Login5__V3__Challenges__CodeChallenge methods */ +void spotify__login5__v3__challenges__code_challenge__init + (Spotify__Login5__V3__Challenges__CodeChallenge *message); +size_t spotify__login5__v3__challenges__code_challenge__get_packed_size + (const Spotify__Login5__V3__Challenges__CodeChallenge *message); +size_t spotify__login5__v3__challenges__code_challenge__pack + (const Spotify__Login5__V3__Challenges__CodeChallenge *message, + uint8_t *out); +size_t spotify__login5__v3__challenges__code_challenge__pack_to_buffer + (const Spotify__Login5__V3__Challenges__CodeChallenge *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Challenges__CodeChallenge * + spotify__login5__v3__challenges__code_challenge__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__challenges__code_challenge__free_unpacked + (Spotify__Login5__V3__Challenges__CodeChallenge *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__Challenges__CodeSolution methods */ +void spotify__login5__v3__challenges__code_solution__init + (Spotify__Login5__V3__Challenges__CodeSolution *message); +size_t spotify__login5__v3__challenges__code_solution__get_packed_size + (const Spotify__Login5__V3__Challenges__CodeSolution *message); +size_t spotify__login5__v3__challenges__code_solution__pack + (const Spotify__Login5__V3__Challenges__CodeSolution *message, + uint8_t *out); +size_t spotify__login5__v3__challenges__code_solution__pack_to_buffer + (const Spotify__Login5__V3__Challenges__CodeSolution *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Challenges__CodeSolution * + spotify__login5__v3__challenges__code_solution__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__challenges__code_solution__free_unpacked + (Spotify__Login5__V3__Challenges__CodeSolution *message, + ProtobufCAllocator *allocator); +/* --- per-message closures --- */ + +typedef void (*Spotify__Login5__V3__Challenges__CodeChallenge_Closure) + (const Spotify__Login5__V3__Challenges__CodeChallenge *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__Challenges__CodeSolution_Closure) + (const Spotify__Login5__V3__Challenges__CodeSolution *message, + void *closure_data); + +/* --- services --- */ + + +/* --- descriptors --- */ + +extern const ProtobufCMessageDescriptor spotify__login5__v3__challenges__code_challenge__descriptor; +extern const ProtobufCEnumDescriptor spotify__login5__v3__challenges__code_challenge__method__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__challenges__code_solution__descriptor; + +PROTOBUF_C__END_DECLS + + +#endif /* PROTOBUF_C_login5_5fchallenges_5fcode_2eproto__INCLUDED */ diff --git a/src/inputs/librespot-c/src/proto/login5_challenges_code.proto b/src/inputs/librespot-c/src/proto/login5_challenges_code.proto new file mode 100644 index 00000000..8e6e6a2b --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_challenges_code.proto @@ -0,0 +1,19 @@ +syntax = "proto3"; + +package spotify.login5.v3.challenges; + +message CodeChallenge { + Method method = 1; + enum Method { + UNKNOWN = 0; + SMS = 1; + } + + int32 code_length = 2; + int32 expires_in = 3; + string canonical_phone_number = 4; +} + +message CodeSolution { + string code = 1; +} diff --git a/src/inputs/librespot-c/src/proto/login5_challenges_hashcash.pb-c.c b/src/inputs/librespot-c/src/proto/login5_challenges_hashcash.pb-c.c new file mode 100644 index 00000000..53c463ac --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_challenges_hashcash.pb-c.c @@ -0,0 +1,201 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: login5_challenges_hashcash.proto */ + +/* Do not generate deprecated warnings for self */ +#ifndef PROTOBUF_C__NO_DEPRECATED +#define PROTOBUF_C__NO_DEPRECATED +#endif + +#include "login5_challenges_hashcash.pb-c.h" +void spotify__login5__v3__challenges__hashcash_challenge__init + (Spotify__Login5__V3__Challenges__HashcashChallenge *message) +{ + static const Spotify__Login5__V3__Challenges__HashcashChallenge init_value = SPOTIFY__LOGIN5__V3__CHALLENGES__HASHCASH_CHALLENGE__INIT; + *message = init_value; +} +size_t spotify__login5__v3__challenges__hashcash_challenge__get_packed_size + (const Spotify__Login5__V3__Challenges__HashcashChallenge *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__hashcash_challenge__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__challenges__hashcash_challenge__pack + (const Spotify__Login5__V3__Challenges__HashcashChallenge *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__hashcash_challenge__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__challenges__hashcash_challenge__pack_to_buffer + (const Spotify__Login5__V3__Challenges__HashcashChallenge *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__hashcash_challenge__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Challenges__HashcashChallenge * + spotify__login5__v3__challenges__hashcash_challenge__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Challenges__HashcashChallenge *) + protobuf_c_message_unpack (&spotify__login5__v3__challenges__hashcash_challenge__descriptor, + allocator, len, data); +} +void spotify__login5__v3__challenges__hashcash_challenge__free_unpacked + (Spotify__Login5__V3__Challenges__HashcashChallenge *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__challenges__hashcash_challenge__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__challenges__hashcash_solution__init + (Spotify__Login5__V3__Challenges__HashcashSolution *message) +{ + static const Spotify__Login5__V3__Challenges__HashcashSolution init_value = SPOTIFY__LOGIN5__V3__CHALLENGES__HASHCASH_SOLUTION__INIT; + *message = init_value; +} +size_t spotify__login5__v3__challenges__hashcash_solution__get_packed_size + (const Spotify__Login5__V3__Challenges__HashcashSolution *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__hashcash_solution__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__challenges__hashcash_solution__pack + (const Spotify__Login5__V3__Challenges__HashcashSolution *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__hashcash_solution__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__challenges__hashcash_solution__pack_to_buffer + (const Spotify__Login5__V3__Challenges__HashcashSolution *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__challenges__hashcash_solution__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Challenges__HashcashSolution * + spotify__login5__v3__challenges__hashcash_solution__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Challenges__HashcashSolution *) + protobuf_c_message_unpack (&spotify__login5__v3__challenges__hashcash_solution__descriptor, + allocator, len, data); +} +void spotify__login5__v3__challenges__hashcash_solution__free_unpacked + (Spotify__Login5__V3__Challenges__HashcashSolution *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__challenges__hashcash_solution__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +static const ProtobufCFieldDescriptor spotify__login5__v3__challenges__hashcash_challenge__field_descriptors[2] = +{ + { + "prefix", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_BYTES, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Challenges__HashcashChallenge, prefix), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "length", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Challenges__HashcashChallenge, length), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__challenges__hashcash_challenge__field_indices_by_name[] = { + 1, /* field[1] = length */ + 0, /* field[0] = prefix */ +}; +static const ProtobufCIntRange spotify__login5__v3__challenges__hashcash_challenge__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__challenges__hashcash_challenge__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.challenges.HashcashChallenge", + "HashcashChallenge", + "Spotify__Login5__V3__Challenges__HashcashChallenge", + "spotify.login5.v3.challenges", + sizeof(Spotify__Login5__V3__Challenges__HashcashChallenge), + 2, + spotify__login5__v3__challenges__hashcash_challenge__field_descriptors, + spotify__login5__v3__challenges__hashcash_challenge__field_indices_by_name, + 1, spotify__login5__v3__challenges__hashcash_challenge__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__challenges__hashcash_challenge__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__challenges__hashcash_solution__field_descriptors[2] = +{ + { + "suffix", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_BYTES, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Challenges__HashcashSolution, suffix), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "duration", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Challenges__HashcashSolution, duration), + &google__protobuf__duration__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__challenges__hashcash_solution__field_indices_by_name[] = { + 1, /* field[1] = duration */ + 0, /* field[0] = suffix */ +}; +static const ProtobufCIntRange spotify__login5__v3__challenges__hashcash_solution__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__challenges__hashcash_solution__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.challenges.HashcashSolution", + "HashcashSolution", + "Spotify__Login5__V3__Challenges__HashcashSolution", + "spotify.login5.v3.challenges", + sizeof(Spotify__Login5__V3__Challenges__HashcashSolution), + 2, + spotify__login5__v3__challenges__hashcash_solution__field_descriptors, + spotify__login5__v3__challenges__hashcash_solution__field_indices_by_name, + 1, spotify__login5__v3__challenges__hashcash_solution__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__challenges__hashcash_solution__init, + NULL,NULL,NULL /* reserved[123] */ +}; diff --git a/src/inputs/librespot-c/src/proto/login5_challenges_hashcash.pb-c.h b/src/inputs/librespot-c/src/proto/login5_challenges_hashcash.pb-c.h new file mode 100644 index 00000000..58ce5d5e --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_challenges_hashcash.pb-c.h @@ -0,0 +1,108 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: login5_challenges_hashcash.proto */ + +#ifndef PROTOBUF_C_login5_5fchallenges_5fhashcash_2eproto__INCLUDED +#define PROTOBUF_C_login5_5fchallenges_5fhashcash_2eproto__INCLUDED + +#include + +PROTOBUF_C__BEGIN_DECLS + +#if PROTOBUF_C_VERSION_NUMBER < 1003000 +# error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers. +#elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION +# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c. +#endif + +#include "google_duration.pb-c.h" + +typedef struct Spotify__Login5__V3__Challenges__HashcashChallenge Spotify__Login5__V3__Challenges__HashcashChallenge; +typedef struct Spotify__Login5__V3__Challenges__HashcashSolution Spotify__Login5__V3__Challenges__HashcashSolution; + + +/* --- enums --- */ + + +/* --- messages --- */ + +struct Spotify__Login5__V3__Challenges__HashcashChallenge +{ + ProtobufCMessage base; + ProtobufCBinaryData prefix; + int32_t length; +}; +#define SPOTIFY__LOGIN5__V3__CHALLENGES__HASHCASH_CHALLENGE__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__challenges__hashcash_challenge__descriptor) \ + , {0,NULL}, 0 } + + +struct Spotify__Login5__V3__Challenges__HashcashSolution +{ + ProtobufCMessage base; + ProtobufCBinaryData suffix; + Google__Protobuf__Duration *duration; +}; +#define SPOTIFY__LOGIN5__V3__CHALLENGES__HASHCASH_SOLUTION__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__challenges__hashcash_solution__descriptor) \ + , {0,NULL}, NULL } + + +/* Spotify__Login5__V3__Challenges__HashcashChallenge methods */ +void spotify__login5__v3__challenges__hashcash_challenge__init + (Spotify__Login5__V3__Challenges__HashcashChallenge *message); +size_t spotify__login5__v3__challenges__hashcash_challenge__get_packed_size + (const Spotify__Login5__V3__Challenges__HashcashChallenge *message); +size_t spotify__login5__v3__challenges__hashcash_challenge__pack + (const Spotify__Login5__V3__Challenges__HashcashChallenge *message, + uint8_t *out); +size_t spotify__login5__v3__challenges__hashcash_challenge__pack_to_buffer + (const Spotify__Login5__V3__Challenges__HashcashChallenge *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Challenges__HashcashChallenge * + spotify__login5__v3__challenges__hashcash_challenge__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__challenges__hashcash_challenge__free_unpacked + (Spotify__Login5__V3__Challenges__HashcashChallenge *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__Challenges__HashcashSolution methods */ +void spotify__login5__v3__challenges__hashcash_solution__init + (Spotify__Login5__V3__Challenges__HashcashSolution *message); +size_t spotify__login5__v3__challenges__hashcash_solution__get_packed_size + (const Spotify__Login5__V3__Challenges__HashcashSolution *message); +size_t spotify__login5__v3__challenges__hashcash_solution__pack + (const Spotify__Login5__V3__Challenges__HashcashSolution *message, + uint8_t *out); +size_t spotify__login5__v3__challenges__hashcash_solution__pack_to_buffer + (const Spotify__Login5__V3__Challenges__HashcashSolution *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Challenges__HashcashSolution * + spotify__login5__v3__challenges__hashcash_solution__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__challenges__hashcash_solution__free_unpacked + (Spotify__Login5__V3__Challenges__HashcashSolution *message, + ProtobufCAllocator *allocator); +/* --- per-message closures --- */ + +typedef void (*Spotify__Login5__V3__Challenges__HashcashChallenge_Closure) + (const Spotify__Login5__V3__Challenges__HashcashChallenge *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__Challenges__HashcashSolution_Closure) + (const Spotify__Login5__V3__Challenges__HashcashSolution *message, + void *closure_data); + +/* --- services --- */ + + +/* --- descriptors --- */ + +extern const ProtobufCMessageDescriptor spotify__login5__v3__challenges__hashcash_challenge__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__challenges__hashcash_solution__descriptor; + +PROTOBUF_C__END_DECLS + + +#endif /* PROTOBUF_C_login5_5fchallenges_5fhashcash_2eproto__INCLUDED */ diff --git a/src/inputs/librespot-c/src/proto/login5_challenges_hashcash.proto b/src/inputs/librespot-c/src/proto/login5_challenges_hashcash.proto new file mode 100644 index 00000000..544d19a7 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_challenges_hashcash.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +package spotify.login5.v3.challenges; + +import "google_duration.proto"; + +message HashcashChallenge { + bytes prefix = 1; + int32 length = 2; +} + +message HashcashSolution { + bytes suffix = 1; + google.protobuf.Duration duration = 2; +} diff --git a/src/inputs/librespot-c/src/proto/login5_client_info.pb-c.c b/src/inputs/librespot-c/src/proto/login5_client_info.pb-c.c new file mode 100644 index 00000000..fe9d8a8b --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_client_info.pb-c.c @@ -0,0 +1,105 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: login5_client_info.proto */ + +/* Do not generate deprecated warnings for self */ +#ifndef PROTOBUF_C__NO_DEPRECATED +#define PROTOBUF_C__NO_DEPRECATED +#endif + +#include "login5_client_info.pb-c.h" +void spotify__login5__v3__client_info__init + (Spotify__Login5__V3__ClientInfo *message) +{ + static const Spotify__Login5__V3__ClientInfo init_value = SPOTIFY__LOGIN5__V3__CLIENT_INFO__INIT; + *message = init_value; +} +size_t spotify__login5__v3__client_info__get_packed_size + (const Spotify__Login5__V3__ClientInfo *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__client_info__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__client_info__pack + (const Spotify__Login5__V3__ClientInfo *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__client_info__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__client_info__pack_to_buffer + (const Spotify__Login5__V3__ClientInfo *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__client_info__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__ClientInfo * + spotify__login5__v3__client_info__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__ClientInfo *) + protobuf_c_message_unpack (&spotify__login5__v3__client_info__descriptor, + allocator, len, data); +} +void spotify__login5__v3__client_info__free_unpacked + (Spotify__Login5__V3__ClientInfo *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__client_info__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +static const ProtobufCFieldDescriptor spotify__login5__v3__client_info__field_descriptors[2] = +{ + { + "client_id", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__ClientInfo, client_id), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "device_id", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__ClientInfo, device_id), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__client_info__field_indices_by_name[] = { + 0, /* field[0] = client_id */ + 1, /* field[1] = device_id */ +}; +static const ProtobufCIntRange spotify__login5__v3__client_info__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__client_info__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.ClientInfo", + "ClientInfo", + "Spotify__Login5__V3__ClientInfo", + "spotify.login5.v3", + sizeof(Spotify__Login5__V3__ClientInfo), + 2, + spotify__login5__v3__client_info__field_descriptors, + spotify__login5__v3__client_info__field_indices_by_name, + 1, spotify__login5__v3__client_info__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__client_info__init, + NULL,NULL,NULL /* reserved[123] */ +}; diff --git a/src/inputs/librespot-c/src/proto/login5_client_info.pb-c.h b/src/inputs/librespot-c/src/proto/login5_client_info.pb-c.h new file mode 100644 index 00000000..a51cc6ae --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_client_info.pb-c.h @@ -0,0 +1,72 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: login5_client_info.proto */ + +#ifndef PROTOBUF_C_login5_5fclient_5finfo_2eproto__INCLUDED +#define PROTOBUF_C_login5_5fclient_5finfo_2eproto__INCLUDED + +#include + +PROTOBUF_C__BEGIN_DECLS + +#if PROTOBUF_C_VERSION_NUMBER < 1003000 +# error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers. +#elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION +# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c. +#endif + + +typedef struct Spotify__Login5__V3__ClientInfo Spotify__Login5__V3__ClientInfo; + + +/* --- enums --- */ + + +/* --- messages --- */ + +struct Spotify__Login5__V3__ClientInfo +{ + ProtobufCMessage base; + char *client_id; + char *device_id; +}; +#define SPOTIFY__LOGIN5__V3__CLIENT_INFO__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__client_info__descriptor) \ + , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string } + + +/* Spotify__Login5__V3__ClientInfo methods */ +void spotify__login5__v3__client_info__init + (Spotify__Login5__V3__ClientInfo *message); +size_t spotify__login5__v3__client_info__get_packed_size + (const Spotify__Login5__V3__ClientInfo *message); +size_t spotify__login5__v3__client_info__pack + (const Spotify__Login5__V3__ClientInfo *message, + uint8_t *out); +size_t spotify__login5__v3__client_info__pack_to_buffer + (const Spotify__Login5__V3__ClientInfo *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__ClientInfo * + spotify__login5__v3__client_info__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__client_info__free_unpacked + (Spotify__Login5__V3__ClientInfo *message, + ProtobufCAllocator *allocator); +/* --- per-message closures --- */ + +typedef void (*Spotify__Login5__V3__ClientInfo_Closure) + (const Spotify__Login5__V3__ClientInfo *message, + void *closure_data); + +/* --- services --- */ + + +/* --- descriptors --- */ + +extern const ProtobufCMessageDescriptor spotify__login5__v3__client_info__descriptor; + +PROTOBUF_C__END_DECLS + + +#endif /* PROTOBUF_C_login5_5fclient_5finfo_2eproto__INCLUDED */ diff --git a/src/inputs/librespot-c/src/proto/login5_client_info.proto b/src/inputs/librespot-c/src/proto/login5_client_info.proto new file mode 100644 index 00000000..b1b1fe1a --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_client_info.proto @@ -0,0 +1,8 @@ +syntax = "proto3"; + +package spotify.login5.v3; + +message ClientInfo { + string client_id = 1; + string device_id = 2; +} diff --git a/src/inputs/librespot-c/src/proto/login5_credentials.pb-c.c b/src/inputs/librespot-c/src/proto/login5_credentials.pb-c.c new file mode 100644 index 00000000..22a504d2 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_credentials.pb-c.c @@ -0,0 +1,816 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: login5_credentials.proto */ + +/* Do not generate deprecated warnings for self */ +#ifndef PROTOBUF_C__NO_DEPRECATED +#define PROTOBUF_C__NO_DEPRECATED +#endif + +#include "login5_credentials.pb-c.h" +void spotify__login5__v3__credentials__stored_credential__init + (Spotify__Login5__V3__Credentials__StoredCredential *message) +{ + static const Spotify__Login5__V3__Credentials__StoredCredential init_value = SPOTIFY__LOGIN5__V3__CREDENTIALS__STORED_CREDENTIAL__INIT; + *message = init_value; +} +size_t spotify__login5__v3__credentials__stored_credential__get_packed_size + (const Spotify__Login5__V3__Credentials__StoredCredential *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__stored_credential__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__credentials__stored_credential__pack + (const Spotify__Login5__V3__Credentials__StoredCredential *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__stored_credential__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__credentials__stored_credential__pack_to_buffer + (const Spotify__Login5__V3__Credentials__StoredCredential *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__stored_credential__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Credentials__StoredCredential * + spotify__login5__v3__credentials__stored_credential__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Credentials__StoredCredential *) + protobuf_c_message_unpack (&spotify__login5__v3__credentials__stored_credential__descriptor, + allocator, len, data); +} +void spotify__login5__v3__credentials__stored_credential__free_unpacked + (Spotify__Login5__V3__Credentials__StoredCredential *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__credentials__stored_credential__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__credentials__password__init + (Spotify__Login5__V3__Credentials__Password *message) +{ + static const Spotify__Login5__V3__Credentials__Password init_value = SPOTIFY__LOGIN5__V3__CREDENTIALS__PASSWORD__INIT; + *message = init_value; +} +size_t spotify__login5__v3__credentials__password__get_packed_size + (const Spotify__Login5__V3__Credentials__Password *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__password__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__credentials__password__pack + (const Spotify__Login5__V3__Credentials__Password *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__password__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__credentials__password__pack_to_buffer + (const Spotify__Login5__V3__Credentials__Password *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__password__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Credentials__Password * + spotify__login5__v3__credentials__password__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Credentials__Password *) + protobuf_c_message_unpack (&spotify__login5__v3__credentials__password__descriptor, + allocator, len, data); +} +void spotify__login5__v3__credentials__password__free_unpacked + (Spotify__Login5__V3__Credentials__Password *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__credentials__password__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__credentials__facebook_access_token__init + (Spotify__Login5__V3__Credentials__FacebookAccessToken *message) +{ + static const Spotify__Login5__V3__Credentials__FacebookAccessToken init_value = SPOTIFY__LOGIN5__V3__CREDENTIALS__FACEBOOK_ACCESS_TOKEN__INIT; + *message = init_value; +} +size_t spotify__login5__v3__credentials__facebook_access_token__get_packed_size + (const Spotify__Login5__V3__Credentials__FacebookAccessToken *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__facebook_access_token__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__credentials__facebook_access_token__pack + (const Spotify__Login5__V3__Credentials__FacebookAccessToken *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__facebook_access_token__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__credentials__facebook_access_token__pack_to_buffer + (const Spotify__Login5__V3__Credentials__FacebookAccessToken *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__facebook_access_token__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Credentials__FacebookAccessToken * + spotify__login5__v3__credentials__facebook_access_token__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Credentials__FacebookAccessToken *) + protobuf_c_message_unpack (&spotify__login5__v3__credentials__facebook_access_token__descriptor, + allocator, len, data); +} +void spotify__login5__v3__credentials__facebook_access_token__free_unpacked + (Spotify__Login5__V3__Credentials__FacebookAccessToken *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__credentials__facebook_access_token__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__credentials__one_time_token__init + (Spotify__Login5__V3__Credentials__OneTimeToken *message) +{ + static const Spotify__Login5__V3__Credentials__OneTimeToken init_value = SPOTIFY__LOGIN5__V3__CREDENTIALS__ONE_TIME_TOKEN__INIT; + *message = init_value; +} +size_t spotify__login5__v3__credentials__one_time_token__get_packed_size + (const Spotify__Login5__V3__Credentials__OneTimeToken *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__one_time_token__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__credentials__one_time_token__pack + (const Spotify__Login5__V3__Credentials__OneTimeToken *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__one_time_token__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__credentials__one_time_token__pack_to_buffer + (const Spotify__Login5__V3__Credentials__OneTimeToken *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__one_time_token__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Credentials__OneTimeToken * + spotify__login5__v3__credentials__one_time_token__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Credentials__OneTimeToken *) + protobuf_c_message_unpack (&spotify__login5__v3__credentials__one_time_token__descriptor, + allocator, len, data); +} +void spotify__login5__v3__credentials__one_time_token__free_unpacked + (Spotify__Login5__V3__Credentials__OneTimeToken *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__credentials__one_time_token__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__credentials__parent_child_credential__init + (Spotify__Login5__V3__Credentials__ParentChildCredential *message) +{ + static const Spotify__Login5__V3__Credentials__ParentChildCredential init_value = SPOTIFY__LOGIN5__V3__CREDENTIALS__PARENT_CHILD_CREDENTIAL__INIT; + *message = init_value; +} +size_t spotify__login5__v3__credentials__parent_child_credential__get_packed_size + (const Spotify__Login5__V3__Credentials__ParentChildCredential *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__parent_child_credential__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__credentials__parent_child_credential__pack + (const Spotify__Login5__V3__Credentials__ParentChildCredential *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__parent_child_credential__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__credentials__parent_child_credential__pack_to_buffer + (const Spotify__Login5__V3__Credentials__ParentChildCredential *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__parent_child_credential__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Credentials__ParentChildCredential * + spotify__login5__v3__credentials__parent_child_credential__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Credentials__ParentChildCredential *) + protobuf_c_message_unpack (&spotify__login5__v3__credentials__parent_child_credential__descriptor, + allocator, len, data); +} +void spotify__login5__v3__credentials__parent_child_credential__free_unpacked + (Spotify__Login5__V3__Credentials__ParentChildCredential *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__credentials__parent_child_credential__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__credentials__apple_sign_in_credential__init + (Spotify__Login5__V3__Credentials__AppleSignInCredential *message) +{ + static const Spotify__Login5__V3__Credentials__AppleSignInCredential init_value = SPOTIFY__LOGIN5__V3__CREDENTIALS__APPLE_SIGN_IN_CREDENTIAL__INIT; + *message = init_value; +} +size_t spotify__login5__v3__credentials__apple_sign_in_credential__get_packed_size + (const Spotify__Login5__V3__Credentials__AppleSignInCredential *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__apple_sign_in_credential__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__credentials__apple_sign_in_credential__pack + (const Spotify__Login5__V3__Credentials__AppleSignInCredential *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__apple_sign_in_credential__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__credentials__apple_sign_in_credential__pack_to_buffer + (const Spotify__Login5__V3__Credentials__AppleSignInCredential *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__apple_sign_in_credential__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Credentials__AppleSignInCredential * + spotify__login5__v3__credentials__apple_sign_in_credential__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Credentials__AppleSignInCredential *) + protobuf_c_message_unpack (&spotify__login5__v3__credentials__apple_sign_in_credential__descriptor, + allocator, len, data); +} +void spotify__login5__v3__credentials__apple_sign_in_credential__free_unpacked + (Spotify__Login5__V3__Credentials__AppleSignInCredential *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__credentials__apple_sign_in_credential__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__credentials__samsung_sign_in_credential__init + (Spotify__Login5__V3__Credentials__SamsungSignInCredential *message) +{ + static const Spotify__Login5__V3__Credentials__SamsungSignInCredential init_value = SPOTIFY__LOGIN5__V3__CREDENTIALS__SAMSUNG_SIGN_IN_CREDENTIAL__INIT; + *message = init_value; +} +size_t spotify__login5__v3__credentials__samsung_sign_in_credential__get_packed_size + (const Spotify__Login5__V3__Credentials__SamsungSignInCredential *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__samsung_sign_in_credential__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__credentials__samsung_sign_in_credential__pack + (const Spotify__Login5__V3__Credentials__SamsungSignInCredential *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__samsung_sign_in_credential__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__credentials__samsung_sign_in_credential__pack_to_buffer + (const Spotify__Login5__V3__Credentials__SamsungSignInCredential *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__samsung_sign_in_credential__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Credentials__SamsungSignInCredential * + spotify__login5__v3__credentials__samsung_sign_in_credential__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Credentials__SamsungSignInCredential *) + protobuf_c_message_unpack (&spotify__login5__v3__credentials__samsung_sign_in_credential__descriptor, + allocator, len, data); +} +void spotify__login5__v3__credentials__samsung_sign_in_credential__free_unpacked + (Spotify__Login5__V3__Credentials__SamsungSignInCredential *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__credentials__samsung_sign_in_credential__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void spotify__login5__v3__credentials__google_sign_in_credential__init + (Spotify__Login5__V3__Credentials__GoogleSignInCredential *message) +{ + static const Spotify__Login5__V3__Credentials__GoogleSignInCredential init_value = SPOTIFY__LOGIN5__V3__CREDENTIALS__GOOGLE_SIGN_IN_CREDENTIAL__INIT; + *message = init_value; +} +size_t spotify__login5__v3__credentials__google_sign_in_credential__get_packed_size + (const Spotify__Login5__V3__Credentials__GoogleSignInCredential *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__google_sign_in_credential__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__credentials__google_sign_in_credential__pack + (const Spotify__Login5__V3__Credentials__GoogleSignInCredential *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__google_sign_in_credential__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__credentials__google_sign_in_credential__pack_to_buffer + (const Spotify__Login5__V3__Credentials__GoogleSignInCredential *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__credentials__google_sign_in_credential__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Credentials__GoogleSignInCredential * + spotify__login5__v3__credentials__google_sign_in_credential__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Credentials__GoogleSignInCredential *) + protobuf_c_message_unpack (&spotify__login5__v3__credentials__google_sign_in_credential__descriptor, + allocator, len, data); +} +void spotify__login5__v3__credentials__google_sign_in_credential__free_unpacked + (Spotify__Login5__V3__Credentials__GoogleSignInCredential *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__credentials__google_sign_in_credential__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +static const ProtobufCFieldDescriptor spotify__login5__v3__credentials__stored_credential__field_descriptors[2] = +{ + { + "username", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__StoredCredential, username), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "data", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_BYTES, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__StoredCredential, data), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__credentials__stored_credential__field_indices_by_name[] = { + 1, /* field[1] = data */ + 0, /* field[0] = username */ +}; +static const ProtobufCIntRange spotify__login5__v3__credentials__stored_credential__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__credentials__stored_credential__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.credentials.StoredCredential", + "StoredCredential", + "Spotify__Login5__V3__Credentials__StoredCredential", + "spotify.login5.v3.credentials", + sizeof(Spotify__Login5__V3__Credentials__StoredCredential), + 2, + spotify__login5__v3__credentials__stored_credential__field_descriptors, + spotify__login5__v3__credentials__stored_credential__field_indices_by_name, + 1, spotify__login5__v3__credentials__stored_credential__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__credentials__stored_credential__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__credentials__password__field_descriptors[3] = +{ + { + "id", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__Password, id), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "password", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__Password, password), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "padding", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_BYTES, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__Password, padding), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__credentials__password__field_indices_by_name[] = { + 0, /* field[0] = id */ + 2, /* field[2] = padding */ + 1, /* field[1] = password */ +}; +static const ProtobufCIntRange spotify__login5__v3__credentials__password__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 3 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__credentials__password__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.credentials.Password", + "Password", + "Spotify__Login5__V3__Credentials__Password", + "spotify.login5.v3.credentials", + sizeof(Spotify__Login5__V3__Credentials__Password), + 3, + spotify__login5__v3__credentials__password__field_descriptors, + spotify__login5__v3__credentials__password__field_indices_by_name, + 1, spotify__login5__v3__credentials__password__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__credentials__password__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__credentials__facebook_access_token__field_descriptors[2] = +{ + { + "fb_uid", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__FacebookAccessToken, fb_uid), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "access_token", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__FacebookAccessToken, access_token), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__credentials__facebook_access_token__field_indices_by_name[] = { + 1, /* field[1] = access_token */ + 0, /* field[0] = fb_uid */ +}; +static const ProtobufCIntRange spotify__login5__v3__credentials__facebook_access_token__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__credentials__facebook_access_token__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.credentials.FacebookAccessToken", + "FacebookAccessToken", + "Spotify__Login5__V3__Credentials__FacebookAccessToken", + "spotify.login5.v3.credentials", + sizeof(Spotify__Login5__V3__Credentials__FacebookAccessToken), + 2, + spotify__login5__v3__credentials__facebook_access_token__field_descriptors, + spotify__login5__v3__credentials__facebook_access_token__field_indices_by_name, + 1, spotify__login5__v3__credentials__facebook_access_token__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__credentials__facebook_access_token__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__credentials__one_time_token__field_descriptors[1] = +{ + { + "token", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__OneTimeToken, token), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__credentials__one_time_token__field_indices_by_name[] = { + 0, /* field[0] = token */ +}; +static const ProtobufCIntRange spotify__login5__v3__credentials__one_time_token__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 1 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__credentials__one_time_token__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.credentials.OneTimeToken", + "OneTimeToken", + "Spotify__Login5__V3__Credentials__OneTimeToken", + "spotify.login5.v3.credentials", + sizeof(Spotify__Login5__V3__Credentials__OneTimeToken), + 1, + spotify__login5__v3__credentials__one_time_token__field_descriptors, + spotify__login5__v3__credentials__one_time_token__field_indices_by_name, + 1, spotify__login5__v3__credentials__one_time_token__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__credentials__one_time_token__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__credentials__parent_child_credential__field_descriptors[2] = +{ + { + "child_id", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__ParentChildCredential, child_id), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "parent_stored_credential", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_MESSAGE, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__ParentChildCredential, parent_stored_credential), + &spotify__login5__v3__credentials__stored_credential__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__credentials__parent_child_credential__field_indices_by_name[] = { + 0, /* field[0] = child_id */ + 1, /* field[1] = parent_stored_credential */ +}; +static const ProtobufCIntRange spotify__login5__v3__credentials__parent_child_credential__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__credentials__parent_child_credential__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.credentials.ParentChildCredential", + "ParentChildCredential", + "Spotify__Login5__V3__Credentials__ParentChildCredential", + "spotify.login5.v3.credentials", + sizeof(Spotify__Login5__V3__Credentials__ParentChildCredential), + 2, + spotify__login5__v3__credentials__parent_child_credential__field_descriptors, + spotify__login5__v3__credentials__parent_child_credential__field_indices_by_name, + 1, spotify__login5__v3__credentials__parent_child_credential__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__credentials__parent_child_credential__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__credentials__apple_sign_in_credential__field_descriptors[3] = +{ + { + "auth_code", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__AppleSignInCredential, auth_code), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "redirect_uri", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__AppleSignInCredential, redirect_uri), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "bundle_id", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__AppleSignInCredential, bundle_id), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__credentials__apple_sign_in_credential__field_indices_by_name[] = { + 0, /* field[0] = auth_code */ + 2, /* field[2] = bundle_id */ + 1, /* field[1] = redirect_uri */ +}; +static const ProtobufCIntRange spotify__login5__v3__credentials__apple_sign_in_credential__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 3 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__credentials__apple_sign_in_credential__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.credentials.AppleSignInCredential", + "AppleSignInCredential", + "Spotify__Login5__V3__Credentials__AppleSignInCredential", + "spotify.login5.v3.credentials", + sizeof(Spotify__Login5__V3__Credentials__AppleSignInCredential), + 3, + spotify__login5__v3__credentials__apple_sign_in_credential__field_descriptors, + spotify__login5__v3__credentials__apple_sign_in_credential__field_indices_by_name, + 1, spotify__login5__v3__credentials__apple_sign_in_credential__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__credentials__apple_sign_in_credential__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__credentials__samsung_sign_in_credential__field_descriptors[4] = +{ + { + "auth_code", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__SamsungSignInCredential, auth_code), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "redirect_uri", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__SamsungSignInCredential, redirect_uri), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "id_token", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__SamsungSignInCredential, id_token), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "token_endpoint_url", + 4, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__SamsungSignInCredential, token_endpoint_url), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__credentials__samsung_sign_in_credential__field_indices_by_name[] = { + 0, /* field[0] = auth_code */ + 2, /* field[2] = id_token */ + 1, /* field[1] = redirect_uri */ + 3, /* field[3] = token_endpoint_url */ +}; +static const ProtobufCIntRange spotify__login5__v3__credentials__samsung_sign_in_credential__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 4 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__credentials__samsung_sign_in_credential__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.credentials.SamsungSignInCredential", + "SamsungSignInCredential", + "Spotify__Login5__V3__Credentials__SamsungSignInCredential", + "spotify.login5.v3.credentials", + sizeof(Spotify__Login5__V3__Credentials__SamsungSignInCredential), + 4, + spotify__login5__v3__credentials__samsung_sign_in_credential__field_descriptors, + spotify__login5__v3__credentials__samsung_sign_in_credential__field_indices_by_name, + 1, spotify__login5__v3__credentials__samsung_sign_in_credential__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__credentials__samsung_sign_in_credential__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__credentials__google_sign_in_credential__field_descriptors[2] = +{ + { + "auth_code", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__GoogleSignInCredential, auth_code), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "redirect_uri", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Credentials__GoogleSignInCredential, redirect_uri), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__credentials__google_sign_in_credential__field_indices_by_name[] = { + 0, /* field[0] = auth_code */ + 1, /* field[1] = redirect_uri */ +}; +static const ProtobufCIntRange spotify__login5__v3__credentials__google_sign_in_credential__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 2 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__credentials__google_sign_in_credential__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.credentials.GoogleSignInCredential", + "GoogleSignInCredential", + "Spotify__Login5__V3__Credentials__GoogleSignInCredential", + "spotify.login5.v3.credentials", + sizeof(Spotify__Login5__V3__Credentials__GoogleSignInCredential), + 2, + spotify__login5__v3__credentials__google_sign_in_credential__field_descriptors, + spotify__login5__v3__credentials__google_sign_in_credential__field_indices_by_name, + 1, spotify__login5__v3__credentials__google_sign_in_credential__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__credentials__google_sign_in_credential__init, + NULL,NULL,NULL /* reserved[123] */ +}; diff --git a/src/inputs/librespot-c/src/proto/login5_credentials.pb-c.h b/src/inputs/librespot-c/src/proto/login5_credentials.pb-c.h new file mode 100644 index 00000000..ab0b1f4e --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_credentials.pb-c.h @@ -0,0 +1,320 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: login5_credentials.proto */ + +#ifndef PROTOBUF_C_login5_5fcredentials_2eproto__INCLUDED +#define PROTOBUF_C_login5_5fcredentials_2eproto__INCLUDED + +#include + +PROTOBUF_C__BEGIN_DECLS + +#if PROTOBUF_C_VERSION_NUMBER < 1003000 +# error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers. +#elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION +# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c. +#endif + + +typedef struct Spotify__Login5__V3__Credentials__StoredCredential Spotify__Login5__V3__Credentials__StoredCredential; +typedef struct Spotify__Login5__V3__Credentials__Password Spotify__Login5__V3__Credentials__Password; +typedef struct Spotify__Login5__V3__Credentials__FacebookAccessToken Spotify__Login5__V3__Credentials__FacebookAccessToken; +typedef struct Spotify__Login5__V3__Credentials__OneTimeToken Spotify__Login5__V3__Credentials__OneTimeToken; +typedef struct Spotify__Login5__V3__Credentials__ParentChildCredential Spotify__Login5__V3__Credentials__ParentChildCredential; +typedef struct Spotify__Login5__V3__Credentials__AppleSignInCredential Spotify__Login5__V3__Credentials__AppleSignInCredential; +typedef struct Spotify__Login5__V3__Credentials__SamsungSignInCredential Spotify__Login5__V3__Credentials__SamsungSignInCredential; +typedef struct Spotify__Login5__V3__Credentials__GoogleSignInCredential Spotify__Login5__V3__Credentials__GoogleSignInCredential; + + +/* --- enums --- */ + + +/* --- messages --- */ + +struct Spotify__Login5__V3__Credentials__StoredCredential +{ + ProtobufCMessage base; + char *username; + ProtobufCBinaryData data; +}; +#define SPOTIFY__LOGIN5__V3__CREDENTIALS__STORED_CREDENTIAL__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__credentials__stored_credential__descriptor) \ + , (char *)protobuf_c_empty_string, {0,NULL} } + + +struct Spotify__Login5__V3__Credentials__Password +{ + ProtobufCMessage base; + char *id; + char *password; + ProtobufCBinaryData padding; +}; +#define SPOTIFY__LOGIN5__V3__CREDENTIALS__PASSWORD__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__credentials__password__descriptor) \ + , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, {0,NULL} } + + +struct Spotify__Login5__V3__Credentials__FacebookAccessToken +{ + ProtobufCMessage base; + char *fb_uid; + char *access_token; +}; +#define SPOTIFY__LOGIN5__V3__CREDENTIALS__FACEBOOK_ACCESS_TOKEN__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__credentials__facebook_access_token__descriptor) \ + , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string } + + +struct Spotify__Login5__V3__Credentials__OneTimeToken +{ + ProtobufCMessage base; + char *token; +}; +#define SPOTIFY__LOGIN5__V3__CREDENTIALS__ONE_TIME_TOKEN__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__credentials__one_time_token__descriptor) \ + , (char *)protobuf_c_empty_string } + + +struct Spotify__Login5__V3__Credentials__ParentChildCredential +{ + ProtobufCMessage base; + char *child_id; + Spotify__Login5__V3__Credentials__StoredCredential *parent_stored_credential; +}; +#define SPOTIFY__LOGIN5__V3__CREDENTIALS__PARENT_CHILD_CREDENTIAL__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__credentials__parent_child_credential__descriptor) \ + , (char *)protobuf_c_empty_string, NULL } + + +struct Spotify__Login5__V3__Credentials__AppleSignInCredential +{ + ProtobufCMessage base; + char *auth_code; + char *redirect_uri; + char *bundle_id; +}; +#define SPOTIFY__LOGIN5__V3__CREDENTIALS__APPLE_SIGN_IN_CREDENTIAL__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__credentials__apple_sign_in_credential__descriptor) \ + , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string } + + +struct Spotify__Login5__V3__Credentials__SamsungSignInCredential +{ + ProtobufCMessage base; + char *auth_code; + char *redirect_uri; + char *id_token; + char *token_endpoint_url; +}; +#define SPOTIFY__LOGIN5__V3__CREDENTIALS__SAMSUNG_SIGN_IN_CREDENTIAL__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__credentials__samsung_sign_in_credential__descriptor) \ + , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string } + + +struct Spotify__Login5__V3__Credentials__GoogleSignInCredential +{ + ProtobufCMessage base; + char *auth_code; + char *redirect_uri; +}; +#define SPOTIFY__LOGIN5__V3__CREDENTIALS__GOOGLE_SIGN_IN_CREDENTIAL__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__credentials__google_sign_in_credential__descriptor) \ + , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string } + + +/* Spotify__Login5__V3__Credentials__StoredCredential methods */ +void spotify__login5__v3__credentials__stored_credential__init + (Spotify__Login5__V3__Credentials__StoredCredential *message); +size_t spotify__login5__v3__credentials__stored_credential__get_packed_size + (const Spotify__Login5__V3__Credentials__StoredCredential *message); +size_t spotify__login5__v3__credentials__stored_credential__pack + (const Spotify__Login5__V3__Credentials__StoredCredential *message, + uint8_t *out); +size_t spotify__login5__v3__credentials__stored_credential__pack_to_buffer + (const Spotify__Login5__V3__Credentials__StoredCredential *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Credentials__StoredCredential * + spotify__login5__v3__credentials__stored_credential__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__credentials__stored_credential__free_unpacked + (Spotify__Login5__V3__Credentials__StoredCredential *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__Credentials__Password methods */ +void spotify__login5__v3__credentials__password__init + (Spotify__Login5__V3__Credentials__Password *message); +size_t spotify__login5__v3__credentials__password__get_packed_size + (const Spotify__Login5__V3__Credentials__Password *message); +size_t spotify__login5__v3__credentials__password__pack + (const Spotify__Login5__V3__Credentials__Password *message, + uint8_t *out); +size_t spotify__login5__v3__credentials__password__pack_to_buffer + (const Spotify__Login5__V3__Credentials__Password *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Credentials__Password * + spotify__login5__v3__credentials__password__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__credentials__password__free_unpacked + (Spotify__Login5__V3__Credentials__Password *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__Credentials__FacebookAccessToken methods */ +void spotify__login5__v3__credentials__facebook_access_token__init + (Spotify__Login5__V3__Credentials__FacebookAccessToken *message); +size_t spotify__login5__v3__credentials__facebook_access_token__get_packed_size + (const Spotify__Login5__V3__Credentials__FacebookAccessToken *message); +size_t spotify__login5__v3__credentials__facebook_access_token__pack + (const Spotify__Login5__V3__Credentials__FacebookAccessToken *message, + uint8_t *out); +size_t spotify__login5__v3__credentials__facebook_access_token__pack_to_buffer + (const Spotify__Login5__V3__Credentials__FacebookAccessToken *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Credentials__FacebookAccessToken * + spotify__login5__v3__credentials__facebook_access_token__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__credentials__facebook_access_token__free_unpacked + (Spotify__Login5__V3__Credentials__FacebookAccessToken *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__Credentials__OneTimeToken methods */ +void spotify__login5__v3__credentials__one_time_token__init + (Spotify__Login5__V3__Credentials__OneTimeToken *message); +size_t spotify__login5__v3__credentials__one_time_token__get_packed_size + (const Spotify__Login5__V3__Credentials__OneTimeToken *message); +size_t spotify__login5__v3__credentials__one_time_token__pack + (const Spotify__Login5__V3__Credentials__OneTimeToken *message, + uint8_t *out); +size_t spotify__login5__v3__credentials__one_time_token__pack_to_buffer + (const Spotify__Login5__V3__Credentials__OneTimeToken *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Credentials__OneTimeToken * + spotify__login5__v3__credentials__one_time_token__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__credentials__one_time_token__free_unpacked + (Spotify__Login5__V3__Credentials__OneTimeToken *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__Credentials__ParentChildCredential methods */ +void spotify__login5__v3__credentials__parent_child_credential__init + (Spotify__Login5__V3__Credentials__ParentChildCredential *message); +size_t spotify__login5__v3__credentials__parent_child_credential__get_packed_size + (const Spotify__Login5__V3__Credentials__ParentChildCredential *message); +size_t spotify__login5__v3__credentials__parent_child_credential__pack + (const Spotify__Login5__V3__Credentials__ParentChildCredential *message, + uint8_t *out); +size_t spotify__login5__v3__credentials__parent_child_credential__pack_to_buffer + (const Spotify__Login5__V3__Credentials__ParentChildCredential *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Credentials__ParentChildCredential * + spotify__login5__v3__credentials__parent_child_credential__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__credentials__parent_child_credential__free_unpacked + (Spotify__Login5__V3__Credentials__ParentChildCredential *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__Credentials__AppleSignInCredential methods */ +void spotify__login5__v3__credentials__apple_sign_in_credential__init + (Spotify__Login5__V3__Credentials__AppleSignInCredential *message); +size_t spotify__login5__v3__credentials__apple_sign_in_credential__get_packed_size + (const Spotify__Login5__V3__Credentials__AppleSignInCredential *message); +size_t spotify__login5__v3__credentials__apple_sign_in_credential__pack + (const Spotify__Login5__V3__Credentials__AppleSignInCredential *message, + uint8_t *out); +size_t spotify__login5__v3__credentials__apple_sign_in_credential__pack_to_buffer + (const Spotify__Login5__V3__Credentials__AppleSignInCredential *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Credentials__AppleSignInCredential * + spotify__login5__v3__credentials__apple_sign_in_credential__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__credentials__apple_sign_in_credential__free_unpacked + (Spotify__Login5__V3__Credentials__AppleSignInCredential *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__Credentials__SamsungSignInCredential methods */ +void spotify__login5__v3__credentials__samsung_sign_in_credential__init + (Spotify__Login5__V3__Credentials__SamsungSignInCredential *message); +size_t spotify__login5__v3__credentials__samsung_sign_in_credential__get_packed_size + (const Spotify__Login5__V3__Credentials__SamsungSignInCredential *message); +size_t spotify__login5__v3__credentials__samsung_sign_in_credential__pack + (const Spotify__Login5__V3__Credentials__SamsungSignInCredential *message, + uint8_t *out); +size_t spotify__login5__v3__credentials__samsung_sign_in_credential__pack_to_buffer + (const Spotify__Login5__V3__Credentials__SamsungSignInCredential *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Credentials__SamsungSignInCredential * + spotify__login5__v3__credentials__samsung_sign_in_credential__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__credentials__samsung_sign_in_credential__free_unpacked + (Spotify__Login5__V3__Credentials__SamsungSignInCredential *message, + ProtobufCAllocator *allocator); +/* Spotify__Login5__V3__Credentials__GoogleSignInCredential methods */ +void spotify__login5__v3__credentials__google_sign_in_credential__init + (Spotify__Login5__V3__Credentials__GoogleSignInCredential *message); +size_t spotify__login5__v3__credentials__google_sign_in_credential__get_packed_size + (const Spotify__Login5__V3__Credentials__GoogleSignInCredential *message); +size_t spotify__login5__v3__credentials__google_sign_in_credential__pack + (const Spotify__Login5__V3__Credentials__GoogleSignInCredential *message, + uint8_t *out); +size_t spotify__login5__v3__credentials__google_sign_in_credential__pack_to_buffer + (const Spotify__Login5__V3__Credentials__GoogleSignInCredential *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Credentials__GoogleSignInCredential * + spotify__login5__v3__credentials__google_sign_in_credential__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__credentials__google_sign_in_credential__free_unpacked + (Spotify__Login5__V3__Credentials__GoogleSignInCredential *message, + ProtobufCAllocator *allocator); +/* --- per-message closures --- */ + +typedef void (*Spotify__Login5__V3__Credentials__StoredCredential_Closure) + (const Spotify__Login5__V3__Credentials__StoredCredential *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__Credentials__Password_Closure) + (const Spotify__Login5__V3__Credentials__Password *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__Credentials__FacebookAccessToken_Closure) + (const Spotify__Login5__V3__Credentials__FacebookAccessToken *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__Credentials__OneTimeToken_Closure) + (const Spotify__Login5__V3__Credentials__OneTimeToken *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__Credentials__ParentChildCredential_Closure) + (const Spotify__Login5__V3__Credentials__ParentChildCredential *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__Credentials__AppleSignInCredential_Closure) + (const Spotify__Login5__V3__Credentials__AppleSignInCredential *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__Credentials__SamsungSignInCredential_Closure) + (const Spotify__Login5__V3__Credentials__SamsungSignInCredential *message, + void *closure_data); +typedef void (*Spotify__Login5__V3__Credentials__GoogleSignInCredential_Closure) + (const Spotify__Login5__V3__Credentials__GoogleSignInCredential *message, + void *closure_data); + +/* --- services --- */ + + +/* --- descriptors --- */ + +extern const ProtobufCMessageDescriptor spotify__login5__v3__credentials__stored_credential__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__credentials__password__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__credentials__facebook_access_token__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__credentials__one_time_token__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__credentials__parent_child_credential__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__credentials__apple_sign_in_credential__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__credentials__samsung_sign_in_credential__descriptor; +extern const ProtobufCMessageDescriptor spotify__login5__v3__credentials__google_sign_in_credential__descriptor; + +PROTOBUF_C__END_DECLS + + +#endif /* PROTOBUF_C_login5_5fcredentials_2eproto__INCLUDED */ diff --git a/src/inputs/librespot-c/src/proto/login5_credentials.proto b/src/inputs/librespot-c/src/proto/login5_credentials.proto new file mode 100644 index 00000000..7fe07292 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_credentials.proto @@ -0,0 +1,46 @@ +syntax = "proto3"; + +package spotify.login5.v3.credentials; + +message StoredCredential { + string username = 1; + bytes data = 2; +} + +message Password { + string id = 1; + string password = 2; + bytes padding = 3; +} + +message FacebookAccessToken { + string fb_uid = 1; + string access_token = 2; +} + +message OneTimeToken { + string token = 1; +} + +message ParentChildCredential { + string child_id = 1; + StoredCredential parent_stored_credential = 2; +} + +message AppleSignInCredential { + string auth_code = 1; + string redirect_uri = 2; + string bundle_id = 3; +} + +message SamsungSignInCredential { + string auth_code = 1; + string redirect_uri = 2; + string id_token = 3; + string token_endpoint_url = 4; +} + +message GoogleSignInCredential { + string auth_code = 1; + string redirect_uri = 2; +} diff --git a/src/inputs/librespot-c/src/proto/login5_identifiers.pb-c.c b/src/inputs/librespot-c/src/proto/login5_identifiers.pb-c.c new file mode 100644 index 00000000..5fb0c5a1 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_identifiers.pb-c.c @@ -0,0 +1,118 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: login5_identifiers.proto */ + +/* Do not generate deprecated warnings for self */ +#ifndef PROTOBUF_C__NO_DEPRECATED +#define PROTOBUF_C__NO_DEPRECATED +#endif + +#include "login5_identifiers.pb-c.h" +void spotify__login5__v3__identifiers__phone_number__init + (Spotify__Login5__V3__Identifiers__PhoneNumber *message) +{ + static const Spotify__Login5__V3__Identifiers__PhoneNumber init_value = SPOTIFY__LOGIN5__V3__IDENTIFIERS__PHONE_NUMBER__INIT; + *message = init_value; +} +size_t spotify__login5__v3__identifiers__phone_number__get_packed_size + (const Spotify__Login5__V3__Identifiers__PhoneNumber *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__identifiers__phone_number__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__identifiers__phone_number__pack + (const Spotify__Login5__V3__Identifiers__PhoneNumber *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__identifiers__phone_number__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__identifiers__phone_number__pack_to_buffer + (const Spotify__Login5__V3__Identifiers__PhoneNumber *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__identifiers__phone_number__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__Identifiers__PhoneNumber * + spotify__login5__v3__identifiers__phone_number__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__Identifiers__PhoneNumber *) + protobuf_c_message_unpack (&spotify__login5__v3__identifiers__phone_number__descriptor, + allocator, len, data); +} +void spotify__login5__v3__identifiers__phone_number__free_unpacked + (Spotify__Login5__V3__Identifiers__PhoneNumber *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__identifiers__phone_number__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +static const ProtobufCFieldDescriptor spotify__login5__v3__identifiers__phone_number__field_descriptors[3] = +{ + { + "number", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Identifiers__PhoneNumber, number), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "iso_country_code", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Identifiers__PhoneNumber, iso_country_code), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "country_calling_code", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__Identifiers__PhoneNumber, country_calling_code), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__identifiers__phone_number__field_indices_by_name[] = { + 2, /* field[2] = country_calling_code */ + 1, /* field[1] = iso_country_code */ + 0, /* field[0] = number */ +}; +static const ProtobufCIntRange spotify__login5__v3__identifiers__phone_number__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 3 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__identifiers__phone_number__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.identifiers.PhoneNumber", + "PhoneNumber", + "Spotify__Login5__V3__Identifiers__PhoneNumber", + "spotify.login5.v3.identifiers", + sizeof(Spotify__Login5__V3__Identifiers__PhoneNumber), + 3, + spotify__login5__v3__identifiers__phone_number__field_descriptors, + spotify__login5__v3__identifiers__phone_number__field_indices_by_name, + 1, spotify__login5__v3__identifiers__phone_number__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__identifiers__phone_number__init, + NULL,NULL,NULL /* reserved[123] */ +}; diff --git a/src/inputs/librespot-c/src/proto/login5_identifiers.pb-c.h b/src/inputs/librespot-c/src/proto/login5_identifiers.pb-c.h new file mode 100644 index 00000000..43ee9d47 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_identifiers.pb-c.h @@ -0,0 +1,73 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: login5_identifiers.proto */ + +#ifndef PROTOBUF_C_login5_5fidentifiers_2eproto__INCLUDED +#define PROTOBUF_C_login5_5fidentifiers_2eproto__INCLUDED + +#include + +PROTOBUF_C__BEGIN_DECLS + +#if PROTOBUF_C_VERSION_NUMBER < 1003000 +# error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers. +#elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION +# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c. +#endif + + +typedef struct Spotify__Login5__V3__Identifiers__PhoneNumber Spotify__Login5__V3__Identifiers__PhoneNumber; + + +/* --- enums --- */ + + +/* --- messages --- */ + +struct Spotify__Login5__V3__Identifiers__PhoneNumber +{ + ProtobufCMessage base; + char *number; + char *iso_country_code; + char *country_calling_code; +}; +#define SPOTIFY__LOGIN5__V3__IDENTIFIERS__PHONE_NUMBER__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__identifiers__phone_number__descriptor) \ + , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string } + + +/* Spotify__Login5__V3__Identifiers__PhoneNumber methods */ +void spotify__login5__v3__identifiers__phone_number__init + (Spotify__Login5__V3__Identifiers__PhoneNumber *message); +size_t spotify__login5__v3__identifiers__phone_number__get_packed_size + (const Spotify__Login5__V3__Identifiers__PhoneNumber *message); +size_t spotify__login5__v3__identifiers__phone_number__pack + (const Spotify__Login5__V3__Identifiers__PhoneNumber *message, + uint8_t *out); +size_t spotify__login5__v3__identifiers__phone_number__pack_to_buffer + (const Spotify__Login5__V3__Identifiers__PhoneNumber *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__Identifiers__PhoneNumber * + spotify__login5__v3__identifiers__phone_number__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__identifiers__phone_number__free_unpacked + (Spotify__Login5__V3__Identifiers__PhoneNumber *message, + ProtobufCAllocator *allocator); +/* --- per-message closures --- */ + +typedef void (*Spotify__Login5__V3__Identifiers__PhoneNumber_Closure) + (const Spotify__Login5__V3__Identifiers__PhoneNumber *message, + void *closure_data); + +/* --- services --- */ + + +/* --- descriptors --- */ + +extern const ProtobufCMessageDescriptor spotify__login5__v3__identifiers__phone_number__descriptor; + +PROTOBUF_C__END_DECLS + + +#endif /* PROTOBUF_C_login5_5fidentifiers_2eproto__INCLUDED */ diff --git a/src/inputs/librespot-c/src/proto/login5_identifiers.proto b/src/inputs/librespot-c/src/proto/login5_identifiers.proto new file mode 100644 index 00000000..326c570e --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_identifiers.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; + +package spotify.login5.v3.identifiers; + +message PhoneNumber { + string number = 1; + string iso_country_code = 2; + string country_calling_code = 3; +} diff --git a/src/inputs/librespot-c/src/proto/login5_user_info.pb-c.c b/src/inputs/librespot-c/src/proto/login5_user_info.pb-c.c new file mode 100644 index 00000000..ff39aea6 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_user_info.pb-c.c @@ -0,0 +1,215 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: login5_user_info.proto */ + +/* Do not generate deprecated warnings for self */ +#ifndef PROTOBUF_C__NO_DEPRECATED +#define PROTOBUF_C__NO_DEPRECATED +#endif + +#include "login5_user_info.pb-c.h" +void spotify__login5__v3__user_info__init + (Spotify__Login5__V3__UserInfo *message) +{ + static const Spotify__Login5__V3__UserInfo init_value = SPOTIFY__LOGIN5__V3__USER_INFO__INIT; + *message = init_value; +} +size_t spotify__login5__v3__user_info__get_packed_size + (const Spotify__Login5__V3__UserInfo *message) +{ + assert(message->base.descriptor == &spotify__login5__v3__user_info__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__login5__v3__user_info__pack + (const Spotify__Login5__V3__UserInfo *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__login5__v3__user_info__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__login5__v3__user_info__pack_to_buffer + (const Spotify__Login5__V3__UserInfo *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__login5__v3__user_info__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Login5__V3__UserInfo * + spotify__login5__v3__user_info__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Login5__V3__UserInfo *) + protobuf_c_message_unpack (&spotify__login5__v3__user_info__descriptor, + allocator, len, data); +} +void spotify__login5__v3__user_info__free_unpacked + (Spotify__Login5__V3__UserInfo *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__login5__v3__user_info__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +static const ProtobufCEnumValue spotify__login5__v3__user_info__gender__enum_values_by_number[4] = +{ + { "UNKNOWN", "SPOTIFY__LOGIN5__V3__USER_INFO__GENDER__UNKNOWN", 0 }, + { "MALE", "SPOTIFY__LOGIN5__V3__USER_INFO__GENDER__MALE", 1 }, + { "FEMALE", "SPOTIFY__LOGIN5__V3__USER_INFO__GENDER__FEMALE", 2 }, + { "NEUTRAL", "SPOTIFY__LOGIN5__V3__USER_INFO__GENDER__NEUTRAL", 3 }, +}; +static const ProtobufCIntRange spotify__login5__v3__user_info__gender__value_ranges[] = { +{0, 0},{0, 4} +}; +static const ProtobufCEnumValueIndex spotify__login5__v3__user_info__gender__enum_values_by_name[4] = +{ + { "FEMALE", 2 }, + { "MALE", 1 }, + { "NEUTRAL", 3 }, + { "UNKNOWN", 0 }, +}; +const ProtobufCEnumDescriptor spotify__login5__v3__user_info__gender__descriptor = +{ + PROTOBUF_C__ENUM_DESCRIPTOR_MAGIC, + "spotify.login5.v3.UserInfo.Gender", + "Gender", + "Spotify__Login5__V3__UserInfo__Gender", + "spotify.login5.v3", + 4, + spotify__login5__v3__user_info__gender__enum_values_by_number, + 4, + spotify__login5__v3__user_info__gender__enum_values_by_name, + 1, + spotify__login5__v3__user_info__gender__value_ranges, + NULL,NULL,NULL,NULL /* reserved[1234] */ +}; +static const ProtobufCFieldDescriptor spotify__login5__v3__user_info__field_descriptors[8] = +{ + { + "name", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__UserInfo, name), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "email", + 2, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__UserInfo, email), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "email_verified", + 3, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_BOOL, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__UserInfo, email_verified), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "birthdate", + 4, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__UserInfo, birthdate), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "gender", + 5, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_ENUM, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__UserInfo, gender), + &spotify__login5__v3__user_info__gender__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "phone_number", + 6, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__UserInfo, phone_number), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "phone_number_verified", + 7, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_BOOL, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__UserInfo, phone_number_verified), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "email_already_registered", + 8, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_BOOL, + 0, /* quantifier_offset */ + offsetof(Spotify__Login5__V3__UserInfo, email_already_registered), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__login5__v3__user_info__field_indices_by_name[] = { + 3, /* field[3] = birthdate */ + 1, /* field[1] = email */ + 7, /* field[7] = email_already_registered */ + 2, /* field[2] = email_verified */ + 4, /* field[4] = gender */ + 0, /* field[0] = name */ + 5, /* field[5] = phone_number */ + 6, /* field[6] = phone_number_verified */ +}; +static const ProtobufCIntRange spotify__login5__v3__user_info__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 8 } +}; +const ProtobufCMessageDescriptor spotify__login5__v3__user_info__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.login5.v3.UserInfo", + "UserInfo", + "Spotify__Login5__V3__UserInfo", + "spotify.login5.v3", + sizeof(Spotify__Login5__V3__UserInfo), + 8, + spotify__login5__v3__user_info__field_descriptors, + spotify__login5__v3__user_info__field_indices_by_name, + 1, spotify__login5__v3__user_info__number_ranges, + (ProtobufCMessageInit) spotify__login5__v3__user_info__init, + NULL,NULL,NULL /* reserved[123] */ +}; diff --git a/src/inputs/librespot-c/src/proto/login5_user_info.pb-c.h b/src/inputs/librespot-c/src/proto/login5_user_info.pb-c.h new file mode 100644 index 00000000..1be704a9 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_user_info.pb-c.h @@ -0,0 +1,86 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: login5_user_info.proto */ + +#ifndef PROTOBUF_C_login5_5fuser_5finfo_2eproto__INCLUDED +#define PROTOBUF_C_login5_5fuser_5finfo_2eproto__INCLUDED + +#include + +PROTOBUF_C__BEGIN_DECLS + +#if PROTOBUF_C_VERSION_NUMBER < 1003000 +# error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers. +#elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION +# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c. +#endif + + +typedef struct Spotify__Login5__V3__UserInfo Spotify__Login5__V3__UserInfo; + + +/* --- enums --- */ + +typedef enum _Spotify__Login5__V3__UserInfo__Gender { + SPOTIFY__LOGIN5__V3__USER_INFO__GENDER__UNKNOWN = 0, + SPOTIFY__LOGIN5__V3__USER_INFO__GENDER__MALE = 1, + SPOTIFY__LOGIN5__V3__USER_INFO__GENDER__FEMALE = 2, + SPOTIFY__LOGIN5__V3__USER_INFO__GENDER__NEUTRAL = 3 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__LOGIN5__V3__USER_INFO__GENDER) +} Spotify__Login5__V3__UserInfo__Gender; + +/* --- messages --- */ + +struct Spotify__Login5__V3__UserInfo +{ + ProtobufCMessage base; + char *name; + char *email; + protobuf_c_boolean email_verified; + char *birthdate; + Spotify__Login5__V3__UserInfo__Gender gender; + char *phone_number; + protobuf_c_boolean phone_number_verified; + protobuf_c_boolean email_already_registered; +}; +#define SPOTIFY__LOGIN5__V3__USER_INFO__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__login5__v3__user_info__descriptor) \ + , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, 0, (char *)protobuf_c_empty_string, SPOTIFY__LOGIN5__V3__USER_INFO__GENDER__UNKNOWN, (char *)protobuf_c_empty_string, 0, 0 } + + +/* Spotify__Login5__V3__UserInfo methods */ +void spotify__login5__v3__user_info__init + (Spotify__Login5__V3__UserInfo *message); +size_t spotify__login5__v3__user_info__get_packed_size + (const Spotify__Login5__V3__UserInfo *message); +size_t spotify__login5__v3__user_info__pack + (const Spotify__Login5__V3__UserInfo *message, + uint8_t *out); +size_t spotify__login5__v3__user_info__pack_to_buffer + (const Spotify__Login5__V3__UserInfo *message, + ProtobufCBuffer *buffer); +Spotify__Login5__V3__UserInfo * + spotify__login5__v3__user_info__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__login5__v3__user_info__free_unpacked + (Spotify__Login5__V3__UserInfo *message, + ProtobufCAllocator *allocator); +/* --- per-message closures --- */ + +typedef void (*Spotify__Login5__V3__UserInfo_Closure) + (const Spotify__Login5__V3__UserInfo *message, + void *closure_data); + +/* --- services --- */ + + +/* --- descriptors --- */ + +extern const ProtobufCMessageDescriptor spotify__login5__v3__user_info__descriptor; +extern const ProtobufCEnumDescriptor spotify__login5__v3__user_info__gender__descriptor; + +PROTOBUF_C__END_DECLS + + +#endif /* PROTOBUF_C_login5_5fuser_5finfo_2eproto__INCLUDED */ diff --git a/src/inputs/librespot-c/src/proto/login5_user_info.proto b/src/inputs/librespot-c/src/proto/login5_user_info.proto new file mode 100644 index 00000000..f03b69a9 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/login5_user_info.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; + +package spotify.login5.v3; + +message UserInfo { + string name = 1; + string email = 2; + bool email_verified = 3; + string birthdate = 4; + + Gender gender = 5; + enum Gender { + UNKNOWN = 0; + MALE = 1; + FEMALE = 2; + NEUTRAL = 3; + } + + string phone_number = 6; + bool phone_number_verified = 7; + bool email_already_registered = 8; +} diff --git a/src/inputs/librespot-c/src/proto/mergedprofile.proto b/src/inputs/librespot-c/src/proto/mergedprofile.proto deleted file mode 100644 index e283e1de..00000000 --- a/src/inputs/librespot-c/src/proto/mergedprofile.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto2"; - -message MergedProfileRequest { -} - -message MergedProfileReply { - optional string username = 0x1; - optional string artistid = 0x2; -} - diff --git a/src/inputs/librespot-c/src/proto/playlist4changes.proto b/src/inputs/librespot-c/src/proto/playlist4changes.proto deleted file mode 100644 index 6b424b71..00000000 --- a/src/inputs/librespot-c/src/proto/playlist4changes.proto +++ /dev/null @@ -1,87 +0,0 @@ -syntax = "proto2"; - -import "playlist4ops.proto"; -import "playlist4meta.proto"; -import "playlist4content.proto"; -import "playlist4issues.proto"; - -message ChangeInfo { - optional string user = 0x1; - optional int32 timestamp = 0x2; - optional bool admin = 0x3; - optional bool undo = 0x4; - optional bool redo = 0x5; - optional bool merge = 0x6; - optional bool compressed = 0x7; - optional bool migration = 0x8; -} - -message Delta { - optional bytes base_version = 0x1; - repeated Op ops = 0x2; - optional ChangeInfo info = 0x4; -} - -message Merge { - optional bytes base_version = 0x1; - optional bytes merge_version = 0x2; - optional ChangeInfo info = 0x4; -} - -message ChangeSet { - optional Kind kind = 0x1; - enum Kind { - KIND_UNKNOWN = 0x0; - DELTA = 0x2; - MERGE = 0x3; - } - optional Delta delta = 0x2; - optional Merge merge = 0x3; -} - -message RevisionTaggedChangeSet { - optional bytes revision = 0x1; - optional ChangeSet change_set = 0x2; -} - -message Diff { - optional bytes from_revision = 0x1; - repeated Op ops = 0x2; - optional bytes to_revision = 0x3; -} - -message ListDump { - optional bytes latestRevision = 0x1; - optional int32 length = 0x2; - optional ListAttributes attributes = 0x3; - optional ListChecksum checksum = 0x4; - optional ListItems contents = 0x5; - repeated Delta pendingDeltas = 0x7; -} - -message ListChanges { - optional bytes baseRevision = 0x1; - repeated Delta deltas = 0x2; - optional bool wantResultingRevisions = 0x3; - optional bool wantSyncResult = 0x4; - optional ListDump dump = 0x5; - repeated int32 nonces = 0x6; -} - -message SelectedListContent { - optional bytes revision = 0x1; - optional int32 length = 0x2; - optional ListAttributes attributes = 0x3; - optional ListChecksum checksum = 0x4; - optional ListItems contents = 0x5; - optional Diff diff = 0x6; - optional Diff syncResult = 0x7; - repeated bytes resultingRevisions = 0x8; - optional bool multipleHeads = 0x9; - optional bool upToDate = 0xa; - repeated ClientResolveAction resolveAction = 0xc; - repeated ClientIssue issues = 0xd; - repeated int32 nonces = 0xe; - optional string owner_username =0x10; -} - diff --git a/src/inputs/librespot-c/src/proto/playlist4content.proto b/src/inputs/librespot-c/src/proto/playlist4content.proto deleted file mode 100644 index 50d197fa..00000000 --- a/src/inputs/librespot-c/src/proto/playlist4content.proto +++ /dev/null @@ -1,37 +0,0 @@ -syntax = "proto2"; - -import "playlist4meta.proto"; -import "playlist4issues.proto"; - -message Item { - optional string uri = 0x1; - optional ItemAttributes attributes = 0x2; -} - -message ListItems { - optional int32 pos = 0x1; - optional bool truncated = 0x2; - repeated Item items = 0x3; -} - -message ContentRange { - optional int32 pos = 0x1; - optional int32 length = 0x2; -} - -message ListContentSelection { - optional bool wantRevision = 0x1; - optional bool wantLength = 0x2; - optional bool wantAttributes = 0x3; - optional bool wantChecksum = 0x4; - optional bool wantContent = 0x5; - optional ContentRange contentRange = 0x6; - optional bool wantDiff = 0x7; - optional bytes baseRevision = 0x8; - optional bytes hintRevision = 0x9; - optional bool wantNothingIfUpToDate = 0xa; - optional bool wantResolveAction = 0xc; - repeated ClientIssue issues = 0xd; - repeated ClientResolveAction resolveAction = 0xe; -} - diff --git a/src/inputs/librespot-c/src/proto/playlist4issues.proto b/src/inputs/librespot-c/src/proto/playlist4issues.proto deleted file mode 100644 index 3808d532..00000000 --- a/src/inputs/librespot-c/src/proto/playlist4issues.proto +++ /dev/null @@ -1,43 +0,0 @@ -syntax = "proto2"; - -message ClientIssue { - optional Level level = 0x1; - enum Level { - LEVEL_UNKNOWN = 0x0; - LEVEL_DEBUG = 0x1; - LEVEL_INFO = 0x2; - LEVEL_NOTICE = 0x3; - LEVEL_WARNING = 0x4; - LEVEL_ERROR = 0x5; - } - optional Code code = 0x2; - enum Code { - CODE_UNKNOWN = 0x0; - CODE_INDEX_OUT_OF_BOUNDS = 0x1; - CODE_VERSION_MISMATCH = 0x2; - CODE_CACHED_CHANGE = 0x3; - CODE_OFFLINE_CHANGE = 0x4; - CODE_CONCURRENT_CHANGE = 0x5; - } - optional int32 repeatCount = 0x3; -} - -message ClientResolveAction { - optional Code code = 0x1; - enum Code { - CODE_UNKNOWN = 0x0; - CODE_NO_ACTION = 0x1; - CODE_RETRY = 0x2; - CODE_RELOAD = 0x3; - CODE_DISCARD_LOCAL_CHANGES = 0x4; - CODE_SEND_DUMP = 0x5; - CODE_DISPLAY_ERROR_MESSAGE = 0x6; - } - optional Initiator initiator = 0x2; - enum Initiator { - INITIATOR_UNKNOWN = 0x0; - INITIATOR_SERVER = 0x1; - INITIATOR_CLIENT = 0x2; - } -} - diff --git a/src/inputs/librespot-c/src/proto/playlist4meta.proto b/src/inputs/librespot-c/src/proto/playlist4meta.proto deleted file mode 100644 index 4c22a9f0..00000000 --- a/src/inputs/librespot-c/src/proto/playlist4meta.proto +++ /dev/null @@ -1,52 +0,0 @@ -syntax = "proto2"; - -message ListChecksum { - optional int32 version = 0x1; - optional bytes sha1 = 0x4; -} - -message DownloadFormat { - optional Codec codec = 0x1; - enum Codec { - CODEC_UNKNOWN = 0x0; - OGG_VORBIS = 0x1; - FLAC = 0x2; - MPEG_1_LAYER_3 = 0x3; - } -} - -message ListAttributes { - optional string name = 0x1; - optional string description = 0x2; - optional bytes picture = 0x3; - optional bool collaborative = 0x4; - optional string pl3_version = 0x5; - optional bool deleted_by_owner = 0x6; - optional bool restricted_collaborative = 0x7; - optional int64 deprecated_client_id = 0x8; - optional bool public_starred = 0x9; - optional string client_id = 0xa; -} - -message ItemAttributes { - optional string added_by = 0x1; - optional int64 timestamp = 0x2; - optional string message = 0x3; - optional bool seen = 0x4; - optional int64 download_count = 0x5; - optional DownloadFormat download_format = 0x6; - optional string sevendigital_id = 0x7; - optional int64 sevendigital_left = 0x8; - optional int64 seen_at = 0x9; - optional bool public = 0xa; -} - -message StringAttribute { - optional string key = 0x1; - optional string value = 0x2; -} - -message StringAttributes { - repeated StringAttribute attribute = 0x1; -} - diff --git a/src/inputs/librespot-c/src/proto/playlist4ops.proto b/src/inputs/librespot-c/src/proto/playlist4ops.proto deleted file mode 100644 index dbbfcaa9..00000000 --- a/src/inputs/librespot-c/src/proto/playlist4ops.proto +++ /dev/null @@ -1,103 +0,0 @@ -syntax = "proto2"; - -import "playlist4meta.proto"; -import "playlist4content.proto"; - -message Add { - optional int32 fromIndex = 0x1; - repeated Item items = 0x2; - optional ListChecksum list_checksum = 0x3; - optional bool addLast = 0x4; - optional bool addFirst = 0x5; -} - -message Rem { - optional int32 fromIndex = 0x1; - optional int32 length = 0x2; - repeated Item items = 0x3; - optional ListChecksum list_checksum = 0x4; - optional ListChecksum items_checksum = 0x5; - optional ListChecksum uris_checksum = 0x6; - optional bool itemsAsKey = 0x7; -} - -message Mov { - optional int32 fromIndex = 0x1; - optional int32 length = 0x2; - optional int32 toIndex = 0x3; - optional ListChecksum list_checksum = 0x4; - optional ListChecksum items_checksum = 0x5; - optional ListChecksum uris_checksum = 0x6; -} - -message ItemAttributesPartialState { - optional ItemAttributes values = 0x1; - repeated ItemAttributeKind no_value = 0x2; - - enum ItemAttributeKind { - ITEM_UNKNOWN = 0x0; - ITEM_ADDED_BY = 0x1; - ITEM_TIMESTAMP = 0x2; - ITEM_MESSAGE = 0x3; - ITEM_SEEN = 0x4; - ITEM_DOWNLOAD_COUNT = 0x5; - ITEM_DOWNLOAD_FORMAT = 0x6; - ITEM_SEVENDIGITAL_ID = 0x7; - ITEM_SEVENDIGITAL_LEFT = 0x8; - ITEM_SEEN_AT = 0x9; - ITEM_PUBLIC = 0xa; - } -} - -message ListAttributesPartialState { - optional ListAttributes values = 0x1; - repeated ListAttributeKind no_value = 0x2; - - enum ListAttributeKind { - LIST_UNKNOWN = 0x0; - LIST_NAME = 0x1; - LIST_DESCRIPTION = 0x2; - LIST_PICTURE = 0x3; - LIST_COLLABORATIVE = 0x4; - LIST_PL3_VERSION = 0x5; - LIST_DELETED_BY_OWNER = 0x6; - LIST_RESTRICTED_COLLABORATIVE = 0x7; - } -} - -message UpdateItemAttributes { - optional int32 index = 0x1; - optional ItemAttributesPartialState new_attributes = 0x2; - optional ItemAttributesPartialState old_attributes = 0x3; - optional ListChecksum list_checksum = 0x4; - optional ListChecksum old_attributes_checksum = 0x5; -} - -message UpdateListAttributes { - optional ListAttributesPartialState new_attributes = 0x1; - optional ListAttributesPartialState old_attributes = 0x2; - optional ListChecksum list_checksum = 0x3; - optional ListChecksum old_attributes_checksum = 0x4; -} - -message Op { - optional Kind kind = 0x1; - enum Kind { - KIND_UNKNOWN = 0x0; - ADD = 0x2; - REM = 0x3; - MOV = 0x4; - UPDATE_ITEM_ATTRIBUTES = 0x5; - UPDATE_LIST_ATTRIBUTES = 0x6; - } - optional Add add = 0x2; - optional Rem rem = 0x3; - optional Mov mov = 0x4; - optional UpdateItemAttributes update_item_attributes = 0x5; - optional UpdateListAttributes update_list_attributes = 0x6; -} - -message OpList { - repeated Op ops = 0x1; -} - diff --git a/src/inputs/librespot-c/src/proto/popcount.proto b/src/inputs/librespot-c/src/proto/popcount.proto deleted file mode 100644 index 7a0bac84..00000000 --- a/src/inputs/librespot-c/src/proto/popcount.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto2"; - -message PopcountRequest { -} - -message PopcountResult { - optional sint64 count = 0x1; - optional bool truncated = 0x2; - repeated string user = 0x3; - repeated sint64 subscriptionTimestamps = 0x4; - repeated sint64 insertionTimestamps = 0x5; -} - diff --git a/src/inputs/librespot-c/src/proto/presence.proto b/src/inputs/librespot-c/src/proto/presence.proto deleted file mode 100644 index 5e9be377..00000000 --- a/src/inputs/librespot-c/src/proto/presence.proto +++ /dev/null @@ -1,94 +0,0 @@ -syntax = "proto2"; - -message PlaylistPublishedState { - optional string uri = 0x1; - optional int64 timestamp = 0x2; -} - -message PlaylistTrackAddedState { - optional string playlist_uri = 0x1; - optional string track_uri = 0x2; - optional int64 timestamp = 0x3; -} - -message TrackFinishedPlayingState { - optional string uri = 0x1; - optional string context_uri = 0x2; - optional int64 timestamp = 0x3; - optional string referrer_uri = 0x4; -} - -message FavoriteAppAddedState { - optional string app_uri = 0x1; - optional int64 timestamp = 0x2; -} - -message TrackStartedPlayingState { - optional string uri = 0x1; - optional string context_uri = 0x2; - optional int64 timestamp = 0x3; - optional string referrer_uri = 0x4; -} - -message UriSharedState { - optional string uri = 0x1; - optional string message = 0x2; - optional int64 timestamp = 0x3; -} - -message ArtistFollowedState { - optional string uri = 0x1; - optional string artist_name = 0x2; - optional string artist_cover_uri = 0x3; - optional int64 timestamp = 0x4; -} - -message DeviceInformation { - optional string os = 0x1; - optional string type = 0x2; -} - -message GenericPresenceState { - optional int32 type = 0x1; - optional int64 timestamp = 0x2; - optional string item_uri = 0x3; - optional string item_name = 0x4; - optional string item_image = 0x5; - optional string context_uri = 0x6; - optional string context_name = 0x7; - optional string context_image = 0x8; - optional string referrer_uri = 0x9; - optional string referrer_name = 0xa; - optional string referrer_image = 0xb; - optional string message = 0xc; - optional DeviceInformation device_information = 0xd; -} - -message State { - optional int64 timestamp = 0x1; - optional Type type = 0x2; - enum Type { - PLAYLIST_PUBLISHED = 0x1; - PLAYLIST_TRACK_ADDED = 0x2; - TRACK_FINISHED_PLAYING = 0x3; - FAVORITE_APP_ADDED = 0x4; - TRACK_STARTED_PLAYING = 0x5; - URI_SHARED = 0x6; - ARTIST_FOLLOWED = 0x7; - GENERIC = 0xb; - } - optional string uri = 0x3; - optional PlaylistPublishedState playlist_published = 0x4; - optional PlaylistTrackAddedState playlist_track_added = 0x5; - optional TrackFinishedPlayingState track_finished_playing = 0x6; - optional FavoriteAppAddedState favorite_app_added = 0x7; - optional TrackStartedPlayingState track_started_playing = 0x8; - optional UriSharedState uri_shared = 0x9; - optional ArtistFollowedState artist_followed = 0xa; - optional GenericPresenceState generic = 0xb; -} - -message StateList { - repeated State states = 0x1; -} - diff --git a/src/inputs/librespot-c/src/proto/pubsub.proto b/src/inputs/librespot-c/src/proto/pubsub.proto deleted file mode 100644 index a781c377..00000000 --- a/src/inputs/librespot-c/src/proto/pubsub.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto2"; - -message Subscription { - optional string uri = 0x1; - optional int32 expiry = 0x2; - optional int32 status_code = 0x3; -} - diff --git a/src/inputs/librespot-c/src/proto/radio.proto b/src/inputs/librespot-c/src/proto/radio.proto deleted file mode 100644 index 7a8f3bde..00000000 --- a/src/inputs/librespot-c/src/proto/radio.proto +++ /dev/null @@ -1,58 +0,0 @@ -syntax = "proto2"; - -message RadioRequest { - repeated string uris = 0x1; - optional int32 salt = 0x2; - optional int32 length = 0x4; - optional string stationId = 0x5; - repeated string lastTracks = 0x6; -} - -message MultiSeedRequest { - repeated string uris = 0x1; -} - -message Feedback { - optional string uri = 0x1; - optional string type = 0x2; - optional double timestamp = 0x3; -} - -message Tracks { - repeated string gids = 0x1; - optional string source = 0x2; - optional string identity = 0x3; - repeated string tokens = 0x4; - repeated Feedback feedback = 0x5; -} - -message Station { - optional string id = 0x1; - optional string title = 0x2; - optional string titleUri = 0x3; - optional string subtitle = 0x4; - optional string subtitleUri = 0x5; - optional string imageUri = 0x6; - optional double lastListen = 0x7; - repeated string seeds = 0x8; - optional int32 thumbsUp = 0x9; - optional int32 thumbsDown = 0xa; -} - -message Rules { - optional string js = 0x1; -} - -message StationResponse { - optional Station station = 0x1; - repeated Feedback feedback = 0x2; -} - -message StationList { - repeated Station stations = 0x1; -} - -message LikedPlaylist { - optional string uri = 0x1; -} - diff --git a/src/inputs/librespot-c/src/proto/search.proto b/src/inputs/librespot-c/src/proto/search.proto deleted file mode 100644 index 38b717f7..00000000 --- a/src/inputs/librespot-c/src/proto/search.proto +++ /dev/null @@ -1,44 +0,0 @@ -syntax = "proto2"; - -message SearchRequest { - optional string query = 0x1; - optional Type type = 0x2; - enum Type { - TRACK = 0x0; - ALBUM = 0x1; - ARTIST = 0x2; - PLAYLIST = 0x3; - USER = 0x4; - } - optional int32 limit = 0x3; - optional int32 offset = 0x4; - optional bool did_you_mean = 0x5; - optional string spotify_uri = 0x2; - repeated bytes file_id = 0x3; - optional string url = 0x4; - optional string slask_id = 0x5; -} - -message Playlist { - optional string uri = 0x1; - optional string name = 0x2; - repeated Image image = 0x3; -} - -message User { - optional string username = 0x1; - optional string full_name = 0x2; - repeated Image image = 0x3; - optional sint32 followers = 0x4; -} - -message SearchReply { - optional sint32 hits = 0x1; - repeated Track track = 0x2; - repeated Album album = 0x3; - repeated Artist artist = 0x4; - repeated Playlist playlist = 0x5; - optional string did_you_mean = 0x6; - repeated User user = 0x7; -} - diff --git a/src/inputs/librespot-c/src/proto/social.proto b/src/inputs/librespot-c/src/proto/social.proto deleted file mode 100644 index 58d39a18..00000000 --- a/src/inputs/librespot-c/src/proto/social.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto2"; - -message DecorationData { - optional string username = 0x1; - optional string full_name = 0x2; - optional string image_url = 0x3; - optional string large_image_url = 0x5; - optional string first_name = 0x6; - optional string last_name = 0x7; - optional string facebook_uid = 0x8; -} - diff --git a/src/inputs/librespot-c/src/proto/socialgraph.proto b/src/inputs/librespot-c/src/proto/socialgraph.proto deleted file mode 100644 index 3adc1306..00000000 --- a/src/inputs/librespot-c/src/proto/socialgraph.proto +++ /dev/null @@ -1,49 +0,0 @@ -syntax = "proto2"; - -message CountReply { - repeated int32 counts = 0x1; -} - -message UserListRequest { - optional string last_result = 0x1; - optional int32 count = 0x2; - optional bool include_length = 0x3; -} - -message UserListReply { - repeated User users = 0x1; - optional int32 length = 0x2; -} - -message User { - optional string username = 0x1; - optional int32 subscriber_count = 0x2; - optional int32 subscription_count = 0x3; -} - -message ArtistListReply { - repeated Artist artists = 0x1; -} - -message Artist { - optional string artistid = 0x1; - optional int32 subscriber_count = 0x2; -} - -message StringListRequest { - repeated string args = 0x1; -} - -message StringListReply { - repeated string reply = 0x1; -} - -message TopPlaylistsRequest { - optional string username = 0x1; - optional int32 count = 0x2; -} - -message TopPlaylistsReply { - repeated string uris = 0x1; -} - diff --git a/src/inputs/librespot-c/src/proto/storage_resolve.pb-c.c b/src/inputs/librespot-c/src/proto/storage_resolve.pb-c.c new file mode 100644 index 00000000..461c891b --- /dev/null +++ b/src/inputs/librespot-c/src/proto/storage_resolve.pb-c.c @@ -0,0 +1,149 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: storage_resolve.proto */ + +/* Do not generate deprecated warnings for self */ +#ifndef PROTOBUF_C__NO_DEPRECATED +#define PROTOBUF_C__NO_DEPRECATED +#endif + +#include "storage_resolve.pb-c.h" +void spotify__download__proto__storage_resolve_response__init + (Spotify__Download__Proto__StorageResolveResponse *message) +{ + static const Spotify__Download__Proto__StorageResolveResponse init_value = SPOTIFY__DOWNLOAD__PROTO__STORAGE_RESOLVE_RESPONSE__INIT; + *message = init_value; +} +size_t spotify__download__proto__storage_resolve_response__get_packed_size + (const Spotify__Download__Proto__StorageResolveResponse *message) +{ + assert(message->base.descriptor == &spotify__download__proto__storage_resolve_response__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t spotify__download__proto__storage_resolve_response__pack + (const Spotify__Download__Proto__StorageResolveResponse *message, + uint8_t *out) +{ + assert(message->base.descriptor == &spotify__download__proto__storage_resolve_response__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t spotify__download__proto__storage_resolve_response__pack_to_buffer + (const Spotify__Download__Proto__StorageResolveResponse *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &spotify__download__proto__storage_resolve_response__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Spotify__Download__Proto__StorageResolveResponse * + spotify__download__proto__storage_resolve_response__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Spotify__Download__Proto__StorageResolveResponse *) + protobuf_c_message_unpack (&spotify__download__proto__storage_resolve_response__descriptor, + allocator, len, data); +} +void spotify__download__proto__storage_resolve_response__free_unpacked + (Spotify__Download__Proto__StorageResolveResponse *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &spotify__download__proto__storage_resolve_response__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +static const ProtobufCEnumValue spotify__download__proto__storage_resolve_response__result__enum_values_by_number[3] = +{ + { "CDN", "SPOTIFY__DOWNLOAD__PROTO__STORAGE_RESOLVE_RESPONSE__RESULT__CDN", 0 }, + { "STORAGE", "SPOTIFY__DOWNLOAD__PROTO__STORAGE_RESOLVE_RESPONSE__RESULT__STORAGE", 1 }, + { "RESTRICTED", "SPOTIFY__DOWNLOAD__PROTO__STORAGE_RESOLVE_RESPONSE__RESULT__RESTRICTED", 3 }, +}; +static const ProtobufCIntRange spotify__download__proto__storage_resolve_response__result__value_ranges[] = { +{0, 0},{3, 2},{0, 3} +}; +static const ProtobufCEnumValueIndex spotify__download__proto__storage_resolve_response__result__enum_values_by_name[3] = +{ + { "CDN", 0 }, + { "RESTRICTED", 2 }, + { "STORAGE", 1 }, +}; +const ProtobufCEnumDescriptor spotify__download__proto__storage_resolve_response__result__descriptor = +{ + PROTOBUF_C__ENUM_DESCRIPTOR_MAGIC, + "spotify.download.proto.StorageResolveResponse.Result", + "Result", + "Spotify__Download__Proto__StorageResolveResponse__Result", + "spotify.download.proto", + 3, + spotify__download__proto__storage_resolve_response__result__enum_values_by_number, + 3, + spotify__download__proto__storage_resolve_response__result__enum_values_by_name, + 2, + spotify__download__proto__storage_resolve_response__result__value_ranges, + NULL,NULL,NULL,NULL /* reserved[1234] */ +}; +static const ProtobufCFieldDescriptor spotify__download__proto__storage_resolve_response__field_descriptors[3] = +{ + { + "result", + 1, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_ENUM, + 0, /* quantifier_offset */ + offsetof(Spotify__Download__Proto__StorageResolveResponse, result), + &spotify__download__proto__storage_resolve_response__result__descriptor, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "cdnurl", + 2, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_STRING, + offsetof(Spotify__Download__Proto__StorageResolveResponse, n_cdnurl), + offsetof(Spotify__Download__Proto__StorageResolveResponse, cdnurl), + NULL, + &protobuf_c_empty_string, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "fileid", + 4, + PROTOBUF_C_LABEL_NONE, + PROTOBUF_C_TYPE_BYTES, + 0, /* quantifier_offset */ + offsetof(Spotify__Download__Proto__StorageResolveResponse, fileid), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned spotify__download__proto__storage_resolve_response__field_indices_by_name[] = { + 1, /* field[1] = cdnurl */ + 2, /* field[2] = fileid */ + 0, /* field[0] = result */ +}; +static const ProtobufCIntRange spotify__download__proto__storage_resolve_response__number_ranges[2 + 1] = +{ + { 1, 0 }, + { 4, 2 }, + { 0, 3 } +}; +const ProtobufCMessageDescriptor spotify__download__proto__storage_resolve_response__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "spotify.download.proto.StorageResolveResponse", + "StorageResolveResponse", + "Spotify__Download__Proto__StorageResolveResponse", + "spotify.download.proto", + sizeof(Spotify__Download__Proto__StorageResolveResponse), + 3, + spotify__download__proto__storage_resolve_response__field_descriptors, + spotify__download__proto__storage_resolve_response__field_indices_by_name, + 2, spotify__download__proto__storage_resolve_response__number_ranges, + (ProtobufCMessageInit) spotify__download__proto__storage_resolve_response__init, + NULL,NULL,NULL /* reserved[123] */ +}; diff --git a/src/inputs/librespot-c/src/proto/storage_resolve.pb-c.h b/src/inputs/librespot-c/src/proto/storage_resolve.pb-c.h new file mode 100644 index 00000000..6e739bd0 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/storage_resolve.pb-c.h @@ -0,0 +1,81 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ +/* Generated from: storage_resolve.proto */ + +#ifndef PROTOBUF_C_storage_5fresolve_2eproto__INCLUDED +#define PROTOBUF_C_storage_5fresolve_2eproto__INCLUDED + +#include + +PROTOBUF_C__BEGIN_DECLS + +#if PROTOBUF_C_VERSION_NUMBER < 1003000 +# error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers. +#elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION +# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c. +#endif + + +typedef struct Spotify__Download__Proto__StorageResolveResponse Spotify__Download__Proto__StorageResolveResponse; + + +/* --- enums --- */ + +typedef enum _Spotify__Download__Proto__StorageResolveResponse__Result { + SPOTIFY__DOWNLOAD__PROTO__STORAGE_RESOLVE_RESPONSE__RESULT__CDN = 0, + SPOTIFY__DOWNLOAD__PROTO__STORAGE_RESOLVE_RESPONSE__RESULT__STORAGE = 1, + SPOTIFY__DOWNLOAD__PROTO__STORAGE_RESOLVE_RESPONSE__RESULT__RESTRICTED = 3 + PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(SPOTIFY__DOWNLOAD__PROTO__STORAGE_RESOLVE_RESPONSE__RESULT) +} Spotify__Download__Proto__StorageResolveResponse__Result; + +/* --- messages --- */ + +struct Spotify__Download__Proto__StorageResolveResponse +{ + ProtobufCMessage base; + Spotify__Download__Proto__StorageResolveResponse__Result result; + size_t n_cdnurl; + char **cdnurl; + ProtobufCBinaryData fileid; +}; +#define SPOTIFY__DOWNLOAD__PROTO__STORAGE_RESOLVE_RESPONSE__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&spotify__download__proto__storage_resolve_response__descriptor) \ + , SPOTIFY__DOWNLOAD__PROTO__STORAGE_RESOLVE_RESPONSE__RESULT__CDN, 0,NULL, {0,NULL} } + + +/* Spotify__Download__Proto__StorageResolveResponse methods */ +void spotify__download__proto__storage_resolve_response__init + (Spotify__Download__Proto__StorageResolveResponse *message); +size_t spotify__download__proto__storage_resolve_response__get_packed_size + (const Spotify__Download__Proto__StorageResolveResponse *message); +size_t spotify__download__proto__storage_resolve_response__pack + (const Spotify__Download__Proto__StorageResolveResponse *message, + uint8_t *out); +size_t spotify__download__proto__storage_resolve_response__pack_to_buffer + (const Spotify__Download__Proto__StorageResolveResponse *message, + ProtobufCBuffer *buffer); +Spotify__Download__Proto__StorageResolveResponse * + spotify__download__proto__storage_resolve_response__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void spotify__download__proto__storage_resolve_response__free_unpacked + (Spotify__Download__Proto__StorageResolveResponse *message, + ProtobufCAllocator *allocator); +/* --- per-message closures --- */ + +typedef void (*Spotify__Download__Proto__StorageResolveResponse_Closure) + (const Spotify__Download__Proto__StorageResolveResponse *message, + void *closure_data); + +/* --- services --- */ + + +/* --- descriptors --- */ + +extern const ProtobufCMessageDescriptor spotify__download__proto__storage_resolve_response__descriptor; +extern const ProtobufCEnumDescriptor spotify__download__proto__storage_resolve_response__result__descriptor; + +PROTOBUF_C__END_DECLS + + +#endif /* PROTOBUF_C_storage_5fresolve_2eproto__INCLUDED */ diff --git a/src/inputs/librespot-c/src/proto/storage_resolve.proto b/src/inputs/librespot-c/src/proto/storage_resolve.proto new file mode 100644 index 00000000..8bee32d8 --- /dev/null +++ b/src/inputs/librespot-c/src/proto/storage_resolve.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +package spotify.download.proto; + +message StorageResolveResponse { + Result result = 1; + enum Result { + CDN = 0; + STORAGE = 1; + RESTRICTED = 3; + } + + repeated string cdnurl = 2; + bytes fileid = 4; +} diff --git a/src/inputs/librespot-c/src/proto/suggest.proto b/src/inputs/librespot-c/src/proto/suggest.proto deleted file mode 100644 index ef45f1e2..00000000 --- a/src/inputs/librespot-c/src/proto/suggest.proto +++ /dev/null @@ -1,43 +0,0 @@ -syntax = "proto2"; - -message Track { - optional bytes gid = 0x1; - optional string name = 0x2; - optional bytes image = 0x3; - repeated string artist_name = 0x4; - repeated bytes artist_gid = 0x5; - optional uint32 rank = 0x6; -} - -message Artist { - optional bytes gid = 0x1; - optional string name = 0x2; - optional bytes image = 0x3; - optional uint32 rank = 0x6; -} - -message Album { - optional bytes gid = 0x1; - optional string name = 0x2; - optional bytes image = 0x3; - repeated string artist_name = 0x4; - repeated bytes artist_gid = 0x5; - optional uint32 rank = 0x6; -} - -message Playlist { - optional string uri = 0x1; - optional string name = 0x2; - optional string image_uri = 0x3; - optional string owner_name = 0x4; - optional string owner_uri = 0x5; - optional uint32 rank = 0x6; -} - -message Suggestions { - repeated Track track = 0x1; - repeated Album album = 0x2; - repeated Artist artist = 0x3; - repeated Playlist playlist = 0x4; -} - diff --git a/src/inputs/librespot-c/src/proto/toplist.proto b/src/inputs/librespot-c/src/proto/toplist.proto deleted file mode 100644 index 1a12159f..00000000 --- a/src/inputs/librespot-c/src/proto/toplist.proto +++ /dev/null @@ -1,6 +0,0 @@ -syntax = "proto2"; - -message Toplist { - repeated string items = 0x1; -} - diff --git a/src/inputs/librespot-c/tests/.gitignore b/src/inputs/librespot-c/tests/.gitignore index a5bce3fd..bae42c55 100644 --- a/src/inputs/librespot-c/tests/.gitignore +++ b/src/inputs/librespot-c/tests/.gitignore @@ -1 +1,2 @@ test1 +test2 diff --git a/src/inputs/librespot-c/tests/Makefile.am b/src/inputs/librespot-c/tests/Makefile.am index 893e0857..b347ed42 100644 --- a/src/inputs/librespot-c/tests/Makefile.am +++ b/src/inputs/librespot-c/tests/Makefile.am @@ -7,4 +7,8 @@ test1_SOURCES = test1.c test1_LDADD = $(top_builddir)/librespot-c.a -lpthread $(TEST_LIBS) test1_CFLAGS = $(TEST_CFLAGS) -check_PROGRAMS = test1 +test2_SOURCES = test2.c +test2_LDADD = $(top_builddir)/librespot-c.a -lpthread $(TEST_LIBS) +test2_CFLAGS = $(TEST_CFLAGS) + +check_PROGRAMS = test1 test2 diff --git a/src/inputs/librespot-c/tests/test1.c b/src/inputs/librespot-c/tests/test1.c index 011f0a09..9f5bec34 100644 --- a/src/inputs/librespot-c/tests/test1.c +++ b/src/inputs/librespot-c/tests/test1.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -75,64 +76,6 @@ logmsg(const char *fmt, ...) va_end(ap); } -static size_t -https_write_cb(char *data, size_t size, size_t nmemb, void *userdata) -{ - char **body; - size_t realsize; - - realsize = size * nmemb; - body = (char **)userdata; - - *body = malloc(realsize + 1); - memcpy(*body, data, realsize); - (*body)[realsize] = 0; - - return realsize; -} - -static int -https_get(char **body, const char *url) -{ - CURL *curl; - CURLcode res; - long response_code; - - curl = curl_easy_init(); - if (!curl) - { - printf("Could not initialize CURL\n"); - goto error; - } - - curl_easy_setopt(curl, CURLOPT_URL, url); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, https_write_cb); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, body); - - res = curl_easy_perform(curl); - if (res != CURLE_OK) - { - printf("CURL could not make request (%d)\n", (int)res); - goto error; - } - - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code); - if (response_code != 200) - { - printf("HTTP response code %d\n", (int)response_code); - goto error; - } - - curl_easy_cleanup(curl); - - return 0; - - error: - curl_easy_cleanup(curl); - return -1; -} - static int tcp_connect(const char *address, unsigned short port) { @@ -223,7 +166,6 @@ audio_read_cb(int fd, short what, void *arg) struct sp_callbacks callbacks = { - .https_get = https_get, .tcp_connect = tcp_connect, .tcp_disconnect = tcp_disconnect, @@ -241,20 +183,15 @@ main(int argc, char * argv[]) struct sp_credentials credentials; struct sp_metadata metadata; struct event *read_ev; + uint8_t stored_cred[256]; + size_t stored_cred_len; // struct event *stop_ev; // struct timeval tv = { 0 }; int ret; if (argc != 4) { - printf("%s spotify_path username password|token\n", argv[0]); - goto error; - } - - test_file = open("testfile.ogg", O_CREAT | O_RDWR, 0664); - if (test_file < 0) - { - printf("Error opening file: %s\n", strerror(errno)); + printf("%s spotify_path username access_token\n", argv[0]); goto error; } @@ -268,17 +205,14 @@ main(int argc, char * argv[]) goto error; } - if (strlen(argv[3]) < 100) - session = librespotc_login_password(argv[2], argv[3]); - else - session = librespotc_login_token(argv[2], argv[3]); // Length of token should be 194 + session = librespotc_login_token(argv[2], argv[3]); if (!session) { - printf("Error logging in: %s\n", librespotc_last_errmsg()); + printf("Error logging in with token: %s\n", librespotc_last_errmsg()); goto error; } - printf("\n --- Login OK --- \n"); + printf("\n--- Login with token OK ---\n\n"); ret = librespotc_credentials_get(&credentials, session); if (ret < 0) @@ -287,7 +221,30 @@ main(int argc, char * argv[]) goto error; } - printf("Username is %s\n", credentials.username); + printf("=== CREDENTIALS ===\n"); + printf("Username:\n%s\n", credentials.username); + hexdump("Stored credentials:\n", credentials.stored_cred, credentials.stored_cred_len); + printf("===================\n"); + + // "Store" the credentials + stored_cred_len = credentials.stored_cred_len; + if (stored_cred_len > sizeof(stored_cred)) + { + printf("Unexpected length of stored credentials\n"); + goto error; + } + memcpy(stored_cred, credentials.stored_cred, stored_cred_len); + + librespotc_logout(session); + + session = librespotc_login_stored_cred(argv[2], stored_cred, stored_cred_len); + if (!session) + { + printf("Error logging in with stored credentials: %s\n", librespotc_last_errmsg()); + goto error; + } + + printf("\n--- Login with stored credentials OK ---\n\n"); audio_fd = librespotc_open(argv[1], session); if (audio_fd < 0) @@ -312,6 +269,13 @@ main(int argc, char * argv[]) goto error; } + test_file = open("testfile.ogg", O_CREAT | O_RDWR, 0664); + if (test_file < 0) + { + printf("Error opening testfile.ogg: %s\n", strerror(errno)); + goto error; + } + evbase = event_base_new(); audio_buf = evbuffer_new(); @@ -329,14 +293,14 @@ main(int argc, char * argv[]) // event_free(stop_ev); event_free(read_ev); + close(test_file); + evbuffer_free(audio_buf); event_base_free(evbase); librespotc_close(audio_fd); - close(test_file); - librespotc_logout(session); librespotc_deinit(); @@ -344,10 +308,10 @@ main(int argc, char * argv[]) return 0; error: - if (audio_fd >= 0) - librespotc_close(audio_fd); if (test_file >= 0) close(test_file); + if (audio_fd >= 0) + librespotc_close(audio_fd); if (session) librespotc_logout(session); diff --git a/src/inputs/librespot-c/tests/test2.c b/src/inputs/librespot-c/tests/test2.c new file mode 100644 index 00000000..9f8a4e45 --- /dev/null +++ b/src/inputs/librespot-c/tests/test2.c @@ -0,0 +1,283 @@ +#include +#include +#include +#include +#include +#include +#include +#include // for isprint() + +#include +#include +#include + +// For file output +#include +#include + +#include +#include + +#include "librespot-c.h" + +static int audio_fd = -1; +static int test_file = -1; +static struct event_base *evbase; +static struct evbuffer *audio_buf; + +static int total_bytes; + +static void +hexdump(const char *msg, uint8_t *mem, size_t len) +{ + int i, j; + int hexdump_cols = 16; + + if (msg) + printf("%s", msg); + + for (i = 0; i < len + ((len % hexdump_cols) ? (hexdump_cols - len % hexdump_cols) : 0); i++) + { + if(i % hexdump_cols == 0) + printf("0x%06x: ", i); + + if (i < len) + printf("%02x ", 0xFF & ((char*)mem)[i]); + else + printf(" "); + + if (i % hexdump_cols == (hexdump_cols - 1)) + { + for (j = i - (hexdump_cols - 1); j <= i; j++) + { + if (j >= len) + putchar(' '); + else if (isprint(((char*)mem)[j])) + putchar(0xFF & ((char*)mem)[j]); + else + putchar('.'); + } + + putchar('\n'); + } + } +} + +static void +logmsg(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vprintf(fmt, ap); + va_end(ap); +} + +static int +tcp_connect(const char *address, unsigned short port) +{ + struct addrinfo hints = { 0 }; + struct addrinfo *servinfo; + struct addrinfo *ptr; + char strport[8]; + int fd; + int ret; + + hints.ai_socktype = SOCK_STREAM; + hints.ai_family = AF_UNSPEC; + + snprintf(strport, sizeof(strport), "%hu", port); + ret = getaddrinfo(address, strport, &hints, &servinfo); + if (ret < 0) + { + printf("Could not connect to %s (port %u): %s\n", address, port, gai_strerror(ret)); + return -1; + } + + for (ptr = servinfo; ptr; ptr = ptr->ai_next) + { + fd = socket(ptr->ai_family, SOCK_STREAM, ptr->ai_protocol); + if (fd < 0) + { + continue; + } + + ret = connect(fd, ptr->ai_addr, ptr->ai_addrlen); + if (ret < 0) + { + close(fd); + continue; + } + + break; + } + + freeaddrinfo(servinfo); + + if (!ptr) + { + printf("Could not connect to '%s' (port %u): %s\n", address, port, strerror(errno)); + return -1; + } + + printf("Connected to %s (port %u)\n", address, port); + + return fd; +} + +static void +tcp_disconnect(int fd) +{ + if (fd < 0) + return; + + close(fd); +} + +static void +progress_cb(int fd, void *arg, size_t received, size_t len) +{ + printf("Progress on fd %d is %zu/%zu\n", fd, received, len); +} + +// This thread +static void +audio_read_cb(int fd, short what, void *arg) +{ + int got; + + got = evbuffer_read(audio_buf, fd, -1); + if (got <= 0) + { + printf("Playback ended (%d)\n", got); + event_base_loopbreak(evbase); + return; + } + + total_bytes += got; + + printf("Got %d bytes of audio, total received is %d bytes\n", got, total_bytes); + + evbuffer_write(audio_buf, test_file); +} + +struct sp_callbacks callbacks = +{ + .tcp_connect = tcp_connect, + .tcp_disconnect = tcp_disconnect, + + .thread_name_set = NULL, + + .hexdump = hexdump, + .logmsg = logmsg, +}; + +int +main(int argc, char * argv[]) +{ + struct sp_session *session = NULL; + struct sp_sysinfo sysinfo = { 0 }; +// struct sp_credentials credentials; + struct sp_metadata metadata; + struct event *read_ev; + FILE *f_stored_cred = NULL; + uint8_t stored_cred[256]; + size_t stored_cred_len; +// struct event *stop_ev; +// struct timeval tv = { 0 }; + int ret; + + if (argc != 4) + { + printf("%s spotify_path username stored_credentials_file\n", argv[0]); + goto error; + } + + snprintf(sysinfo.device_id, sizeof(sysinfo.device_id), "622682995d5c1db29722de8dd85f6c3acd6fc592"); + + ret = librespotc_init(&sysinfo, &callbacks); + if (ret < 0) + { + printf("Error initializing Spotify: %s\n", librespotc_last_errmsg()); + goto error; + } + + f_stored_cred = fopen(argv[3], "rb"); + if (!f_stored_cred) + { + printf("Error opening file with stored credentials\n"); + goto error; + } + + stored_cred_len = fread(stored_cred, 1, sizeof(stored_cred), f_stored_cred); + if (stored_cred_len == 0) + { + printf("Stored credentials file is empty\n"); + goto error; + } + + session = librespotc_login_stored_cred(argv[2], stored_cred, stored_cred_len); + if (!session) + { + printf("Error logging in with stored credentials: %s\n", librespotc_last_errmsg()); + goto error; + } + + printf("\n--- Login with stored credentials OK ---\n\n"); + + audio_fd = librespotc_open(argv[1], session); + if (audio_fd < 0) + { + printf("Error opening file: %s\n", librespotc_last_errmsg()); + goto error; + } + + ret = librespotc_metadata_get(&metadata, audio_fd); + if (ret < 0) + { + printf("Error getting track metadata: %s\n", librespotc_last_errmsg()); + goto error; + } + + printf("File is open, length is %zu\n", metadata.file_len); + + test_file = open("testfile.ogg", O_CREAT | O_RDWR, 0664); + if (test_file < 0) + { + printf("Error opening testfile.ogg: %s\n", strerror(errno)); + goto error; + } + + evbase = event_base_new(); + audio_buf = evbuffer_new(); + + read_ev = event_new(evbase, audio_fd, EV_READ | EV_PERSIST, audio_read_cb, NULL); + event_add(read_ev, NULL); + + librespotc_write(audio_fd, progress_cb, NULL); + +// stop_ev = evtimer_new(evbase, stop, &audio_fd); +// tv.tv_sec = 2; +// event_add(stop_ev, &tv); + + event_base_dispatch(evbase); + +// event_free(stop_ev); + event_free(read_ev); + + close(test_file); + + evbuffer_free(audio_buf); + event_base_free(evbase); + + error: + if (audio_fd >= 0) + librespotc_close(audio_fd); + if (session) + librespotc_logout(session); + if (f_stored_cred) + fclose(f_stored_cred); + + librespotc_deinit(); + return ret; +} diff --git a/src/inputs/spotify.c b/src/inputs/spotify.c index fd3293e4..d070e16e 100644 --- a/src/inputs/spotify.c +++ b/src/inputs/spotify.c @@ -72,14 +72,14 @@ spotify_deinit(void) } int -spotify_login_token(const char *username, const char *token, const char **errmsg) +spotify_login(const char *username, const char *token, const char **errmsg) { struct spotify_backend *backend = backend_set(); - if (!backend || !backend->login_token) + if (!backend || !backend->login) return -1; - return backend->login_token(username, token, errmsg); + return backend->login(username, token, errmsg); } void diff --git a/src/inputs/spotify.h b/src/inputs/spotify.h index 027b04d3..5bfbd06c 100644 --- a/src/inputs/spotify.h +++ b/src/inputs/spotify.h @@ -16,8 +16,7 @@ struct spotify_backend { int (*init)(void); void (*deinit)(void); - int (*login)(const char *username, const char *password, const char **errmsg); - int (*login_token)(const char *username, const char *token, const char **errmsg); + int (*login)(const char *username, const char *token, const char **errmsg); void (*logout)(void); int (*relogin)(void); void (*uri_register)(const char *uri); @@ -31,7 +30,7 @@ void spotify_deinit(void); int -spotify_login_token(const char *username, const char *token, const char **errmsg); +spotify_login(const char *username, const char *token, const char **errmsg); void spotify_logout(void); diff --git a/src/inputs/spotify_librespotc.c b/src/inputs/spotify_librespotc.c index d973bf8a..7b47938e 100644 --- a/src/inputs/spotify_librespotc.c +++ b/src/inputs/spotify_librespotc.c @@ -217,40 +217,6 @@ progress_cb(int fd, void *cb_arg, size_t received, size_t len) DPRINTF(E_SPAM, L_SPOTIFY, "Progress %zu/%zu\n", received, len); } -static int -https_get_cb(char **out, const char *url) -{ - struct http_client_ctx ctx = { 0 }; - char *body; - size_t len; - int ret; - - ctx.url = url; - ctx.input_body = evbuffer_new(); - - ret = http_client_request(&ctx, NULL); - if (ret < 0 || ctx.response_code != HTTP_OK) - { - DPRINTF(E_LOG, L_SPOTIFY, "Failed to get AP list from '%s' (return %d, error code %d)\n", ctx.url, ret, ctx.response_code); - goto error; - } - - len = evbuffer_get_length(ctx.input_body); - body = malloc(len + 1); - - evbuffer_remove(ctx.input_body, body, len); - body[len] = '\0'; // For safety - - *out = body; - - evbuffer_free(ctx.input_body); - return 0; - - error: - evbuffer_free(ctx.input_body); - return -1; -} - static int tcp_connect(const char *address, unsigned short port) { @@ -289,7 +255,6 @@ hexdump_cb(const char *msg, uint8_t *data, size_t data_len) /* ------------------------ librespot-c initialization ---------------------- */ struct sp_callbacks callbacks = { - .https_get = https_get_cb, .tcp_connect = tcp_connect, .tcp_disconnect = tcp_disconnect, @@ -641,40 +606,7 @@ struct input_definition input_spotify = /* Called from other threads than the input thread */ static int -login(const char *username, const char *password, const char **errmsg) -{ - struct global_ctx *ctx = &spotify_ctx; - int ret; - - pthread_mutex_lock(&spotify_ctx_lock); - - ctx->session = librespotc_login_password(username, password); - if (!ctx->session) - goto error; - - ret = postlogin(ctx); - if (ret < 0) - goto error; - - pthread_mutex_unlock(&spotify_ctx_lock); - - return 0; - - error: - if (ctx->session) - librespotc_logout(ctx->session); - ctx->session = NULL; - - if (errmsg) - *errmsg = librespotc_last_errmsg(); - - pthread_mutex_unlock(&spotify_ctx_lock); - - return -1; -} - -static int -login_token(const char *username, const char *token, const char **errmsg) +login(const char *username, const char *token, const char **errmsg) { struct global_ctx *ctx = &spotify_ctx; int ret; @@ -782,7 +714,6 @@ status_get(struct spotify_status *status) struct spotify_backend spotify_librespotc = { .login = login, - .login_token = login_token, .logout = logout, .relogin = relogin, .status_get = status_get, diff --git a/src/library/spotify_webapi.c b/src/library/spotify_webapi.c index 24f825ef..8e8e61b8 100644 --- a/src/library/spotify_webapi.c +++ b/src/library/spotify_webapi.c @@ -2188,7 +2188,7 @@ spotifywebapi_oauth_callback(struct evkeyvalq *param, const char *redirect_uri, if (!code) { *errmsg = "Error: Didn't receive a code from Spotify"; - return -1; + goto error; } DPRINTF(E_DBG, L_SPOTIFY, "Received OAuth code: %s\n", code); @@ -2198,11 +2198,8 @@ spotifywebapi_oauth_callback(struct evkeyvalq *param, const char *redirect_uri, goto error; credentials_user_token_get(&user, &access_token); - ret = spotify_login_token(user, access_token, errmsg); - - free(user); - free(access_token); + ret = spotify_login(user, access_token, errmsg); if (ret < 0) goto error; @@ -2211,9 +2208,13 @@ spotifywebapi_oauth_callback(struct evkeyvalq *param, const char *redirect_uri, listener_notify(LISTENER_SPOTIFY); + free(user); + free(access_token); return 0; error: + free(user); + free(access_token); return -1; } From b5977b56330e635bc6a8d1ac7f05d520729d4980 Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Sat, 8 Feb 2025 23:31:25 +0100 Subject: [PATCH 05/11] [spotify] Fix for connection retry during login --- src/inputs/librespot-c/src/connection.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/inputs/librespot-c/src/connection.c b/src/inputs/librespot-c/src/connection.c index 47a72e00..a43d9922 100644 --- a/src/inputs/librespot-c/src/connection.c +++ b/src/inputs/librespot-c/src/connection.c @@ -565,7 +565,9 @@ prepare_tcp_handshake(struct sp_seq_request *request, struct sp_conn_callbacks * ret = ap_connect(&session->conn, &session->accesspoint, &session->cooldown_ts, cb, session); if (ret == SP_ERR_NOCONNECTION) { - seq_next_set(session, request->seq_type); + if (request->seq_type != SP_SEQ_LOGIN) + seq_next_set(session, request->seq_type); + session->request = seq_request_get(SP_SEQ_LOGIN, 0, session->use_legacy); return SP_OK_WAIT; } From aab49945d44b9968ed78c0d6069876a442e26a1a Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Sat, 8 Feb 2025 23:31:55 +0100 Subject: [PATCH 06/11] [misc] Distinguished logging of errors from getaddrinfo() --- src/misc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/misc.c b/src/misc.c index 8f84eb84..b7b4fe6d 100644 --- a/src/misc.c +++ b/src/misc.c @@ -340,7 +340,7 @@ net_connect_impl(const char *addr, unsigned short port, int type, const char *lo ret = getaddrinfo(addr, strport, &hints, &servinfo); if (ret < 0) { - DPRINTF(E_LOG, L_MISC, "Could not connect to '%s' at %s (port %u): %s\n", log_service_name, addr, port, gai_strerror(ret)); + DPRINTF(E_LOG, L_MISC, "Could not get '%s' address info for %s (port %u): %s\n", log_service_name, addr, port, gai_strerror(ret)); return -1; } From 2547336576f8295eddf1ca39b47c4e1a6b03b90d Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Tue, 11 Feb 2025 20:35:44 +0100 Subject: [PATCH 07/11] [spotify] Retry fix for connection retry --- src/inputs/librespot-c/src/connection.c | 26 +++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/inputs/librespot-c/src/connection.c b/src/inputs/librespot-c/src/connection.c index a43d9922..f4afa54c 100644 --- a/src/inputs/librespot-c/src/connection.c +++ b/src/inputs/librespot-c/src/connection.c @@ -340,9 +340,6 @@ ap_connect(struct sp_connection *conn, struct sp_server *server, time_t *cooldow int ret; time_t now; - if (must_resolve(server)) - RETURN_ERROR(SP_ERR_NOCONNECTION, "Cannot connect to access point, it has recently failed"); - // Protection against flooding the access points with reconnection attempts // Note that cooldown_ts can't be part of the connection struct because // the struct is reset between connection attempts. @@ -352,20 +349,33 @@ ap_connect(struct sp_connection *conn, struct sp_server *server, time_t *cooldow else if (now >= *cooldown_ts) // Last attempt was recent, so disallow more attempts for a while *cooldown_ts = now + SP_AP_COOLDOWN_SECS; else - RETURN_ERROR(SP_ERR_NOCONNECTION, "Cannot connect to access point, cooldown after disconnect is in effect"); + RETURN_ERROR(SP_ERR_NOCONNECTION, "Cannot connect to access points, cooldown after multiple disconnects"); + + // This server has recently failed, so tell caller to try another + if (must_resolve(server)) + { + sp_cb.logmsg("Server '%s' no longer valid\n", server->address); + goto retry; + } if (conn->is_connected) ap_disconnect(conn); ret = tcp_connection_make(conn, server, cb, cb_arg); if (ret < 0) - RETURN_ERROR(ret, sp_errmsg); + { + sp_cb.logmsg("Couldn't connect to '%s': %s\n", server->address, sp_errmsg); + goto retry; + } return SP_OK_DONE; error: ap_disconnect(conn); return ret; + + retry: + return SP_OK_WAIT; // Tells caller to try another } void @@ -563,7 +573,7 @@ prepare_tcp_handshake(struct sp_seq_request *request, struct sp_conn_callbacks * if (!session->conn.is_connected) { ret = ap_connect(&session->conn, &session->accesspoint, &session->cooldown_ts, cb, session); - if (ret == SP_ERR_NOCONNECTION) + if (ret == SP_OK_WAIT) // Try another server { if (request->seq_type != SP_SEQ_LOGIN) seq_next_set(session, request->seq_type); @@ -639,7 +649,7 @@ resolve_server_info_set(struct sp_server *server, const char *key, json_object * } if (!s) - RETURN_ERROR(SP_ERR_NOCONNECTION, "Response from access port resolver had no valid servers"); + RETURN_ERROR(SP_ERR_NOCONNECTION, "Response from resolver had no valid servers"); if (!is_same) { @@ -1140,7 +1150,7 @@ handle_media_get(struct sp_message *msg, struct sp_session *session) if (channel->file.len_bytes == 0 && file_size_get(channel, hres) < 0) RETURN_ERROR(SP_ERR_INVALID, "Invalid content-range, can't determine media size"); - sp_cb.logmsg("Received %zu bytes, size is %d\n", hres->body_len, channel->file.len_bytes); +// sp_cb.logmsg("Received %zu bytes, size is %d\n", hres->body_len, channel->file.len_bytes); // Not sure if the channel concept even makes sense for http, but nonetheless // we use it to stay consistent with the old tcp protocol From 038c74105250705ffa0ceef324d60fa8e20ce31d Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Sun, 23 Feb 2025 23:43:51 +0100 Subject: [PATCH 08/11] [spotify] Set the new protocol as experimental and fallback, old one as default --- src/conffile.c | 1 + src/inputs/spotify_librespotc.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/conffile.c b/src/conffile.c index da49f03d..9f0d8e48 100644 --- a/src/conffile.c +++ b/src/conffile.c @@ -217,6 +217,7 @@ static cfg_opt_t sec_spotify[] = CFG_BOOL("base_playlist_disable", cfg_false, CFGF_NONE), CFG_BOOL("artist_override", cfg_false, CFGF_NONE), CFG_BOOL("album_override", cfg_false, CFGF_NONE), + CFG_BOOL("disable_legacy_mode", cfg_false, CFGF_NONE), CFG_END() }; diff --git a/src/inputs/spotify_librespotc.c b/src/inputs/spotify_librespotc.c index 7b47938e..05cb91ae 100644 --- a/src/inputs/spotify_librespotc.c +++ b/src/inputs/spotify_librespotc.c @@ -486,6 +486,10 @@ setup(struct input_source *source) return 0; error: + // This should be removed when we don't default to legacy mode any more + DPRINTF(E_INFO, L_SPOTIFY, "Switching off Spotify legacy mode\n"); + librespotc_legacy_set(ctx->session, false); + pthread_mutex_unlock(&spotify_ctx_lock); stop(source); @@ -617,6 +621,13 @@ login(const char *username, const char *token, const char **errmsg) if (!ctx->session) goto error; + // For now, use old tcp based protocol as default unless configured not to. + // Note that setup() will switch the old protocol off on error. + if (!cfg_getbool(cfg_getsec(cfg, "spotify"), "disable_legacy_mode")) + librespotc_legacy_set(ctx->session, true); + else + DPRINTF(E_INFO, L_SPOTIFY, "Using experimental http protocol for Spotify\n"); + ret = postlogin(ctx); if (ret < 0) goto error; From 4980218fc500c73c10c163f3b829e03efff93bfb Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Mon, 24 Feb 2025 19:58:09 +0100 Subject: [PATCH 09/11] [spotify] Import version 0.5 of librespot-c --- src/inputs/librespot-c/librespot-c.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/inputs/librespot-c/librespot-c.h b/src/inputs/librespot-c/librespot-c.h index 37306470..b2efcabc 100644 --- a/src/inputs/librespot-c/librespot-c.h +++ b/src/inputs/librespot-c/librespot-c.h @@ -6,7 +6,7 @@ #include #define LIBRESPOT_C_VERSION_MAJOR 0 -#define LIBRESPOT_C_VERSION_MINOR 4 +#define LIBRESPOT_C_VERSION_MINOR 5 struct sp_session; From f587a78e22071b7256f95982fa97a194911aa88e Mon Sep 17 00:00:00 2001 From: Alain Nussbaumer Date: Tue, 25 Feb 2025 13:26:53 +0100 Subject: [PATCH 10/11] [web] Fix security issue --- web-src/package-lock.json | 897 ++++++++++++++++++++++++-------------- web-src/package.json | 2 +- 2 files changed, 563 insertions(+), 336 deletions(-) diff --git a/web-src/package-lock.json b/web-src/package-lock.json index 2eeec3d9..a135fa02 100644 --- a/web-src/package-lock.json +++ b/web-src/package-lock.json @@ -34,7 +34,7 @@ "eslint-plugin-vue": "^9.25.0", "prettier": "^3.2.5", "sass": "^1.75.0", - "vite": "^5.4.12" + "vite": "^6.2.0" } }, "node_modules/@aacassandra/vue3-progressbar": { @@ -66,12 +66,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", - "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.7" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -81,9 +81,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", - "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -94,9 +94,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", "cpu": [ "ppc64" ], @@ -107,13 +107,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", "cpu": [ "arm" ], @@ -124,13 +124,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", "cpu": [ "arm64" ], @@ -141,13 +141,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", "cpu": [ "x64" ], @@ -158,13 +158,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", "cpu": [ "arm64" ], @@ -175,13 +175,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", "cpu": [ "x64" ], @@ -192,13 +192,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", "cpu": [ "arm64" ], @@ -209,13 +209,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", "cpu": [ "x64" ], @@ -226,13 +226,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", "cpu": [ "arm" ], @@ -243,13 +243,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", "cpu": [ "arm64" ], @@ -260,13 +260,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", "cpu": [ "ia32" ], @@ -277,13 +277,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", "cpu": [ "loong64" ], @@ -294,13 +294,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", "cpu": [ "mips64el" ], @@ -311,13 +311,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", "cpu": [ "ppc64" ], @@ -328,13 +328,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", "cpu": [ "riscv64" ], @@ -345,13 +345,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", "cpu": [ "s390x" ], @@ -362,13 +362,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", "cpu": [ "x64" ], @@ -379,13 +379,30 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", "cpu": [ "x64" ], @@ -396,13 +413,30 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", "cpu": [ "x64" ], @@ -413,13 +447,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", "cpu": [ "x64" ], @@ -430,13 +464,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", "cpu": [ "arm64" ], @@ -447,13 +481,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", "cpu": [ "ia32" ], @@ -464,13 +498,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", "cpu": [ "x64" ], @@ -481,7 +515,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -527,13 +561,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", - "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.5", + "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -542,9 +576,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", - "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -555,9 +589,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz", + "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -579,9 +613,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.19.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz", - "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==", + "version": "9.21.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.21.0.tgz", + "integrity": "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==", "dev": true, "license": "MIT", "engines": { @@ -589,9 +623,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", - "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -599,13 +633,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", - "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.10.0", + "@eslint/core": "^0.12.0", "levn": "^0.4.1" }, "engines": { @@ -665,9 +699,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -842,9 +876,9 @@ } }, "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -863,25 +897,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", "cpu": [ "arm64" ], @@ -900,9 +934,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", "cpu": [ "arm64" ], @@ -921,9 +955,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", "cpu": [ "x64" ], @@ -942,9 +976,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", "cpu": [ "x64" ], @@ -963,9 +997,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", "cpu": [ "arm" ], @@ -984,9 +1018,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", "cpu": [ "arm" ], @@ -1005,9 +1039,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", "cpu": [ "arm64" ], @@ -1026,9 +1060,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", "cpu": [ "arm64" ], @@ -1047,9 +1081,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", "cpu": [ "x64" ], @@ -1068,9 +1102,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", "cpu": [ "x64" ], @@ -1089,9 +1123,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", "cpu": [ "arm64" ], @@ -1110,9 +1144,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", "cpu": [ "ia32" ], @@ -1131,9 +1165,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", "cpu": [ "x64" ], @@ -1175,9 +1209,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.0.tgz", - "integrity": "sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", + "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", "cpu": [ "arm" ], @@ -1189,9 +1223,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.0.tgz", - "integrity": "sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", + "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", "cpu": [ "arm64" ], @@ -1203,9 +1237,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.0.tgz", - "integrity": "sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", + "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", "cpu": [ "arm64" ], @@ -1217,9 +1251,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.0.tgz", - "integrity": "sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", + "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", "cpu": [ "x64" ], @@ -1231,9 +1265,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.0.tgz", - "integrity": "sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", + "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", "cpu": [ "arm64" ], @@ -1245,9 +1279,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.0.tgz", - "integrity": "sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", + "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", "cpu": [ "x64" ], @@ -1259,9 +1293,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.0.tgz", - "integrity": "sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", + "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", "cpu": [ "arm" ], @@ -1273,9 +1307,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.0.tgz", - "integrity": "sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", + "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", "cpu": [ "arm" ], @@ -1287,9 +1321,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.0.tgz", - "integrity": "sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", + "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", "cpu": [ "arm64" ], @@ -1301,9 +1335,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.0.tgz", - "integrity": "sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", + "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", "cpu": [ "arm64" ], @@ -1315,9 +1349,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.0.tgz", - "integrity": "sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", + "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", "cpu": [ "loong64" ], @@ -1329,9 +1363,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.0.tgz", - "integrity": "sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", + "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", "cpu": [ "ppc64" ], @@ -1343,9 +1377,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.0.tgz", - "integrity": "sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", + "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", "cpu": [ "riscv64" ], @@ -1357,9 +1391,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.0.tgz", - "integrity": "sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", + "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", "cpu": [ "s390x" ], @@ -1371,9 +1405,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.0.tgz", - "integrity": "sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", + "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", "cpu": [ "x64" ], @@ -1385,9 +1419,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.0.tgz", - "integrity": "sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", + "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", "cpu": [ "x64" ], @@ -1399,9 +1433,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.0.tgz", - "integrity": "sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", + "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", "cpu": [ "arm64" ], @@ -1413,9 +1447,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.0.tgz", - "integrity": "sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", + "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", "cpu": [ "ia32" ], @@ -1427,9 +1461,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.0.tgz", - "integrity": "sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", + "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", "cpu": [ "x64" ], @@ -1713,6 +1747,19 @@ "integrity": "sha512-kMu4H0Pr0VjvfsnT6viRDCgptUq0Rvy7y7PX6q+IHg1xUynsjszPjhAdal5ysAlCG5HNO+5YXxeiu92qYGQolw==", "license": "MIT" }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1895,6 +1942,20 @@ "node": ">=0.10" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -1907,10 +1968,55 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1918,32 +2024,34 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" } }, "node_modules/escape-string-regexp": { @@ -1982,22 +2090,22 @@ } }, "node_modules/eslint": { - "version": "9.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz", - "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==", + "version": "9.21.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.21.0.tgz", + "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.10.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.19.0", - "@eslint/plugin-kit": "^0.2.5", + "@eslint/config-array": "^0.19.2", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.0", + "@eslint/js": "9.21.0", + "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -2259,9 +2367,9 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, "license": "ISC", "dependencies": { @@ -2326,9 +2434,9 @@ } }, "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, @@ -2353,13 +2461,14 @@ } }, "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { @@ -2381,6 +2490,52 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -2407,6 +2562,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2417,6 +2584,45 @@ "node": ">=8" } }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2435,9 +2641,9 @@ "license": "MIT" }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2670,6 +2876,15 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdi-vue": { "version": "3.0.13", "resolved": "https://registry.npmjs.org/mdi-vue/-/mdi-vue-3.0.13.tgz", @@ -2768,9 +2983,9 @@ } }, "node_modules/mlly/node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, @@ -2971,16 +3186,16 @@ } }, "node_modules/pkg-types/node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "funding": [ { "type": "opencollective", @@ -3030,9 +3245,9 @@ } }, "node_modules/prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.2.tgz", + "integrity": "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==", "dev": true, "license": "MIT", "bin": { @@ -3083,9 +3298,9 @@ "license": "MIT" }, "node_modules/readdirp": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", - "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { @@ -3124,9 +3339,9 @@ } }, "node_modules/rollup": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.0.tgz", - "integrity": "sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", + "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3140,25 +3355,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.32.0", - "@rollup/rollup-android-arm64": "4.32.0", - "@rollup/rollup-darwin-arm64": "4.32.0", - "@rollup/rollup-darwin-x64": "4.32.0", - "@rollup/rollup-freebsd-arm64": "4.32.0", - "@rollup/rollup-freebsd-x64": "4.32.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.32.0", - "@rollup/rollup-linux-arm-musleabihf": "4.32.0", - "@rollup/rollup-linux-arm64-gnu": "4.32.0", - "@rollup/rollup-linux-arm64-musl": "4.32.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.32.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.32.0", - "@rollup/rollup-linux-riscv64-gnu": "4.32.0", - "@rollup/rollup-linux-s390x-gnu": "4.32.0", - "@rollup/rollup-linux-x64-gnu": "4.32.0", - "@rollup/rollup-linux-x64-musl": "4.32.0", - "@rollup/rollup-win32-arm64-msvc": "4.32.0", - "@rollup/rollup-win32-ia32-msvc": "4.32.0", - "@rollup/rollup-win32-x64-msvc": "4.32.0", + "@rollup/rollup-android-arm-eabi": "4.34.8", + "@rollup/rollup-android-arm64": "4.34.8", + "@rollup/rollup-darwin-arm64": "4.34.8", + "@rollup/rollup-darwin-x64": "4.34.8", + "@rollup/rollup-freebsd-arm64": "4.34.8", + "@rollup/rollup-freebsd-x64": "4.34.8", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", + "@rollup/rollup-linux-arm-musleabihf": "4.34.8", + "@rollup/rollup-linux-arm64-gnu": "4.34.8", + "@rollup/rollup-linux-arm64-musl": "4.34.8", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", + "@rollup/rollup-linux-riscv64-gnu": "4.34.8", + "@rollup/rollup-linux-s390x-gnu": "4.34.8", + "@rollup/rollup-linux-x64-gnu": "4.34.8", + "@rollup/rollup-linux-x64-musl": "4.34.8", + "@rollup/rollup-win32-arm64-msvc": "4.34.8", + "@rollup/rollup-win32-ia32-msvc": "4.34.8", + "@rollup/rollup-win32-x64-msvc": "4.34.8", "fsevents": "~2.3.2" } }, @@ -3187,9 +3402,9 @@ } }, "node_modules/sass": { - "version": "1.83.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.4.tgz", - "integrity": "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==", + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.1.tgz", + "integrity": "sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==", "dev": true, "license": "MIT", "dependencies": { @@ -3208,9 +3423,9 @@ } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "license": "ISC", "bin": { @@ -3379,21 +3594,21 @@ "license": "MIT" }, "node_modules/vite": { - "version": "5.4.14", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", - "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz", + "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -3402,19 +3617,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -3435,6 +3656,12 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, diff --git a/web-src/package.json b/web-src/package.json index 517a26bf..aa42ce7c 100644 --- a/web-src/package.json +++ b/web-src/package.json @@ -38,6 +38,6 @@ "eslint-plugin-vue": "^9.25.0", "prettier": "^3.2.5", "sass": "^1.75.0", - "vite": "^5.4.12" + "vite": "^6.2.0" } } From 07afe390f7576bb821e8b99d4b6106e9da90fdac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2025 12:27:30 +0000 Subject: [PATCH 11/11] [web] Rebuild web interface --- htdocs/assets/index.js | 79 +++++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 31 deletions(-) diff --git a/htdocs/assets/index.js b/htdocs/assets/index.js index d598cd71..b006a423 100644 --- a/htdocs/assets/index.js +++ b/htdocs/assets/index.js @@ -1,72 +1,89 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const s of o)if(s.type==="childList")for(const i of s.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(o){const s={};return o.integrity&&(s.integrity=o.integrity),o.referrerPolicy&&(s.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?s.credentials="include":o.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(o){if(o.ep)return;o.ep=!0;const s=n(o);fetch(o.href,s)}})();/** +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(s){if(s.ep)return;s.ep=!0;const o=n(s);fetch(s.href,o)}})();/** * @vue/shared v3.5.13 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**//*! #__NO_SIDE_EFFECTS__ */function Al(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Je={},ms=[],Mn=()=>{},Fz=()=>!1,ji=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),bd=e=>e.startsWith("onUpdate:"),pt=Object.assign,vd=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Vz=Object.prototype.hasOwnProperty,st=(e,t)=>Vz.call(e,t),be=Array.isArray,fs=e=>As(e)==="[object Map]",Vo=e=>As(e)==="[object Set]",$m=e=>As(e)==="[object Date]",Hz=e=>As(e)==="[object RegExp]",Oe=e=>typeof e=="function",yt=e=>typeof e=="string",or=e=>typeof e=="symbol",ft=e=>e!==null&&typeof e=="object",Cd=e=>(ft(e)||Oe(e))&&Oe(e.then)&&Oe(e.catch),Gh=Object.prototype.toString,As=e=>Gh.call(e),Uz=e=>As(e).slice(8,-1),Ol=e=>As(e)==="[object Object]",wd=e=>yt(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ps=Al(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Pl=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},jz=/-(\w)/g,qt=Pl(e=>e.replace(jz,(t,n)=>n?n.toUpperCase():"")),Bz=/\B([A-Z])/g,yn=Pl(e=>e.replace(Bz,"-$1").toLowerCase()),Bi=Pl(e=>e.charAt(0).toUpperCase()+e.slice(1)),ai=Pl(e=>e?`on${Bi(e)}`:""),an=(e,t)=>!Object.is(e,t),hs=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},Za=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Ya=e=>{const t=yt(e)?Number(e):NaN;return isNaN(t)?e:t};let Am;const Il=()=>Am||(Am=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),Wz="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol",qz=Al(Wz);function po(e){if(be(e)){const t={};for(let n=0;n{if(n){const r=n.split(Kz);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function Se(e){let t="";if(yt(e))t=e;else if(be(e))for(let n=0;nco(n,t))}const Yh=e=>!!(e&&e.__v_isRef===!0),y=e=>yt(e)?e:e==null?"":be(e)||ft(e)&&(e.toString===Gh||!Oe(e.toString))?Yh(e)?y(e.value):JSON.stringify(e,Xh,2):String(e),Xh=(e,t)=>Yh(t)?Xh(e,t.value):fs(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o],s)=>(n[ku(r,s)+" =>"]=o,n),{})}:Vo(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>ku(n))}:or(t)?ku(t):ft(t)&&!be(t)&&!Ol(t)?String(t):t,ku=(e,t="")=>{var n;return or(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +**//*! #__NO_SIDE_EFFECTS__ */function nn(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Ze={},_o=[],tn=()=>{},ri=()=>!1,Ks=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),ou=e=>e.startsWith("onUpdate:"),Je=Object.assign,iu=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},BC=Object.prototype.hasOwnProperty,lt=(e,t)=>BC.call(e,t),ve=Array.isArray,go=e=>Po(e)==="[object Map]",Xs=e=>Po(e)==="[object Set]",vm=e=>Po(e)==="[object Date]",Xy=e=>Po(e)==="[object RegExp]",$e=e=>typeof e=="function",Re=e=>typeof e=="string",An=e=>typeof e=="symbol",mt=e=>e!==null&&typeof e=="object",au=e=>(mt(e)||$e(e))&&$e(e.then)&&$e(e.catch),wf=Object.prototype.toString,Po=e=>wf.call(e),Yy=e=>Po(e).slice(8,-1),Ya=e=>Po(e)==="[object Object]",lu=e=>Re(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,as=nn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Zy=nn("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),cu=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},qC=/-(\w)/g,zt=cu(e=>e.replace(qC,(t,n)=>n?n.toUpperCase():"")),WC=/\B([A-Z])/g,pn=cu(e=>e.replace(WC,"-$1").toLowerCase()),Ys=cu(e=>e.charAt(0).toUpperCase()+e.slice(1)),yo=cu(e=>e?`on${Ys(e)}`:""),dn=(e,t)=>!Object.is(e,t),vo=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},Ea=e=>{const t=parseFloat(e);return isNaN(t)?e:t},wa=e=>{const t=Re(e)?Number(e):NaN;return isNaN(t)?e:t};let ch;const Za=()=>ch||(ch=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),GC=/^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$/;function KC(e){return GC.test(e)?`__props.${e}`:`__props[${JSON.stringify(e)}]`}function XC(e,t){return e+JSON.stringify(t,(n,r)=>typeof r=="function"?r.toString():r)}const YC={TEXT:1,1:"TEXT",CLASS:2,2:"CLASS",STYLE:4,4:"STYLE",PROPS:8,8:"PROPS",FULL_PROPS:16,16:"FULL_PROPS",NEED_HYDRATION:32,32:"NEED_HYDRATION",STABLE_FRAGMENT:64,64:"STABLE_FRAGMENT",KEYED_FRAGMENT:128,128:"KEYED_FRAGMENT",UNKEYED_FRAGMENT:256,256:"UNKEYED_FRAGMENT",NEED_PATCH:512,512:"NEED_PATCH",DYNAMIC_SLOTS:1024,1024:"DYNAMIC_SLOTS",DEV_ROOT_FRAGMENT:2048,2048:"DEV_ROOT_FRAGMENT",CACHED:-1,"-1":"CACHED",BAIL:-2,"-2":"BAIL"},ZC={1:"TEXT",2:"CLASS",4:"STYLE",8:"PROPS",16:"FULL_PROPS",32:"NEED_HYDRATION",64:"STABLE_FRAGMENT",128:"KEYED_FRAGMENT",256:"UNKEYED_FRAGMENT",512:"NEED_PATCH",1024:"DYNAMIC_SLOTS",2048:"DEV_ROOT_FRAGMENT",[-1]:"HOISTED",[-2]:"BAIL"},JC={ELEMENT:1,1:"ELEMENT",FUNCTIONAL_COMPONENT:2,2:"FUNCTIONAL_COMPONENT",STATEFUL_COMPONENT:4,4:"STATEFUL_COMPONENT",TEXT_CHILDREN:8,8:"TEXT_CHILDREN",ARRAY_CHILDREN:16,16:"ARRAY_CHILDREN",SLOTS_CHILDREN:32,32:"SLOTS_CHILDREN",TELEPORT:64,64:"TELEPORT",SUSPENSE:128,128:"SUSPENSE",COMPONENT_SHOULD_KEEP_ALIVE:256,256:"COMPONENT_SHOULD_KEEP_ALIVE",COMPONENT_KEPT_ALIVE:512,512:"COMPONENT_KEPT_ALIVE",COMPONENT:6,6:"COMPONENT"},QC={STABLE:1,1:"STABLE",DYNAMIC:2,2:"DYNAMIC",FORWARDED:3,3:"FORWARDED"},eS={1:"STABLE",2:"DYNAMIC",3:"FORWARDED"},tS="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol",xf=nn(tS),nS=xf,uh=2;function Jy(e,t=0,n=e.length){if(t=Math.max(0,Math.min(t,e.length)),n=Math.max(0,Math.min(n,e.length)),t>n)return"";let r=e.split(/(\r?\n)/);const s=r.filter((a,l)=>l%2===1);r=r.filter((a,l)=>l%2===0);let o=0;const i=[];for(let a=0;a=t){for(let l=a-uh;l<=a+uh||n>o;l++){if(l<0||l>=r.length)continue;const c=l+1;i.push(`${c}${" ".repeat(Math.max(3-String(c).length,0))}| ${r[l]}`);const d=r[l].length,m=s[l]&&s[l].length||0;if(l===a){const f=t-(o-(d+m)),p=Math.max(1,n>o?d-f:n-t);i.push(" | "+" ".repeat(f)+"^".repeat(p))}else if(l>a){if(n>o){const f=Math.max(Math.min(n-o,d),1);i.push(" | "+"^".repeat(f))}o+=d+m}}break}return i.join(` +`)}function _s(e){if(ve(e)){const t={};for(let n=0;n{if(n){const r=n.split(sS);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function iS(e){if(!e)return"";if(Re(e))return e;let t="";for(const n in e){const r=e[n];if(Re(r)||typeof r=="number"){const s=n.startsWith("--")?n:pn(n);t+=`${s}:${r};`}}return t}function Ce(e){let t="";if(Re(e))t=e;else if(ve(e))for(let n=0;n/="'\u0009\u000a\u000c\u0020]/,yd={};function fS(e){if(yd.hasOwnProperty(e))return yd[e];const t=mS.test(e);return t&&console.error(`unsafe attribute name: ${e}`),yd[e]=!t}const pS={acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},hS=nn("accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap"),_S=nn("xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan"),gS=nn("accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns");function yS(e){if(e==null)return!1;const t=typeof e;return t==="string"||t==="number"||t==="boolean"}const vS=/["'&<>]/;function bS(e){const t=""+e,n=vS.exec(t);if(!n)return t;let r="",s,o,i=0;for(o=n.index;o||--!>|?@[\\\]^`{|}~]/g;function SS(e,t){return e.replace(o1,n=>t?n==='"'?'\\\\\\"':`\\\\${n}`:`\\${n}`)}function ES(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&rms(n,t))}const i1=e=>!!(e&&e.__v_isRef===!0),y=e=>Re(e)?e:e==null?"":ve(e)||mt(e)&&(e.toString===wf||!$e(e.toString))?i1(e)?y(e.value):JSON.stringify(e,a1,2):String(e),a1=(e,t)=>i1(t)?a1(e,t.value):go(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],o)=>(n[vd(r,o)+" =>"]=s,n),{})}:Xs(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>vd(n))}:An(t)?vd(t):mt(t)&&!ve(t)&&!Ya(t)?String(t):t,vd=(e,t="")=>{var n;return An(e)?`Symbol(${(n=e.description)!=null?n:t})`:e},wS=Object.freeze(Object.defineProperty({__proto__:null,EMPTY_ARR:_o,EMPTY_OBJ:Ze,NO:ri,NOOP:tn,PatchFlagNames:ZC,PatchFlags:YC,ShapeFlags:JC,SlotFlags:QC,camelize:zt,capitalize:Ys,cssVarNameEscapeSymbolsRE:o1,def:kf,escapeHtml:bS,escapeHtmlComment:CS,extend:Je,genCacheKey:XC,genPropsAccessExp:KC,generateCodeFrame:Jy,getEscapedCssVarName:SS,getGlobalThis:Za,hasChanged:dn,hasOwn:lt,hyphenate:pn,includeBooleanAttr:Af,invokeArrayFns:vo,isArray:ve,isBooleanAttr:dS,isBuiltInDirective:Zy,isDate:vm,isFunction:$e,isGloballyAllowed:xf,isGloballyWhitelisted:nS,isHTMLTag:Qy,isIntegerKey:lu,isKnownHtmlAttr:hS,isKnownMathMLAttr:gS,isKnownSvgAttr:_S,isMap:go,isMathMLTag:t1,isModelListener:ou,isObject:mt,isOn:Ks,isPlainObject:Ya,isPromise:au,isRegExp:Xy,isRenderableAttrValue:yS,isReservedProp:as,isSSRSafeAttrName:fS,isSVGTag:e1,isSet:Xs,isSpecialBooleanAttr:s1,isString:Re,isSymbol:An,isVoidTag:n1,looseEqual:ms,looseIndexOf:Ja,looseToNumber:Ea,makeMap:nn,normalizeClass:Ce,normalizeProps:si,normalizeStyle:_s,objectToString:wf,parseStringStyle:Tf,propsToAttrMap:pS,remove:iu,slotFlagsText:eS,stringifyStyle:iS,toDisplayString:y,toHandlerKey:yo,toNumber:wa,toRawType:Yy,toTypeString:Po},Symbol.toStringTag,{value:"Module"}));/** * @vue/reactivity v3.5.13 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let sn;class Sd{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=sn,!t&&sn&&(this.index=(sn.scopes||(sn.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0)return;if(ui){let t=ui;for(ui=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;li;){let t=li;for(li=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function t_(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function n_(e){let t,n=e.depsTail,r=n;for(;r;){const o=r.prevDep;r.version===-1?(r===n&&(n=o),Td(r),eb(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=o}e.deps=t,e.depsTail=n}function bc(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(r_(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function r_(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===xi))return;e.globalVersion=xi;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!bc(e)){e.flags&=-3;return}const n=_t,r=rr;_t=e,rr=!0;try{t_(e);const o=e.fn(e._value);(t.version===0||an(o,e._value))&&(e._value=o,t.version++)}catch(o){throw t.version++,o}finally{_t=n,rr=r,n_(e),e.flags&=-3}}function Td(e,t=!1){const{dep:n,prevSub:r,nextSub:o}=e;if(r&&(r.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let s=n.computed.deps;s;s=s.nextDep)Td(s,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function eb(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}function tb(e,t){e.effect instanceof ki&&(e=e.effect.fn);const n=new ki(e);t&&pt(n,t);try{n.run()}catch(o){throw n.stop(),o}const r=n.run.bind(n);return r.effect=n,r}function nb(e){e.effect.stop()}let rr=!0;const o_=[];function ho(){o_.push(rr),rr=!1}function _o(){const e=o_.pop();rr=e===void 0?!0:e}function Om(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=_t;_t=void 0;try{t()}finally{_t=n}}}let xi=0;class rb{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Dl{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!_t||!rr||_t===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==_t)n=this.activeLink=new rb(_t,this),_t.deps?(n.prevDep=_t.depsTail,_t.depsTail.nextDep=n,_t.depsTail=n):_t.deps=_t.depsTail=n,s_(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=_t.depsTail,n.nextDep=void 0,_t.depsTail.nextDep=n,_t.depsTail=n,_t.deps===n&&(_t.deps=r)}return n}trigger(t){this.version++,xi++,this.notify(t)}notify(t){xd();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Ed()}}}function s_(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)s_(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Xa=new WeakMap,Oo=Symbol(""),vc=Symbol(""),Ei=Symbol("");function Zt(e,t,n){if(rr&&_t){let r=Xa.get(e);r||Xa.set(e,r=new Map);let o=r.get(n);o||(r.set(n,o=new Dl),o.map=r,o.key=n),o.track()}}function Or(e,t,n,r,o,s){const i=Xa.get(e);if(!i){xi++;return}const a=l=>{l&&l.trigger()};if(xd(),t==="clear")i.forEach(a);else{const l=be(e),c=l&&wd(n);if(l&&n==="length"){const d=Number(r);i.forEach((m,f)=>{(f==="length"||f===Ei||!or(f)&&f>=d)&&a(m)})}else switch((n!==void 0||i.has(void 0))&&a(i.get(n)),c&&a(i.get(Ei)),t){case"add":l?c&&a(i.get("length")):(a(i.get(Oo)),fs(e)&&a(i.get(vc)));break;case"delete":l||(a(i.get(Oo)),fs(e)&&a(i.get(vc)));break;case"set":fs(e)&&a(i.get(Oo));break}}Ed()}function ob(e,t){const n=Xa.get(e);return n&&n.get(t)}function Wo(e){const t=Xe(e);return t===e?t:(Zt(t,"iterate",Ei),En(e)?t:t.map(Yt))}function Rl(e){return Zt(e=Xe(e),"iterate",Ei),e}const sb={__proto__:null,[Symbol.iterator](){return Eu(this,Symbol.iterator,Yt)},concat(...e){return Wo(this).concat(...e.map(t=>be(t)?Wo(t):t))},entries(){return Eu(this,"entries",e=>(e[1]=Yt(e[1]),e))},every(e,t){return xr(this,"every",e,t,void 0,arguments)},filter(e,t){return xr(this,"filter",e,t,n=>n.map(Yt),arguments)},find(e,t){return xr(this,"find",e,t,Yt,arguments)},findIndex(e,t){return xr(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return xr(this,"findLast",e,t,Yt,arguments)},findLastIndex(e,t){return xr(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return xr(this,"forEach",e,t,void 0,arguments)},includes(...e){return Tu(this,"includes",e)},indexOf(...e){return Tu(this,"indexOf",e)},join(e){return Wo(this).join(e)},lastIndexOf(...e){return Tu(this,"lastIndexOf",e)},map(e,t){return xr(this,"map",e,t,void 0,arguments)},pop(){return Hs(this,"pop")},push(...e){return Hs(this,"push",e)},reduce(e,...t){return Pm(this,"reduce",e,t)},reduceRight(e,...t){return Pm(this,"reduceRight",e,t)},shift(){return Hs(this,"shift")},some(e,t){return xr(this,"some",e,t,void 0,arguments)},splice(...e){return Hs(this,"splice",e)},toReversed(){return Wo(this).toReversed()},toSorted(e){return Wo(this).toSorted(e)},toSpliced(...e){return Wo(this).toSpliced(...e)},unshift(...e){return Hs(this,"unshift",e)},values(){return Eu(this,"values",Yt)}};function Eu(e,t,n){const r=Rl(e),o=r[t]();return r!==e&&!En(e)&&(o._next=o.next,o.next=()=>{const s=o._next();return s.value&&(s.value=n(s.value)),s}),o}const ib=Array.prototype;function xr(e,t,n,r,o,s){const i=Rl(e),a=i!==e&&!En(e),l=i[t];if(l!==ib[t]){const m=l.apply(e,s);return a?Yt(m):m}let c=n;i!==e&&(a?c=function(m,f){return n.call(this,Yt(m),f,e)}:n.length>2&&(c=function(m,f){return n.call(this,m,f,e)}));const d=l.call(i,c,r);return a&&o?o(d):d}function Pm(e,t,n,r){const o=Rl(e);let s=n;return o!==e&&(En(e)?n.length>3&&(s=function(i,a,l){return n.call(this,i,a,l,e)}):s=function(i,a,l){return n.call(this,i,Yt(a),l,e)}),o[t](s,...r)}function Tu(e,t,n){const r=Xe(e);Zt(r,"iterate",Ei);const o=r[t](...n);return(o===-1||o===!1)&&Vl(n[0])?(n[0]=Xe(n[0]),r[t](...n)):o}function Hs(e,t,n=[]){ho(),xd();const r=Xe(e)[t].apply(e,n);return Ed(),_o(),r}const ab=Al("__proto__,__v_isRef,__isVue"),i_=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(or));function lb(e){or(e)||(e=String(e));const t=Xe(this);return Zt(t,"has",e),t.hasOwnProperty(e)}class a_{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n==="__v_skip")return t.__v_skip;const o=this._isReadonly,s=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return s;if(n==="__v_raw")return r===(o?s?f_:m_:s?d_:c_).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=be(t);if(!o){let l;if(i&&(l=sb[n]))return l;if(n==="hasOwnProperty")return lb}const a=Reflect.get(t,n,St(t)?t:r);return(or(n)?i_.has(n):ab(n))||(o||Zt(t,"get",n),s)?a:St(a)?i&&wd(n)?a:a.value:ft(a)?o?Ad(a):Os(a):a}}class l_ extends a_{constructor(t=!1){super(!1,t)}set(t,n,r,o){let s=t[n];if(!this._isShallow){const l=mo(s);if(!En(r)&&!mo(r)&&(s=Xe(s),r=Xe(r)),!be(t)&&St(s)&&!St(r))return l?!1:(s.value=r,!0)}const i=be(t)&&wd(n)?Number(n)e,oa=e=>Reflect.getPrototypeOf(e);function fb(e,t,n){return function(...r){const o=this.__v_raw,s=Xe(o),i=fs(s),a=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,c=o[e](...r),d=n?Cc:t?wc:Yt;return!t&&Zt(s,"iterate",l?vc:Oo),{next(){const{value:m,done:f}=c.next();return f?{value:m,done:f}:{value:a?[d(m[0]),d(m[1])]:d(m),done:f}},[Symbol.iterator](){return this}}}}function sa(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function pb(e,t){const n={get(o){const s=this.__v_raw,i=Xe(s),a=Xe(o);e||(an(o,a)&&Zt(i,"get",o),Zt(i,"get",a));const{has:l}=oa(i),c=t?Cc:e?wc:Yt;if(l.call(i,o))return c(s.get(o));if(l.call(i,a))return c(s.get(a));s!==i&&s.get(o)},get size(){const o=this.__v_raw;return!e&&Zt(Xe(o),"iterate",Oo),Reflect.get(o,"size",o)},has(o){const s=this.__v_raw,i=Xe(s),a=Xe(o);return e||(an(o,a)&&Zt(i,"has",o),Zt(i,"has",a)),o===a?s.has(o):s.has(o)||s.has(a)},forEach(o,s){const i=this,a=i.__v_raw,l=Xe(a),c=t?Cc:e?wc:Yt;return!e&&Zt(l,"iterate",Oo),a.forEach((d,m)=>o.call(s,c(d),c(m),i))}};return pt(n,e?{add:sa("add"),set:sa("set"),delete:sa("delete"),clear:sa("clear")}:{add(o){!t&&!En(o)&&!mo(o)&&(o=Xe(o));const s=Xe(this);return oa(s).has.call(s,o)||(s.add(o),Or(s,"add",o,o)),this},set(o,s){!t&&!En(s)&&!mo(s)&&(s=Xe(s));const i=Xe(this),{has:a,get:l}=oa(i);let c=a.call(i,o);c||(o=Xe(o),c=a.call(i,o));const d=l.call(i,o);return i.set(o,s),c?an(s,d)&&Or(i,"set",o,s):Or(i,"add",o,s),this},delete(o){const s=Xe(this),{has:i,get:a}=oa(s);let l=i.call(s,o);l||(o=Xe(o),l=i.call(s,o)),a&&a.call(s,o);const c=s.delete(o);return l&&Or(s,"delete",o,void 0),c},clear(){const o=Xe(this),s=o.size!==0,i=o.clear();return s&&Or(o,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(o=>{n[o]=fb(o,e,t)}),n}function Ml(e,t){const n=pb(e,t);return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(st(n,o)&&o in r?n:r,o,s)}const hb={get:Ml(!1,!1)},_b={get:Ml(!1,!0)},gb={get:Ml(!0,!1)},yb={get:Ml(!0,!0)},c_=new WeakMap,d_=new WeakMap,m_=new WeakMap,f_=new WeakMap;function zb(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function bb(e){return e.__v_skip||!Object.isExtensible(e)?0:zb(Uz(e))}function Os(e){return mo(e)?e:Fl(e,!1,ub,hb,c_)}function $d(e){return Fl(e,!1,db,_b,d_)}function Ad(e){return Fl(e,!0,cb,gb,m_)}function vb(e){return Fl(e,!0,mb,yb,f_)}function Fl(e,t,n,r,o){if(!ft(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=bb(e);if(i===0)return e;const a=new Proxy(e,i===2?r:n);return o.set(e,a),a}function vr(e){return mo(e)?vr(e.__v_raw):!!(e&&e.__v_isReactive)}function mo(e){return!!(e&&e.__v_isReadonly)}function En(e){return!!(e&&e.__v_isShallow)}function Vl(e){return e?!!e.__v_raw:!1}function Xe(e){const t=e&&e.__v_raw;return t?Xe(t):e}function Hl(e){return!st(e,"__v_skip")&&Object.isExtensible(e)&&Kh(e,"__v_skip",!0),e}const Yt=e=>ft(e)?Os(e):e,wc=e=>ft(e)?Ad(e):e;function St(e){return e?e.__v_isRef===!0:!1}function Fn(e){return p_(e,!1)}function Ul(e){return p_(e,!0)}function p_(e,t){return St(e)?e:new Cb(e,t)}class Cb{constructor(t,n){this.dep=new Dl,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:Xe(t),this._value=n?t:Yt(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||En(t)||mo(t);t=r?t:Xe(t),an(t,n)&&(this._rawValue=t,this._value=r?t:Yt(t),this.dep.trigger())}}function wb(e){e.dep&&e.dep.trigger()}function zn(e){return St(e)?e.value:e}function Sb(e){return Oe(e)?e():zn(e)}const kb={get:(e,t,n)=>t==="__v_raw"?e:zn(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return St(o)&&!St(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function Od(e){return vr(e)?e:new Proxy(e,kb)}class xb{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Dl,{get:r,set:o}=t(n.track.bind(n),n.trigger.bind(n));this._get=r,this._set=o}get value(){return this._value=this._get()}set value(t){this._set(t)}}function h_(e){return new xb(e)}function __(e){const t=be(e)?new Array(e.length):{};for(const n in e)t[n]=g_(e,n);return t}class Eb{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return ob(Xe(this._object),this._key)}}class Tb{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function $b(e,t,n){return St(e)?e:Oe(e)?new Tb(e):ft(e)&&arguments.length>1?g_(e,t,n):Fn(e)}function g_(e,t,n){const r=e[t];return St(r)?r:new Eb(e,t,n)}class Ab{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Dl(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=xi-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&_t!==this)return e_(this,!0),!0}get value(){const t=this.dep.track();return r_(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Ob(e,t,n=!1){let r,o;return Oe(e)?r=e:(r=e.get,o=e.set),new Ab(r,o,n)}const Pb={GET:"get",HAS:"has",ITERATE:"iterate"},Ib={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"},ia={},Ja=new WeakMap;let Jr;function Lb(){return Jr}function y_(e,t=!1,n=Jr){if(n){let r=Ja.get(n);r||Ja.set(n,r=[]),r.push(e)}}function Nb(e,t,n=Je){const{immediate:r,deep:o,once:s,scheduler:i,augmentJob:a,call:l}=n,c=z=>o?z:En(z)||o===!1||o===0?Pr(z,1):Pr(z);let d,m,f,p,h=!1,_=!1;if(St(e)?(m=()=>e.value,h=En(e)):vr(e)?(m=()=>c(e),h=!0):be(e)?(_=!0,h=e.some(z=>vr(z)||En(z)),m=()=>e.map(z=>{if(St(z))return z.value;if(vr(z))return c(z);if(Oe(z))return l?l(z,2):z()})):Oe(e)?t?m=l?()=>l(e,2):e:m=()=>{if(f){ho();try{f()}finally{_o()}}const z=Jr;Jr=d;try{return l?l(e,3,[p]):e(p)}finally{Jr=z}}:m=Mn,t&&o){const z=m,S=o===!0?1/0:o;m=()=>Pr(z(),S)}const b=kd(),C=()=>{d.stop(),b&&b.active&&vd(b.effects,d)};if(s&&t){const z=t;t=(...S)=>{z(...S),C()}}let w=_?new Array(e.length).fill(ia):ia;const g=z=>{if(!(!(d.flags&1)||!d.dirty&&!z))if(t){const S=d.run();if(o||h||(_?S.some((k,L)=>an(k,w[L])):an(S,w))){f&&f();const k=Jr;Jr=d;try{const L=[S,w===ia?void 0:_&&w[0]===ia?[]:w,p];l?l(t,3,L):t(...L),w=S}finally{Jr=k}}}else d.run()};return a&&a(g),d=new ki(m),d.scheduler=i?()=>i(g,!1):g,p=z=>y_(z,!1,d),f=d.onStop=()=>{const z=Ja.get(d);if(z){if(l)l(z,4);else for(const S of z)S();Ja.delete(d)}},t?r?g(!0):w=d.run():i?i(g.bind(null,!0),!0):d.run(),C.pause=d.pause.bind(d),C.resume=d.resume.bind(d),C.stop=C,C}function Pr(e,t=1/0,n){if(t<=0||!ft(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,St(e))Pr(e.value,t,n);else if(be(e))for(let r=0;r{Pr(r,t,n)});else if(Ol(e)){for(const r in e)Pr(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Pr(e[r],t,n)}return e}/** +**/let En;class Of{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=En,!t&&En&&(this.index=(En.scopes||(En.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0)return;if(la){let t=la;for(la=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;aa;){let t=aa;for(aa=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function d1(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function m1(e){let t,n=e.depsTail,r=n;for(;r;){const s=r.prevDep;r.version===-1?(r===n&&(n=s),Pf(r),kS(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=s}e.deps=t,e.depsTail=n}function bm(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(f1(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function f1(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===xa))return;e.globalVersion=xa;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!bm(e)){e.flags&=-3;return}const n=bt,r=xr;bt=e,xr=!0;try{d1(e);const s=e.fn(e._value);(t.version===0||dn(s,e._value))&&(e._value=s,t.version++)}catch(s){throw t.version++,s}finally{bt=n,xr=r,m1(e),e.flags&=-3}}function Pf(e,t=!1){const{dep:n,prevSub:r,nextSub:s}=e;if(r&&(r.nextSub=s,e.prevSub=void 0),s&&(s.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let o=n.computed.deps;o;o=o.nextDep)Pf(o,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function kS(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}function xS(e,t){e.effect instanceof ka&&(e=e.effect.fn);const n=new ka(e);t&&Je(n,t);try{n.run()}catch(s){throw n.stop(),s}const r=n.run.bind(n);return r.effect=n,r}function TS(e){e.effect.stop()}let xr=!0;const p1=[];function Zs(){p1.push(xr),xr=!1}function Js(){const e=p1.pop();xr=e===void 0?!0:e}function dh(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=bt;bt=void 0;try{t()}finally{bt=n}}}let xa=0;class AS{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class du{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!bt||!xr||bt===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==bt)n=this.activeLink=new AS(bt,this),bt.deps?(n.prevDep=bt.depsTail,bt.depsTail.nextDep=n,bt.depsTail=n):bt.deps=bt.depsTail=n,h1(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=bt.depsTail,n.nextDep=void 0,bt.depsTail.nextDep=n,bt.depsTail=n,bt.deps===n&&(bt.deps=r)}return n}trigger(t){this.version++,xa++,this.notify(t)}notify(t){Nf();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{If()}}}function h1(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)h1(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const vc=new WeakMap,bo=Symbol(""),zm=Symbol(""),Ta=Symbol("");function mn(e,t,n){if(xr&&bt){let r=vc.get(e);r||vc.set(e,r=new Map);let s=r.get(n);s||(r.set(n,s=new du),s.map=r,s.key=n),s.track()}}function ns(e,t,n,r,s,o){const i=vc.get(e);if(!i){xa++;return}const a=l=>{l&&l.trigger()};if(Nf(),t==="clear")i.forEach(a);else{const l=ve(e),c=l&&lu(n);if(l&&n==="length"){const d=Number(r);i.forEach((m,f)=>{(f==="length"||f===Ta||!An(f)&&f>=d)&&a(m)})}else switch((n!==void 0||i.has(void 0))&&a(i.get(n)),c&&a(i.get(Ta)),t){case"add":l?c&&a(i.get("length")):(a(i.get(bo)),go(e)&&a(i.get(zm)));break;case"delete":l||(a(i.get(bo)),go(e)&&a(i.get(zm)));break;case"set":go(e)&&a(i.get(bo));break}}If()}function OS(e,t){const n=vc.get(e);return n&&n.get(t)}function Fo(e){const t=nt(e);return t===e?t:(mn(t,"iterate",Ta),Yn(e)?t:t.map(fn))}function mu(e){return mn(e=nt(e),"iterate",Ta),e}const $S={__proto__:null,[Symbol.iterator](){return zd(this,Symbol.iterator,fn)},concat(...e){return Fo(this).concat(...e.map(t=>ve(t)?Fo(t):t))},entries(){return zd(this,"entries",e=>(e[1]=fn(e[1]),e))},every(e,t){return Xr(this,"every",e,t,void 0,arguments)},filter(e,t){return Xr(this,"filter",e,t,n=>n.map(fn),arguments)},find(e,t){return Xr(this,"find",e,t,fn,arguments)},findIndex(e,t){return Xr(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Xr(this,"findLast",e,t,fn,arguments)},findLastIndex(e,t){return Xr(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Xr(this,"forEach",e,t,void 0,arguments)},includes(...e){return Cd(this,"includes",e)},indexOf(...e){return Cd(this,"indexOf",e)},join(e){return Fo(this).join(e)},lastIndexOf(...e){return Cd(this,"lastIndexOf",e)},map(e,t){return Xr(this,"map",e,t,void 0,arguments)},pop(){return Ui(this,"pop")},push(...e){return Ui(this,"push",e)},reduce(e,...t){return mh(this,"reduce",e,t)},reduceRight(e,...t){return mh(this,"reduceRight",e,t)},shift(){return Ui(this,"shift")},some(e,t){return Xr(this,"some",e,t,void 0,arguments)},splice(...e){return Ui(this,"splice",e)},toReversed(){return Fo(this).toReversed()},toSorted(e){return Fo(this).toSorted(e)},toSpliced(...e){return Fo(this).toSpliced(...e)},unshift(...e){return Ui(this,"unshift",e)},values(){return zd(this,"values",fn)}};function zd(e,t,n){const r=mu(e),s=r[t]();return r!==e&&!Yn(e)&&(s._next=s.next,s.next=()=>{const o=s._next();return o.value&&(o.value=n(o.value)),o}),s}const NS=Array.prototype;function Xr(e,t,n,r,s,o){const i=mu(e),a=i!==e&&!Yn(e),l=i[t];if(l!==NS[t]){const m=l.apply(e,o);return a?fn(m):m}let c=n;i!==e&&(a?c=function(m,f){return n.call(this,fn(m),f,e)}:n.length>2&&(c=function(m,f){return n.call(this,m,f,e)}));const d=l.call(i,c,r);return a&&s?s(d):d}function mh(e,t,n,r){const s=mu(e);let o=n;return s!==e&&(Yn(e)?n.length>3&&(o=function(i,a,l){return n.call(this,i,a,l,e)}):o=function(i,a,l){return n.call(this,i,fn(a),l,e)}),s[t](o,...r)}function Cd(e,t,n){const r=nt(e);mn(r,"iterate",Ta);const s=r[t](...n);return(s===-1||s===!1)&&hu(n[0])?(n[0]=nt(n[0]),r[t](...n)):s}function Ui(e,t,n=[]){Zs(),Nf();const r=nt(e)[t].apply(e,n);return If(),Js(),r}const IS=nn("__proto__,__v_isRef,__isVue"),_1=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(An));function PS(e){An(e)||(e=String(e));const t=nt(this);return mn(t,"has",e),t.hasOwnProperty(e)}class g1{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n==="__v_skip")return t.__v_skip;const s=this._isReadonly,o=this._isShallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return o;if(n==="__v_raw")return r===(s?o?S1:C1:o?z1:b1).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=ve(t);if(!s){let l;if(i&&(l=$S[n]))return l;if(n==="hasOwnProperty")return PS}const a=Reflect.get(t,n,Ot(t)?t:r);return(An(n)?_1.has(n):IS(n))||(s||mn(t,"get",n),o)?a:Ot(a)?i&&lu(n)?a:a.value:mt(a)?s?Rf(a):Oi(a):a}}class y1 extends g1{constructor(t=!1){super(!1,t)}set(t,n,r,s){let o=t[n];if(!this._isShallow){const l=qs(o);if(!Yn(r)&&!qs(r)&&(o=nt(o),r=nt(r)),!ve(t)&&Ot(o)&&!Ot(r))return l?!1:(o.value=r,!0)}const i=ve(t)&&lu(n)?Number(n)e,gl=e=>Reflect.getPrototypeOf(e);function FS(e,t,n){return function(...r){const s=this.__v_raw,o=nt(s),i=go(o),a=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,c=s[e](...r),d=n?Cm:t?Sm:fn;return!t&&mn(o,"iterate",l?zm:bo),{next(){const{value:m,done:f}=c.next();return f?{value:m,done:f}:{value:a?[d(m[0]),d(m[1])]:d(m),done:f}},[Symbol.iterator](){return this}}}}function yl(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function VS(e,t){const n={get(s){const o=this.__v_raw,i=nt(o),a=nt(s);e||(dn(s,a)&&mn(i,"get",s),mn(i,"get",a));const{has:l}=gl(i),c=t?Cm:e?Sm:fn;if(l.call(i,s))return c(o.get(s));if(l.call(i,a))return c(o.get(a));o!==i&&o.get(s)},get size(){const s=this.__v_raw;return!e&&mn(nt(s),"iterate",bo),Reflect.get(s,"size",s)},has(s){const o=this.__v_raw,i=nt(o),a=nt(s);return e||(dn(s,a)&&mn(i,"has",s),mn(i,"has",a)),s===a?o.has(s):o.has(s)||o.has(a)},forEach(s,o){const i=this,a=i.__v_raw,l=nt(a),c=t?Cm:e?Sm:fn;return!e&&mn(l,"iterate",bo),a.forEach((d,m)=>s.call(o,c(d),c(m),i))}};return Je(n,e?{add:yl("add"),set:yl("set"),delete:yl("delete"),clear:yl("clear")}:{add(s){!t&&!Yn(s)&&!qs(s)&&(s=nt(s));const o=nt(this);return gl(o).has.call(o,s)||(o.add(s),ns(o,"add",s,s)),this},set(s,o){!t&&!Yn(o)&&!qs(o)&&(o=nt(o));const i=nt(this),{has:a,get:l}=gl(i);let c=a.call(i,s);c||(s=nt(s),c=a.call(i,s));const d=l.call(i,s);return i.set(s,o),c?dn(o,d)&&ns(i,"set",s,o):ns(i,"add",s,o),this},delete(s){const o=nt(this),{has:i,get:a}=gl(o);let l=i.call(o,s);l||(s=nt(s),l=i.call(o,s)),a&&a.call(o,s);const c=o.delete(s);return l&&ns(o,"delete",s,void 0),c},clear(){const s=nt(this),o=s.size!==0,i=s.clear();return o&&ns(s,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(s=>{n[s]=FS(s,e,t)}),n}function fu(e,t){const n=VS(e,t);return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(lt(n,s)&&s in r?n:r,s,o)}const HS={get:fu(!1,!1)},US={get:fu(!1,!0)},jS={get:fu(!0,!1)},BS={get:fu(!0,!0)},b1=new WeakMap,z1=new WeakMap,C1=new WeakMap,S1=new WeakMap;function qS(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function WS(e){return e.__v_skip||!Object.isExtensible(e)?0:qS(Yy(e))}function Oi(e){return qs(e)?e:pu(e,!1,LS,HS,b1)}function Lf(e){return pu(e,!1,DS,US,z1)}function Rf(e){return pu(e,!0,RS,jS,C1)}function GS(e){return pu(e,!0,MS,BS,S1)}function pu(e,t,n,r,s){if(!mt(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=s.get(e);if(o)return o;const i=WS(e);if(i===0)return e;const a=new Proxy(e,i===2?r:n);return s.set(e,a),a}function Br(e){return qs(e)?Br(e.__v_raw):!!(e&&e.__v_isReactive)}function qs(e){return!!(e&&e.__v_isReadonly)}function Yn(e){return!!(e&&e.__v_isShallow)}function hu(e){return e?!!e.__v_raw:!1}function nt(e){const t=e&&e.__v_raw;return t?nt(t):e}function _u(e){return!lt(e,"__v_skip")&&Object.isExtensible(e)&&kf(e,"__v_skip",!0),e}const fn=e=>mt(e)?Oi(e):e,Sm=e=>mt(e)?Rf(e):e;function Ot(e){return e?e.__v_isRef===!0:!1}function ar(e){return E1(e,!1)}function gu(e){return E1(e,!0)}function E1(e,t){return Ot(e)?e:new KS(e,t)}class KS{constructor(t,n){this.dep=new du,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:nt(t),this._value=n?t:fn(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||Yn(t)||qs(t);t=r?t:nt(t),dn(t,n)&&(this._rawValue=t,this._value=r?t:fn(t),this.dep.trigger())}}function XS(e){e.dep&&e.dep.trigger()}function Fn(e){return Ot(e)?e.value:e}function YS(e){return $e(e)?e():Fn(e)}const ZS={get:(e,t,n)=>t==="__v_raw"?e:Fn(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return Ot(s)&&!Ot(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function Df(e){return Br(e)?e:new Proxy(e,ZS)}class JS{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new du,{get:r,set:s}=t(n.track.bind(n),n.trigger.bind(n));this._get=r,this._set=s}get value(){return this._value=this._get()}set value(t){this._set(t)}}function w1(e){return new JS(e)}function k1(e){const t=ve(e)?new Array(e.length):{};for(const n in e)t[n]=x1(e,n);return t}class QS{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return OS(nt(this._object),this._key)}}class eE{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function tE(e,t,n){return Ot(e)?e:$e(e)?new eE(e):mt(e)&&arguments.length>1?x1(e,t,n):ar(e)}function x1(e,t,n){const r=e[t];return Ot(r)?r:new QS(e,t,n)}class nE{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new du(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=xa-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&bt!==this)return u1(this,!0),!0}get value(){const t=this.dep.track();return f1(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function rE(e,t,n=!1){let r,s;return $e(e)?r=e:(r=e.get,s=e.set),new nE(r,s,n)}const sE={GET:"get",HAS:"has",ITERATE:"iterate"},oE={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"},vl={},bc=new WeakMap;let Os;function iE(){return Os}function T1(e,t=!1,n=Os){if(n){let r=bc.get(n);r||bc.set(n,r=[]),r.push(e)}}function aE(e,t,n=Ze){const{immediate:r,deep:s,once:o,scheduler:i,augmentJob:a,call:l}=n,c=b=>s?b:Yn(b)||s===!1||s===0?rs(b,1):rs(b);let d,m,f,p,h=!1,_=!1;if(Ot(e)?(m=()=>e.value,h=Yn(e)):Br(e)?(m=()=>c(e),h=!0):ve(e)?(_=!0,h=e.some(b=>Br(b)||Yn(b)),m=()=>e.map(b=>{if(Ot(b))return b.value;if(Br(b))return c(b);if($e(b))return l?l(b,2):b()})):$e(e)?t?m=l?()=>l(e,2):e:m=()=>{if(f){Zs();try{f()}finally{Js()}}const b=Os;Os=d;try{return l?l(e,3,[p]):e(p)}finally{Os=b}}:m=tn,t&&s){const b=m,E=s===!0?1/0:s;m=()=>rs(b(),E)}const v=$f(),C=()=>{d.stop(),v&&v.active&&iu(v.effects,d)};if(o&&t){const b=t;t=(...E)=>{b(...E),C()}}let S=_?new Array(e.length).fill(vl):vl;const g=b=>{if(!(!(d.flags&1)||!d.dirty&&!b))if(t){const E=d.run();if(s||h||(_?E.some((w,P)=>dn(w,S[P])):dn(E,S))){f&&f();const w=Os;Os=d;try{const P=[E,S===vl?void 0:_&&S[0]===vl?[]:S,p];l?l(t,3,P):t(...P),S=E}finally{Os=w}}}else d.run()};return a&&a(g),d=new ka(m),d.scheduler=i?()=>i(g,!1):g,p=b=>T1(b,!1,d),f=d.onStop=()=>{const b=bc.get(d);if(b){if(l)l(b,4);else for(const E of b)E();bc.delete(d)}},t?r?g(!0):S=d.run():i?i(g.bind(null,!0),!0):d.run(),C.pause=d.pause.bind(d),C.resume=d.resume.bind(d),C.stop=C,C}function rs(e,t=1/0,n){if(t<=0||!mt(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,Ot(e))rs(e.value,t,n);else if(ve(e))for(let r=0;r{rs(r,t,n)});else if(Ya(e)){for(const r in e)rs(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&rs(e[r],t,n)}return e}/** * @vue/runtime-core v3.5.13 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/const z_=[];function Db(e){z_.push(e)}function Rb(){z_.pop()}function Mb(e,t){}const Fb={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE",APP_UNMOUNT_CLEANUP:16,16:"APP_UNMOUNT_CLEANUP"},Vb={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush",15:"component update",16:"app unmount cleanup function"};function Ps(e,t,n,r){try{return r?e(...r):e()}catch(o){Ho(o,t,n)}}function Un(e,t,n,r){if(Oe(e)){const o=Ps(e,t,n,r);return o&&Cd(o)&&o.catch(s=>{Ho(s,t,n)}),o}if(be(e)){const o=[];for(let s=0;s>>1,o=ln[r],s=$i(o);s=$i(n)?ln.push(e):ln.splice(Ub(t),0,e),e.flags|=1,v_()}}function v_(){Qa||(Qa=b_.then(C_))}function Ti(e){be(e)?_s.push(...e):Qr&&e.id===-1?Qr.splice(ts+1,0,e):e.flags&1||(_s.push(e),e.flags|=1),v_()}function Im(e,t,n=_r+1){for(;n$i(n)-$i(r));if(_s.length=0,Qr){Qr.push(...t);return}for(Qr=t,ts=0;tse.id==null?e.flags&2?-1:1/0:e.id;function C_(e){try{for(_r=0;_rns.emit(o,...s)),aa=[]):typeof window<"u"&&window.HTMLElement&&!((r=(n=window.navigator)==null?void 0:n.userAgent)!=null&&r.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(s=>{w_(s,t)}),setTimeout(()=>{ns||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,aa=[])},3e3)):aa=[]}let Ht=null,jl=null;function Ai(e){const t=Ht;return Ht=e,jl=e&&e.type.__scopeId||null,t}function jb(e){jl=e}function Bb(){jl=null}const Wb=e=>N;function N(e,t=Ht,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&Oc(-1);const s=Ai(t);let i;try{i=e(...o)}finally{Ai(s),r._d&&Oc(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function gt(e,t){if(Ht===null)return e;const n=Ki(Ht),r=e.dirs||(e.dirs=[]);for(let o=0;oe.__isTeleport,ci=e=>e&&(e.disabled||e.disabled===""),Lm=e=>e&&(e.defer||e.defer===""),Nm=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Dm=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Sc=(e,t)=>{const n=e&&e.to;return yt(n)?t?t(n):null:n},x_={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,s,i,a,l,c){const{mc:d,pc:m,pbc:f,o:{insert:p,querySelector:h,createText:_,createComment:b}}=c,C=ci(t.props);let{shapeFlag:w,children:g,dynamicChildren:z}=t;if(e==null){const S=t.el=_(""),k=t.anchor=_("");p(S,n,r),p(k,n,r);const L=(T,F)=>{w&16&&(o&&o.isCE&&(o.ce._teleportTarget=T),d(g,T,F,o,s,i,a,l))},D=()=>{const T=t.target=Sc(t.props,h),F=E_(T,t,_,p);T&&(i!=="svg"&&Nm(T)?i="svg":i!=="mathml"&&Dm(T)&&(i="mathml"),C||(L(T,F),Pa(t,!1)))};C&&(L(n,k),Pa(t,!0)),Lm(t.props)?Ft(()=>{D(),t.el.__isMounted=!0},s):D()}else{if(Lm(t.props)&&!e.el.__isMounted){Ft(()=>{x_.process(e,t,n,r,o,s,i,a,l,c),delete e.el.__isMounted},s);return}t.el=e.el,t.targetStart=e.targetStart;const S=t.anchor=e.anchor,k=t.target=e.target,L=t.targetAnchor=e.targetAnchor,D=ci(e.props),T=D?n:k,F=D?S:L;if(i==="svg"||Nm(k)?i="svg":(i==="mathml"||Dm(k))&&(i="mathml"),z?(f(e.dynamicChildren,z,T,o,s,i,a),Bd(e,t,!0)):l||m(e,t,T,F,o,s,i,a,!1),C)D?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):la(t,n,S,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const G=t.target=Sc(t.props,h);G&&la(t,G,null,c,0)}else D&&la(t,k,L,c,1);Pa(t,C)}},remove(e,t,n,{um:r,o:{remove:o}},s){const{shapeFlag:i,children:a,anchor:l,targetStart:c,targetAnchor:d,target:m,props:f}=e;if(m&&(o(c),o(d)),s&&o(l),i&16){const p=s||!ci(f);for(let h=0;h{e.isMounted=!0}),Gl(()=>{e.isUnmounting=!0}),e}const Pn=[Function,Array],Ld={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Pn,onEnter:Pn,onAfterEnter:Pn,onEnterCancelled:Pn,onBeforeLeave:Pn,onLeave:Pn,onAfterLeave:Pn,onLeaveCancelled:Pn,onBeforeAppear:Pn,onAppear:Pn,onAfterAppear:Pn,onAppearCancelled:Pn},T_=e=>{const t=e.subTree;return t.component?T_(t.component):t},Gb={name:"BaseTransition",props:Ld,setup(e,{slots:t}){const n=cn(),r=Id();return()=>{const o=t.default&&Bl(t.default(),!0);if(!o||!o.length)return;const s=$_(o),i=Xe(e),{mode:a}=i;if(r.isLeaving)return $u(s);const l=Rm(s);if(!l)return $u(s);let c=bs(l,i,r,n,m=>c=m);l.type!==Dt&&Rr(l,c);let d=n.subTree&&Rm(n.subTree);if(d&&d.type!==Dt&&!er(l,d)&&T_(n).type!==Dt){let m=bs(d,i,r,n);if(Rr(d,m),a==="out-in"&&l.type!==Dt)return r.isLeaving=!0,m.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete m.afterLeave,d=void 0},$u(s);a==="in-out"&&l.type!==Dt?m.delayLeave=(f,p,h)=>{const _=O_(r,d);_[String(d.key)]=d,f[eo]=()=>{p(),f[eo]=void 0,delete c.delayedLeave,d=void 0},c.delayedLeave=()=>{h(),delete c.delayedLeave,d=void 0}}:d=void 0}else d&&(d=void 0);return s}}};function $_(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==Dt){t=n;break}}return t}const A_=Gb;function O_(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function bs(e,t,n,r,o){const{appear:s,mode:i,persisted:a=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:d,onEnterCancelled:m,onBeforeLeave:f,onLeave:p,onAfterLeave:h,onLeaveCancelled:_,onBeforeAppear:b,onAppear:C,onAfterAppear:w,onAppearCancelled:g}=t,z=String(e.key),S=O_(n,e),k=(T,F)=>{T&&Un(T,r,9,F)},L=(T,F)=>{const G=F[1];k(T,F),be(T)?T.every(U=>U.length<=1)&&G():T.length<=1&&G()},D={mode:i,persisted:a,beforeEnter(T){let F=l;if(!n.isMounted)if(s)F=b||l;else return;T[eo]&&T[eo](!0);const G=S[z];G&&er(e,G)&&G.el[eo]&&G.el[eo](),k(F,[T])},enter(T){let F=c,G=d,U=m;if(!n.isMounted)if(s)F=C||c,G=w||d,U=g||m;else return;let W=!1;const ee=T[ua]=fe=>{W||(W=!0,fe?k(U,[T]):k(G,[T]),D.delayedLeave&&D.delayedLeave(),T[ua]=void 0)};F?L(F,[T,ee]):ee()},leave(T,F){const G=String(e.key);if(T[ua]&&T[ua](!0),n.isUnmounting)return F();k(f,[T]);let U=!1;const W=T[eo]=ee=>{U||(U=!0,F(),ee?k(_,[T]):k(h,[T]),T[eo]=void 0,S[G]===e&&delete S[G])};S[G]=e,p?L(p,[T,W]):W()},clone(T){const F=bs(T,t,n,r,o);return o&&o(F),F}};return D}function $u(e){if(Wi(e))return e=wr(e),e.children=null,e}function Rm(e){if(!Wi(e))return k_(e.type)&&e.children?$_(e.children):e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&Oe(n.default))return n.default()}}function Rr(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Rr(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Bl(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let s=0;sn.value,set:s=>n.value=s})}return n}function Oi(e,t,n,r,o=!1){if(be(e)){e.forEach((h,_)=>Oi(h,t&&(be(t)?t[_]:t),n,r,o));return}if(lo(r)&&!o){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&Oi(e,t,n,r.component.subTree);return}const s=r.shapeFlag&4?Ki(r.component):r.el,i=o?null:s,{i:a,r:l}=e,c=t&&t.r,d=a.refs===Je?a.refs={}:a.refs,m=a.setupState,f=Xe(m),p=m===Je?()=>!1:h=>st(f,h);if(c!=null&&c!==l&&(yt(c)?(d[c]=null,p(c)&&(m[c]=null)):St(c)&&(c.value=null)),Oe(l))Ps(l,a,12,[i,d]);else{const h=yt(l),_=St(l);if(h||_){const b=()=>{if(e.f){const C=h?p(l)?m[l]:d[l]:l.value;o?be(C)&&vd(C,s):be(C)?C.includes(s)||C.push(s):h?(d[l]=[s],p(l)&&(m[l]=d[l])):(l.value=[s],e.k&&(d[e.k]=l.value))}else h?(d[l]=i,p(l)&&(m[l]=i)):_&&(l.value=i,e.k&&(d[e.k]=i))};i?(b.id=-1,Ft(b,n)):b()}}}let Mm=!1;const qo=()=>{Mm||(console.error("Hydration completed but contains mismatches."),Mm=!0)},Yb=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Xb=e=>e.namespaceURI.includes("MathML"),ca=e=>{if(e.nodeType===1){if(Yb(e))return"svg";if(Xb(e))return"mathml"}},ls=e=>e.nodeType===8;function Jb(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:s,parentNode:i,remove:a,insert:l,createComment:c}}=e,d=(g,z)=>{if(!z.hasChildNodes()){n(null,g,z),el(),z._vnode=g;return}m(z.firstChild,g,null,null,null),el(),z._vnode=g},m=(g,z,S,k,L,D=!1)=>{D=D||!!z.dynamicChildren;const T=ls(g)&&g.data==="[",F=()=>_(g,z,S,k,L,T),{type:G,ref:U,shapeFlag:W,patchFlag:ee}=z;let fe=g.nodeType;z.el=g,ee===-2&&(D=!1,z.dynamicChildren=null);let K=null;switch(G){case Nr:fe!==3?z.children===""?(l(z.el=o(""),i(g),g),K=g):K=F():(g.data!==z.children&&(qo(),g.data=z.children),K=s(g));break;case Dt:w(g)?(K=s(g),C(z.el=g.content.firstChild,g,S)):fe!==8||T?K=F():K=s(g);break;case Io:if(T&&(g=s(g),fe=g.nodeType),fe===1||fe===3){K=g;const ne=!z.children.length;for(let ue=0;ue{D=D||!!z.dynamicChildren;const{type:T,props:F,patchFlag:G,shapeFlag:U,dirs:W,transition:ee}=z,fe=T==="input"||T==="option";if(fe||G!==-1){W&&gr(z,null,S,"created");let K=!1;if(w(g)){K=rg(null,ee)&&S&&S.vnode.props&&S.vnode.props.appear;const ue=g.content.firstChild;K&&ee.beforeEnter(ue),C(ue,g,S),z.el=g=ue}if(U&16&&!(F&&(F.innerHTML||F.textContent))){let ue=p(g.firstChild,z,g,S,k,L,D);for(;ue;){da(g,1)||qo();const Ne=ue;ue=ue.nextSibling,a(Ne)}}else if(U&8){let ue=z.children;ue[0]===` -`&&(g.tagName==="PRE"||g.tagName==="TEXTAREA")&&(ue=ue.slice(1)),g.textContent!==ue&&(da(g,0)||qo(),g.textContent=z.children)}if(F){if(fe||!D||G&48){const ue=g.tagName.includes("-");for(const Ne in F)(fe&&(Ne.endsWith("value")||Ne==="indeterminate")||ji(Ne)&&!ps(Ne)||Ne[0]==="."||ue)&&r(g,Ne,null,F[Ne],void 0,S)}else if(F.onClick)r(g,"onClick",null,F.onClick,void 0,S);else if(G&4&&vr(F.style))for(const ue in F.style)F.style[ue]}let ne;(ne=F&&F.onVnodeBeforeMount)&&hn(ne,S,z),W&&gr(z,null,S,"beforeMount"),((ne=F&&F.onVnodeMounted)||W||K)&&fg(()=>{ne&&hn(ne,S,z),K&&ee.enter(g),W&&gr(z,null,S,"mounted")},k)}return g.nextSibling},p=(g,z,S,k,L,D,T)=>{T=T||!!z.dynamicChildren;const F=z.children,G=F.length;for(let U=0;U{const{slotScopeIds:T}=z;T&&(L=L?L.concat(T):T);const F=i(g),G=p(s(g),z,F,S,k,L,D);return G&&ls(G)&&G.data==="]"?s(z.anchor=G):(qo(),l(z.anchor=c("]"),F,G),G)},_=(g,z,S,k,L,D)=>{if(da(g.parentElement,1)||qo(),z.el=null,D){const G=b(g);for(;;){const U=s(g);if(U&&U!==G)a(U);else break}}const T=s(g),F=i(g);return a(g),n(null,z,F,T,S,k,ca(F),L),S&&(S.vnode.el=z.el,Yl(S,z.el)),T},b=(g,z="[",S="]")=>{let k=0;for(;g;)if(g=s(g),g&&ls(g)&&(g.data===z&&k++,g.data===S)){if(k===0)return s(g);k--}return g},C=(g,z,S)=>{const k=z.parentNode;k&&k.replaceChild(g,z);let L=S;for(;L;)L.vnode.el===z&&(L.vnode.el=L.subTree.el=g),L=L.parent},w=g=>g.nodeType===1&&g.tagName==="TEMPLATE";return[d,m]}const Fm="data-allow-mismatch",Qb={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function da(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Fm);)e=e.parentElement;const n=e&&e.getAttribute(Fm);if(n==null)return!1;if(n==="")return!0;{const r=n.split(",");return t===0&&r.includes("children")?!0:n.split(",").includes(Qb[t])}}const ev=Il().requestIdleCallback||(e=>setTimeout(e,1)),tv=Il().cancelIdleCallback||(e=>clearTimeout(e)),nv=(e=1e4)=>t=>{const n=ev(t,{timeout:e});return()=>tv(n)};function rv(e){const{top:t,left:n,bottom:r,right:o}=e.getBoundingClientRect(),{innerHeight:s,innerWidth:i}=window;return(t>0&&t0&&r0&&n0&&o(t,n)=>{const r=new IntersectionObserver(o=>{for(const s of o)if(s.isIntersecting){r.disconnect(),t();break}},e);return n(o=>{if(o instanceof Element){if(rv(o))return t(),r.disconnect(),!1;r.observe(o)}}),()=>r.disconnect()},sv=e=>t=>{if(e){const n=matchMedia(e);if(n.matches)t();else return n.addEventListener("change",t,{once:!0}),()=>n.removeEventListener("change",t)}},iv=(e=[])=>(t,n)=>{yt(e)&&(e=[e]);let r=!1;const o=i=>{r||(r=!0,s(),t(),i.target.dispatchEvent(new i.constructor(i.type,i)))},s=()=>{n(i=>{for(const a of e)i.removeEventListener(a,o)})};return n(i=>{for(const a of e)i.addEventListener(a,o,{once:!0})}),s};function av(e,t){if(ls(e)&&e.data==="["){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(ls(r))if(r.data==="]"){if(--n===0)break}else r.data==="["&&n++;r=r.nextSibling}}else t(e)}const lo=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function lv(e){Oe(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,hydrate:s,timeout:i,suspensible:a=!0,onError:l}=e;let c=null,d,m=0;const f=()=>(m++,c=null,p()),p=()=>{let h;return c||(h=c=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),l)return new Promise((b,C)=>{l(_,()=>b(f()),()=>C(_),m+1)});throw _}).then(_=>h!==c&&c?c:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),d=_,_)))};return Vr({name:"AsyncComponentWrapper",__asyncLoader:p,__asyncHydrate(h,_,b){const C=s?()=>{const w=s(b,g=>av(h,g));w&&(_.bum||(_.bum=[])).push(w)}:b;d?C():p().then(()=>!_.isUnmounted&&C())},get __asyncResolved(){return d},setup(){const h=Vt;if(Nd(h),d)return()=>Au(d,h);const _=g=>{c=null,Ho(g,h,13,!r)};if(a&&h.suspense||vs)return p().then(g=>()=>Au(g,h)).catch(g=>(_(g),()=>r?v(r,{error:g}):null));const b=Fn(!1),C=Fn(),w=Fn(!!o);return o&&setTimeout(()=>{w.value=!1},o),i!=null&&setTimeout(()=>{if(!b.value&&!C.value){const g=new Error(`Async component timed out after ${i}ms.`);_(g),C.value=g}},i),p().then(()=>{b.value=!0,h.parent&&Wi(h.parent.vnode)&&h.parent.update()}).catch(g=>{_(g),C.value=g}),()=>{if(b.value&&d)return Au(d,h);if(C.value&&r)return v(r,{error:C.value});if(n&&!w.value)return v(n)}}})}function Au(e,t){const{ref:n,props:r,children:o,ce:s}=t.vnode,i=v(e,r,o);return i.ref=n,i.ce=s,delete t.vnode.ce,i}const Wi=e=>e.type.__isKeepAlive,uv={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=cn(),r=n.ctx;if(!r.renderer)return()=>{const w=t.default&&t.default();return w&&w.length===1?w[0]:w};const o=new Map,s=new Set;let i=null;const a=n.suspense,{renderer:{p:l,m:c,um:d,o:{createElement:m}}}=r,f=m("div");r.activate=(w,g,z,S,k)=>{const L=w.component;c(w,g,z,0,a),l(L.vnode,w,g,z,L,a,S,w.slotScopeIds,k),Ft(()=>{L.isDeactivated=!1,L.a&&hs(L.a);const D=w.props&&w.props.onVnodeMounted;D&&hn(D,L.parent,w)},a)},r.deactivate=w=>{const g=w.component;nl(g.m),nl(g.a),c(w,f,null,1,a),Ft(()=>{g.da&&hs(g.da);const z=w.props&&w.props.onVnodeUnmounted;z&&hn(z,g.parent,w),g.isDeactivated=!0},a)};function p(w){Ou(w),d(w,n,a,!0)}function h(w){o.forEach((g,z)=>{const S=Dc(g.type);S&&!w(S)&&_(z)})}function _(w){const g=o.get(w);g&&(!i||!er(g,i))?p(g):i&&Ou(i),o.delete(w),s.delete(w)}Tn(()=>[e.include,e.exclude],([w,g])=>{w&&h(z=>Qs(w,z)),g&&h(z=>!Qs(g,z))},{flush:"post",deep:!0});let b=null;const C=()=>{b!=null&&(rl(n.subTree.type)?Ft(()=>{o.set(b,ma(n.subTree))},n.subTree.suspense):o.set(b,ma(n.subTree)))};return Is(C),ql(C),Gl(()=>{o.forEach(w=>{const{subTree:g,suspense:z}=n,S=ma(g);if(w.type===S.type&&w.key===S.key){Ou(S);const k=S.component.da;k&&Ft(k,z);return}p(w)})}),()=>{if(b=null,!t.default)return i=null;const w=t.default(),g=w[0];if(w.length>1)return i=null,w;if(!Mr(g)||!(g.shapeFlag&4)&&!(g.shapeFlag&128))return i=null,g;let z=ma(g);if(z.type===Dt)return i=null,z;const S=z.type,k=Dc(lo(z)?z.type.__asyncResolved||{}:S),{include:L,exclude:D,max:T}=e;if(L&&(!k||!Qs(L,k))||D&&k&&Qs(D,k))return z.shapeFlag&=-257,i=z,g;const F=z.key==null?S:z.key,G=o.get(F);return z.el&&(z=wr(z),g.shapeFlag&128&&(g.ssContent=z)),b=F,G?(z.el=G.el,z.component=G.component,z.transition&&Rr(z,z.transition),z.shapeFlag|=512,s.delete(F),s.add(F)):(s.add(F),T&&s.size>parseInt(T,10)&&_(s.values().next().value)),z.shapeFlag|=256,i=z,rl(g.type)?g:z}}},cv=uv;function Qs(e,t){return be(e)?e.some(n=>Qs(n,t)):yt(e)?e.split(",").includes(t):Hz(e)?(e.lastIndex=0,e.test(t)):!1}function P_(e,t){L_(e,"a",t)}function I_(e,t){L_(e,"da",t)}function L_(e,t,n=Vt){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Wl(t,r,n),n){let o=n.parent;for(;o&&o.parent;)Wi(o.parent.vnode)&&dv(r,t,n,o),o=o.parent}}function dv(e,t,n,r){const o=Wl(t,e,r,!0);qi(()=>{vd(r[t],o)},n)}function Ou(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function ma(e){return e.shapeFlag&128?e.ssContent:e}function Wl(e,t,n=Vt,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...i)=>{ho();const a=Ro(n),l=Un(t,n,e,i);return a(),_o(),l});return r?o.unshift(s):o.push(s),s}}const Hr=e=>(t,n=Vt)=>{(!vs||e==="sp")&&Wl(e,(...r)=>t(...r),n)},N_=Hr("bm"),Is=Hr("m"),Dd=Hr("bu"),ql=Hr("u"),Gl=Hr("bum"),qi=Hr("um"),D_=Hr("sp"),R_=Hr("rtg"),M_=Hr("rtc");function F_(e,t=Vt){Wl("ec",e,t)}const Rd="components",mv="directives";function O(e,t){return Fd(Rd,e,!0,t)||e}const V_=Symbol.for("v-ndc");function Kl(e){return yt(e)?Fd(Rd,e,!1)||e:e||V_}function Md(e){return Fd(mv,e)}function Fd(e,t,n=!0,r=!1){const o=Ht||Vt;if(o){const s=o.type;if(e===Rd){const a=Dc(s,!1);if(a&&(a===t||a===qt(t)||a===Bi(qt(t))))return s}const i=Vm(o[e]||s[e],t)||Vm(o.appContext[e],t);return!i&&r?s:i}}function Vm(e,t){return e&&(e[t]||e[qt(t)]||e[Bi(qt(t))])}function zt(e,t,n,r){let o;const s=n&&n[r],i=be(e);if(i||yt(e)){const a=i&&vr(e);let l=!1;a&&(l=!En(e),e=Rl(e)),o=new Array(e.length);for(let c=0,d=e.length;ct(a,l,void 0,s&&s[l]));else{const a=Object.keys(e);o=new Array(a.length);for(let l=0,c=a.length;l{const s=r.fn(...o);return s&&(s.key=r.key),s}:r.fn)}return e}function wt(e,t,n={},r,o){if(Ht.ce||Ht.parent&&lo(Ht.parent)&&Ht.parent.ce)return t!=="default"&&(n.name=t),x(),ve(ze,null,[v("slot",n,r&&r())],64);let s=e[t];s&&s._c&&(s._d=!1),x();const i=s&&Hd(s(n)),a=n.key||i&&i.key,l=ve(ze,{key:(a&&!or(a)?a:`_${t}`)+(!i&&r?"_fb":"")},i||(r?r():[]),i&&e._===1?64:-2);return!o&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),s&&s._c&&(s._d=!0),l}function Hd(e){return e.some(t=>Mr(t)?!(t.type===Dt||t.type===ze&&!Hd(t.children)):!0)?e:null}function fv(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:ai(r)]=e[r];return n}const kc=e=>e?zg(e)?Ki(e):kc(e.parent):null,di=pt(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>kc(e.parent),$root:e=>kc(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Ud(e),$forceUpdate:e=>e.f||(e.f=()=>{Pd(e.update)}),$nextTick:e=>e.n||(e.n=Uo.bind(e.proxy)),$watch:e=>jv.bind(e)}),Pu=(e,t)=>e!==Je&&!e.__isScriptSetup&&st(e,t),xc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:a,appContext:l}=e;let c;if(t[0]!=="$"){const p=i[t];if(p!==void 0)switch(p){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(Pu(r,t))return i[t]=1,r[t];if(o!==Je&&st(o,t))return i[t]=2,o[t];if((c=e.propsOptions[0])&&st(c,t))return i[t]=3,s[t];if(n!==Je&&st(n,t))return i[t]=4,n[t];Ec&&(i[t]=0)}}const d=di[t];let m,f;if(d)return t==="$attrs"&&Zt(e.attrs,"get",""),d(e);if((m=a.__cssModules)&&(m=m[t]))return m;if(n!==Je&&st(n,t))return i[t]=4,n[t];if(f=l.config.globalProperties,st(f,t))return f[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return Pu(o,t)?(o[t]=n,!0):r!==Je&&st(r,t)?(r[t]=n,!0):st(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:s}},i){let a;return!!n[i]||e!==Je&&st(e,i)||Pu(t,i)||(a=s[0])&&st(a,i)||st(r,i)||st(di,i)||st(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:st(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},pv=pt({},xc,{get(e,t){if(t!==Symbol.unscopables)return xc.get(e,t,e)},has(e,t){return t[0]!=="_"&&!qz(t)}});function hv(){return null}function _v(){return null}function gv(e){}function yv(e){}function zv(){return null}function bv(){}function vv(e,t){return null}function Cv(){return H_().slots}function wv(){return H_().attrs}function H_(){const e=cn();return e.setupContext||(e.setupContext=Cg(e))}function Pi(e){return be(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function Sv(e,t){const n=Pi(e);for(const r in t){if(r.startsWith("__skip"))continue;let o=n[r];o?be(o)||Oe(o)?o=n[r]={type:o,default:t[r]}:o.default=t[r]:o===null&&(o=n[r]={default:t[r]}),o&&t[`__skip_${r}`]&&(o.skipFactory=!0)}return n}function kv(e,t){return!e||!t?e||t:be(e)&&be(t)?e.concat(t):pt({},Pi(e),Pi(t))}function xv(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function Ev(e){const t=cn();let n=e();return Ic(),Cd(n)&&(n=n.catch(r=>{throw Ro(t),r})),[n,()=>Ro(t)]}let Ec=!0;function Tv(e){const t=Ud(e),n=e.proxy,r=e.ctx;Ec=!1,t.beforeCreate&&Hm(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:a,provide:l,inject:c,created:d,beforeMount:m,mounted:f,beforeUpdate:p,updated:h,activated:_,deactivated:b,beforeDestroy:C,beforeUnmount:w,destroyed:g,unmounted:z,render:S,renderTracked:k,renderTriggered:L,errorCaptured:D,serverPrefetch:T,expose:F,inheritAttrs:G,components:U,directives:W,filters:ee}=t;if(c&&$v(c,r,null),i)for(const ne in i){const ue=i[ne];Oe(ue)&&(r[ne]=ue.bind(n))}if(o){const ne=o.call(n,n);ft(ne)&&(e.data=Os(ne))}if(Ec=!0,s)for(const ne in s){const ue=s[ne],Ne=Oe(ue)?ue.bind(n,n):Oe(ue.get)?ue.get.bind(n,n):Mn,it=!Oe(ue)&&Oe(ue.set)?ue.set.bind(n):Mn,Ve=jt({get:Ne,set:it});Object.defineProperty(r,ne,{enumerable:!0,configurable:!0,get:()=>Ve.value,set:He=>Ve.value=He})}if(a)for(const ne in a)U_(a[ne],r,n,ne);if(l){const ne=Oe(l)?l.call(n):l;Reflect.ownKeys(ne).forEach(ue=>{mi(ue,ne[ue])})}d&&Hm(d,e,"c");function K(ne,ue){be(ue)?ue.forEach(Ne=>ne(Ne.bind(n))):ue&&ne(ue.bind(n))}if(K(N_,m),K(Is,f),K(Dd,p),K(ql,h),K(P_,_),K(I_,b),K(F_,D),K(M_,k),K(R_,L),K(Gl,w),K(qi,z),K(D_,T),be(F))if(F.length){const ne=e.exposed||(e.exposed={});F.forEach(ue=>{Object.defineProperty(ne,ue,{get:()=>n[ue],set:Ne=>n[ue]=Ne})})}else e.exposed||(e.exposed={});S&&e.render===Mn&&(e.render=S),G!=null&&(e.inheritAttrs=G),U&&(e.components=U),W&&(e.directives=W),T&&Nd(e)}function $v(e,t,n=Mn){be(e)&&(e=Tc(e));for(const r in e){const o=e[r];let s;ft(o)?"default"in o?s=Vn(o.from||r,o.default,!0):s=Vn(o.from||r):s=Vn(o),St(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:i=>s.value=i}):t[r]=s}}function Hm(e,t,n){Un(be(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function U_(e,t,n,r){let o=r.includes(".")?ug(n,r):()=>n[r];if(yt(e)){const s=t[e];Oe(s)&&Tn(o,s)}else if(Oe(e))Tn(o,e.bind(n));else if(ft(e))if(be(e))e.forEach(s=>U_(s,t,n,r));else{const s=Oe(e.handler)?e.handler.bind(n):t[e.handler];Oe(s)&&Tn(o,s,e)}}function Ud(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,a=s.get(t);let l;return a?l=a:!o.length&&!n&&!r?l=t:(l={},o.length&&o.forEach(c=>tl(l,c,i,!0)),tl(l,t,i)),ft(t)&&s.set(t,l),l}function tl(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&tl(e,s,n,!0),o&&o.forEach(i=>tl(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const a=Av[i]||n&&n[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const Av={data:Um,props:jm,emits:jm,methods:ei,computed:ei,beforeCreate:nn,created:nn,beforeMount:nn,mounted:nn,beforeUpdate:nn,updated:nn,beforeDestroy:nn,beforeUnmount:nn,destroyed:nn,unmounted:nn,activated:nn,deactivated:nn,errorCaptured:nn,serverPrefetch:nn,components:ei,directives:ei,watch:Pv,provide:Um,inject:Ov};function Um(e,t){return t?e?function(){return pt(Oe(e)?e.call(this,this):e,Oe(t)?t.call(this,this):t)}:t:e}function Ov(e,t){return ei(Tc(e),Tc(t))}function Tc(e){if(be(e)){const t={};for(let n=0;n1)return n&&Oe(t)?t.call(r&&r.proxy):t}}function B_(){return!!(Vt||Ht||Po)}const W_={},q_=()=>Object.create(W_),G_=e=>Object.getPrototypeOf(e)===W_;function Nv(e,t,n,r=!1){const o={},s=q_();e.propsDefaults=Object.create(null),K_(e,t,o,s);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=r?o:$d(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function Dv(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,a=Xe(o),[l]=e.propsOptions;let c=!1;if((r||i>0)&&!(i&16)){if(i&8){const d=e.vnode.dynamicProps;for(let m=0;m{l=!0;const[f,p]=Z_(m,t,!0);pt(i,f),p&&a.push(...p)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!s&&!l)return ft(e)&&r.set(e,ms),ms;if(be(s))for(let d=0;de[0]==="_"||e==="$stable",jd=e=>be(e)?e.map(_n):[_n(e)],Mv=(e,t,n)=>{if(t._n)return t;const r=N((...o)=>jd(t(...o)),n);return r._c=!1,r},X_=(e,t,n)=>{const r=e._ctx;for(const o in e){if(Y_(o))continue;const s=e[o];if(Oe(s))t[o]=Mv(o,s,r);else if(s!=null){const i=jd(s);t[o]=()=>i}}},J_=(e,t)=>{const n=jd(t);e.slots.default=()=>n},Q_=(e,t,n)=>{for(const r in t)(n||r!=="_")&&(e[r]=t[r])},Fv=(e,t,n)=>{const r=e.slots=q_();if(e.vnode.shapeFlag&32){const o=t._;o?(Q_(r,t,n),n&&Kh(r,"_",o,!0)):X_(t,r)}else t&&J_(e,t)},Vv=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,i=Je;if(r.shapeFlag&32){const a=t._;a?n&&a===1?s=!1:Q_(o,t,n):(s=!t.$stable,X_(t,o)),i=t}else t&&(J_(e,t),i={default:1});if(s)for(const a in o)!Y_(a)&&i[a]==null&&delete o[a]},Ft=fg;function eg(e){return ng(e)}function tg(e){return ng(e,Jb)}function ng(e,t){const n=Il();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:i,createText:a,createComment:l,setText:c,setElementText:d,parentNode:m,nextSibling:f,setScopeId:p=Mn,insertStaticContent:h}=e,_=(A,P,j,te=null,X=null,ie=null,pe=void 0,E=null,$=!!P.dynamicChildren)=>{if(A===P)return;A&&!er(A,P)&&(te=Z(A),He(A,X,ie,!0),A=null),P.patchFlag===-2&&($=!1,P.dynamicChildren=null);const{type:R,ref:oe,shapeFlag:ae}=P;switch(R){case Nr:b(A,P,j,te);break;case Dt:C(A,P,j,te);break;case Io:A==null&&w(P,j,te,pe);break;case ze:U(A,P,j,te,X,ie,pe,E,$);break;default:ae&1?S(A,P,j,te,X,ie,pe,E,$):ae&6?W(A,P,j,te,X,ie,pe,E,$):(ae&64||ae&128)&&R.process(A,P,j,te,X,ie,pe,E,$,ye)}oe!=null&&X&&Oi(oe,A&&A.ref,ie,P||A,!P)},b=(A,P,j,te)=>{if(A==null)r(P.el=a(P.children),j,te);else{const X=P.el=A.el;P.children!==A.children&&c(X,P.children)}},C=(A,P,j,te)=>{A==null?r(P.el=l(P.children||""),j,te):P.el=A.el},w=(A,P,j,te)=>{[A.el,A.anchor]=h(A.children,P,j,te,A.el,A.anchor)},g=({el:A,anchor:P},j,te)=>{let X;for(;A&&A!==P;)X=f(A),r(A,j,te),A=X;r(P,j,te)},z=({el:A,anchor:P})=>{let j;for(;A&&A!==P;)j=f(A),o(A),A=j;o(P)},S=(A,P,j,te,X,ie,pe,E,$)=>{P.type==="svg"?pe="svg":P.type==="math"&&(pe="mathml"),A==null?k(P,j,te,X,ie,pe,E,$):T(A,P,X,ie,pe,E,$)},k=(A,P,j,te,X,ie,pe,E)=>{let $,R;const{props:oe,shapeFlag:ae,transition:se,dirs:V}=A;if($=A.el=i(A.type,ie,oe&&oe.is,oe),ae&8?d($,A.children):ae&16&&D(A.children,$,null,te,X,Iu(A,ie),pe,E),V&&gr(A,null,te,"created"),L($,A,A.scopeId,pe,te),oe){for(const ke in oe)ke!=="value"&&!ps(ke)&&s($,ke,null,oe[ke],ie,te);"value"in oe&&s($,"value",null,oe.value,ie),(R=oe.onVnodeBeforeMount)&&hn(R,te,A)}V&&gr(A,null,te,"beforeMount");const Y=rg(X,se);Y&&se.beforeEnter($),r($,P,j),((R=oe&&oe.onVnodeMounted)||Y||V)&&Ft(()=>{R&&hn(R,te,A),Y&&se.enter($),V&&gr(A,null,te,"mounted")},X)},L=(A,P,j,te,X)=>{if(j&&p(A,j),te)for(let ie=0;ie{for(let R=$;R{const E=P.el=A.el;let{patchFlag:$,dynamicChildren:R,dirs:oe}=P;$|=A.patchFlag&16;const ae=A.props||Je,se=P.props||Je;let V;if(j&&bo(j,!1),(V=se.onVnodeBeforeUpdate)&&hn(V,j,P,A),oe&&gr(P,A,j,"beforeUpdate"),j&&bo(j,!0),(ae.innerHTML&&se.innerHTML==null||ae.textContent&&se.textContent==null)&&d(E,""),R?F(A.dynamicChildren,R,E,j,te,Iu(P,X),ie):pe||ue(A,P,E,null,j,te,Iu(P,X),ie,!1),$>0){if($&16)G(E,ae,se,j,X);else if($&2&&ae.class!==se.class&&s(E,"class",null,se.class,X),$&4&&s(E,"style",ae.style,se.style,X),$&8){const Y=P.dynamicProps;for(let ke=0;ke{V&&hn(V,j,P,A),oe&&gr(P,A,j,"updated")},te)},F=(A,P,j,te,X,ie,pe)=>{for(let E=0;E{if(P!==j){if(P!==Je)for(const ie in P)!ps(ie)&&!(ie in j)&&s(A,ie,P[ie],null,X,te);for(const ie in j){if(ps(ie))continue;const pe=j[ie],E=P[ie];pe!==E&&ie!=="value"&&s(A,ie,E,pe,X,te)}"value"in j&&s(A,"value",P.value,j.value,X)}},U=(A,P,j,te,X,ie,pe,E,$)=>{const R=P.el=A?A.el:a(""),oe=P.anchor=A?A.anchor:a("");let{patchFlag:ae,dynamicChildren:se,slotScopeIds:V}=P;V&&(E=E?E.concat(V):V),A==null?(r(R,j,te),r(oe,j,te),D(P.children||[],j,oe,X,ie,pe,E,$)):ae>0&&ae&64&&se&&A.dynamicChildren?(F(A.dynamicChildren,se,j,X,ie,pe,E),(P.key!=null||X&&P===X.subTree)&&Bd(A,P,!0)):ue(A,P,j,oe,X,ie,pe,E,$)},W=(A,P,j,te,X,ie,pe,E,$)=>{P.slotScopeIds=E,A==null?P.shapeFlag&512?X.ctx.activate(P,j,te,pe,$):ee(P,j,te,X,ie,pe,$):fe(A,P,$)},ee=(A,P,j,te,X,ie,pe)=>{const E=A.component=yg(A,te,X);if(Wi(A)&&(E.ctx.renderer=ye),bg(E,!1,pe),E.asyncDep){if(X&&X.registerDep(E,K,pe),!A.el){const $=E.subTree=v(Dt);C(null,$,P,j)}}else K(E,A,P,j,X,ie,pe)},fe=(A,P,j)=>{const te=P.component=A.component;if(Zv(A,P,j))if(te.asyncDep&&!te.asyncResolved){ne(te,P,j);return}else te.next=P,te.update();else P.el=A.el,te.vnode=P},K=(A,P,j,te,X,ie,pe)=>{const E=()=>{if(A.isMounted){let{next:ae,bu:se,u:V,parent:Y,vnode:ke}=A;{const _e=og(A);if(_e){ae&&(ae.el=ke.el,ne(A,ae,pe)),_e.asyncDep.then(()=>{A.isUnmounted||E()});return}}let M=ae,H;bo(A,!1),ae?(ae.el=ke.el,ne(A,ae,pe)):ae=ke,se&&hs(se),(H=ae.props&&ae.props.onVnodeBeforeUpdate)&&hn(H,Y,ae,ke),bo(A,!0);const q=Ia(A),re=A.subTree;A.subTree=q,_(re,q,m(re.el),Z(re),A,X,ie),ae.el=q.el,M===null&&Yl(A,q.el),V&&Ft(V,X),(H=ae.props&&ae.props.onVnodeUpdated)&&Ft(()=>hn(H,Y,ae,ke),X)}else{let ae;const{el:se,props:V}=P,{bm:Y,m:ke,parent:M,root:H,type:q}=A,re=lo(P);if(bo(A,!1),Y&&hs(Y),!re&&(ae=V&&V.onVnodeBeforeMount)&&hn(ae,M,P),bo(A,!0),se&&Ge){const _e=()=>{A.subTree=Ia(A),Ge(se,A.subTree,A,X,null)};re&&q.__asyncHydrate?q.__asyncHydrate(se,A,_e):_e()}else{H.ce&&H.ce._injectChildStyle(q);const _e=A.subTree=Ia(A);_(null,_e,j,te,A,X,ie),P.el=_e.el}if(ke&&Ft(ke,X),!re&&(ae=V&&V.onVnodeMounted)){const _e=P;Ft(()=>hn(ae,M,_e),X)}(P.shapeFlag&256||M&&lo(M.vnode)&&M.vnode.shapeFlag&256)&&A.a&&Ft(A.a,X),A.isMounted=!0,P=j=te=null}};A.scope.on();const $=A.effect=new ki(E);A.scope.off();const R=A.update=$.run.bind($),oe=A.job=$.runIfDirty.bind($);oe.i=A,oe.id=A.uid,$.scheduler=()=>Pd(oe),bo(A,!0),R()},ne=(A,P,j)=>{P.component=A;const te=A.vnode.props;A.vnode=P,A.next=null,Dv(A,P.props,te,j),Vv(A,P.children,j),ho(),Im(A),_o()},ue=(A,P,j,te,X,ie,pe,E,$=!1)=>{const R=A&&A.children,oe=A?A.shapeFlag:0,ae=P.children,{patchFlag:se,shapeFlag:V}=P;if(se>0){if(se&128){it(R,ae,j,te,X,ie,pe,E,$);return}else if(se&256){Ne(R,ae,j,te,X,ie,pe,E,$);return}}V&8?(oe&16&&We(R,X,ie),ae!==R&&d(j,ae)):oe&16?V&16?it(R,ae,j,te,X,ie,pe,E,$):We(R,X,ie,!0):(oe&8&&d(j,""),V&16&&D(ae,j,te,X,ie,pe,E,$))},Ne=(A,P,j,te,X,ie,pe,E,$)=>{A=A||ms,P=P||ms;const R=A.length,oe=P.length,ae=Math.min(R,oe);let se;for(se=0;seoe?We(A,X,ie,!0,!1,ae):D(P,j,te,X,ie,pe,E,$,ae)},it=(A,P,j,te,X,ie,pe,E,$)=>{let R=0;const oe=P.length;let ae=A.length-1,se=oe-1;for(;R<=ae&&R<=se;){const V=A[R],Y=P[R]=$?to(P[R]):_n(P[R]);if(er(V,Y))_(V,Y,j,null,X,ie,pe,E,$);else break;R++}for(;R<=ae&&R<=se;){const V=A[ae],Y=P[se]=$?to(P[se]):_n(P[se]);if(er(V,Y))_(V,Y,j,null,X,ie,pe,E,$);else break;ae--,se--}if(R>ae){if(R<=se){const V=se+1,Y=Vse)for(;R<=ae;)He(A[R],X,ie,!0),R++;else{const V=R,Y=R,ke=new Map;for(R=Y;R<=se;R++){const Re=P[R]=$?to(P[R]):_n(P[R]);Re.key!=null&&ke.set(Re.key,R)}let M,H=0;const q=se-Y+1;let re=!1,_e=0;const Te=new Array(q);for(R=0;R=q){He(Re,X,ie,!0);continue}let nt;if(Re.key!=null)nt=ke.get(Re.key);else for(M=Y;M<=se;M++)if(Te[M-Y]===0&&er(Re,P[M])){nt=M;break}nt===void 0?He(Re,X,ie,!0):(Te[nt-Y]=R+1,nt>=_e?_e=nt:re=!0,_(Re,P[nt],j,null,X,ie,pe,E,$),H++)}const Me=re?Hv(Te):ms;for(M=Me.length-1,R=q-1;R>=0;R--){const Re=Y+R,nt=P[Re],Pe=Re+1{const{el:ie,type:pe,transition:E,children:$,shapeFlag:R}=A;if(R&6){Ve(A.component.subTree,P,j,te);return}if(R&128){A.suspense.move(P,j,te);return}if(R&64){pe.move(A,P,j,ye);return}if(pe===ze){r(ie,P,j);for(let ae=0;ae<$.length;ae++)Ve($[ae],P,j,te);r(A.anchor,P,j);return}if(pe===Io){g(A,P,j);return}if(te!==2&&R&1&&E)if(te===0)E.beforeEnter(ie),r(ie,P,j),Ft(()=>E.enter(ie),X);else{const{leave:ae,delayLeave:se,afterLeave:V}=E,Y=()=>r(ie,P,j),ke=()=>{ae(ie,()=>{Y(),V&&V()})};se?se(ie,Y,ke):ke()}else r(ie,P,j)},He=(A,P,j,te=!1,X=!1)=>{const{type:ie,props:pe,ref:E,children:$,dynamicChildren:R,shapeFlag:oe,patchFlag:ae,dirs:se,cacheIndex:V}=A;if(ae===-2&&(X=!1),E!=null&&Oi(E,null,j,A,!0),V!=null&&(P.renderCache[V]=void 0),oe&256){P.ctx.deactivate(A);return}const Y=oe&1&&se,ke=!lo(A);let M;if(ke&&(M=pe&&pe.onVnodeBeforeUnmount)&&hn(M,P,A),oe&6)dt(A.component,j,te);else{if(oe&128){A.suspense.unmount(j,te);return}Y&&gr(A,null,P,"beforeUnmount"),oe&64?A.type.remove(A,P,j,ye,te):R&&!R.hasOnce&&(ie!==ze||ae>0&&ae&64)?We(R,P,j,!1,!0):(ie===ze&&ae&384||!X&&oe&16)&&We($,P,j),te&&at(A)}(ke&&(M=pe&&pe.onVnodeUnmounted)||Y)&&Ft(()=>{M&&hn(M,P,A),Y&&gr(A,null,P,"unmounted")},j)},at=A=>{const{type:P,el:j,anchor:te,transition:X}=A;if(P===ze){lt(j,te);return}if(P===Io){z(A);return}const ie=()=>{o(j),X&&!X.persisted&&X.afterLeave&&X.afterLeave()};if(A.shapeFlag&1&&X&&!X.persisted){const{leave:pe,delayLeave:E}=X,$=()=>pe(j,ie);E?E(A.el,ie,$):$()}else ie()},lt=(A,P)=>{let j;for(;A!==P;)j=f(A),o(A),A=j;o(P)},dt=(A,P,j)=>{const{bum:te,scope:X,job:ie,subTree:pe,um:E,m:$,a:R}=A;nl($),nl(R),te&&hs(te),X.stop(),ie&&(ie.flags|=8,He(pe,A,P,j)),E&&Ft(E,P),Ft(()=>{A.isUnmounted=!0},P),P&&P.pendingBranch&&!P.isUnmounted&&A.asyncDep&&!A.asyncResolved&&A.suspenseId===P.pendingId&&(P.deps--,P.deps===0&&P.resolve())},We=(A,P,j,te=!1,X=!1,ie=0)=>{for(let pe=ie;pe{if(A.shapeFlag&6)return Z(A.component.subTree);if(A.shapeFlag&128)return A.suspense.next();const P=f(A.anchor||A.el),j=P&&P[S_];return j?f(j):P};let me=!1;const ce=(A,P,j)=>{A==null?P._vnode&&He(P._vnode,null,null,!0):_(P._vnode||null,A,P,null,null,null,j),P._vnode=A,me||(me=!0,Im(),el(),me=!1)},ye={p:_,um:He,m:Ve,r:at,mt:ee,mc:D,pc:ue,pbc:F,n:Z,o:e};let Ue,Ge;return t&&([Ue,Ge]=t(ye)),{render:ce,hydrate:Ue,createApp:Lv(ce,Ue)}}function Iu({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function bo({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function rg(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Bd(e,t,n=!1){const r=e.children,o=t.children;if(be(r)&&be(o))for(let s=0;s>1,e[n[a]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,i=n[s-1];s-- >0;)n[s]=i,i=t[i];return n}function og(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:og(t)}function nl(e){if(e)for(let t=0;tVn(sg);function ag(e,t){return Gi(e,null,t)}function Uv(e,t){return Gi(e,null,{flush:"post"})}function lg(e,t){return Gi(e,null,{flush:"sync"})}function Tn(e,t,n){return Gi(e,t,n)}function Gi(e,t,n=Je){const{immediate:r,deep:o,flush:s,once:i}=n,a=pt({},n),l=t&&r||!t&&s!=="post";let c;if(vs){if(s==="sync"){const p=ig();c=p.__watcherHandles||(p.__watcherHandles=[])}else if(!l){const p=()=>{};return p.stop=Mn,p.resume=Mn,p.pause=Mn,p}}const d=Vt;a.call=(p,h,_)=>Un(p,d,h,_);let m=!1;s==="post"?a.scheduler=p=>{Ft(p,d&&d.suspense)}:s!=="sync"&&(m=!0,a.scheduler=(p,h)=>{h?p():Pd(p)}),a.augmentJob=p=>{t&&(p.flags|=4),m&&(p.flags|=2,d&&(p.id=d.uid,p.i=d))};const f=Nb(e,t,a);return vs&&(c?c.push(f):l&&f()),f}function jv(e,t,n){const r=this.proxy,o=yt(e)?e.includes(".")?ug(r,e):()=>r[e]:e.bind(r,r);let s;Oe(t)?s=t:(s=t.handler,n=t);const i=Ro(this),a=Gi(o,s.bind(r),n);return i(),a}function ug(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{let d,m=Je,f;return lg(()=>{const p=e[o];an(d,p)&&(d=p,c())}),{get(){return l(),n.get?n.get(d):d},set(p){const h=n.set?n.set(p):p;if(!an(h,d)&&!(m!==Je&&an(p,m)))return;const _=r.vnode.props;_&&(t in _||o in _||s in _)&&(`onUpdate:${t}`in _||`onUpdate:${o}`in _||`onUpdate:${s}`in _)||(d=p,c()),r.emit(`update:${t}`,h),an(p,h)&&an(p,m)&&!an(h,f)&&c(),m=p,f=h}}});return a[Symbol.iterator]=()=>{let l=0;return{next(){return l<2?{value:l++?i||Je:a,done:!1}:{done:!0}}}},a}const cg=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${qt(t)}Modifiers`]||e[`${yn(t)}Modifiers`];function Wv(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||Je;let o=n;const s=t.startsWith("update:"),i=s&&cg(r,t.slice(7));i&&(i.trim&&(o=n.map(d=>yt(d)?d.trim():d)),i.number&&(o=n.map(Za)));let a,l=r[a=ai(t)]||r[a=ai(qt(t))];!l&&s&&(l=r[a=ai(yn(t))]),l&&Un(l,e,6,o);const c=r[a+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,Un(c,e,6,o)}}function dg(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let i={},a=!1;if(!Oe(e)){const l=c=>{const d=dg(c,t,!0);d&&(a=!0,pt(i,d))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!a?(ft(e)&&r.set(e,null),null):(be(s)?s.forEach(l=>i[l]=null):pt(i,s),ft(e)&&r.set(e,i),i)}function Zl(e,t){return!e||!ji(t)?!1:(t=t.slice(2).replace(/Once$/,""),st(e,t[0].toLowerCase()+t.slice(1))||st(e,yn(t))||st(e,t))}function Ia(e){const{type:t,vnode:n,proxy:r,withProxy:o,propsOptions:[s],slots:i,attrs:a,emit:l,render:c,renderCache:d,props:m,data:f,setupState:p,ctx:h,inheritAttrs:_}=e,b=Ai(e);let C,w;try{if(n.shapeFlag&4){const z=o||r,S=z;C=_n(c.call(S,z,d,m,p,f,h)),w=a}else{const z=t;C=_n(z.length>1?z(m,{attrs:a,slots:i,emit:l}):z(m,null)),w=t.props?a:Gv(a)}}catch(z){fi.length=0,Ho(z,e,1),C=v(Dt)}let g=C;if(w&&_!==!1){const z=Object.keys(w),{shapeFlag:S}=g;z.length&&S&7&&(s&&z.some(bd)&&(w=Kv(w,s)),g=wr(g,w,!1,!0))}return n.dirs&&(g=wr(g,null,!1,!0),g.dirs=g.dirs?g.dirs.concat(n.dirs):n.dirs),n.transition&&Rr(g,n.transition),C=g,Ai(b),C}function qv(e,t=!0){let n;for(let r=0;r{let t;for(const n in e)(n==="class"||n==="style"||ji(n))&&((t||(t={}))[n]=e[n]);return t},Kv=(e,t)=>{const n={};for(const r in e)(!bd(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Zv(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:a,patchFlag:l}=t,c=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?Wm(r,i,c):!!i;if(l&8){const d=t.dynamicProps;for(let m=0;me.__isSuspense;let Ac=0;const Yv={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,s,i,a,l,c){if(e==null)Jv(t,n,r,o,s,i,a,l,c);else{if(s&&s.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}Qv(e,t,n,r,o,i,a,l,c)}},hydrate:e0,normalize:t0},Xv=Yv;function Ii(e,t){const n=e.props&&e.props[t];Oe(n)&&n()}function Jv(e,t,n,r,o,s,i,a,l){const{p:c,o:{createElement:d}}=l,m=d("div"),f=e.suspense=mg(e,o,r,t,m,n,s,i,a,l);c(null,f.pendingBranch=e.ssContent,m,null,r,f,s,i),f.deps>0?(Ii(e,"onPending"),Ii(e,"onFallback"),c(null,e.ssFallback,t,n,r,null,s,i),gs(f,e.ssFallback)):f.resolve(!1,!0)}function Qv(e,t,n,r,o,s,i,a,{p:l,um:c,o:{createElement:d}}){const m=t.suspense=e.suspense;m.vnode=t,t.el=e.el;const f=t.ssContent,p=t.ssFallback,{activeBranch:h,pendingBranch:_,isInFallback:b,isHydrating:C}=m;if(_)m.pendingBranch=f,er(f,_)?(l(_,f,m.hiddenContainer,null,o,m,s,i,a),m.deps<=0?m.resolve():b&&(C||(l(h,p,n,r,o,null,s,i,a),gs(m,p)))):(m.pendingId=Ac++,C?(m.isHydrating=!1,m.activeBranch=_):c(_,o,m),m.deps=0,m.effects.length=0,m.hiddenContainer=d("div"),b?(l(null,f,m.hiddenContainer,null,o,m,s,i,a),m.deps<=0?m.resolve():(l(h,p,n,r,o,null,s,i,a),gs(m,p))):h&&er(f,h)?(l(h,f,n,r,o,m,s,i,a),m.resolve(!0)):(l(null,f,m.hiddenContainer,null,o,m,s,i,a),m.deps<=0&&m.resolve()));else if(h&&er(f,h))l(h,f,n,r,o,m,s,i,a),gs(m,f);else if(Ii(t,"onPending"),m.pendingBranch=f,f.shapeFlag&512?m.pendingId=f.component.suspenseId:m.pendingId=Ac++,l(null,f,m.hiddenContainer,null,o,m,s,i,a),m.deps<=0)m.resolve();else{const{timeout:w,pendingId:g}=m;w>0?setTimeout(()=>{m.pendingId===g&&m.fallback(p)},w):w===0&&m.fallback(p)}}function mg(e,t,n,r,o,s,i,a,l,c,d=!1){const{p:m,m:f,um:p,n:h,o:{parentNode:_,remove:b}}=c;let C;const w=n0(e);w&&t&&t.pendingBranch&&(C=t.pendingId,t.deps++);const g=e.props?Ya(e.props.timeout):void 0,z=s,S={vnode:e,parent:t,parentComponent:n,namespace:i,container:r,hiddenContainer:o,deps:0,pendingId:Ac++,timeout:typeof g=="number"?g:-1,activeBranch:null,pendingBranch:null,isInFallback:!d,isHydrating:d,isUnmounted:!1,effects:[],resolve(k=!1,L=!1){const{vnode:D,activeBranch:T,pendingBranch:F,pendingId:G,effects:U,parentComponent:W,container:ee}=S;let fe=!1;S.isHydrating?S.isHydrating=!1:k||(fe=T&&F.transition&&F.transition.mode==="out-in",fe&&(T.transition.afterLeave=()=>{G===S.pendingId&&(f(F,ee,s===z?h(T):s,0),Ti(U))}),T&&(_(T.el)===ee&&(s=h(T)),p(T,W,S,!0)),fe||f(F,ee,s,0)),gs(S,F),S.pendingBranch=null,S.isInFallback=!1;let K=S.parent,ne=!1;for(;K;){if(K.pendingBranch){K.effects.push(...U),ne=!0;break}K=K.parent}!ne&&!fe&&Ti(U),S.effects=[],w&&t&&t.pendingBranch&&C===t.pendingId&&(t.deps--,t.deps===0&&!L&&t.resolve()),Ii(D,"onResolve")},fallback(k){if(!S.pendingBranch)return;const{vnode:L,activeBranch:D,parentComponent:T,container:F,namespace:G}=S;Ii(L,"onFallback");const U=h(D),W=()=>{S.isInFallback&&(m(null,k,F,U,T,null,G,a,l),gs(S,k))},ee=k.transition&&k.transition.mode==="out-in";ee&&(D.transition.afterLeave=W),S.isInFallback=!0,p(D,T,null,!0),ee||W()},move(k,L,D){S.activeBranch&&f(S.activeBranch,k,L,D),S.container=k},next(){return S.activeBranch&&h(S.activeBranch)},registerDep(k,L,D){const T=!!S.pendingBranch;T&&S.deps++;const F=k.vnode.el;k.asyncDep.catch(G=>{Ho(G,k,0)}).then(G=>{if(k.isUnmounted||S.isUnmounted||S.pendingId!==k.suspenseId)return;k.asyncResolved=!0;const{vnode:U}=k;Lc(k,G,!1),F&&(U.el=F);const W=!F&&k.subTree.el;L(k,U,_(F||k.subTree.el),F?null:h(k.subTree),S,i,D),W&&b(W),Yl(k,U.el),T&&--S.deps===0&&S.resolve()})},unmount(k,L){S.isUnmounted=!0,S.activeBranch&&p(S.activeBranch,n,k,L),S.pendingBranch&&p(S.pendingBranch,n,k,L)}};return S}function e0(e,t,n,r,o,s,i,a,l){const c=t.suspense=mg(t,r,n,e.parentNode,document.createElement("div"),null,o,s,i,a,!0),d=l(e,c.pendingBranch=t.ssContent,n,c,s,i);return c.deps===0&&c.resolve(!1,!0),d}function t0(e){const{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=qm(r?n.default:n),e.ssFallback=r?qm(n.fallback):v(Dt)}function qm(e){let t;if(Oe(e)){const n=Do&&e._c;n&&(e._d=!1,x()),e=e(),n&&(e._d=!0,t=en,pg())}return be(e)&&(e=qv(e)),e=_n(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function fg(e,t){t&&t.pendingBranch?be(e)?t.effects.push(...e):t.effects.push(e):Ti(e)}function gs(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let o=t.el;for(;!o&&t.component;)t=t.component.subTree,o=t.el;n.el=o,r&&r.subTree===n&&(r.vnode.el=o,Yl(r,o))}function n0(e){const t=e.props&&e.props.suspensible;return t!=null&&t!==!1}const ze=Symbol.for("v-fgt"),Nr=Symbol.for("v-txt"),Dt=Symbol.for("v-cmt"),Io=Symbol.for("v-stc"),fi=[];let en=null;function x(e=!1){fi.push(en=e?null:[])}function pg(){fi.pop(),en=fi[fi.length-1]||null}let Do=1;function Oc(e,t=!1){Do+=e,e<0&&en&&t&&(en.hasOnce=!0)}function hg(e){return e.dynamicChildren=Do>0?en||ms:null,pg(),Do>0&&en&&en.push(e),e}function I(e,t,n,r,o,s){return hg(u(e,t,n,r,o,s,!0))}function ve(e,t,n,r,o){return hg(v(e,t,n,r,o,!0))}function Mr(e){return e?e.__v_isVNode===!0:!1}function er(e,t){return e.type===t.type&&e.key===t.key}function r0(e){}const _g=({key:e})=>e??null,La=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?yt(e)||St(e)||Oe(e)?{i:Ht,r:e,k:t,f:!!n}:e:null);function u(e,t=null,n=null,r=0,o=null,s=e===ze?0:1,i=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&_g(t),ref:t&&La(t),scopeId:jl,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Ht};return a?(Wd(l,n),s&128&&e.normalize(l)):n&&(l.shapeFlag|=yt(n)?8:16),Do>0&&!i&&en&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&en.push(l),l}const v=o0;function o0(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===V_)&&(e=Dt),Mr(e)){const a=wr(e,t,!0);return n&&Wd(a,n),Do>0&&!s&&en&&(a.shapeFlag&6?en[en.indexOf(e)]=a:en.push(a)),a.patchFlag=-2,a}if(m0(e)&&(e=e.__vccOpts),t){t=gg(t);let{class:a,style:l}=t;a&&!yt(a)&&(t.class=Se(a)),ft(l)&&(Vl(l)&&!be(l)&&(l=pt({},l)),t.style=po(l))}const i=yt(e)?1:rl(e)?128:k_(e)?64:ft(e)?4:Oe(e)?2:0;return u(e,t,n,r,o,i,s,!0)}function gg(e){return e?Vl(e)||G_(e)?pt({},e):e:null}function wr(e,t,n=!1,r=!1){const{props:o,ref:s,patchFlag:i,children:a,transition:l}=e,c=t?us(o||{},t):o,d={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&_g(c),ref:t&&t.ref?n&&s?be(s)?s.concat(La(t)):[s,La(t)]:La(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ze?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&wr(e.ssContent),ssFallback:e.ssFallback&&wr(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&Rr(d,l.clone(d)),d}function Mt(e=" ",t=0){return v(Nr,null,e,t)}function s0(e,t){const n=v(Io,null,e);return n.staticCount=t,n}function Q(e="",t=!1){return t?(x(),ve(Dt,null,e)):v(Dt,null,e)}function _n(e){return e==null||typeof e=="boolean"?v(Dt):be(e)?v(ze,null,e.slice()):Mr(e)?to(e):v(Nr,null,String(e))}function to(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:wr(e)}function Wd(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(be(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),Wd(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!G_(t)?t._ctx=Ht:o===3&&Ht&&(Ht.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Oe(t)?(t={default:t,_ctx:Ht},n=32):(t=String(t),r&64?(n=16,t=[Mt(t)]):n=8);e.children=t,e.shapeFlag|=n}function us(...e){const t={};for(let n=0;nVt||Ht;let ol,Pc;{const e=Il(),t=(n,r)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(r),s=>{o.length>1?o.forEach(i=>i(s)):o[0](s)}};ol=t("__VUE_INSTANCE_SETTERS__",n=>Vt=n),Pc=t("__VUE_SSR_SETTERS__",n=>vs=n)}const Ro=e=>{const t=Vt;return ol(e),e.scope.on(),()=>{e.scope.off(),ol(t)}},Ic=()=>{Vt&&Vt.scope.off(),ol(null)};function zg(e){return e.vnode.shapeFlag&4}let vs=!1;function bg(e,t=!1,n=!1){t&&Pc(t);const{props:r,children:o}=e.vnode,s=zg(e);Nv(e,r,s,t),Fv(e,o,n);const i=s?l0(e,t):void 0;return t&&Pc(!1),i}function l0(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,xc);const{setup:r}=n;if(r){ho();const o=e.setupContext=r.length>1?Cg(e):null,s=Ro(e),i=Ps(r,e,0,[e.props,o]),a=Cd(i);if(_o(),s(),(a||e.sp)&&!lo(e)&&Nd(e),a){if(i.then(Ic,Ic),t)return i.then(l=>{Lc(e,l,t)}).catch(l=>{Ho(l,e,0)});e.asyncDep=i}else Lc(e,i,t)}else vg(e,t)}function Lc(e,t,n){Oe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ft(t)&&(e.setupState=Od(t)),vg(e,n)}let sl,Nc;function u0(e){sl=e,Nc=t=>{t.render._rc&&(t.withProxy=new Proxy(t.ctx,pv))}}const c0=()=>!sl;function vg(e,t,n){const r=e.type;if(!e.render){if(!t&&sl&&!r.render){const o=r.template||Ud(e).template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:a,compilerOptions:l}=r,c=pt(pt({isCustomElement:s,delimiters:a},i),l);r.render=sl(o,c)}}e.render=r.render||Mn,Nc&&Nc(e)}{const o=Ro(e);ho();try{Tv(e)}finally{_o(),o()}}}const d0={get(e,t){return Zt(e,"get",""),e[t]}};function Cg(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,d0),slots:e.slots,emit:e.emit,expose:t}}function Ki(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Od(Hl(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in di)return di[n](e)},has(t,n){return n in t||n in di}})):e.proxy}function Dc(e,t=!0){return Oe(e)?e.displayName||e.name:e.name||t&&e.__name}function m0(e){return Oe(e)&&"__vccOpts"in e}const jt=(e,t)=>Ob(e,t,vs);function zr(e,t,n){const r=arguments.length;return r===2?ft(t)&&!be(t)?Mr(t)?v(e,null,[t]):v(e,t):v(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Mr(n)&&(n=[n]),v(e,t,n))}function f0(){}function p0(e,t,n,r){const o=n[r];if(o&&wg(o,e))return o;const s=t();return s.memo=e.slice(),s.cacheIndex=r,n[r]=s}function wg(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let r=0;r0&&en&&en.push(e),!0}const Sg="3.5.13",h0=Mn,_0=Vb,g0=ns,y0=w_,z0={createComponentInstance:yg,setupComponent:bg,renderComponentRoot:Ia,setCurrentRenderingInstance:Ai,isVNode:Mr,normalizeVNode:_n,getComponentPublicInstance:Ki,ensureValidVNode:Hd,pushWarningContext:Db,popWarningContext:Rb},b0=z0,v0=null,C0=null,w0=null;/** +**/const A1=[];function lE(e){A1.push(e)}function cE(){A1.pop()}function uE(e,t){}const dE={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE",APP_UNMOUNT_CLEANUP:16,16:"APP_UNMOUNT_CLEANUP"},mE={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush",15:"component update",16:"app unmount cleanup function"};function $i(e,t,n,r){try{return r?e(...r):e()}catch(s){Lo(s,t,n)}}function dr(e,t,n,r){if($e(e)){const s=$i(e,t,n,r);return s&&au(s)&&s.catch(o=>{Lo(o,t,n)}),s}if(ve(e)){const s=[];for(let o=0;o>>1,s=wn[r],o=Oa(s);o=Oa(n)?wn.push(e):wn.splice(pE(t),0,e),e.flags|=1,$1()}}function $1(){zc||(zc=O1.then(N1))}function Aa(e){ve(e)?ci.push(...e):$s&&e.id===-1?$s.splice(Yo+1,0,e):e.flags&1||(ci.push(e),e.flags|=1),$1()}function fh(e,t,n=Fr+1){for(;nOa(n)-Oa(r));if(ci.length=0,$s){$s.push(...t);return}for($s=t,Yo=0;Yo<$s.length;Yo++){const n=$s[Yo];n.flags&4&&(n.flags&=-2),n.flags&8||n(),n.flags&=-2}$s=null,Yo=0}}const Oa=e=>e.id==null?e.flags&2?-1:1/0:e.id;function N1(e){try{for(Fr=0;FrZo.emit(s,...o)),bl=[]):typeof window<"u"&&window.HTMLElement&&!((r=(n=window.navigator)==null?void 0:n.userAgent)!=null&&r.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(o=>{I1(o,t)}),setTimeout(()=>{Zo||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,bl=[])},3e3)):bl=[]}let Zt=null,yu=null;function $a(e){const t=Zt;return Zt=e,yu=e&&e.type.__scopeId||null,t}function hE(e){yu=e}function _E(){yu=null}const gE=e=>D;function D(e,t=Zt,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&$m(-1);const o=$a(t);let i;try{i=e(...s)}finally{$a(o),r._d&&$m(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Ct(e,t){if(Zt===null)return e;const n=nl(Zt),r=e.dirs||(e.dirs=[]);for(let s=0;se.__isTeleport,ca=e=>e&&(e.disabled||e.disabled===""),ph=e=>e&&(e.defer||e.defer===""),hh=e=>typeof SVGElement<"u"&&e instanceof SVGElement,_h=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Em=(e,t)=>{const n=e&&e.to;return Re(n)?t?t(n):null:n},R1={name:"Teleport",__isTeleport:!0,process(e,t,n,r,s,o,i,a,l,c){const{mc:d,pc:m,pbc:f,o:{insert:p,querySelector:h,createText:_,createComment:v}}=c,C=ca(t.props);let{shapeFlag:S,children:g,dynamicChildren:b}=t;if(e==null){const E=t.el=_(""),w=t.anchor=_("");p(E,n,r),p(w,n,r);const P=(k,R)=>{S&16&&(s&&s.isCE&&(s.ce._teleportTarget=k),d(g,k,R,s,o,i,a,l))},N=()=>{const k=t.target=Em(t.props,h),R=D1(k,t,_,p);k&&(i!=="svg"&&hh(k)?i="svg":i!=="mathml"&&_h(k)&&(i="mathml"),C||(P(k,R),Kl(t,!1)))};C&&(P(n,w),Kl(t,!0)),ph(t.props)?Xt(()=>{N(),t.el.__isMounted=!0},o):N()}else{if(ph(t.props)&&!e.el.__isMounted){Xt(()=>{R1.process(e,t,n,r,s,o,i,a,l,c),delete e.el.__isMounted},o);return}t.el=e.el,t.targetStart=e.targetStart;const E=t.anchor=e.anchor,w=t.target=e.target,P=t.targetAnchor=e.targetAnchor,N=ca(e.props),k=N?n:w,R=N?E:P;if(i==="svg"||hh(w)?i="svg":(i==="mathml"||_h(w))&&(i="mathml"),b?(f(e.dynamicChildren,b,k,s,o,i,a),Yf(e,t,!0)):l||m(e,t,k,R,s,o,i,a,!1),C)N?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):zl(t,n,E,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const B=t.target=Em(t.props,h);B&&zl(t,B,null,c,0)}else N&&zl(t,w,P,c,1);Kl(t,C)}},remove(e,t,n,{um:r,o:{remove:s}},o){const{shapeFlag:i,children:a,anchor:l,targetStart:c,targetAnchor:d,target:m,props:f}=e;if(m&&(s(c),s(d)),o&&s(l),i&16){const p=o||!ca(f);for(let h=0;h{e.isMounted=!0}),Cu(()=>{e.isUnmounting=!0}),e}const tr=[Function,Array],Vf={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:tr,onEnter:tr,onAfterEnter:tr,onEnterCancelled:tr,onBeforeLeave:tr,onLeave:tr,onAfterLeave:tr,onLeaveCancelled:tr,onBeforeAppear:tr,onAppear:tr,onAfterAppear:tr,onAppearCancelled:tr},M1=e=>{const t=e.subTree;return t.component?M1(t.component):t},vE={name:"BaseTransition",props:Vf,setup(e,{slots:t}){const n=On(),r=Ff();return()=>{const s=t.default&&vu(t.default(),!0);if(!s||!s.length)return;const o=F1(s),i=nt(e),{mode:a}=i;if(r.isLeaving)return Sd(o);const l=gh(o);if(!l)return Sd(o);let c=pi(l,i,r,n,m=>c=m);l.type!==Wt&&fs(l,c);let d=n.subTree&&gh(n.subTree);if(d&&d.type!==Wt&&!Er(l,d)&&M1(n).type!==Wt){let m=pi(d,i,r,n);if(fs(d,m),a==="out-in"&&l.type!==Wt)return r.isLeaving=!0,m.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete m.afterLeave,d=void 0},Sd(o);a==="in-out"&&l.type!==Wt?m.delayLeave=(f,p,h)=>{const _=H1(r,d);_[String(d.key)]=d,f[Ns]=()=>{p(),f[Ns]=void 0,delete c.delayedLeave,d=void 0},c.delayedLeave=()=>{h(),delete c.delayedLeave,d=void 0}}:d=void 0}else d&&(d=void 0);return o}}};function F1(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==Wt){t=n;break}}return t}const V1=vE;function H1(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function pi(e,t,n,r,s){const{appear:o,mode:i,persisted:a=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:d,onEnterCancelled:m,onBeforeLeave:f,onLeave:p,onAfterLeave:h,onLeaveCancelled:_,onBeforeAppear:v,onAppear:C,onAfterAppear:S,onAppearCancelled:g}=t,b=String(e.key),E=H1(n,e),w=(k,R)=>{k&&dr(k,r,9,R)},P=(k,R)=>{const B=R[1];w(k,R),ve(k)?k.every(M=>M.length<=1)&&B():k.length<=1&&B()},N={mode:i,persisted:a,beforeEnter(k){let R=l;if(!n.isMounted)if(o)R=v||l;else return;k[Ns]&&k[Ns](!0);const B=E[b];B&&Er(e,B)&&B.el[Ns]&&B.el[Ns](),w(R,[k])},enter(k){let R=c,B=d,M=m;if(!n.isMounted)if(o)R=C||c,B=S||d,M=g||m;else return;let H=!1;const X=k[Cl]=ae=>{H||(H=!0,ae?w(M,[k]):w(B,[k]),N.delayedLeave&&N.delayedLeave(),k[Cl]=void 0)};R?P(R,[k,X]):X()},leave(k,R){const B=String(e.key);if(k[Cl]&&k[Cl](!0),n.isUnmounting)return R();w(f,[k]);let M=!1;const H=k[Ns]=X=>{M||(M=!0,R(),X?w(_,[k]):w(h,[k]),k[Ns]=void 0,E[B]===e&&delete E[B])};E[B]=e,p?P(p,[k,H]):H()},clone(k){const R=pi(k,t,n,r,s);return s&&s(R),R}};return N}function Sd(e){if(Qa(e))return e=Wr(e),e.children=null,e}function gh(e){if(!Qa(e))return L1(e.type)&&e.children?F1(e.children):e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&$e(n.default))return n.default()}}function fs(e,t){e.shapeFlag&6&&e.component?(e.transition=t,fs(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function vu(e,t=!1,n){let r=[],s=0;for(let o=0;o1)for(let o=0;on.value,set:o=>n.value=o})}return n}function Na(e,t,n,r,s=!1){if(ve(e)){e.forEach((h,_)=>Na(h,t&&(ve(t)?t[_]:t),n,r,s));return}if(Us(r)&&!s){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&Na(e,t,n,r.component.subTree);return}const o=r.shapeFlag&4?nl(r.component):r.el,i=s?null:o,{i:a,r:l}=e,c=t&&t.r,d=a.refs===Ze?a.refs={}:a.refs,m=a.setupState,f=nt(m),p=m===Ze?()=>!1:h=>lt(f,h);if(c!=null&&c!==l&&(Re(c)?(d[c]=null,p(c)&&(m[c]=null)):Ot(c)&&(c.value=null)),$e(l))$i(l,a,12,[i,d]);else{const h=Re(l),_=Ot(l);if(h||_){const v=()=>{if(e.f){const C=h?p(l)?m[l]:d[l]:l.value;s?ve(C)&&iu(C,o):ve(C)?C.includes(o)||C.push(o):h?(d[l]=[o],p(l)&&(m[l]=d[l])):(l.value=[o],e.k&&(d[e.k]=l.value))}else h?(d[l]=i,p(l)&&(m[l]=i)):_&&(l.value=i,e.k&&(d[e.k]=i))};i?(v.id=-1,Xt(v,n)):v()}}}let yh=!1;const Vo=()=>{yh||(console.error("Hydration completed but contains mismatches."),yh=!0)},CE=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",SE=e=>e.namespaceURI.includes("MathML"),Sl=e=>{if(e.nodeType===1){if(CE(e))return"svg";if(SE(e))return"mathml"}},oi=e=>e.nodeType===8;function EE(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:o,parentNode:i,remove:a,insert:l,createComment:c}}=e,d=(g,b)=>{if(!b.hasChildNodes()){n(null,g,b),Cc(),b._vnode=g;return}m(b.firstChild,g,null,null,null),Cc(),b._vnode=g},m=(g,b,E,w,P,N=!1)=>{N=N||!!b.dynamicChildren;const k=oi(g)&&g.data==="[",R=()=>_(g,b,E,w,P,k),{type:B,ref:M,shapeFlag:H,patchFlag:X}=b;let ae=g.nodeType;b.el=g,X===-2&&(N=!1,b.dynamicChildren=null);let G=null;switch(B){case ls:ae!==3?b.children===""?(l(b.el=s(""),i(g),g),G=g):G=R():(g.data!==b.children&&(Vo(),g.data=b.children),G=o(g));break;case Wt:S(g)?(G=o(g),C(b.el=g.content.firstChild,g,E)):ae!==8||k?G=R():G=o(g);break;case Co:if(k&&(g=o(g),ae=g.nodeType),ae===1||ae===3){G=g;const te=!b.children.length;for(let le=0;le{N=N||!!b.dynamicChildren;const{type:k,props:R,patchFlag:B,shapeFlag:M,dirs:H,transition:X}=b,ae=k==="input"||k==="option";if(ae||B!==-1){H&&Vr(b,null,E,"created");let G=!1;if(S(g)){G=fv(null,X)&&E&&E.vnode.props&&E.vnode.props.appear;const le=g.content.firstChild;G&&X.beforeEnter(le),C(le,g,E),b.el=g=le}if(M&16&&!(R&&(R.innerHTML||R.textContent))){let le=p(g.firstChild,b,g,E,w,P,N);for(;le;){El(g,1)||Vo();const Ae=le;le=le.nextSibling,a(Ae)}}else if(M&8){let le=b.children;le[0]===` +`&&(g.tagName==="PRE"||g.tagName==="TEXTAREA")&&(le=le.slice(1)),g.textContent!==le&&(El(g,0)||Vo(),g.textContent=b.children)}if(R){if(ae||!N||B&48){const le=g.tagName.includes("-");for(const Ae in R)(ae&&(Ae.endsWith("value")||Ae==="indeterminate")||Ks(Ae)&&!as(Ae)||Ae[0]==="."||le)&&r(g,Ae,null,R[Ae],void 0,E)}else if(R.onClick)r(g,"onClick",null,R.onClick,void 0,E);else if(B&4&&Br(R.style))for(const le in R.style)R.style[le]}let te;(te=R&&R.onVnodeBeforeMount)&&Rn(te,E,b),H&&Vr(b,null,E,"beforeMount"),((te=R&&R.onVnodeMounted)||H||G)&&Sv(()=>{te&&Rn(te,E,b),G&&X.enter(g),H&&Vr(b,null,E,"mounted")},w)}return g.nextSibling},p=(g,b,E,w,P,N,k)=>{k=k||!!b.dynamicChildren;const R=b.children,B=R.length;for(let M=0;M{const{slotScopeIds:k}=b;k&&(P=P?P.concat(k):k);const R=i(g),B=p(o(g),b,R,E,w,P,N);return B&&oi(B)&&B.data==="]"?o(b.anchor=B):(Vo(),l(b.anchor=c("]"),R,B),B)},_=(g,b,E,w,P,N)=>{if(El(g.parentElement,1)||Vo(),b.el=null,N){const B=v(g);for(;;){const M=o(g);if(M&&M!==B)a(M);else break}}const k=o(g),R=i(g);return a(g),n(null,b,R,k,E,w,Sl(R),P),E&&(E.vnode.el=b.el,wu(E,b.el)),k},v=(g,b="[",E="]")=>{let w=0;for(;g;)if(g=o(g),g&&oi(g)&&(g.data===b&&w++,g.data===E)){if(w===0)return o(g);w--}return g},C=(g,b,E)=>{const w=b.parentNode;w&&w.replaceChild(g,b);let P=E;for(;P;)P.vnode.el===b&&(P.vnode.el=P.subTree.el=g),P=P.parent},S=g=>g.nodeType===1&&g.tagName==="TEMPLATE";return[d,m]}const vh="data-allow-mismatch",wE={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function El(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(vh);)e=e.parentElement;const n=e&&e.getAttribute(vh);if(n==null)return!1;if(n==="")return!0;{const r=n.split(",");return t===0&&r.includes("children")?!0:n.split(",").includes(wE[t])}}const kE=Za().requestIdleCallback||(e=>setTimeout(e,1)),xE=Za().cancelIdleCallback||(e=>clearTimeout(e)),TE=(e=1e4)=>t=>{const n=kE(t,{timeout:e});return()=>xE(n)};function AE(e){const{top:t,left:n,bottom:r,right:s}=e.getBoundingClientRect(),{innerHeight:o,innerWidth:i}=window;return(t>0&&t0&&r0&&n0&&s(t,n)=>{const r=new IntersectionObserver(s=>{for(const o of s)if(o.isIntersecting){r.disconnect(),t();break}},e);return n(s=>{if(s instanceof Element){if(AE(s))return t(),r.disconnect(),!1;r.observe(s)}}),()=>r.disconnect()},$E=e=>t=>{if(e){const n=matchMedia(e);if(n.matches)t();else return n.addEventListener("change",t,{once:!0}),()=>n.removeEventListener("change",t)}},NE=(e=[])=>(t,n)=>{Re(e)&&(e=[e]);let r=!1;const s=i=>{r||(r=!0,o(),t(),i.target.dispatchEvent(new i.constructor(i.type,i)))},o=()=>{n(i=>{for(const a of e)i.removeEventListener(a,s)})};return n(i=>{for(const a of e)i.addEventListener(a,s,{once:!0})}),o};function IE(e,t){if(oi(e)&&e.data==="["){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(oi(r))if(r.data==="]"){if(--n===0)break}else r.data==="["&&n++;r=r.nextSibling}}else t(e)}const Us=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function PE(e){$e(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,hydrate:o,timeout:i,suspensible:a=!0,onError:l}=e;let c=null,d,m=0;const f=()=>(m++,c=null,p()),p=()=>{let h;return c||(h=c=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),l)return new Promise((v,C)=>{l(_,()=>v(f()),()=>C(_),m+1)});throw _}).then(_=>h!==c&&c?c:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),d=_,_)))};return gs({name:"AsyncComponentWrapper",__asyncLoader:p,__asyncHydrate(h,_,v){const C=o?()=>{const S=o(v,g=>IE(h,g));S&&(_.bum||(_.bum=[])).push(S)}:v;d?C():p().then(()=>!_.isUnmounted&&C())},get __asyncResolved(){return d},setup(){const h=Yt;if(Hf(h),d)return()=>Ed(d,h);const _=g=>{c=null,Lo(g,h,13,!r)};if(a&&h.suspense||hi)return p().then(g=>()=>Ed(g,h)).catch(g=>(_(g),()=>r?z(r,{error:g}):null));const v=ar(!1),C=ar(),S=ar(!!s);return s&&setTimeout(()=>{S.value=!1},s),i!=null&&setTimeout(()=>{if(!v.value&&!C.value){const g=new Error(`Async component timed out after ${i}ms.`);_(g),C.value=g}},i),p().then(()=>{v.value=!0,h.parent&&Qa(h.parent.vnode)&&h.parent.update()}).catch(g=>{_(g),C.value=g}),()=>{if(v.value&&d)return Ed(d,h);if(C.value&&r)return z(r,{error:C.value});if(n&&!S.value)return z(n)}}})}function Ed(e,t){const{ref:n,props:r,children:s,ce:o}=t.vnode,i=z(e,r,s);return i.ref=n,i.ce=o,delete t.vnode.ce,i}const Qa=e=>e.type.__isKeepAlive,LE={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=On(),r=n.ctx;if(!r.renderer)return()=>{const S=t.default&&t.default();return S&&S.length===1?S[0]:S};const s=new Map,o=new Set;let i=null;const a=n.suspense,{renderer:{p:l,m:c,um:d,o:{createElement:m}}}=r,f=m("div");r.activate=(S,g,b,E,w)=>{const P=S.component;c(S,g,b,0,a),l(P.vnode,S,g,b,P,a,E,S.slotScopeIds,w),Xt(()=>{P.isDeactivated=!1,P.a&&vo(P.a);const N=S.props&&S.props.onVnodeMounted;N&&Rn(N,P.parent,S)},a)},r.deactivate=S=>{const g=S.component;Ec(g.m),Ec(g.a),c(S,f,null,1,a),Xt(()=>{g.da&&vo(g.da);const b=S.props&&S.props.onVnodeUnmounted;b&&Rn(b,g.parent,S),g.isDeactivated=!0},a)};function p(S){wd(S),d(S,n,a,!0)}function h(S){s.forEach((g,b)=>{const E=Rm(g.type);E&&!S(E)&&_(b)})}function _(S){const g=s.get(S);g&&(!i||!Er(g,i))?p(g):i&&wd(i),s.delete(S),o.delete(S)}Zn(()=>[e.include,e.exclude],([S,g])=>{S&&h(b=>Qi(S,b)),g&&h(b=>!Qi(g,b))},{flush:"post",deep:!0});let v=null;const C=()=>{v!=null&&(wc(n.subTree.type)?Xt(()=>{s.set(v,wl(n.subTree))},n.subTree.suspense):s.set(v,wl(n.subTree)))};return Ni(C),zu(C),Cu(()=>{s.forEach(S=>{const{subTree:g,suspense:b}=n,E=wl(g);if(S.type===E.type&&S.key===E.key){wd(E);const w=E.component.da;w&&Xt(w,b);return}p(S)})}),()=>{if(v=null,!t.default)return i=null;const S=t.default(),g=S[0];if(S.length>1)return i=null,S;if(!ps(g)||!(g.shapeFlag&4)&&!(g.shapeFlag&128))return i=null,g;let b=wl(g);if(b.type===Wt)return i=null,b;const E=b.type,w=Rm(Us(b)?b.type.__asyncResolved||{}:E),{include:P,exclude:N,max:k}=e;if(P&&(!w||!Qi(P,w))||N&&w&&Qi(N,w))return b.shapeFlag&=-257,i=b,g;const R=b.key==null?E:b.key,B=s.get(R);return b.el&&(b=Wr(b),g.shapeFlag&128&&(g.ssContent=b)),v=R,B?(b.el=B.el,b.component=B.component,b.transition&&fs(b,b.transition),b.shapeFlag|=512,o.delete(R),o.add(R)):(o.add(R),k&&o.size>parseInt(k,10)&&_(o.values().next().value)),b.shapeFlag|=256,i=b,wc(g.type)?g:b}}},RE=LE;function Qi(e,t){return ve(e)?e.some(n=>Qi(n,t)):Re(e)?e.split(",").includes(t):Xy(e)?(e.lastIndex=0,e.test(t)):!1}function U1(e,t){B1(e,"a",t)}function j1(e,t){B1(e,"da",t)}function B1(e,t,n=Yt){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(bu(t,r,n),n){let s=n.parent;for(;s&&s.parent;)Qa(s.parent.vnode)&&DE(r,t,n,s),s=s.parent}}function DE(e,t,n,r){const s=bu(t,e,r,!0);el(()=>{iu(r[t],s)},n)}function wd(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function wl(e){return e.shapeFlag&128?e.ssContent:e}function bu(e,t,n=Yt,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{Zs();const a=xo(n),l=dr(t,n,e,i);return a(),Js(),l});return r?s.unshift(o):s.push(o),o}}const ys=e=>(t,n=Yt)=>{(!hi||e==="sp")&&bu(e,(...r)=>t(...r),n)},q1=ys("bm"),Ni=ys("m"),Uf=ys("bu"),zu=ys("u"),Cu=ys("bum"),el=ys("um"),W1=ys("sp"),G1=ys("rtg"),K1=ys("rtc");function X1(e,t=Yt){bu("ec",e,t)}const jf="components",ME="directives";function $(e,t){return qf(jf,e,!0,t)||e}const Y1=Symbol.for("v-ndc");function Su(e){return Re(e)?qf(jf,e,!1)||e:e||Y1}function Bf(e){return qf(ME,e)}function qf(e,t,n=!0,r=!1){const s=Zt||Yt;if(s){const o=s.type;if(e===jf){const a=Rm(o,!1);if(a&&(a===t||a===zt(t)||a===Ys(zt(t))))return o}const i=bh(s[e]||o[e],t)||bh(s.appContext[e],t);return!i&&r?o:i}}function bh(e,t){return e&&(e[t]||e[zt(t)]||e[Ys(zt(t))])}function Et(e,t,n,r){let s;const o=n&&n[r],i=ve(e);if(i||Re(e)){const a=i&&Br(e);let l=!1;a&&(l=!Yn(e),e=mu(e)),s=new Array(e.length);for(let c=0,d=e.length;ct(a,l,void 0,o&&o[l]));else{const a=Object.keys(e);s=new Array(a.length);for(let l=0,c=a.length;l{const o=r.fn(...s);return o&&(o.key=r.key),o}:r.fn)}return e}function At(e,t,n={},r,s){if(Zt.ce||Zt.parent&&Us(Zt.parent)&&Zt.parent.ce)return t!=="default"&&(n.name=t),x(),ze(be,null,[z("slot",n,r&&r())],64);let o=e[t];o&&o._c&&(o._d=!1),x();const i=o&&Gf(o(n)),a=n.key||i&&i.key,l=ze(be,{key:(a&&!An(a)?a:`_${t}`)+(!i&&r?"_fb":"")},i||(r?r():[]),i&&e._===1?64:-2);return!s&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),o&&o._c&&(o._d=!0),l}function Gf(e){return e.some(t=>ps(t)?!(t.type===Wt||t.type===be&&!Gf(t.children)):!0)?e:null}function FE(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:yo(r)]=e[r];return n}const wm=e=>e?Av(e)?nl(e):wm(e.parent):null,ua=Je(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>wm(e.parent),$root:e=>wm(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Kf(e),$forceUpdate:e=>e.f||(e.f=()=>{Mf(e.update)}),$nextTick:e=>e.n||(e.n=Ro.bind(e.proxy)),$watch:e=>hw.bind(e)}),kd=(e,t)=>e!==Ze&&!e.__isScriptSetup&<(e,t),km={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:s,props:o,accessCache:i,type:a,appContext:l}=e;let c;if(t[0]!=="$"){const p=i[t];if(p!==void 0)switch(p){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return o[t]}else{if(kd(r,t))return i[t]=1,r[t];if(s!==Ze&<(s,t))return i[t]=2,s[t];if((c=e.propsOptions[0])&<(c,t))return i[t]=3,o[t];if(n!==Ze&<(n,t))return i[t]=4,n[t];xm&&(i[t]=0)}}const d=ua[t];let m,f;if(d)return t==="$attrs"&&mn(e.attrs,"get",""),d(e);if((m=a.__cssModules)&&(m=m[t]))return m;if(n!==Ze&<(n,t))return i[t]=4,n[t];if(f=l.config.globalProperties,lt(f,t))return f[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:o}=e;return kd(s,t)?(s[t]=n,!0):r!==Ze&<(r,t)?(r[t]=n,!0):lt(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:o}},i){let a;return!!n[i]||e!==Ze&<(e,i)||kd(t,i)||(a=o[0])&<(a,i)||lt(r,i)||lt(ua,i)||lt(s.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:lt(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},VE=Je({},km,{get(e,t){if(t!==Symbol.unscopables)return km.get(e,t,e)},has(e,t){return t[0]!=="_"&&!xf(t)}});function HE(){return null}function UE(){return null}function jE(e){}function BE(e){}function qE(){return null}function WE(){}function GE(e,t){return null}function KE(){return Z1().slots}function XE(){return Z1().attrs}function Z1(){const e=On();return e.setupContext||(e.setupContext=Nv(e))}function Ia(e){return ve(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function YE(e,t){const n=Ia(e);for(const r in t){if(r.startsWith("__skip"))continue;let s=n[r];s?ve(s)||$e(s)?s=n[r]={type:s,default:t[r]}:s.default=t[r]:s===null&&(s=n[r]={default:t[r]}),s&&t[`__skip_${r}`]&&(s.skipFactory=!0)}return n}function ZE(e,t){return!e||!t?e||t:ve(e)&&ve(t)?e.concat(t):Je({},Ia(e),Ia(t))}function JE(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function QE(e){const t=On();let n=e();return Im(),au(n)&&(n=n.catch(r=>{throw xo(t),r})),[n,()=>xo(t)]}let xm=!0;function ew(e){const t=Kf(e),n=e.proxy,r=e.ctx;xm=!1,t.beforeCreate&&zh(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:a,provide:l,inject:c,created:d,beforeMount:m,mounted:f,beforeUpdate:p,updated:h,activated:_,deactivated:v,beforeDestroy:C,beforeUnmount:S,destroyed:g,unmounted:b,render:E,renderTracked:w,renderTriggered:P,errorCaptured:N,serverPrefetch:k,expose:R,inheritAttrs:B,components:M,directives:H,filters:X}=t;if(c&&tw(c,r,null),i)for(const te in i){const le=i[te];$e(le)&&(r[te]=le.bind(n))}if(s){const te=s.call(n,n);mt(te)&&(e.data=Oi(te))}if(xm=!0,o)for(const te in o){const le=o[te],Ae=$e(le)?le.bind(n,n):$e(le.get)?le.get.bind(n,n):tn,Qe=!$e(le)&&$e(le.set)?le.set.bind(n):tn,De=en({get:Ae,set:Qe});Object.defineProperty(r,te,{enumerable:!0,configurable:!0,get:()=>De.value,set:je=>De.value=je})}if(a)for(const te in a)J1(a[te],r,n,te);if(l){const te=$e(l)?l.call(n):l;Reflect.ownKeys(te).forEach(le=>{da(le,te[le])})}d&&zh(d,e,"c");function G(te,le){ve(le)?le.forEach(Ae=>te(Ae.bind(n))):le&&te(le.bind(n))}if(G(q1,m),G(Ni,f),G(Uf,p),G(zu,h),G(U1,_),G(j1,v),G(X1,N),G(K1,w),G(G1,P),G(Cu,S),G(el,b),G(W1,k),ve(R))if(R.length){const te=e.exposed||(e.exposed={});R.forEach(le=>{Object.defineProperty(te,le,{get:()=>n[le],set:Ae=>n[le]=Ae})})}else e.exposed||(e.exposed={});E&&e.render===tn&&(e.render=E),B!=null&&(e.inheritAttrs=B),M&&(e.components=M),H&&(e.directives=H),k&&Hf(e)}function tw(e,t,n=tn){ve(e)&&(e=Tm(e));for(const r in e){const s=e[r];let o;mt(s)?"default"in s?o=lr(s.from||r,s.default,!0):o=lr(s.from||r):o=lr(s),Ot(o)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[r]=o}}function zh(e,t,n){dr(ve(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function J1(e,t,n,r){let s=r.includes(".")?vv(n,r):()=>n[r];if(Re(e)){const o=t[e];$e(o)&&Zn(s,o)}else if($e(e))Zn(s,e.bind(n));else if(mt(e))if(ve(e))e.forEach(o=>J1(o,t,n,r));else{const o=$e(e.handler)?e.handler.bind(n):t[e.handler];$e(o)&&Zn(s,o,e)}}function Kf(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,a=o.get(t);let l;return a?l=a:!s.length&&!n&&!r?l=t:(l={},s.length&&s.forEach(c=>Sc(l,c,i,!0)),Sc(l,t,i)),mt(t)&&o.set(t,l),l}function Sc(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&Sc(e,o,n,!0),s&&s.forEach(i=>Sc(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const a=nw[i]||n&&n[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const nw={data:Ch,props:Sh,emits:Sh,methods:ea,computed:ea,beforeCreate:zn,created:zn,beforeMount:zn,mounted:zn,beforeUpdate:zn,updated:zn,beforeDestroy:zn,beforeUnmount:zn,destroyed:zn,unmounted:zn,activated:zn,deactivated:zn,errorCaptured:zn,serverPrefetch:zn,components:ea,directives:ea,watch:sw,provide:Ch,inject:rw};function Ch(e,t){return t?e?function(){return Je($e(e)?e.call(this,this):e,$e(t)?t.call(this,this):t)}:t:e}function rw(e,t){return ea(Tm(e),Tm(t))}function Tm(e){if(ve(e)){const t={};for(let n=0;n1)return n&&$e(t)?t.call(r&&r.proxy):t}}function ev(){return!!(Yt||Zt||zo)}const tv={},nv=()=>Object.create(tv),rv=e=>Object.getPrototypeOf(e)===tv;function aw(e,t,n,r=!1){const s={},o=nv();e.propsDefaults=Object.create(null),sv(e,t,s,o);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:Lf(s):e.type.props?e.props=s:e.props=o,e.attrs=o}function lw(e,t,n,r){const{props:s,attrs:o,vnode:{patchFlag:i}}=e,a=nt(s),[l]=e.propsOptions;let c=!1;if((r||i>0)&&!(i&16)){if(i&8){const d=e.vnode.dynamicProps;for(let m=0;m{l=!0;const[f,p]=ov(m,t,!0);Je(i,f),p&&a.push(...p)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!o&&!l)return mt(e)&&r.set(e,_o),_o;if(ve(o))for(let d=0;de[0]==="_"||e==="$stable",Xf=e=>ve(e)?e.map(Dn):[Dn(e)],uw=(e,t,n)=>{if(t._n)return t;const r=D((...s)=>Xf(t(...s)),n);return r._c=!1,r},av=(e,t,n)=>{const r=e._ctx;for(const s in e){if(iv(s))continue;const o=e[s];if($e(o))t[s]=uw(s,o,r);else if(o!=null){const i=Xf(o);t[s]=()=>i}}},lv=(e,t)=>{const n=Xf(t);e.slots.default=()=>n},cv=(e,t,n)=>{for(const r in t)(n||r!=="_")&&(e[r]=t[r])},dw=(e,t,n)=>{const r=e.slots=nv();if(e.vnode.shapeFlag&32){const s=t._;s?(cv(r,t,n),n&&kf(r,"_",s,!0)):av(t,r)}else t&&lv(e,t)},mw=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=Ze;if(r.shapeFlag&32){const a=t._;a?n&&a===1?o=!1:cv(s,t,n):(o=!t.$stable,av(t,s)),i=t}else t&&(lv(e,t),i={default:1});if(o)for(const a in s)!iv(a)&&i[a]==null&&delete s[a]},Xt=Sv;function uv(e){return mv(e)}function dv(e){return mv(e,EE)}function mv(e,t){const n=Za();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:a,createComment:l,setText:c,setElementText:d,parentNode:m,nextSibling:f,setScopeId:p=tn,insertStaticContent:h}=e,_=(O,I,q,ne=null,J=null,ie=null,pe=void 0,T=null,A=!!I.dynamicChildren)=>{if(O===I)return;O&&!Er(O,I)&&(ne=Y(O),je(O,J,ie,!0),O=null),I.patchFlag===-2&&(A=!1,I.dynamicChildren=null);const{type:F,ref:se,shapeFlag:ce}=I;switch(F){case ls:v(O,I,q,ne);break;case Wt:C(O,I,q,ne);break;case Co:O==null&&S(I,q,ne,pe);break;case be:M(O,I,q,ne,J,ie,pe,T,A);break;default:ce&1?E(O,I,q,ne,J,ie,pe,T,A):ce&6?H(O,I,q,ne,J,ie,pe,T,A):(ce&64||ce&128)&&F.process(O,I,q,ne,J,ie,pe,T,A,ye)}se!=null&&J&&Na(se,O&&O.ref,ie,I||O,!I)},v=(O,I,q,ne)=>{if(O==null)r(I.el=a(I.children),q,ne);else{const J=I.el=O.el;I.children!==O.children&&c(J,I.children)}},C=(O,I,q,ne)=>{O==null?r(I.el=l(I.children||""),q,ne):I.el=O.el},S=(O,I,q,ne)=>{[O.el,O.anchor]=h(O.children,I,q,ne,O.el,O.anchor)},g=({el:O,anchor:I},q,ne)=>{let J;for(;O&&O!==I;)J=f(O),r(O,q,ne),O=J;r(I,q,ne)},b=({el:O,anchor:I})=>{let q;for(;O&&O!==I;)q=f(O),s(O),O=q;s(I)},E=(O,I,q,ne,J,ie,pe,T,A)=>{I.type==="svg"?pe="svg":I.type==="math"&&(pe="mathml"),O==null?w(I,q,ne,J,ie,pe,T,A):k(O,I,J,ie,pe,T,A)},w=(O,I,q,ne,J,ie,pe,T)=>{let A,F;const{props:se,shapeFlag:ce,transition:oe,dirs:j}=O;if(A=O.el=i(O.type,ie,se&&se.is,se),ce&8?d(A,O.children):ce&16&&N(O.children,A,null,ne,J,xd(O,ie),pe,T),j&&Vr(O,null,ne,"created"),P(A,O,O.scopeId,pe,ne),se){for(const we in se)we!=="value"&&!as(we)&&o(A,we,null,se[we],ie,ne);"value"in se&&o(A,"value",null,se.value,ie),(F=se.onVnodeBeforeMount)&&Rn(F,ne,O)}j&&Vr(O,null,ne,"beforeMount");const Z=fv(J,oe);Z&&oe.beforeEnter(A),r(A,I,q),((F=se&&se.onVnodeMounted)||Z||j)&&Xt(()=>{F&&Rn(F,ne,O),Z&&oe.enter(A),j&&Vr(O,null,ne,"mounted")},J)},P=(O,I,q,ne,J)=>{if(q&&p(O,q),ne)for(let ie=0;ie{for(let F=A;F{const T=I.el=O.el;let{patchFlag:A,dynamicChildren:F,dirs:se}=I;A|=O.patchFlag&16;const ce=O.props||Ze,oe=I.props||Ze;let j;if(q&&no(q,!1),(j=oe.onVnodeBeforeUpdate)&&Rn(j,q,I,O),se&&Vr(I,O,q,"beforeUpdate"),q&&no(q,!0),(ce.innerHTML&&oe.innerHTML==null||ce.textContent&&oe.textContent==null)&&d(T,""),F?R(O.dynamicChildren,F,T,q,ne,xd(I,J),ie):pe||le(O,I,T,null,q,ne,xd(I,J),ie,!1),A>0){if(A&16)B(T,ce,oe,q,J);else if(A&2&&ce.class!==oe.class&&o(T,"class",null,oe.class,J),A&4&&o(T,"style",ce.style,oe.style,J),A&8){const Z=I.dynamicProps;for(let we=0;we{j&&Rn(j,q,I,O),se&&Vr(I,O,q,"updated")},ne)},R=(O,I,q,ne,J,ie,pe)=>{for(let T=0;T{if(I!==q){if(I!==Ze)for(const ie in I)!as(ie)&&!(ie in q)&&o(O,ie,I[ie],null,J,ne);for(const ie in q){if(as(ie))continue;const pe=q[ie],T=I[ie];pe!==T&&ie!=="value"&&o(O,ie,T,pe,J,ne)}"value"in q&&o(O,"value",I.value,q.value,J)}},M=(O,I,q,ne,J,ie,pe,T,A)=>{const F=I.el=O?O.el:a(""),se=I.anchor=O?O.anchor:a("");let{patchFlag:ce,dynamicChildren:oe,slotScopeIds:j}=I;j&&(T=T?T.concat(j):j),O==null?(r(F,q,ne),r(se,q,ne),N(I.children||[],q,se,J,ie,pe,T,A)):ce>0&&ce&64&&oe&&O.dynamicChildren?(R(O.dynamicChildren,oe,q,J,ie,pe,T),(I.key!=null||J&&I===J.subTree)&&Yf(O,I,!0)):le(O,I,q,se,J,ie,pe,T,A)},H=(O,I,q,ne,J,ie,pe,T,A)=>{I.slotScopeIds=T,O==null?I.shapeFlag&512?J.ctx.activate(I,q,ne,pe,A):X(I,q,ne,J,ie,pe,A):ae(O,I,A)},X=(O,I,q,ne,J,ie,pe)=>{const T=O.component=Tv(O,ne,J);if(Qa(O)&&(T.ctx.renderer=ye),Ov(T,!1,pe),T.asyncDep){if(J&&J.registerDep(T,G,pe),!O.el){const A=T.subTree=z(Wt);C(null,A,I,q)}}else G(T,O,I,q,J,ie,pe)},ae=(O,I,q)=>{const ne=I.component=O.component;if(zw(O,I,q))if(ne.asyncDep&&!ne.asyncResolved){te(ne,I,q);return}else ne.next=I,ne.update();else I.el=O.el,ne.vnode=I},G=(O,I,q,ne,J,ie,pe)=>{const T=()=>{if(O.isMounted){let{next:ce,bu:oe,u:j,parent:Z,vnode:we}=O;{const _e=pv(O);if(_e){ce&&(ce.el=we.el,te(O,ce,pe)),_e.asyncDep.then(()=>{O.isUnmounted||T()});return}}let V=ce,U;no(O,!1),ce?(ce.el=we.el,te(O,ce,pe)):ce=we,oe&&vo(oe),(U=ce.props&&ce.props.onVnodeBeforeUpdate)&&Rn(U,Z,ce,we),no(O,!0);const K=Xl(O),re=O.subTree;O.subTree=K,_(re,K,m(re.el),Y(re),O,J,ie),ce.el=K.el,V===null&&wu(O,K.el),j&&Xt(j,J),(U=ce.props&&ce.props.onVnodeUpdated)&&Xt(()=>Rn(U,Z,ce,we),J)}else{let ce;const{el:oe,props:j}=I,{bm:Z,m:we,parent:V,root:U,type:K}=O,re=Us(I);if(no(O,!1),Z&&vo(Z),!re&&(ce=j&&j.onVnodeBeforeMount)&&Rn(ce,V,I),no(O,!0),oe&&Xe){const _e=()=>{O.subTree=Xl(O),Xe(oe,O.subTree,O,J,null)};re&&K.__asyncHydrate?K.__asyncHydrate(oe,O,_e):_e()}else{U.ce&&U.ce._injectChildStyle(K);const _e=O.subTree=Xl(O);_(null,_e,q,ne,O,J,ie),I.el=_e.el}if(we&&Xt(we,J),!re&&(ce=j&&j.onVnodeMounted)){const _e=I;Xt(()=>Rn(ce,V,_e),J)}(I.shapeFlag&256||V&&Us(V.vnode)&&V.vnode.shapeFlag&256)&&O.a&&Xt(O.a,J),O.isMounted=!0,I=q=ne=null}};O.scope.on();const A=O.effect=new ka(T);O.scope.off();const F=O.update=A.run.bind(A),se=O.job=A.runIfDirty.bind(A);se.i=O,se.id=O.uid,A.scheduler=()=>Mf(se),no(O,!0),F()},te=(O,I,q)=>{I.component=O;const ne=O.vnode.props;O.vnode=I,O.next=null,lw(O,I.props,ne,q),mw(O,I.children,q),Zs(),fh(O),Js()},le=(O,I,q,ne,J,ie,pe,T,A=!1)=>{const F=O&&O.children,se=O?O.shapeFlag:0,ce=I.children,{patchFlag:oe,shapeFlag:j}=I;if(oe>0){if(oe&128){Qe(F,ce,q,ne,J,ie,pe,T,A);return}else if(oe&256){Ae(F,ce,q,ne,J,ie,pe,T,A);return}}j&8?(se&16&&Ge(F,J,ie),ce!==F&&d(q,ce)):se&16?j&16?Qe(F,ce,q,ne,J,ie,pe,T,A):Ge(F,J,ie,!0):(se&8&&d(q,""),j&16&&N(ce,q,ne,J,ie,pe,T,A))},Ae=(O,I,q,ne,J,ie,pe,T,A)=>{O=O||_o,I=I||_o;const F=O.length,se=I.length,ce=Math.min(F,se);let oe;for(oe=0;oese?Ge(O,J,ie,!0,!1,ce):N(I,q,ne,J,ie,pe,T,A,ce)},Qe=(O,I,q,ne,J,ie,pe,T,A)=>{let F=0;const se=I.length;let ce=O.length-1,oe=se-1;for(;F<=ce&&F<=oe;){const j=O[F],Z=I[F]=A?Is(I[F]):Dn(I[F]);if(Er(j,Z))_(j,Z,q,null,J,ie,pe,T,A);else break;F++}for(;F<=ce&&F<=oe;){const j=O[ce],Z=I[oe]=A?Is(I[oe]):Dn(I[oe]);if(Er(j,Z))_(j,Z,q,null,J,ie,pe,T,A);else break;ce--,oe--}if(F>ce){if(F<=oe){const j=oe+1,Z=joe)for(;F<=ce;)je(O[F],J,ie,!0),F++;else{const j=F,Z=F,we=new Map;for(F=Z;F<=oe;F++){const Fe=I[F]=A?Is(I[F]):Dn(I[F]);Fe.key!=null&&we.set(Fe.key,F)}let V,U=0;const K=oe-Z+1;let re=!1,_e=0;const Te=new Array(K);for(F=0;F=K){je(Fe,J,ie,!0);continue}let at;if(Fe.key!=null)at=we.get(Fe.key);else for(V=Z;V<=oe;V++)if(Te[V-Z]===0&&Er(Fe,I[V])){at=V;break}at===void 0?je(Fe,J,ie,!0):(Te[at-Z]=F+1,at>=_e?_e=at:re=!0,_(Fe,I[at],q,null,J,ie,pe,T,A),U++)}const Ve=re?fw(Te):_o;for(V=Ve.length-1,F=K-1;F>=0;F--){const Fe=Z+F,at=I[Fe],Ie=Fe+1{const{el:ie,type:pe,transition:T,children:A,shapeFlag:F}=O;if(F&6){De(O.component.subTree,I,q,ne);return}if(F&128){O.suspense.move(I,q,ne);return}if(F&64){pe.move(O,I,q,ye);return}if(pe===be){r(ie,I,q);for(let ce=0;ceT.enter(ie),J);else{const{leave:ce,delayLeave:oe,afterLeave:j}=T,Z=()=>r(ie,I,q),we=()=>{ce(ie,()=>{Z(),j&&j()})};oe?oe(ie,Z,we):we()}else r(ie,I,q)},je=(O,I,q,ne=!1,J=!1)=>{const{type:ie,props:pe,ref:T,children:A,dynamicChildren:F,shapeFlag:se,patchFlag:ce,dirs:oe,cacheIndex:j}=O;if(ce===-2&&(J=!1),T!=null&&Na(T,null,q,O,!0),j!=null&&(I.renderCache[j]=void 0),se&256){I.ctx.deactivate(O);return}const Z=se&1&&oe,we=!Us(O);let V;if(we&&(V=pe&&pe.onVnodeBeforeUnmount)&&Rn(V,I,O),se&6)gt(O.component,q,ne);else{if(se&128){O.suspense.unmount(q,ne);return}Z&&Vr(O,null,I,"beforeUnmount"),se&64?O.type.remove(O,I,q,ye,ne):F&&!F.hasOnce&&(ie!==be||ce>0&&ce&64)?Ge(F,I,q,!1,!0):(ie===be&&ce&384||!J&&se&16)&&Ge(A,I,q),ne&&ft(O)}(we&&(V=pe&&pe.onVnodeUnmounted)||Z)&&Xt(()=>{V&&Rn(V,I,O),Z&&Vr(O,null,I,"unmounted")},q)},ft=O=>{const{type:I,el:q,anchor:ne,transition:J}=O;if(I===be){pt(q,ne);return}if(I===Co){b(O);return}const ie=()=>{s(q),J&&!J.persisted&&J.afterLeave&&J.afterLeave()};if(O.shapeFlag&1&&J&&!J.persisted){const{leave:pe,delayLeave:T}=J,A=()=>pe(q,ie);T?T(O.el,ie,A):A()}else ie()},pt=(O,I)=>{let q;for(;O!==I;)q=f(O),s(O),O=q;s(I)},gt=(O,I,q)=>{const{bum:ne,scope:J,job:ie,subTree:pe,um:T,m:A,a:F}=O;Ec(A),Ec(F),ne&&vo(ne),J.stop(),ie&&(ie.flags|=8,je(pe,O,I,q)),T&&Xt(T,I),Xt(()=>{O.isUnmounted=!0},I),I&&I.pendingBranch&&!I.isUnmounted&&O.asyncDep&&!O.asyncResolved&&O.suspenseId===I.pendingId&&(I.deps--,I.deps===0&&I.resolve())},Ge=(O,I,q,ne=!1,J=!1,ie=0)=>{for(let pe=ie;pe{if(O.shapeFlag&6)return Y(O.component.subTree);if(O.shapeFlag&128)return O.suspense.next();const I=f(O.anchor||O.el),q=I&&I[P1];return q?f(q):I};let fe=!1;const de=(O,I,q)=>{O==null?I._vnode&&je(I._vnode,null,null,!0):_(I._vnode||null,O,I,null,null,null,q),I._vnode=O,fe||(fe=!0,fh(),Cc(),fe=!1)},ye={p:_,um:je,m:De,r:ft,mt:X,mc:N,pc:le,pbc:R,n:Y,o:e};let Be,Xe;return t&&([Be,Xe]=t(ye)),{render:de,hydrate:Be,createApp:iw(de,Be)}}function xd({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function no({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function fv(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Yf(e,t,n=!1){const r=e.children,s=t.children;if(ve(r)&&ve(s))for(let o=0;o>1,e[n[a]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}function pv(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:pv(t)}function Ec(e){if(e)for(let t=0;tlr(hv);function gv(e,t){return tl(e,null,t)}function pw(e,t){return tl(e,null,{flush:"post"})}function yv(e,t){return tl(e,null,{flush:"sync"})}function Zn(e,t,n){return tl(e,t,n)}function tl(e,t,n=Ze){const{immediate:r,deep:s,flush:o,once:i}=n,a=Je({},n),l=t&&r||!t&&o!=="post";let c;if(hi){if(o==="sync"){const p=_v();c=p.__watcherHandles||(p.__watcherHandles=[])}else if(!l){const p=()=>{};return p.stop=tn,p.resume=tn,p.pause=tn,p}}const d=Yt;a.call=(p,h,_)=>dr(p,d,h,_);let m=!1;o==="post"?a.scheduler=p=>{Xt(p,d&&d.suspense)}:o!=="sync"&&(m=!0,a.scheduler=(p,h)=>{h?p():Mf(p)}),a.augmentJob=p=>{t&&(p.flags|=4),m&&(p.flags|=2,d&&(p.id=d.uid,p.i=d))};const f=aE(e,t,a);return hi&&(c?c.push(f):l&&f()),f}function hw(e,t,n){const r=this.proxy,s=Re(e)?e.includes(".")?vv(r,e):()=>r[e]:e.bind(r,r);let o;$e(t)?o=t:(o=t.handler,n=t);const i=xo(this),a=tl(s,o.bind(r),n);return i(),a}function vv(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{let d,m=Ze,f;return yv(()=>{const p=e[s];dn(d,p)&&(d=p,c())}),{get(){return l(),n.get?n.get(d):d},set(p){const h=n.set?n.set(p):p;if(!dn(h,d)&&!(m!==Ze&&dn(p,m)))return;const _=r.vnode.props;_&&(t in _||s in _||o in _)&&(`onUpdate:${t}`in _||`onUpdate:${s}`in _||`onUpdate:${o}`in _)||(d=p,c()),r.emit(`update:${t}`,h),dn(p,h)&&dn(p,m)&&!dn(h,f)&&c(),m=p,f=h}}});return a[Symbol.iterator]=()=>{let l=0;return{next(){return l<2?{value:l++?i||Ze:a,done:!1}:{done:!0}}}},a}const bv=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${zt(t)}Modifiers`]||e[`${pn(t)}Modifiers`];function gw(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||Ze;let s=n;const o=t.startsWith("update:"),i=o&&bv(r,t.slice(7));i&&(i.trim&&(s=n.map(d=>Re(d)?d.trim():d)),i.number&&(s=n.map(Ea)));let a,l=r[a=yo(t)]||r[a=yo(zt(t))];!l&&o&&(l=r[a=yo(pn(t))]),l&&dr(l,e,6,s);const c=r[a+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,dr(c,e,6,s)}}function zv(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const o=e.emits;let i={},a=!1;if(!$e(e)){const l=c=>{const d=zv(c,t,!0);d&&(a=!0,Je(i,d))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!o&&!a?(mt(e)&&r.set(e,null),null):(ve(o)?o.forEach(l=>i[l]=null):Je(i,o),mt(e)&&r.set(e,i),i)}function Eu(e,t){return!e||!Ks(t)?!1:(t=t.slice(2).replace(/Once$/,""),lt(e,t[0].toLowerCase()+t.slice(1))||lt(e,pn(t))||lt(e,t))}function Xl(e){const{type:t,vnode:n,proxy:r,withProxy:s,propsOptions:[o],slots:i,attrs:a,emit:l,render:c,renderCache:d,props:m,data:f,setupState:p,ctx:h,inheritAttrs:_}=e,v=$a(e);let C,S;try{if(n.shapeFlag&4){const b=s||r,E=b;C=Dn(c.call(E,b,d,m,p,f,h)),S=a}else{const b=t;C=Dn(b.length>1?b(m,{attrs:a,slots:i,emit:l}):b(m,null)),S=t.props?a:vw(a)}}catch(b){ma.length=0,Lo(b,e,1),C=z(Wt)}let g=C;if(S&&_!==!1){const b=Object.keys(S),{shapeFlag:E}=g;b.length&&E&7&&(o&&b.some(ou)&&(S=bw(S,o)),g=Wr(g,S,!1,!0))}return n.dirs&&(g=Wr(g,null,!1,!0),g.dirs=g.dirs?g.dirs.concat(n.dirs):n.dirs),n.transition&&fs(g,n.transition),C=g,$a(v),C}function yw(e,t=!0){let n;for(let r=0;r{let t;for(const n in e)(n==="class"||n==="style"||Ks(n))&&((t||(t={}))[n]=e[n]);return t},bw=(e,t)=>{const n={};for(const r in e)(!ou(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function zw(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:a,patchFlag:l}=t,c=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?wh(r,i,c):!!i;if(l&8){const d=t.dynamicProps;for(let m=0;me.__isSuspense;let Om=0;const Cw={name:"Suspense",__isSuspense:!0,process(e,t,n,r,s,o,i,a,l,c){if(e==null)Ew(t,n,r,s,o,i,a,l,c);else{if(o&&o.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}ww(e,t,n,r,s,i,a,l,c)}},hydrate:kw,normalize:xw},Sw=Cw;function Pa(e,t){const n=e.props&&e.props[t];$e(n)&&n()}function Ew(e,t,n,r,s,o,i,a,l){const{p:c,o:{createElement:d}}=l,m=d("div"),f=e.suspense=Cv(e,s,r,t,m,n,o,i,a,l);c(null,f.pendingBranch=e.ssContent,m,null,r,f,o,i),f.deps>0?(Pa(e,"onPending"),Pa(e,"onFallback"),c(null,e.ssFallback,t,n,r,null,o,i),ui(f,e.ssFallback)):f.resolve(!1,!0)}function ww(e,t,n,r,s,o,i,a,{p:l,um:c,o:{createElement:d}}){const m=t.suspense=e.suspense;m.vnode=t,t.el=e.el;const f=t.ssContent,p=t.ssFallback,{activeBranch:h,pendingBranch:_,isInFallback:v,isHydrating:C}=m;if(_)m.pendingBranch=f,Er(f,_)?(l(_,f,m.hiddenContainer,null,s,m,o,i,a),m.deps<=0?m.resolve():v&&(C||(l(h,p,n,r,s,null,o,i,a),ui(m,p)))):(m.pendingId=Om++,C?(m.isHydrating=!1,m.activeBranch=_):c(_,s,m),m.deps=0,m.effects.length=0,m.hiddenContainer=d("div"),v?(l(null,f,m.hiddenContainer,null,s,m,o,i,a),m.deps<=0?m.resolve():(l(h,p,n,r,s,null,o,i,a),ui(m,p))):h&&Er(f,h)?(l(h,f,n,r,s,m,o,i,a),m.resolve(!0)):(l(null,f,m.hiddenContainer,null,s,m,o,i,a),m.deps<=0&&m.resolve()));else if(h&&Er(f,h))l(h,f,n,r,s,m,o,i,a),ui(m,f);else if(Pa(t,"onPending"),m.pendingBranch=f,f.shapeFlag&512?m.pendingId=f.component.suspenseId:m.pendingId=Om++,l(null,f,m.hiddenContainer,null,s,m,o,i,a),m.deps<=0)m.resolve();else{const{timeout:S,pendingId:g}=m;S>0?setTimeout(()=>{m.pendingId===g&&m.fallback(p)},S):S===0&&m.fallback(p)}}function Cv(e,t,n,r,s,o,i,a,l,c,d=!1){const{p:m,m:f,um:p,n:h,o:{parentNode:_,remove:v}}=c;let C;const S=Tw(e);S&&t&&t.pendingBranch&&(C=t.pendingId,t.deps++);const g=e.props?wa(e.props.timeout):void 0,b=o,E={vnode:e,parent:t,parentComponent:n,namespace:i,container:r,hiddenContainer:s,deps:0,pendingId:Om++,timeout:typeof g=="number"?g:-1,activeBranch:null,pendingBranch:null,isInFallback:!d,isHydrating:d,isUnmounted:!1,effects:[],resolve(w=!1,P=!1){const{vnode:N,activeBranch:k,pendingBranch:R,pendingId:B,effects:M,parentComponent:H,container:X}=E;let ae=!1;E.isHydrating?E.isHydrating=!1:w||(ae=k&&R.transition&&R.transition.mode==="out-in",ae&&(k.transition.afterLeave=()=>{B===E.pendingId&&(f(R,X,o===b?h(k):o,0),Aa(M))}),k&&(_(k.el)===X&&(o=h(k)),p(k,H,E,!0)),ae||f(R,X,o,0)),ui(E,R),E.pendingBranch=null,E.isInFallback=!1;let G=E.parent,te=!1;for(;G;){if(G.pendingBranch){G.effects.push(...M),te=!0;break}G=G.parent}!te&&!ae&&Aa(M),E.effects=[],S&&t&&t.pendingBranch&&C===t.pendingId&&(t.deps--,t.deps===0&&!P&&t.resolve()),Pa(N,"onResolve")},fallback(w){if(!E.pendingBranch)return;const{vnode:P,activeBranch:N,parentComponent:k,container:R,namespace:B}=E;Pa(P,"onFallback");const M=h(N),H=()=>{E.isInFallback&&(m(null,w,R,M,k,null,B,a,l),ui(E,w))},X=w.transition&&w.transition.mode==="out-in";X&&(N.transition.afterLeave=H),E.isInFallback=!0,p(N,k,null,!0),X||H()},move(w,P,N){E.activeBranch&&f(E.activeBranch,w,P,N),E.container=w},next(){return E.activeBranch&&h(E.activeBranch)},registerDep(w,P,N){const k=!!E.pendingBranch;k&&E.deps++;const R=w.vnode.el;w.asyncDep.catch(B=>{Lo(B,w,0)}).then(B=>{if(w.isUnmounted||E.isUnmounted||E.pendingId!==w.suspenseId)return;w.asyncResolved=!0;const{vnode:M}=w;Pm(w,B,!1),R&&(M.el=R);const H=!R&&w.subTree.el;P(w,M,_(R||w.subTree.el),R?null:h(w.subTree),E,i,N),H&&v(H),wu(w,M.el),k&&--E.deps===0&&E.resolve()})},unmount(w,P){E.isUnmounted=!0,E.activeBranch&&p(E.activeBranch,n,w,P),E.pendingBranch&&p(E.pendingBranch,n,w,P)}};return E}function kw(e,t,n,r,s,o,i,a,l){const c=t.suspense=Cv(t,r,n,e.parentNode,document.createElement("div"),null,s,o,i,a,!0),d=l(e,c.pendingBranch=t.ssContent,n,c,o,i);return c.deps===0&&c.resolve(!1,!0),d}function xw(e){const{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=kh(r?n.default:n),e.ssFallback=r?kh(n.fallback):z(Wt)}function kh(e){let t;if($e(e)){const n=ko&&e._c;n&&(e._d=!1,x()),e=e(),n&&(e._d=!0,t=yn,Ev())}return ve(e)&&(e=yw(e)),e=Dn(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function Sv(e,t){t&&t.pendingBranch?ve(e)?t.effects.push(...e):t.effects.push(e):Aa(e)}function ui(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let s=t.el;for(;!s&&t.component;)t=t.component.subTree,s=t.el;n.el=s,r&&r.subTree===n&&(r.vnode.el=s,wu(r,s))}function Tw(e){const t=e.props&&e.props.suspensible;return t!=null&&t!==!1}const be=Symbol.for("v-fgt"),ls=Symbol.for("v-txt"),Wt=Symbol.for("v-cmt"),Co=Symbol.for("v-stc"),ma=[];let yn=null;function x(e=!1){ma.push(yn=e?null:[])}function Ev(){ma.pop(),yn=ma[ma.length-1]||null}let ko=1;function $m(e,t=!1){ko+=e,e<0&&yn&&t&&(yn.hasOnce=!0)}function wv(e){return e.dynamicChildren=ko>0?yn||_o:null,Ev(),ko>0&&yn&&yn.push(e),e}function L(e,t,n,r,s,o){return wv(u(e,t,n,r,s,o,!0))}function ze(e,t,n,r,s){return wv(z(e,t,n,r,s,!0))}function ps(e){return e?e.__v_isVNode===!0:!1}function Er(e,t){return e.type===t.type&&e.key===t.key}function Aw(e){}const kv=({key:e})=>e??null,Yl=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Re(e)||Ot(e)||$e(e)?{i:Zt,r:e,k:t,f:!!n}:e:null);function u(e,t=null,n=null,r=0,s=null,o=e===be?0:1,i=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&kv(t),ref:t&&Yl(t),scopeId:yu,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:Zt};return a?(Zf(l,n),o&128&&e.normalize(l)):n&&(l.shapeFlag|=Re(n)?8:16),ko>0&&!i&&yn&&(l.patchFlag>0||o&6)&&l.patchFlag!==32&&yn.push(l),l}const z=Ow;function Ow(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===Y1)&&(e=Wt),ps(e)){const a=Wr(e,t,!0);return n&&Zf(a,n),ko>0&&!o&&yn&&(a.shapeFlag&6?yn[yn.indexOf(e)]=a:yn.push(a)),a.patchFlag=-2,a}if(Mw(e)&&(e=e.__vccOpts),t){t=xv(t);let{class:a,style:l}=t;a&&!Re(a)&&(t.class=Ce(a)),mt(l)&&(hu(l)&&!ve(l)&&(l=Je({},l)),t.style=_s(l))}const i=Re(e)?1:wc(e)?128:L1(e)?64:mt(e)?4:$e(e)?2:0;return u(e,t,n,r,s,i,o,!0)}function xv(e){return e?hu(e)||rv(e)?Je({},e):e:null}function Wr(e,t,n=!1,r=!1){const{props:s,ref:o,patchFlag:i,children:a,transition:l}=e,c=t?ii(s||{},t):s,d={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&kv(c),ref:t&&t.ref?n&&o?ve(o)?o.concat(Yl(t)):[o,Yl(t)]:Yl(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==be?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Wr(e.ssContent),ssFallback:e.ssFallback&&Wr(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&fs(d,l.clone(d)),d}function Kt(e=" ",t=0){return z(ls,null,e,t)}function $w(e,t){const n=z(Co,null,e);return n.staticCount=t,n}function ee(e="",t=!1){return t?(x(),ze(Wt,null,e)):z(Wt,null,e)}function Dn(e){return e==null||typeof e=="boolean"?z(Wt):ve(e)?z(be,null,e.slice()):ps(e)?Is(e):z(ls,null,String(e))}function Is(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Wr(e)}function Zf(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(ve(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),Zf(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!rv(t)?t._ctx=Zt:s===3&&Zt&&(Zt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else $e(t)?(t={default:t,_ctx:Zt},n=32):(t=String(t),r&64?(n=16,t=[Kt(t)]):n=8);e.children=t,e.shapeFlag|=n}function ii(...e){const t={};for(let n=0;nYt||Zt;let kc,Nm;{const e=Za(),t=(n,r)=>{let s;return(s=e[n])||(s=e[n]=[]),s.push(r),o=>{s.length>1?s.forEach(i=>i(o)):s[0](o)}};kc=t("__VUE_INSTANCE_SETTERS__",n=>Yt=n),Nm=t("__VUE_SSR_SETTERS__",n=>hi=n)}const xo=e=>{const t=Yt;return kc(e),e.scope.on(),()=>{e.scope.off(),kc(t)}},Im=()=>{Yt&&Yt.scope.off(),kc(null)};function Av(e){return e.vnode.shapeFlag&4}let hi=!1;function Ov(e,t=!1,n=!1){t&&Nm(t);const{props:r,children:s}=e.vnode,o=Av(e);aw(e,r,o,t),dw(e,s,n);const i=o?Pw(e,t):void 0;return t&&Nm(!1),i}function Pw(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,km);const{setup:r}=n;if(r){Zs();const s=e.setupContext=r.length>1?Nv(e):null,o=xo(e),i=$i(r,e,0,[e.props,s]),a=au(i);if(Js(),o(),(a||e.sp)&&!Us(e)&&Hf(e),a){if(i.then(Im,Im),t)return i.then(l=>{Pm(e,l,t)}).catch(l=>{Lo(l,e,0)});e.asyncDep=i}else Pm(e,i,t)}else $v(e,t)}function Pm(e,t,n){$e(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:mt(t)&&(e.setupState=Df(t)),$v(e,n)}let xc,Lm;function Lw(e){xc=e,Lm=t=>{t.render._rc&&(t.withProxy=new Proxy(t.ctx,VE))}}const Rw=()=>!xc;function $v(e,t,n){const r=e.type;if(!e.render){if(!t&&xc&&!r.render){const s=r.template||Kf(e).template;if(s){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:a,compilerOptions:l}=r,c=Je(Je({isCustomElement:o,delimiters:a},i),l);r.render=xc(s,c)}}e.render=r.render||tn,Lm&&Lm(e)}{const s=xo(e);Zs();try{ew(e)}finally{Js(),s()}}}const Dw={get(e,t){return mn(e,"get",""),e[t]}};function Nv(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Dw),slots:e.slots,emit:e.emit,expose:t}}function nl(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Df(_u(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in ua)return ua[n](e)},has(t,n){return n in t||n in ua}})):e.proxy}function Rm(e,t=!0){return $e(e)?e.displayName||e.name:e.name||t&&e.__name}function Mw(e){return $e(e)&&"__vccOpts"in e}const en=(e,t)=>rE(e,t,hi);function Ur(e,t,n){const r=arguments.length;return r===2?mt(t)&&!ve(t)?ps(t)?z(e,null,[t]):z(e,t):z(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&ps(n)&&(n=[n]),z(e,t,n))}function Fw(){}function Vw(e,t,n,r){const s=n[r];if(s&&Iv(s,e))return s;const o=t();return o.memo=e.slice(),o.cacheIndex=r,n[r]=o}function Iv(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let r=0;r0&&yn&&yn.push(e),!0}const Pv="3.5.13",Hw=tn,Uw=mE,jw=Zo,Bw=I1,qw={createComponentInstance:Tv,setupComponent:Ov,renderComponentRoot:Xl,setCurrentRenderingInstance:$a,isVNode:ps,normalizeVNode:Dn,getComponentPublicInstance:nl,ensureValidVNode:Gf,pushWarningContext:lE,popWarningContext:cE},Ww=qw,Gw=null,Kw=null,Xw=null;/** * @vue/runtime-dom v3.5.13 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let Rc;const Gm=typeof window<"u"&&window.trustedTypes;if(Gm)try{Rc=Gm.createPolicy("vue",{createHTML:e=>e})}catch{}const kg=Rc?e=>Rc.createHTML(e):e=>e,S0="http://www.w3.org/2000/svg",k0="http://www.w3.org/1998/Math/MathML",Ar=typeof document<"u"?document:null,Km=Ar&&Ar.createElement("template"),x0={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?Ar.createElementNS(S0,e):t==="mathml"?Ar.createElementNS(k0,e):n?Ar.createElement(e,{is:n}):Ar.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Ar.createTextNode(e),createComment:e=>Ar.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ar.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{Km.innerHTML=kg(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const a=Km.content;if(r==="svg"||r==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Br="transition",Us="animation",Cs=Symbol("_vtc"),xg={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Eg=pt({},Ld,xg),E0=e=>(e.displayName="Transition",e.props=Eg,e),Bt=E0((e,{slots:t})=>zr(A_,Tg(e),t)),vo=(e,t=[])=>{be(e)?e.forEach(n=>n(...t)):e&&e(...t)},Zm=e=>e?be(e)?e.some(t=>t.length>1):e.length>1:!1;function Tg(e){const t={};for(const U in e)U in xg||(t[U]=e[U]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:c=i,appearToClass:d=a,leaveFromClass:m=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,h=T0(o),_=h&&h[0],b=h&&h[1],{onBeforeEnter:C,onEnter:w,onEnterCancelled:g,onLeave:z,onLeaveCancelled:S,onBeforeAppear:k=C,onAppear:L=w,onAppearCancelled:D=g}=t,T=(U,W,ee,fe)=>{U._enterCancelled=fe,Yr(U,W?d:a),Yr(U,W?c:i),ee&&ee()},F=(U,W)=>{U._isLeaving=!1,Yr(U,m),Yr(U,p),Yr(U,f),W&&W()},G=U=>(W,ee)=>{const fe=U?L:w,K=()=>T(W,U,ee);vo(fe,[W,K]),Ym(()=>{Yr(W,U?l:s),pr(W,U?d:a),Zm(fe)||Xm(W,r,_,K)})};return pt(t,{onBeforeEnter(U){vo(C,[U]),pr(U,s),pr(U,i)},onBeforeAppear(U){vo(k,[U]),pr(U,l),pr(U,c)},onEnter:G(!1),onAppear:G(!0),onLeave(U,W){U._isLeaving=!0;const ee=()=>F(U,W);pr(U,m),U._enterCancelled?(pr(U,f),Mc()):(Mc(),pr(U,f)),Ym(()=>{U._isLeaving&&(Yr(U,m),pr(U,p),Zm(z)||Xm(U,r,b,ee))}),vo(z,[U,ee])},onEnterCancelled(U){T(U,!1,void 0,!0),vo(g,[U])},onAppearCancelled(U){T(U,!0,void 0,!0),vo(D,[U])},onLeaveCancelled(U){F(U),vo(S,[U])}})}function T0(e){if(e==null)return null;if(ft(e))return[Lu(e.enter),Lu(e.leave)];{const t=Lu(e);return[t,t]}}function Lu(e){return Ya(e)}function pr(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Cs]||(e[Cs]=new Set)).add(t)}function Yr(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Cs];n&&(n.delete(t),n.size||(e[Cs]=void 0))}function Ym(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let $0=0;function Xm(e,t,n,r){const o=e._endId=++$0,s=()=>{o===e._endId&&r()};if(n!=null)return setTimeout(s,n);const{type:i,timeout:a,propCount:l}=$g(e,t);if(!i)return r();const c=i+"end";let d=0;const m=()=>{e.removeEventListener(c,f),s()},f=p=>{p.target===e&&++d>=l&&m()};setTimeout(()=>{d(n[h]||"").split(", "),o=r(`${Br}Delay`),s=r(`${Br}Duration`),i=Jm(o,s),a=r(`${Us}Delay`),l=r(`${Us}Duration`),c=Jm(a,l);let d=null,m=0,f=0;t===Br?i>0&&(d=Br,m=i,f=s.length):t===Us?c>0&&(d=Us,m=c,f=l.length):(m=Math.max(i,c),d=m>0?i>c?Br:Us:null,f=d?d===Br?s.length:l.length:0);const p=d===Br&&/\b(transform|all)(,|$)/.test(r(`${Br}Property`).toString());return{type:d,timeout:m,propCount:f,hasTransform:p}}function Jm(e,t){for(;e.lengthQm(n)+Qm(e[r])))}function Qm(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Mc(){return document.body.offsetHeight}function A0(e,t,n){const r=e[Cs];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const il=Symbol("_vod"),Ag=Symbol("_vsh"),Li={beforeMount(e,{value:t},{transition:n}){e[il]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):js(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),js(e,!0),r.enter(e)):r.leave(e,()=>{js(e,!1)}):js(e,t))},beforeUnmount(e,{value:t}){js(e,t)}};function js(e,t){e.style.display=t?e[il]:"none",e[Ag]=!t}function O0(){Li.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}}}const Og=Symbol("");function P0(e){const t=cn();if(!t)return;const n=t.ut=(o=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(s=>al(s,o))},r=()=>{const o=e(t.proxy);t.ce?al(t.ce,o):Fc(t.subTree,o),n(o)};Dd(()=>{Ti(r)}),Is(()=>{Tn(r,Mn,{flush:"post"});const o=new MutationObserver(r);o.observe(t.subTree.el.parentNode,{childList:!0}),qi(()=>o.disconnect())})}function Fc(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{Fc(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)al(e.el,t);else if(e.type===ze)e.children.forEach(n=>Fc(n,t));else if(e.type===Io){let{el:n,anchor:r}=e;for(;n&&(al(n,t),n!==r);)n=n.nextSibling}}function al(e,t){if(e.nodeType===1){const n=e.style;let r="";for(const o in t)n.setProperty(`--${o}`,t[o]),r+=`--${o}: ${t[o]};`;n[Og]=r}}const I0=/(^|;)\s*display\s*:/;function L0(e,t,n){const r=e.style,o=yt(n);let s=!1;if(n&&!o){if(t)if(yt(t))for(const i of t.split(";")){const a=i.slice(0,i.indexOf(":")).trim();n[a]==null&&Na(r,a,"")}else for(const i in t)n[i]==null&&Na(r,i,"");for(const i in n)i==="display"&&(s=!0),Na(r,i,n[i])}else if(o){if(t!==n){const i=r[Og];i&&(n+=";"+i),r.cssText=n,s=I0.test(n)}}else t&&e.removeAttribute("style");il in e&&(e[il]=s?r.display:"",e[Ag]&&(r.display="none"))}const ef=/\s*!important$/;function Na(e,t,n){if(be(n))n.forEach(r=>Na(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=N0(e,t);ef.test(n)?e.setProperty(yn(r),n.replace(ef,""),"important"):e[r]=n}}const tf=["Webkit","Moz","ms"],Nu={};function N0(e,t){const n=Nu[t];if(n)return n;let r=qt(t);if(r!=="filter"&&r in e)return Nu[t]=r;r=Bi(r);for(let o=0;oDu||(F0.then(()=>Du=0),Du=Date.now());function H0(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Un(U0(r,n.value),t,5,[r])};return n.value=e,n.attached=V0(),n}function U0(e,t){if(be(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const lf=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,j0=(e,t,n,r,o,s)=>{const i=o==="svg";t==="class"?A0(e,r,i):t==="style"?L0(e,n,r):ji(t)?bd(t)||R0(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):B0(e,t,r,i))?(of(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&rf(e,t,r,i,s,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!yt(r))?of(e,qt(t),r,s,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),rf(e,t,r,i))};function B0(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&lf(t)&&Oe(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return lf(t)&&yt(n)?!1:t in e}const uf={};/*! #__NO_SIDE_EFFECTS__ */function Pg(e,t,n){const r=Vr(e,t);Ol(r)&&pt(r,t);class o extends Xl{constructor(i){super(r,i,n)}}return o.def=r,o}/*! #__NO_SIDE_EFFECTS__ */const W0=(e,t)=>Pg(e,t,jg),q0=typeof HTMLElement<"u"?HTMLElement:class{};class Xl extends q0{constructor(t,n={},r=ul){super(),this._def=t,this._props=n,this._createApp=r,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._ob=null,this.shadowRoot&&r!==ul?this._root=this.shadowRoot:t.shadowRoot!==!1?(this.attachShadow({mode:"open"}),this._root=this.shadowRoot):this._root=this,this._def.__asyncLoader||this._resolveProps(this._def)}connectedCallback(){if(!this.isConnected)return;this.shadowRoot||this._parseSlots(),this._connected=!0;let t=this;for(;t=t&&(t.parentNode||t.host);)if(t instanceof Xl){this._parent=t;break}this._instance||(this._resolved?(this._setParent(),this._update()):t&&t._pendingResolve?this._pendingResolve=t._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(t=this._parent){t&&(this._instance.parent=t._instance,this._instance.provides=t._instance.provides)}disconnectedCallback(){this._connected=!1,Uo(()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null)})}_resolveDef(){if(this._pendingResolve)return;for(let r=0;r{for(const o of r)this._setAttr(o.attributeName)}),this._ob.observe(this,{attributes:!0});const t=(r,o=!1)=>{this._resolved=!0,this._pendingResolve=void 0;const{props:s,styles:i}=r;let a;if(s&&!be(s))for(const l in s){const c=s[l];(c===Number||c&&c.type===Number)&&(l in this._props&&(this._props[l]=Ya(this._props[l])),(a||(a=Object.create(null)))[qt(l)]=!0)}this._numberProps=a,o&&this._resolveProps(r),this.shadowRoot&&this._applyStyles(i),this._mount(r)},n=this._def.__asyncLoader;n?this._pendingResolve=n().then(r=>t(this._def=r,!0)):t(this._def)}_mount(t){this._app=this._createApp(t),t.configureApp&&t.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);const n=this._instance&&this._instance.exposed;if(n)for(const r in n)st(this,r)||Object.defineProperty(this,r,{get:()=>zn(n[r])})}_resolveProps(t){const{props:n}=t,r=be(n)?n:Object.keys(n||{});for(const o of Object.keys(this))o[0]!=="_"&&r.includes(o)&&this._setProp(o,this[o]);for(const o of r.map(qt))Object.defineProperty(this,o,{get(){return this._getProp(o)},set(s){this._setProp(o,s,!0,!0)}})}_setAttr(t){if(t.startsWith("data-v-"))return;const n=this.hasAttribute(t);let r=n?this.getAttribute(t):uf;const o=qt(t);n&&this._numberProps&&this._numberProps[o]&&(r=Ya(r)),this._setProp(o,r,!1,!0)}_getProp(t){return this._props[t]}_setProp(t,n,r=!0,o=!1){if(n!==this._props[t]&&(n===uf?delete this._props[t]:(this._props[t]=n,t==="key"&&this._app&&(this._app._ceVNode.key=n)),o&&this._instance&&this._update(),r)){const s=this._ob;s&&s.disconnect(),n===!0?this.setAttribute(yn(t),""):typeof n=="string"||typeof n=="number"?this.setAttribute(yn(t),n+""):n||this.removeAttribute(yn(t)),s&&s.observe(this,{attributes:!0})}}_update(){Ug(this._createVNode(),this._root)}_createVNode(){const t={};this.shadowRoot||(t.onVnodeMounted=t.onVnodeUpdated=this._renderSlots.bind(this));const n=v(this._def,pt(t,this._props));return this._instance||(n.ce=r=>{this._instance=r,r.ce=this,r.isCE=!0;const o=(s,i)=>{this.dispatchEvent(new CustomEvent(s,Ol(i[0])?pt({detail:i},i[0]):{detail:i}))};r.emit=(s,...i)=>{o(s,i),yn(s)!==s&&o(yn(s),i)},this._setParent()}),n}_applyStyles(t,n){if(!t)return;if(n){if(n===this._def||this._styleChildren.has(n))return;this._styleChildren.add(n)}const r=this._nonce;for(let o=t.length-1;o>=0;o--){const s=document.createElement("style");r&&s.setAttribute("nonce",r),s.textContent=t[o],this.shadowRoot.prepend(s)}}_parseSlots(){const t=this._slots={};let n;for(;n=this.firstChild;){const r=n.nodeType===1&&n.getAttribute("slot")||"default";(t[r]||(t[r]=[])).push(n),this.removeChild(n)}}_renderSlots(){const t=(this._teleportTarget||this).querySelectorAll("slot"),n=this._instance.type.__scopeId;for(let r=0;r(delete e.props.mode,e),Y0=Z0({name:"TransitionGroup",props:pt({},Eg,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=cn(),r=Id();let o,s;return ql(()=>{if(!o.length)return;const i=e.moveClass||`${e.name||"v"}-move`;if(!tC(o[0].el,n.vnode.el,i))return;o.forEach(J0),o.forEach(Q0);const a=o.filter(eC);Mc(),a.forEach(l=>{const c=l.el,d=c.style;pr(c,i),d.transform=d.webkitTransform=d.transitionDuration="";const m=c[ll]=f=>{f&&f.target!==c||(!f||/transform$/.test(f.propertyName))&&(c.removeEventListener("transitionend",m),c[ll]=null,Yr(c,i))};c.addEventListener("transitionend",m)})}),()=>{const i=Xe(e),a=Tg(i);let l=i.tag||ze;if(o=[],s)for(let c=0;c{a.split(/\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\s+/).forEach(a=>a&&r.classList.add(a)),r.style.display="none";const s=t.nodeType===1?t:t.parentNode;s.appendChild(r);const{hasTransform:i}=$g(r);return s.removeChild(r),i}const fo=e=>{const t=e.props["onUpdate:modelValue"]||!1;return be(t)?n=>hs(t,n):t};function nC(e){e.target.composing=!0}function df(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Hn=Symbol("_assign"),vn={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e[Hn]=fo(o);const s=r||o.props&&o.props.type==="number";Ir(e,t?"change":"input",i=>{if(i.target.composing)return;let a=e.value;n&&(a=a.trim()),s&&(a=Za(a)),e[Hn](a)}),n&&Ir(e,"change",()=>{e.value=e.value.trim()}),t||(Ir(e,"compositionstart",nC),Ir(e,"compositionend",df),Ir(e,"change",df))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:o,number:s}},i){if(e[Hn]=fo(i),e.composing)return;const a=(s||e.type==="number")&&!/^0\d/.test(e.value)?Za(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||o&&e.value.trim()===l)||(e.value=l))}},jn={deep:!0,created(e,t,n){e[Hn]=fo(n),Ir(e,"change",()=>{const r=e._modelValue,o=ws(e),s=e.checked,i=e[Hn];if(be(r)){const a=Ll(r,o),l=a!==-1;if(s&&!l)i(r.concat(o));else if(!s&&l){const c=[...r];c.splice(a,1),i(c)}}else if(Vo(r)){const a=new Set(r);s?a.add(o):a.delete(o),i(a)}else i(Dg(e,s))})},mounted:mf,beforeUpdate(e,t,n){e[Hn]=fo(n),mf(e,t,n)}};function mf(e,{value:t,oldValue:n},r){e._modelValue=t;let o;if(be(t))o=Ll(t,r.props.value)>-1;else if(Vo(t))o=t.has(r.props.value);else{if(t===n)return;o=co(t,Dg(e,!0))}e.checked!==o&&(e.checked=o)}const qd={created(e,{value:t},n){e.checked=co(t,n.props.value),e[Hn]=fo(n),Ir(e,"change",()=>{e[Hn](ws(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[Hn]=fo(r),t!==n&&(e.checked=co(t,r.props.value))}},Gd={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=Vo(t);Ir(e,"change",()=>{const s=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?Za(ws(i)):ws(i));e[Hn](e.multiple?o?new Set(s):s:s[0]),e._assigning=!0,Uo(()=>{e._assigning=!1})}),e[Hn]=fo(r)},mounted(e,{value:t}){ff(e,t)},beforeUpdate(e,t,n){e[Hn]=fo(n)},updated(e,{value:t}){e._assigning||ff(e,t)}};function ff(e,t){const n=e.multiple,r=be(t);if(!(n&&!r&&!Vo(t))){for(let o=0,s=e.options.length;oString(c)===String(a)):i.selected=Ll(t,a)>-1}else i.selected=t.has(a);else if(co(ws(i),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function ws(e){return"_value"in e?e._value:e.value}function Dg(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Rg={created(e,t,n){fa(e,t,n,null,"created")},mounted(e,t,n){fa(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){fa(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){fa(e,t,n,r,"updated")}};function Mg(e,t){switch(e){case"SELECT":return Gd;case"TEXTAREA":return vn;default:switch(t){case"checkbox":return jn;case"radio":return qd;default:return vn}}}function fa(e,t,n,r,o){const i=Mg(e.tagName,n.props&&n.props.type)[o];i&&i(e,t,n,r)}function rC(){vn.getSSRProps=({value:e})=>({value:e}),qd.getSSRProps=({value:e},t)=>{if(t.props&&co(t.props.value,e))return{checked:!0}},jn.getSSRProps=({value:e},t)=>{if(be(e)){if(t.props&&Ll(e,t.props.value)>-1)return{checked:!0}}else if(Vo(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},Rg.getSSRProps=(e,t)=>{if(typeof t.type!="string")return;const n=Mg(t.type.toUpperCase(),t.props&&t.props.type);if(n.getSSRProps)return n.getSSRProps(e,t)}}const oC=["ctrl","shift","alt","meta"],sC={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>oC.some(n=>e[`${n}Key`]&&!t.includes(n))},bt=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(o,...s)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=yn(o.key);if(t.some(i=>i===s||iC[i]===s))return e(o)})},Fg=pt({patchProp:j0},x0);let pi,pf=!1;function Vg(){return pi||(pi=eg(Fg))}function Hg(){return pi=pf?pi:tg(Fg),pf=!0,pi}const Ug=(...e)=>{Vg().render(...e)},aC=(...e)=>{Hg().hydrate(...e)},ul=(...e)=>{const t=Vg().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Wg(r);if(!o)return;const s=t._component;!Oe(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const i=n(o,!1,Bg(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t},jg=(...e)=>{const t=Hg().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Wg(r);if(o)return n(o,!0,Bg(o))},t};function Bg(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Wg(e){return yt(e)?document.querySelector(e):e}let hf=!1;const lC=()=>{hf||(hf=!0,rC(),O0())};/** -* vue v3.5.13 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/const uC=()=>{},cC=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:A_,BaseTransitionPropsValidators:Ld,Comment:Dt,DeprecationTypes:w0,EffectScope:Sd,ErrorCodes:Fb,ErrorTypeStrings:_0,Fragment:ze,KeepAlive:cv,ReactiveEffect:ki,Static:Io,Suspense:Xv,Teleport:qn,Text:Nr,TrackOpTypes:Pb,Transition:Bt,TransitionGroup:X0,TriggerOpTypes:Ib,VueElement:Xl,assertNumber:Mb,callWithAsyncErrorHandling:Un,callWithErrorHandling:Ps,camelize:qt,capitalize:Bi,cloneVNode:wr,compatUtils:C0,compile:uC,computed:jt,createApp:ul,createBlock:ve,createCommentVNode:Q,createElementBlock:I,createElementVNode:u,createHydrationRenderer:tg,createPropsRestProxy:xv,createRenderer:eg,createSSRApp:jg,createSlots:Vd,createStaticVNode:s0,createTextVNode:Mt,createVNode:v,customRef:h_,defineAsyncComponent:lv,defineComponent:Vr,defineCustomElement:Pg,defineEmits:_v,defineExpose:gv,defineModel:bv,defineOptions:yv,defineProps:hv,defineSSRCustomElement:W0,defineSlots:zv,devtools:g0,effect:tb,effectScope:Nl,getCurrentInstance:cn,getCurrentScope:kd,getCurrentWatcher:Lb,getTransitionRawChildren:Bl,guardReactiveProps:gg,h:zr,handleError:Ho,hasInjectionContext:B_,hydrate:aC,hydrateOnIdle:nv,hydrateOnInteraction:iv,hydrateOnMediaQuery:sv,hydrateOnVisible:ov,initCustomFormatter:f0,initDirectivesForSSR:lC,inject:Vn,isMemoSame:wg,isProxy:Vl,isReactive:vr,isReadonly:mo,isRef:St,isRuntimeOnly:c0,isShallow:En,isVNode:Mr,markRaw:Hl,mergeDefaults:Sv,mergeModels:kv,mergeProps:us,nextTick:Uo,normalizeClass:Se,normalizeProps:Js,normalizeStyle:po,onActivated:P_,onBeforeMount:N_,onBeforeUnmount:Gl,onBeforeUpdate:Dd,onDeactivated:I_,onErrorCaptured:F_,onMounted:Is,onRenderTracked:M_,onRenderTriggered:R_,onScopeDispose:Jh,onServerPrefetch:D_,onUnmounted:qi,onUpdated:ql,onWatcherCleanup:y_,openBlock:x,popScopeId:Bb,provide:mi,proxyRefs:Od,pushScopeId:jb,queuePostFlushCb:Ti,reactive:Os,readonly:Ad,ref:Fn,registerRuntimeCompiler:u0,render:Ug,renderList:zt,renderSlot:wt,resolveComponent:O,resolveDirective:Md,resolveDynamicComponent:Kl,resolveFilter:v0,resolveTransitionHooks:bs,setBlockTracking:Oc,setDevtoolsHook:y0,setTransitionHooks:Rr,shallowReactive:$d,shallowReadonly:vb,shallowRef:Ul,ssrContextKey:sg,ssrUtils:b0,stop:nb,toDisplayString:y,toHandlerKey:ai,toHandlers:fv,toRaw:Xe,toRef:$b,toRefs:__,toValue:Sb,transformVNodeArgs:r0,triggerRef:wb,unref:zn,useAttrs:wv,useCssModule:K0,useCssVars:P0,useHost:Ig,useId:Kb,useModel:Bv,useSSRContext:ig,useShadowRoot:G0,useSlots:Cv,useTemplateRef:Zb,useTransitionState:Id,vModelCheckbox:jn,vModelDynamic:Rg,vModelRadio:qd,vModelSelect:Gd,vModelText:vn,vShow:Li,version:Sg,warn:h0,watch:Tn,watchEffect:ag,watchPostEffect:Uv,watchSyncEffect:lg,withAsyncContext:Ev,withCtx:N,withDefaults:vv,withDirectives:gt,withKeys:gn,withMemo:p0,withModifiers:bt,withScopeId:Wb},Symbol.toStringTag,{value:"Module"}));/*! +**/let Dm;const xh=typeof window<"u"&&window.trustedTypes;if(xh)try{Dm=xh.createPolicy("vue",{createHTML:e=>e})}catch{}const Lv=Dm?e=>Dm.createHTML(e):e=>e,Yw="http://www.w3.org/2000/svg",Zw="http://www.w3.org/1998/Math/MathML",ts=typeof document<"u"?document:null,Th=ts&&ts.createElement("template"),Jw={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?ts.createElementNS(Yw,e):t==="mathml"?ts.createElementNS(Zw,e):n?ts.createElement(e,{is:n}):ts.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>ts.createTextNode(e),createComment:e=>ts.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ts.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{Th.innerHTML=Lv(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const a=Th.content;if(r==="svg"||r==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},zs="transition",ji="animation",_i=Symbol("_vtc"),Rv={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Dv=Je({},Vf,Rv),Qw=e=>(e.displayName="Transition",e.props=Dv,e),rn=Qw((e,{slots:t})=>Ur(V1,Mv(e),t)),ro=(e,t=[])=>{ve(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ah=e=>e?ve(e)?e.some(t=>t.length>1):e.length>1:!1;function Mv(e){const t={};for(const M in e)M in Rv||(t[M]=e[M]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=o,appearActiveClass:c=i,appearToClass:d=a,leaveFromClass:m=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,h=ek(s),_=h&&h[0],v=h&&h[1],{onBeforeEnter:C,onEnter:S,onEnterCancelled:g,onLeave:b,onLeaveCancelled:E,onBeforeAppear:w=C,onAppear:P=S,onAppearCancelled:N=g}=t,k=(M,H,X,ae)=>{M._enterCancelled=ae,Ts(M,H?d:a),Ts(M,H?c:i),X&&X()},R=(M,H)=>{M._isLeaving=!1,Ts(M,m),Ts(M,p),Ts(M,f),H&&H()},B=M=>(H,X)=>{const ae=M?P:S,G=()=>k(H,M,X);ro(ae,[H,G]),Oh(()=>{Ts(H,M?l:o),Dr(H,M?d:a),Ah(ae)||$h(H,r,_,G)})};return Je(t,{onBeforeEnter(M){ro(C,[M]),Dr(M,o),Dr(M,i)},onBeforeAppear(M){ro(w,[M]),Dr(M,l),Dr(M,c)},onEnter:B(!1),onAppear:B(!0),onLeave(M,H){M._isLeaving=!0;const X=()=>R(M,H);Dr(M,m),M._enterCancelled?(Dr(M,f),Mm()):(Mm(),Dr(M,f)),Oh(()=>{M._isLeaving&&(Ts(M,m),Dr(M,p),Ah(b)||$h(M,r,v,X))}),ro(b,[M,X])},onEnterCancelled(M){k(M,!1,void 0,!0),ro(g,[M])},onAppearCancelled(M){k(M,!0,void 0,!0),ro(N,[M])},onLeaveCancelled(M){R(M),ro(E,[M])}})}function ek(e){if(e==null)return null;if(mt(e))return[Td(e.enter),Td(e.leave)];{const t=Td(e);return[t,t]}}function Td(e){return wa(e)}function Dr(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[_i]||(e[_i]=new Set)).add(t)}function Ts(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[_i];n&&(n.delete(t),n.size||(e[_i]=void 0))}function Oh(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let tk=0;function $h(e,t,n,r){const s=e._endId=++tk,o=()=>{s===e._endId&&r()};if(n!=null)return setTimeout(o,n);const{type:i,timeout:a,propCount:l}=Fv(e,t);if(!i)return r();const c=i+"end";let d=0;const m=()=>{e.removeEventListener(c,f),o()},f=p=>{p.target===e&&++d>=l&&m()};setTimeout(()=>{d(n[h]||"").split(", "),s=r(`${zs}Delay`),o=r(`${zs}Duration`),i=Nh(s,o),a=r(`${ji}Delay`),l=r(`${ji}Duration`),c=Nh(a,l);let d=null,m=0,f=0;t===zs?i>0&&(d=zs,m=i,f=o.length):t===ji?c>0&&(d=ji,m=c,f=l.length):(m=Math.max(i,c),d=m>0?i>c?zs:ji:null,f=d?d===zs?o.length:l.length:0);const p=d===zs&&/\b(transform|all)(,|$)/.test(r(`${zs}Property`).toString());return{type:d,timeout:m,propCount:f,hasTransform:p}}function Nh(e,t){for(;e.lengthIh(n)+Ih(e[r])))}function Ih(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Mm(){return document.body.offsetHeight}function nk(e,t,n){const r=e[_i];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Tc=Symbol("_vod"),Vv=Symbol("_vsh"),La={beforeMount(e,{value:t},{transition:n}){e[Tc]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Bi(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Bi(e,!0),r.enter(e)):r.leave(e,()=>{Bi(e,!1)}):Bi(e,t))},beforeUnmount(e,{value:t}){Bi(e,t)}};function Bi(e,t){e.style.display=t?e[Tc]:"none",e[Vv]=!t}function rk(){La.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}}}const Hv=Symbol("");function sk(e){const t=On();if(!t)return;const n=t.ut=(s=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(o=>Ac(o,s))},r=()=>{const s=e(t.proxy);t.ce?Ac(t.ce,s):Fm(t.subTree,s),n(s)};Uf(()=>{Aa(r)}),Ni(()=>{Zn(r,tn,{flush:"post"});const s=new MutationObserver(r);s.observe(t.subTree.el.parentNode,{childList:!0}),el(()=>s.disconnect())})}function Fm(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{Fm(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)Ac(e.el,t);else if(e.type===be)e.children.forEach(n=>Fm(n,t));else if(e.type===Co){let{el:n,anchor:r}=e;for(;n&&(Ac(n,t),n!==r);)n=n.nextSibling}}function Ac(e,t){if(e.nodeType===1){const n=e.style;let r="";for(const s in t)n.setProperty(`--${s}`,t[s]),r+=`--${s}: ${t[s]};`;n[Hv]=r}}const ok=/(^|;)\s*display\s*:/;function ik(e,t,n){const r=e.style,s=Re(n);let o=!1;if(n&&!s){if(t)if(Re(t))for(const i of t.split(";")){const a=i.slice(0,i.indexOf(":")).trim();n[a]==null&&Zl(r,a,"")}else for(const i in t)n[i]==null&&Zl(r,i,"");for(const i in n)i==="display"&&(o=!0),Zl(r,i,n[i])}else if(s){if(t!==n){const i=r[Hv];i&&(n+=";"+i),r.cssText=n,o=ok.test(n)}}else t&&e.removeAttribute("style");Tc in e&&(e[Tc]=o?r.display:"",e[Vv]&&(r.display="none"))}const Ph=/\s*!important$/;function Zl(e,t,n){if(ve(n))n.forEach(r=>Zl(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=ak(e,t);Ph.test(n)?e.setProperty(pn(r),n.replace(Ph,""),"important"):e[r]=n}}const Lh=["Webkit","Moz","ms"],Ad={};function ak(e,t){const n=Ad[t];if(n)return n;let r=zt(t);if(r!=="filter"&&r in e)return Ad[t]=r;r=Ys(r);for(let s=0;sOd||(dk.then(()=>Od=0),Od=Date.now());function fk(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;dr(pk(r,n.value),t,5,[r])};return n.value=e,n.attached=mk(),n}function pk(e,t){if(ve(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const Hh=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,hk=(e,t,n,r,s,o)=>{const i=s==="svg";t==="class"?nk(e,r,i):t==="style"?ik(e,n,r):Ks(t)?ou(t)||ck(e,t,n,r,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):_k(e,t,r,i))?(Mh(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Dh(e,t,r,i,o,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Re(r))?Mh(e,zt(t),r,o,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Dh(e,t,r,i))};function _k(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Hh(t)&&$e(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return Hh(t)&&Re(n)?!1:t in e}const Uh={};/*! #__NO_SIDE_EFFECTS__ */function Uv(e,t,n){const r=gs(e,t);Ya(r)&&Je(r,t);class s extends ku{constructor(i){super(r,i,n)}}return s.def=r,s}/*! #__NO_SIDE_EFFECTS__ */const gk=(e,t)=>Uv(e,t,Qv),yk=typeof HTMLElement<"u"?HTMLElement:class{};class ku extends yk{constructor(t,n={},r=$c){super(),this._def=t,this._props=n,this._createApp=r,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._ob=null,this.shadowRoot&&r!==$c?this._root=this.shadowRoot:t.shadowRoot!==!1?(this.attachShadow({mode:"open"}),this._root=this.shadowRoot):this._root=this,this._def.__asyncLoader||this._resolveProps(this._def)}connectedCallback(){if(!this.isConnected)return;this.shadowRoot||this._parseSlots(),this._connected=!0;let t=this;for(;t=t&&(t.parentNode||t.host);)if(t instanceof ku){this._parent=t;break}this._instance||(this._resolved?(this._setParent(),this._update()):t&&t._pendingResolve?this._pendingResolve=t._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(t=this._parent){t&&(this._instance.parent=t._instance,this._instance.provides=t._instance.provides)}disconnectedCallback(){this._connected=!1,Ro(()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null)})}_resolveDef(){if(this._pendingResolve)return;for(let r=0;r{for(const s of r)this._setAttr(s.attributeName)}),this._ob.observe(this,{attributes:!0});const t=(r,s=!1)=>{this._resolved=!0,this._pendingResolve=void 0;const{props:o,styles:i}=r;let a;if(o&&!ve(o))for(const l in o){const c=o[l];(c===Number||c&&c.type===Number)&&(l in this._props&&(this._props[l]=wa(this._props[l])),(a||(a=Object.create(null)))[zt(l)]=!0)}this._numberProps=a,s&&this._resolveProps(r),this.shadowRoot&&this._applyStyles(i),this._mount(r)},n=this._def.__asyncLoader;n?this._pendingResolve=n().then(r=>t(this._def=r,!0)):t(this._def)}_mount(t){this._app=this._createApp(t),t.configureApp&&t.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);const n=this._instance&&this._instance.exposed;if(n)for(const r in n)lt(this,r)||Object.defineProperty(this,r,{get:()=>Fn(n[r])})}_resolveProps(t){const{props:n}=t,r=ve(n)?n:Object.keys(n||{});for(const s of Object.keys(this))s[0]!=="_"&&r.includes(s)&&this._setProp(s,this[s]);for(const s of r.map(zt))Object.defineProperty(this,s,{get(){return this._getProp(s)},set(o){this._setProp(s,o,!0,!0)}})}_setAttr(t){if(t.startsWith("data-v-"))return;const n=this.hasAttribute(t);let r=n?this.getAttribute(t):Uh;const s=zt(t);n&&this._numberProps&&this._numberProps[s]&&(r=wa(r)),this._setProp(s,r,!1,!0)}_getProp(t){return this._props[t]}_setProp(t,n,r=!0,s=!1){if(n!==this._props[t]&&(n===Uh?delete this._props[t]:(this._props[t]=n,t==="key"&&this._app&&(this._app._ceVNode.key=n)),s&&this._instance&&this._update(),r)){const o=this._ob;o&&o.disconnect(),n===!0?this.setAttribute(pn(t),""):typeof n=="string"||typeof n=="number"?this.setAttribute(pn(t),n+""):n||this.removeAttribute(pn(t)),o&&o.observe(this,{attributes:!0})}}_update(){Jv(this._createVNode(),this._root)}_createVNode(){const t={};this.shadowRoot||(t.onVnodeMounted=t.onVnodeUpdated=this._renderSlots.bind(this));const n=z(this._def,Je(t,this._props));return this._instance||(n.ce=r=>{this._instance=r,r.ce=this,r.isCE=!0;const s=(o,i)=>{this.dispatchEvent(new CustomEvent(o,Ya(i[0])?Je({detail:i},i[0]):{detail:i}))};r.emit=(o,...i)=>{s(o,i),pn(o)!==o&&s(pn(o),i)},this._setParent()}),n}_applyStyles(t,n){if(!t)return;if(n){if(n===this._def||this._styleChildren.has(n))return;this._styleChildren.add(n)}const r=this._nonce;for(let s=t.length-1;s>=0;s--){const o=document.createElement("style");r&&o.setAttribute("nonce",r),o.textContent=t[s],this.shadowRoot.prepend(o)}}_parseSlots(){const t=this._slots={};let n;for(;n=this.firstChild;){const r=n.nodeType===1&&n.getAttribute("slot")||"default";(t[r]||(t[r]=[])).push(n),this.removeChild(n)}}_renderSlots(){const t=(this._teleportTarget||this).querySelectorAll("slot"),n=this._instance.type.__scopeId;for(let r=0;r(delete e.props.mode,e),Ck=zk({name:"TransitionGroup",props:Je({},Dv,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=On(),r=Ff();let s,o;return zu(()=>{if(!s.length)return;const i=e.moveClass||`${e.name||"v"}-move`;if(!xk(s[0].el,n.vnode.el,i))return;s.forEach(Ek),s.forEach(wk);const a=s.filter(kk);Mm(),a.forEach(l=>{const c=l.el,d=c.style;Dr(c,i),d.transform=d.webkitTransform=d.transitionDuration="";const m=c[Oc]=f=>{f&&f.target!==c||(!f||/transform$/.test(f.propertyName))&&(c.removeEventListener("transitionend",m),c[Oc]=null,Ts(c,i))};c.addEventListener("transitionend",m)})}),()=>{const i=nt(e),a=Mv(i);let l=i.tag||be;if(s=[],o)for(let c=0;c{a.split(/\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\s+/).forEach(a=>a&&r.classList.add(a)),r.style.display="none";const o=t.nodeType===1?t:t.parentNode;o.appendChild(r);const{hasTransform:i}=Fv(r);return o.removeChild(r),i}const Ws=e=>{const t=e.props["onUpdate:modelValue"]||!1;return ve(t)?n=>vo(t,n):t};function Tk(e){e.target.composing=!0}function Bh(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const cr=Symbol("_assign"),Un={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[cr]=Ws(s);const o=r||s.props&&s.props.type==="number";ss(e,t?"change":"input",i=>{if(i.target.composing)return;let a=e.value;n&&(a=a.trim()),o&&(a=Ea(a)),e[cr](a)}),n&&ss(e,"change",()=>{e.value=e.value.trim()}),t||(ss(e,"compositionstart",Tk),ss(e,"compositionend",Bh),ss(e,"change",Bh))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:o}},i){if(e[cr]=Ws(i),e.composing)return;const a=(o||e.type==="number")&&!/^0\d/.test(e.value)?Ea(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||s&&e.value.trim()===l)||(e.value=l))}},mr={deep:!0,created(e,t,n){e[cr]=Ws(n),ss(e,"change",()=>{const r=e._modelValue,s=gi(e),o=e.checked,i=e[cr];if(ve(r)){const a=Ja(r,s),l=a!==-1;if(o&&!l)i(r.concat(s));else if(!o&&l){const c=[...r];c.splice(a,1),i(c)}}else if(Xs(r)){const a=new Set(r);o?a.add(s):a.delete(s),i(a)}else i(Wv(e,o))})},mounted:qh,beforeUpdate(e,t,n){e[cr]=Ws(n),qh(e,t,n)}};function qh(e,{value:t,oldValue:n},r){e._modelValue=t;let s;if(ve(t))s=Ja(t,r.props.value)>-1;else if(Xs(t))s=t.has(r.props.value);else{if(t===n)return;s=ms(t,Wv(e,!0))}e.checked!==s&&(e.checked=s)}const Jf={created(e,{value:t},n){e.checked=ms(t,n.props.value),e[cr]=Ws(n),ss(e,"change",()=>{e[cr](gi(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[cr]=Ws(r),t!==n&&(e.checked=ms(t,r.props.value))}},Qf={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const s=Xs(t);ss(e,"change",()=>{const o=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?Ea(gi(i)):gi(i));e[cr](e.multiple?s?new Set(o):o:o[0]),e._assigning=!0,Ro(()=>{e._assigning=!1})}),e[cr]=Ws(r)},mounted(e,{value:t}){Wh(e,t)},beforeUpdate(e,t,n){e[cr]=Ws(n)},updated(e,{value:t}){e._assigning||Wh(e,t)}};function Wh(e,t){const n=e.multiple,r=ve(t);if(!(n&&!r&&!Xs(t))){for(let s=0,o=e.options.length;sString(c)===String(a)):i.selected=Ja(t,a)>-1}else i.selected=t.has(a);else if(ms(gi(i),t)){e.selectedIndex!==s&&(e.selectedIndex=s);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function gi(e){return"_value"in e?e._value:e.value}function Wv(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Gv={created(e,t,n){kl(e,t,n,null,"created")},mounted(e,t,n){kl(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){kl(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){kl(e,t,n,r,"updated")}};function Kv(e,t){switch(e){case"SELECT":return Qf;case"TEXTAREA":return Un;default:switch(t){case"checkbox":return mr;case"radio":return Jf;default:return Un}}}function kl(e,t,n,r,s){const i=Kv(e.tagName,n.props&&n.props.type)[s];i&&i(e,t,n,r)}function Ak(){Un.getSSRProps=({value:e})=>({value:e}),Jf.getSSRProps=({value:e},t)=>{if(t.props&&ms(t.props.value,e))return{checked:!0}},mr.getSSRProps=({value:e},t)=>{if(ve(e)){if(t.props&&Ja(e,t.props.value)>-1)return{checked:!0}}else if(Xs(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},Gv.getSSRProps=(e,t)=>{if(typeof t.type!="string")return;const n=Kv(t.type.toUpperCase(),t.props&&t.props.type);if(n.getSSRProps)return n.getSSRProps(e,t)}}const Ok=["ctrl","shift","alt","meta"],$k={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Ok.some(n=>e[`${n}Key`]&&!t.includes(n))},wt=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(s,...o)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=s=>{if(!("key"in s))return;const o=pn(s.key);if(t.some(i=>i===o||Nk[i]===o))return e(s)})},Xv=Je({patchProp:hk},Jw);let fa,Gh=!1;function Yv(){return fa||(fa=uv(Xv))}function Zv(){return fa=Gh?fa:dv(Xv),Gh=!0,fa}const Jv=(...e)=>{Yv().render(...e)},Ik=(...e)=>{Zv().hydrate(...e)},$c=(...e)=>{const t=Yv().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=tb(r);if(!s)return;const o=t._component;!$e(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.nodeType===1&&(s.textContent="");const i=n(s,!1,eb(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t},Qv=(...e)=>{const t=Zv().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=tb(r);if(s)return n(s,!0,eb(s))},t};function eb(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function tb(e){return Re(e)?document.querySelector(e):e}let Kh=!1;const Pk=()=>{Kh||(Kh=!0,Ak(),rk())},Lk=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:V1,BaseTransitionPropsValidators:Vf,Comment:Wt,DeprecationTypes:Xw,EffectScope:Of,ErrorCodes:dE,ErrorTypeStrings:Uw,Fragment:be,KeepAlive:RE,ReactiveEffect:ka,Static:Co,Suspense:Sw,Teleport:hr,Text:ls,TrackOpTypes:sE,Transition:rn,TransitionGroup:Sk,TriggerOpTypes:oE,VueElement:ku,assertNumber:uE,callWithAsyncErrorHandling:dr,callWithErrorHandling:$i,camelize:zt,capitalize:Ys,cloneVNode:Wr,compatUtils:Kw,computed:en,createApp:$c,createBlock:ze,createCommentVNode:ee,createElementBlock:L,createElementVNode:u,createHydrationRenderer:dv,createPropsRestProxy:JE,createRenderer:uv,createSSRApp:Qv,createSlots:Wf,createStaticVNode:$w,createTextVNode:Kt,createVNode:z,customRef:w1,defineAsyncComponent:PE,defineComponent:gs,defineCustomElement:Uv,defineEmits:UE,defineExpose:jE,defineModel:WE,defineOptions:BE,defineProps:HE,defineSSRCustomElement:gk,defineSlots:qE,devtools:jw,effect:xS,effectScope:uu,getCurrentInstance:On,getCurrentScope:$f,getCurrentWatcher:iE,getTransitionRawChildren:vu,guardReactiveProps:xv,h:Ur,handleError:Lo,hasInjectionContext:ev,hydrate:Ik,hydrateOnIdle:TE,hydrateOnInteraction:NE,hydrateOnMediaQuery:$E,hydrateOnVisible:OE,initCustomFormatter:Fw,initDirectivesForSSR:Pk,inject:lr,isMemoSame:Iv,isProxy:hu,isReactive:Br,isReadonly:qs,isRef:Ot,isRuntimeOnly:Rw,isShallow:Yn,isVNode:ps,markRaw:_u,mergeDefaults:YE,mergeModels:ZE,mergeProps:ii,nextTick:Ro,normalizeClass:Ce,normalizeProps:si,normalizeStyle:_s,onActivated:U1,onBeforeMount:q1,onBeforeUnmount:Cu,onBeforeUpdate:Uf,onDeactivated:j1,onErrorCaptured:X1,onMounted:Ni,onRenderTracked:K1,onRenderTriggered:G1,onScopeDispose:l1,onServerPrefetch:W1,onUnmounted:el,onUpdated:zu,onWatcherCleanup:T1,openBlock:x,popScopeId:_E,provide:da,proxyRefs:Df,pushScopeId:hE,queuePostFlushCb:Aa,reactive:Oi,readonly:Rf,ref:ar,registerRuntimeCompiler:Lw,render:Jv,renderList:Et,renderSlot:At,resolveComponent:$,resolveDirective:Bf,resolveDynamicComponent:Su,resolveFilter:Gw,resolveTransitionHooks:pi,setBlockTracking:$m,setDevtoolsHook:Bw,setTransitionHooks:fs,shallowReactive:Lf,shallowReadonly:GS,shallowRef:gu,ssrContextKey:hv,ssrUtils:Ww,stop:TS,toDisplayString:y,toHandlerKey:yo,toHandlers:FE,toRaw:nt,toRef:tE,toRefs:k1,toValue:YS,transformVNodeArgs:Aw,triggerRef:XS,unref:Fn,useAttrs:XE,useCssModule:bk,useCssVars:sk,useHost:jv,useId:bE,useModel:_w,useSSRContext:_v,useShadowRoot:vk,useSlots:KE,useTemplateRef:zE,useTransitionState:Ff,vModelCheckbox:mr,vModelDynamic:Gv,vModelRadio:Jf,vModelSelect:Qf,vModelText:Un,vShow:La,version:Pv,warn:Hw,watch:Zn,watchEffect:gv,watchPostEffect:pw,watchSyncEffect:yv,withAsyncContext:QE,withCtx:D,withDefaults:GE,withDirectives:Ct,withKeys:Mn,withMemo:Vw,withModifiers:wt,withScopeId:gE},Symbol.toStringTag,{value:"Module"}));/*! * pinia v2.3.1 * (c) 2025 Eduardo San Martin Morote * @license MIT - */let qg;const Jl=e=>qg=e,Gg=Symbol();function Vc(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var hi;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(hi||(hi={}));function dC(){const e=Nl(!0),t=e.run(()=>Fn({}));let n=[],r=[];const o=Hl({install(s){Jl(o),o._a=s,s.provide(Gg,o),s.config.globalProperties.$pinia=o,r.forEach(i=>n.push(i)),r=[]},use(s){return this._a?n.push(s):r.push(s),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return o}const Kg=()=>{};function _f(e,t,n,r=Kg){e.push(t);const o=()=>{const s=e.indexOf(t);s>-1&&(e.splice(s,1),r())};return!n&&kd()&&Jh(o),o}function Go(e,...t){e.slice().forEach(n=>{n(...t)})}const mC=e=>e(),gf=Symbol(),Ru=Symbol();function Hc(e,t){e instanceof Map&&t instanceof Map?t.forEach((n,r)=>e.set(r,n)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],o=e[n];Vc(o)&&Vc(r)&&e.hasOwnProperty(n)&&!St(r)&&!vr(r)?e[n]=Hc(o,r):e[n]=r}return e}const fC=Symbol();function pC(e){return!Vc(e)||!e.hasOwnProperty(fC)}const{assign:Xr}=Object;function hC(e){return!!(St(e)&&e.effect)}function _C(e,t,n,r){const{state:o,actions:s,getters:i}=t,a=n.state.value[e];let l;function c(){a||(n.state.value[e]=o?o():{});const d=__(n.state.value[e]);return Xr(d,s,Object.keys(i||{}).reduce((m,f)=>(m[f]=Hl(jt(()=>{Jl(n);const p=n._s.get(e);return i[f].call(p,p)})),m),{}))}return l=Zg(e,c,t,n,r,!0),l}function Zg(e,t,n={},r,o,s){let i;const a=Xr({actions:{}},n),l={deep:!0};let c,d,m=[],f=[],p;const h=r.state.value[e];!s&&!h&&(r.state.value[e]={}),Fn({});let _;function b(D){let T;c=d=!1,typeof D=="function"?(D(r.state.value[e]),T={type:hi.patchFunction,storeId:e,events:p}):(Hc(r.state.value[e],D),T={type:hi.patchObject,payload:D,storeId:e,events:p});const F=_=Symbol();Uo().then(()=>{_===F&&(c=!0)}),d=!0,Go(m,T,r.state.value[e])}const C=s?function(){const{state:T}=n,F=T?T():{};this.$patch(G=>{Xr(G,F)})}:Kg;function w(){i.stop(),m=[],f=[],r._s.delete(e)}const g=(D,T="")=>{if(gf in D)return D[Ru]=T,D;const F=function(){Jl(r);const G=Array.from(arguments),U=[],W=[];function ee(ne){U.push(ne)}function fe(ne){W.push(ne)}Go(f,{args:G,name:F[Ru],store:S,after:ee,onError:fe});let K;try{K=D.apply(this&&this.$id===e?this:S,G)}catch(ne){throw Go(W,ne),ne}return K instanceof Promise?K.then(ne=>(Go(U,ne),ne)).catch(ne=>(Go(W,ne),Promise.reject(ne))):(Go(U,K),K)};return F[gf]=!0,F[Ru]=T,F},z={_p:r,$id:e,$onAction:_f.bind(null,f),$patch:b,$reset:C,$subscribe(D,T={}){const F=_f(m,D,T.detached,()=>G()),G=i.run(()=>Tn(()=>r.state.value[e],U=>{(T.flush==="sync"?d:c)&&D({storeId:e,type:hi.direct,events:p},U)},Xr({},l,T)));return F},$dispose:w},S=Os(z);r._s.set(e,S);const L=(r._a&&r._a.runWithContext||mC)(()=>r._e.run(()=>(i=Nl()).run(()=>t({action:g}))));for(const D in L){const T=L[D];if(St(T)&&!hC(T)||vr(T))s||(h&&pC(T)&&(St(T)?T.value=h[D]:Hc(T,h[D])),r.state.value[e][D]=T);else if(typeof T=="function"){const F=g(T,D);L[D]=F,a.actions[D]=T}}return Xr(S,L),Xr(Xe(S),L),Object.defineProperty(S,"$state",{get:()=>r.state.value[e],set:D=>{b(T=>{Xr(T,D)})}}),r._p.forEach(D=>{Xr(S,i.run(()=>D({store:S,app:r._a,pinia:r,options:a})))}),h&&s&&n.hydrate&&n.hydrate(S.$state,h),c=!0,d=!0,S}/*! #__NO_SIDE_EFFECTS__ */function Gn(e,t,n){let r,o;const s=typeof t=="function";typeof e=="string"?(r=e,o=s?n:t):(o=e,r=e.id);function i(a,l){const c=B_();return a=a||(c?Vn(Gg,null):null),a&&Jl(a),a=qg,a._s.has(r)||(s?Zg(r,t,o,a):_C(r,o,a)),a._s.get(r)}return i.$id=r,i}const Kd=Gn("RemotesStore",{state:()=>({pairing:{}})});function Yg(e,t){return function(){return e.apply(t,arguments)}}const{toString:gC}=Object.prototype,{getPrototypeOf:Zd}=Object,Ql=(e=>t=>{const n=gC.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),ur=e=>(e=e.toLowerCase(),t=>Ql(t)===e),eu=e=>t=>typeof t===e,{isArray:Ls}=Array,Ni=eu("undefined");function yC(e){return e!==null&&!Ni(e)&&e.constructor!==null&&!Ni(e.constructor)&&$n(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Xg=ur("ArrayBuffer");function zC(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Xg(e.buffer),t}const bC=eu("string"),$n=eu("function"),Jg=eu("number"),tu=e=>e!==null&&typeof e=="object",vC=e=>e===!0||e===!1,Da=e=>{if(Ql(e)!=="object")return!1;const t=Zd(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},CC=ur("Date"),wC=ur("File"),SC=ur("Blob"),kC=ur("FileList"),xC=e=>tu(e)&&$n(e.pipe),EC=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||$n(e.append)&&((t=Ql(e))==="formdata"||t==="object"&&$n(e.toString)&&e.toString()==="[object FormData]"))},TC=ur("URLSearchParams"),[$C,AC,OC,PC]=["ReadableStream","Request","Response","Headers"].map(ur),IC=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Zi(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,o;if(typeof e!="object"&&(e=[e]),Ls(e))for(r=0,o=e.length;r0;)if(o=n[r],t===o.toLowerCase())return o;return null}const $o=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,ey=e=>!Ni(e)&&e!==$o;function Uc(){const{caseless:e}=ey(this)&&this||{},t={},n=(r,o)=>{const s=e&&Qg(t,o)||o;Da(t[s])&&Da(r)?t[s]=Uc(t[s],r):Da(r)?t[s]=Uc({},r):Ls(r)?t[s]=r.slice():t[s]=r};for(let r=0,o=arguments.length;r(Zi(t,(o,s)=>{n&&$n(o)?e[s]=Yg(o,n):e[s]=o},{allOwnKeys:r}),e),NC=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),DC=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},RC=(e,t,n,r)=>{let o,s,i;const a={};if(t=t||{},e==null)return t;do{for(o=Object.getOwnPropertyNames(e),s=o.length;s-- >0;)i=o[s],(!r||r(i,e,t))&&!a[i]&&(t[i]=e[i],a[i]=!0);e=n!==!1&&Zd(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},MC=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},FC=e=>{if(!e)return null;if(Ls(e))return e;let t=e.length;if(!Jg(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},VC=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&Zd(Uint8Array)),HC=(e,t)=>{const r=(e&&e[Symbol.iterator]).call(e);let o;for(;(o=r.next())&&!o.done;){const s=o.value;t.call(e,s[0],s[1])}},UC=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},jC=ur("HTMLFormElement"),BC=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,o){return r.toUpperCase()+o}),yf=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),WC=ur("RegExp"),ty=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Zi(n,(o,s)=>{let i;(i=t(o,s,e))!==!1&&(r[s]=i||o)}),Object.defineProperties(e,r)},qC=e=>{ty(e,(t,n)=>{if($n(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if($n(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},GC=(e,t)=>{const n={},r=o=>{o.forEach(s=>{n[s]=!0})};return Ls(e)?r(e):r(String(e).split(t)),n},KC=()=>{},ZC=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t,Mu="abcdefghijklmnopqrstuvwxyz",zf="0123456789",ny={DIGIT:zf,ALPHA:Mu,ALPHA_DIGIT:Mu+Mu.toUpperCase()+zf},YC=(e=16,t=ny.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function XC(e){return!!(e&&$n(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const JC=e=>{const t=new Array(10),n=(r,o)=>{if(tu(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[o]=r;const s=Ls(r)?[]:{};return Zi(r,(i,a)=>{const l=n(i,o+1);!Ni(l)&&(s[a]=l)}),t[o]=void 0,s}}return r};return n(e,0)},QC=ur("AsyncFunction"),ew=e=>e&&(tu(e)||$n(e))&&$n(e.then)&&$n(e.catch),ry=((e,t)=>e?setImmediate:t?((n,r)=>($o.addEventListener("message",({source:o,data:s})=>{o===$o&&s===n&&r.length&&r.shift()()},!1),o=>{r.push(o),$o.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",$n($o.postMessage)),tw=typeof queueMicrotask<"u"?queueMicrotask.bind($o):typeof process<"u"&&process.nextTick||ry,J={isArray:Ls,isArrayBuffer:Xg,isBuffer:yC,isFormData:EC,isArrayBufferView:zC,isString:bC,isNumber:Jg,isBoolean:vC,isObject:tu,isPlainObject:Da,isReadableStream:$C,isRequest:AC,isResponse:OC,isHeaders:PC,isUndefined:Ni,isDate:CC,isFile:wC,isBlob:SC,isRegExp:WC,isFunction:$n,isStream:xC,isURLSearchParams:TC,isTypedArray:VC,isFileList:kC,forEach:Zi,merge:Uc,extend:LC,trim:IC,stripBOM:NC,inherits:DC,toFlatObject:RC,kindOf:Ql,kindOfTest:ur,endsWith:MC,toArray:FC,forEachEntry:HC,matchAll:UC,isHTMLForm:jC,hasOwnProperty:yf,hasOwnProp:yf,reduceDescriptors:ty,freezeMethods:qC,toObjectSet:GC,toCamelCase:BC,noop:KC,toFiniteNumber:ZC,findKey:Qg,global:$o,isContextDefined:ey,ALPHABET:ny,generateString:YC,isSpecCompliantForm:XC,toJSONObject:JC,isAsyncFn:QC,isThenable:ew,setImmediate:ry,asap:tw};function Be(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o,this.status=o.status?o.status:null)}J.inherits(Be,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:J.toJSONObject(this.config),code:this.code,status:this.status}}});const oy=Be.prototype,sy={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{sy[e]={value:e}});Object.defineProperties(Be,sy);Object.defineProperty(oy,"isAxiosError",{value:!0});Be.from=(e,t,n,r,o,s)=>{const i=Object.create(oy);return J.toFlatObject(e,i,function(l){return l!==Error.prototype},a=>a!=="isAxiosError"),Be.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,s&&Object.assign(i,s),i};const nw=null;function jc(e){return J.isPlainObject(e)||J.isArray(e)}function iy(e){return J.endsWith(e,"[]")?e.slice(0,-2):e}function bf(e,t,n){return e?e.concat(t).map(function(o,s){return o=iy(o),!n&&s?"["+o+"]":o}).join(n?".":""):t}function rw(e){return J.isArray(e)&&!e.some(jc)}const ow=J.toFlatObject(J,{},null,function(t){return/^is[A-Z]/.test(t)});function nu(e,t,n){if(!J.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=J.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(_,b){return!J.isUndefined(b[_])});const r=n.metaTokens,o=n.visitor||d,s=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&J.isSpecCompliantForm(t);if(!J.isFunction(o))throw new TypeError("visitor must be a function");function c(h){if(h===null)return"";if(J.isDate(h))return h.toISOString();if(!l&&J.isBlob(h))throw new Be("Blob is not supported. Use a Buffer instead.");return J.isArrayBuffer(h)||J.isTypedArray(h)?l&&typeof Blob=="function"?new Blob([h]):Buffer.from(h):h}function d(h,_,b){let C=h;if(h&&!b&&typeof h=="object"){if(J.endsWith(_,"{}"))_=r?_:_.slice(0,-2),h=JSON.stringify(h);else if(J.isArray(h)&&rw(h)||(J.isFileList(h)||J.endsWith(_,"[]"))&&(C=J.toArray(h)))return _=iy(_),C.forEach(function(g,z){!(J.isUndefined(g)||g===null)&&t.append(i===!0?bf([_],z,s):i===null?_:_+"[]",c(g))}),!1}return jc(h)?!0:(t.append(bf(b,_,s),c(h)),!1)}const m=[],f=Object.assign(ow,{defaultVisitor:d,convertValue:c,isVisitable:jc});function p(h,_){if(!J.isUndefined(h)){if(m.indexOf(h)!==-1)throw Error("Circular reference detected in "+_.join("."));m.push(h),J.forEach(h,function(C,w){(!(J.isUndefined(C)||C===null)&&o.call(t,C,J.isString(w)?w.trim():w,_,f))===!0&&p(C,_?_.concat(w):[w])}),m.pop()}}if(!J.isObject(e))throw new TypeError("data must be an object");return p(e),t}function vf(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function Yd(e,t){this._pairs=[],e&&nu(e,this,t)}const ay=Yd.prototype;ay.append=function(t,n){this._pairs.push([t,n])};ay.toString=function(t){const n=t?function(r){return t.call(this,r,vf)}:vf;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function sw(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function ly(e,t,n){if(!t)return e;const r=n&&n.encode||sw;J.isFunction(n)&&(n={serialize:n});const o=n&&n.serialize;let s;if(o?s=o(t,n):s=J.isURLSearchParams(t)?t.toString():new Yd(t,n).toString(r),s){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+s}return e}class Cf{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){J.forEach(this.handlers,function(r){r!==null&&t(r)})}}const uy={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},iw=typeof URLSearchParams<"u"?URLSearchParams:Yd,aw=typeof FormData<"u"?FormData:null,lw=typeof Blob<"u"?Blob:null,uw={isBrowser:!0,classes:{URLSearchParams:iw,FormData:aw,Blob:lw},protocols:["http","https","file","blob","url","data"]},Xd=typeof window<"u"&&typeof document<"u",Bc=typeof navigator=="object"&&navigator||void 0,cw=Xd&&(!Bc||["ReactNative","NativeScript","NS"].indexOf(Bc.product)<0),dw=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",mw=Xd&&window.location.href||"http://localhost",fw=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Xd,hasStandardBrowserEnv:cw,hasStandardBrowserWebWorkerEnv:dw,navigator:Bc,origin:mw},Symbol.toStringTag,{value:"Module"})),Xt={...fw,...uw};function pw(e,t){return nu(e,new Xt.classes.URLSearchParams,Object.assign({visitor:function(n,r,o,s){return Xt.isNode&&J.isBuffer(n)?(this.append(r,n.toString("base64")),!1):s.defaultVisitor.apply(this,arguments)}},t))}function hw(e){return J.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function _w(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r=n.length;return i=!i&&J.isArray(o)?o.length:i,l?(J.hasOwnProp(o,i)?o[i]=[o[i],r]:o[i]=r,!a):((!o[i]||!J.isObject(o[i]))&&(o[i]=[]),t(n,r,o[i],s)&&J.isArray(o[i])&&(o[i]=_w(o[i])),!a)}if(J.isFormData(e)&&J.isFunction(e.entries)){const n={};return J.forEachEntry(e,(r,o)=>{t(hw(r),o,n,0)}),n}return null}function gw(e,t,n){if(J.isString(e))try{return(t||JSON.parse)(e),J.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(0,JSON.stringify)(e)}const Yi={transitional:uy,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",o=r.indexOf("application/json")>-1,s=J.isObject(t);if(s&&J.isHTMLForm(t)&&(t=new FormData(t)),J.isFormData(t))return o?JSON.stringify(cy(t)):t;if(J.isArrayBuffer(t)||J.isBuffer(t)||J.isStream(t)||J.isFile(t)||J.isBlob(t)||J.isReadableStream(t))return t;if(J.isArrayBufferView(t))return t.buffer;if(J.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let a;if(s){if(r.indexOf("application/x-www-form-urlencoded")>-1)return pw(t,this.formSerializer).toString();if((a=J.isFileList(t))||r.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return nu(a?{"files[]":t}:t,l&&new l,this.formSerializer)}}return s||o?(n.setContentType("application/json",!1),gw(t)):t}],transformResponse:[function(t){const n=this.transitional||Yi.transitional,r=n&&n.forcedJSONParsing,o=this.responseType==="json";if(J.isResponse(t)||J.isReadableStream(t))return t;if(t&&J.isString(t)&&(r&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t)}catch(a){if(i)throw a.name==="SyntaxError"?Be.from(a,Be.ERR_BAD_RESPONSE,this,null,this.response):a}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Xt.classes.FormData,Blob:Xt.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};J.forEach(["delete","get","head","post","put","patch"],e=>{Yi.headers[e]={}});const yw=J.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),zw=e=>{const t={};let n,r,o;return e&&e.split(` -`).forEach(function(i){o=i.indexOf(":"),n=i.substring(0,o).trim().toLowerCase(),r=i.substring(o+1).trim(),!(!n||t[n]&&yw[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},wf=Symbol("internals");function Bs(e){return e&&String(e).trim().toLowerCase()}function Ra(e){return e===!1||e==null?e:J.isArray(e)?e.map(Ra):String(e)}function bw(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const vw=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function Fu(e,t,n,r,o){if(J.isFunction(r))return r.call(this,t,n);if(o&&(t=n),!!J.isString(t)){if(J.isString(r))return t.indexOf(r)!==-1;if(J.isRegExp(r))return r.test(t)}}function Cw(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function ww(e,t){const n=J.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(o,s,i){return this[r].call(this,t,o,s,i)},configurable:!0})})}class bn{constructor(t){t&&this.set(t)}set(t,n,r){const o=this;function s(a,l,c){const d=Bs(l);if(!d)throw new Error("header name must be a non-empty string");const m=J.findKey(o,d);(!m||o[m]===void 0||c===!0||c===void 0&&o[m]!==!1)&&(o[m||l]=Ra(a))}const i=(a,l)=>J.forEach(a,(c,d)=>s(c,d,l));if(J.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(J.isString(t)&&(t=t.trim())&&!vw(t))i(zw(t),n);else if(J.isHeaders(t))for(const[a,l]of t.entries())s(l,a,r);else t!=null&&s(n,t,r);return this}get(t,n){if(t=Bs(t),t){const r=J.findKey(this,t);if(r){const o=this[r];if(!n)return o;if(n===!0)return bw(o);if(J.isFunction(n))return n.call(this,o,r);if(J.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=Bs(t),t){const r=J.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||Fu(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let o=!1;function s(i){if(i=Bs(i),i){const a=J.findKey(r,i);a&&(!n||Fu(r,r[a],a,n))&&(delete r[a],o=!0)}}return J.isArray(t)?t.forEach(s):s(t),o}clear(t){const n=Object.keys(this);let r=n.length,o=!1;for(;r--;){const s=n[r];(!t||Fu(this,this[s],s,t,!0))&&(delete this[s],o=!0)}return o}normalize(t){const n=this,r={};return J.forEach(this,(o,s)=>{const i=J.findKey(r,s);if(i){n[i]=Ra(o),delete n[s];return}const a=t?Cw(s):String(s).trim();a!==s&&delete n[s],n[a]=Ra(o),r[a]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return J.forEach(this,(r,o)=>{r!=null&&r!==!1&&(n[o]=t&&J.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` -`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(o=>r.set(o)),r}static accessor(t){const r=(this[wf]=this[wf]={accessors:{}}).accessors,o=this.prototype;function s(i){const a=Bs(i);r[a]||(ww(o,i),r[a]=!0)}return J.isArray(t)?t.forEach(s):s(t),this}}bn.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);J.reduceDescriptors(bn.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});J.freezeMethods(bn);function Vu(e,t){const n=this||Yi,r=t||n,o=bn.from(r.headers);let s=r.data;return J.forEach(e,function(a){s=a.call(n,s,o.normalize(),t?t.status:void 0)}),o.normalize(),s}function dy(e){return!!(e&&e.__CANCEL__)}function Ns(e,t,n){Be.call(this,e??"canceled",Be.ERR_CANCELED,t,n),this.name="CanceledError"}J.inherits(Ns,Be,{__CANCEL__:!0});function my(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new Be("Request failed with status code "+n.status,[Be.ERR_BAD_REQUEST,Be.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function Sw(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function kw(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o=0,s=0,i;return t=t!==void 0?t:1e3,function(l){const c=Date.now(),d=r[s];i||(i=c),n[o]=l,r[o]=c;let m=s,f=0;for(;m!==o;)f+=n[m++],m=m%e;if(o=(o+1)%e,o===s&&(s=(s+1)%e),c-i{n=d,o=null,s&&(clearTimeout(s),s=null),e.apply(null,c)};return[(...c)=>{const d=Date.now(),m=d-n;m>=r?i(c,d):(o=c,s||(s=setTimeout(()=>{s=null,i(o)},r-m)))},()=>o&&i(o)]}const cl=(e,t,n=3)=>{let r=0;const o=kw(50,250);return xw(s=>{const i=s.loaded,a=s.lengthComputable?s.total:void 0,l=i-r,c=o(l),d=i<=a;r=i;const m={loaded:i,total:a,progress:a?i/a:void 0,bytes:l,rate:c||void 0,estimated:c&&a&&d?(a-i)/c:void 0,event:s,lengthComputable:a!=null,[t?"download":"upload"]:!0};e(m)},n)},Sf=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},kf=e=>(...t)=>J.asap(()=>e(...t)),Ew=Xt.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,Xt.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(Xt.origin),Xt.navigator&&/(msie|trident)/i.test(Xt.navigator.userAgent)):()=>!0,Tw=Xt.hasStandardBrowserEnv?{write(e,t,n,r,o,s){const i=[e+"="+encodeURIComponent(t)];J.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),J.isString(r)&&i.push("path="+r),J.isString(o)&&i.push("domain="+o),s===!0&&i.push("secure"),document.cookie=i.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function $w(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function Aw(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function fy(e,t){return e&&!$w(t)?Aw(e,t):t}const xf=e=>e instanceof bn?{...e}:e;function Mo(e,t){t=t||{};const n={};function r(c,d,m,f){return J.isPlainObject(c)&&J.isPlainObject(d)?J.merge.call({caseless:f},c,d):J.isPlainObject(d)?J.merge({},d):J.isArray(d)?d.slice():d}function o(c,d,m,f){if(J.isUndefined(d)){if(!J.isUndefined(c))return r(void 0,c,m,f)}else return r(c,d,m,f)}function s(c,d){if(!J.isUndefined(d))return r(void 0,d)}function i(c,d){if(J.isUndefined(d)){if(!J.isUndefined(c))return r(void 0,c)}else return r(void 0,d)}function a(c,d,m){if(m in t)return r(c,d);if(m in e)return r(void 0,c)}const l={url:s,method:s,data:s,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:a,headers:(c,d,m)=>o(xf(c),xf(d),m,!0)};return J.forEach(Object.keys(Object.assign({},e,t)),function(d){const m=l[d]||o,f=m(e[d],t[d],d);J.isUndefined(f)&&m!==a||(n[d]=f)}),n}const py=e=>{const t=Mo({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:o,xsrfCookieName:s,headers:i,auth:a}=t;t.headers=i=bn.from(i),t.url=ly(fy(t.baseURL,t.url),e.params,e.paramsSerializer),a&&i.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):"")));let l;if(J.isFormData(n)){if(Xt.hasStandardBrowserEnv||Xt.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if((l=i.getContentType())!==!1){const[c,...d]=l?l.split(";").map(m=>m.trim()).filter(Boolean):[];i.setContentType([c||"multipart/form-data",...d].join("; "))}}if(Xt.hasStandardBrowserEnv&&(r&&J.isFunction(r)&&(r=r(t)),r||r!==!1&&Ew(t.url))){const c=o&&s&&Tw.read(s);c&&i.set(o,c)}return t},Ow=typeof XMLHttpRequest<"u",Pw=Ow&&function(e){return new Promise(function(n,r){const o=py(e);let s=o.data;const i=bn.from(o.headers).normalize();let{responseType:a,onUploadProgress:l,onDownloadProgress:c}=o,d,m,f,p,h;function _(){p&&p(),h&&h(),o.cancelToken&&o.cancelToken.unsubscribe(d),o.signal&&o.signal.removeEventListener("abort",d)}let b=new XMLHttpRequest;b.open(o.method.toUpperCase(),o.url,!0),b.timeout=o.timeout;function C(){if(!b)return;const g=bn.from("getAllResponseHeaders"in b&&b.getAllResponseHeaders()),S={data:!a||a==="text"||a==="json"?b.responseText:b.response,status:b.status,statusText:b.statusText,headers:g,config:e,request:b};my(function(L){n(L),_()},function(L){r(L),_()},S),b=null}"onloadend"in b?b.onloadend=C:b.onreadystatechange=function(){!b||b.readyState!==4||b.status===0&&!(b.responseURL&&b.responseURL.indexOf("file:")===0)||setTimeout(C)},b.onabort=function(){b&&(r(new Be("Request aborted",Be.ECONNABORTED,e,b)),b=null)},b.onerror=function(){r(new Be("Network Error",Be.ERR_NETWORK,e,b)),b=null},b.ontimeout=function(){let z=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const S=o.transitional||uy;o.timeoutErrorMessage&&(z=o.timeoutErrorMessage),r(new Be(z,S.clarifyTimeoutError?Be.ETIMEDOUT:Be.ECONNABORTED,e,b)),b=null},s===void 0&&i.setContentType(null),"setRequestHeader"in b&&J.forEach(i.toJSON(),function(z,S){b.setRequestHeader(S,z)}),J.isUndefined(o.withCredentials)||(b.withCredentials=!!o.withCredentials),a&&a!=="json"&&(b.responseType=o.responseType),c&&([f,h]=cl(c,!0),b.addEventListener("progress",f)),l&&b.upload&&([m,p]=cl(l),b.upload.addEventListener("progress",m),b.upload.addEventListener("loadend",p)),(o.cancelToken||o.signal)&&(d=g=>{b&&(r(!g||g.type?new Ns(null,e,b):g),b.abort(),b=null)},o.cancelToken&&o.cancelToken.subscribe(d),o.signal&&(o.signal.aborted?d():o.signal.addEventListener("abort",d)));const w=Sw(o.url);if(w&&Xt.protocols.indexOf(w)===-1){r(new Be("Unsupported protocol "+w+":",Be.ERR_BAD_REQUEST,e));return}b.send(s||null)})},Iw=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let r=new AbortController,o;const s=function(c){if(!o){o=!0,a();const d=c instanceof Error?c:this.reason;r.abort(d instanceof Be?d:new Ns(d instanceof Error?d.message:d))}};let i=t&&setTimeout(()=>{i=null,s(new Be(`timeout ${t} of ms exceeded`,Be.ETIMEDOUT))},t);const a=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach(c=>{c.unsubscribe?c.unsubscribe(s):c.removeEventListener("abort",s)}),e=null)};e.forEach(c=>c.addEventListener("abort",s));const{signal:l}=r;return l.unsubscribe=()=>J.asap(a),l}},Lw=function*(e,t){let n=e.byteLength;if(n{const o=Nw(e,t);let s=0,i,a=l=>{i||(i=!0,r&&r(l))};return new ReadableStream({async pull(l){try{const{done:c,value:d}=await o.next();if(c){a(),l.close();return}let m=d.byteLength;if(n){let f=s+=m;n(f)}l.enqueue(new Uint8Array(d))}catch(c){throw a(c),c}},cancel(l){return a(l),o.return()}},{highWaterMark:2})},ru=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",hy=ru&&typeof ReadableStream=="function",Rw=ru&&(typeof TextEncoder=="function"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),_y=(e,...t)=>{try{return!!e(...t)}catch{return!1}},Mw=hy&&_y(()=>{let e=!1;const t=new Request(Xt.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t}),Tf=64*1024,Wc=hy&&_y(()=>J.isReadableStream(new Response("").body)),dl={stream:Wc&&(e=>e.body)};ru&&(e=>{["text","arrayBuffer","blob","formData","stream"].forEach(t=>{!dl[t]&&(dl[t]=J.isFunction(e[t])?n=>n[t]():(n,r)=>{throw new Be(`Response type '${t}' is not supported`,Be.ERR_NOT_SUPPORT,r)})})})(new Response);const Fw=async e=>{if(e==null)return 0;if(J.isBlob(e))return e.size;if(J.isSpecCompliantForm(e))return(await new Request(Xt.origin,{method:"POST",body:e}).arrayBuffer()).byteLength;if(J.isArrayBufferView(e)||J.isArrayBuffer(e))return e.byteLength;if(J.isURLSearchParams(e)&&(e=e+""),J.isString(e))return(await Rw(e)).byteLength},Vw=async(e,t)=>{const n=J.toFiniteNumber(e.getContentLength());return n??Fw(t)},Hw=ru&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:s,timeout:i,onDownloadProgress:a,onUploadProgress:l,responseType:c,headers:d,withCredentials:m="same-origin",fetchOptions:f}=py(e);c=c?(c+"").toLowerCase():"text";let p=Iw([o,s&&s.toAbortSignal()],i),h;const _=p&&p.unsubscribe&&(()=>{p.unsubscribe()});let b;try{if(l&&Mw&&n!=="get"&&n!=="head"&&(b=await Vw(d,r))!==0){let S=new Request(t,{method:"POST",body:r,duplex:"half"}),k;if(J.isFormData(r)&&(k=S.headers.get("content-type"))&&d.setContentType(k),S.body){const[L,D]=Sf(b,cl(kf(l)));r=Ef(S.body,Tf,L,D)}}J.isString(m)||(m=m?"include":"omit");const C="credentials"in Request.prototype;h=new Request(t,{...f,signal:p,method:n.toUpperCase(),headers:d.normalize().toJSON(),body:r,duplex:"half",credentials:C?m:void 0});let w=await fetch(h);const g=Wc&&(c==="stream"||c==="response");if(Wc&&(a||g&&_)){const S={};["status","statusText","headers"].forEach(T=>{S[T]=w[T]});const k=J.toFiniteNumber(w.headers.get("content-length")),[L,D]=a&&Sf(k,cl(kf(a),!0))||[];w=new Response(Ef(w.body,Tf,L,()=>{D&&D(),_&&_()}),S)}c=c||"text";let z=await dl[J.findKey(dl,c)||"text"](w,e);return!g&&_&&_(),await new Promise((S,k)=>{my(S,k,{data:z,headers:bn.from(w.headers),status:w.status,statusText:w.statusText,config:e,request:h})})}catch(C){throw _&&_(),C&&C.name==="TypeError"&&/fetch/i.test(C.message)?Object.assign(new Be("Network Error",Be.ERR_NETWORK,e,h),{cause:C.cause||C}):Be.from(C,C&&C.code,e,h)}}),qc={http:nw,xhr:Pw,fetch:Hw};J.forEach(qc,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const $f=e=>`- ${e}`,Uw=e=>J.isFunction(e)||e===null||e===!1,gy={getAdapter:e=>{e=J.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let s=0;s`adapter ${a} `+(l===!1?"is not supported by the environment":"is not available in the build"));let i=t?s.length>1?`since : -`+s.map($f).join(` -`):" "+$f(s[0]):"as no adapter specified";throw new Be("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return r},adapters:qc};function Hu(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ns(null,e)}function Af(e){return Hu(e),e.headers=bn.from(e.headers),e.data=Vu.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),gy.getAdapter(e.adapter||Yi.adapter)(e).then(function(r){return Hu(e),r.data=Vu.call(e,e.transformResponse,r),r.headers=bn.from(r.headers),r},function(r){return dy(r)||(Hu(e),r&&r.response&&(r.response.data=Vu.call(e,e.transformResponse,r.response),r.response.headers=bn.from(r.response.headers))),Promise.reject(r)})}const yy="1.7.9",ou={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{ou[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const Of={};ou.transitional=function(t,n,r){function o(s,i){return"[Axios v"+yy+"] Transitional option '"+s+"'"+i+(r?". "+r:"")}return(s,i,a)=>{if(t===!1)throw new Be(o(i," has been removed"+(n?" in "+n:"")),Be.ERR_DEPRECATED);return n&&!Of[i]&&(Of[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(s,i,a):!0}};ou.spelling=function(t){return(n,r)=>(console.warn(`${r} is likely a misspelling of ${t}`),!0)};function jw(e,t,n){if(typeof e!="object")throw new Be("options must be an object",Be.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;for(;o-- >0;){const s=r[o],i=t[s];if(i){const a=e[s],l=a===void 0||i(a,s,e);if(l!==!0)throw new Be("option "+s+" must be "+l,Be.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new Be("Unknown option "+s,Be.ERR_BAD_OPTION)}}const Ma={assertOptions:jw,validators:ou},fr=Ma.validators;class Lo{constructor(t){this.defaults=t,this.interceptors={request:new Cf,response:new Cf}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let o={};Error.captureStackTrace?Error.captureStackTrace(o):o=new Error;const s=o.stack?o.stack.replace(/^.+\n/,""):"";try{r.stack?s&&!String(r.stack).endsWith(s.replace(/^.+\n.+\n/,""))&&(r.stack+=` -`+s):r.stack=s}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Mo(this.defaults,n);const{transitional:r,paramsSerializer:o,headers:s}=n;r!==void 0&&Ma.assertOptions(r,{silentJSONParsing:fr.transitional(fr.boolean),forcedJSONParsing:fr.transitional(fr.boolean),clarifyTimeoutError:fr.transitional(fr.boolean)},!1),o!=null&&(J.isFunction(o)?n.paramsSerializer={serialize:o}:Ma.assertOptions(o,{encode:fr.function,serialize:fr.function},!0)),Ma.assertOptions(n,{baseUrl:fr.spelling("baseURL"),withXsrfToken:fr.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=s&&J.merge(s.common,s[n.method]);s&&J.forEach(["delete","get","head","post","put","patch","common"],h=>{delete s[h]}),n.headers=bn.concat(i,s);const a=[];let l=!0;this.interceptors.request.forEach(function(_){typeof _.runWhen=="function"&&_.runWhen(n)===!1||(l=l&&_.synchronous,a.unshift(_.fulfilled,_.rejected))});const c=[];this.interceptors.response.forEach(function(_){c.push(_.fulfilled,_.rejected)});let d,m=0,f;if(!l){const h=[Af.bind(this),void 0];for(h.unshift.apply(h,a),h.push.apply(h,c),f=h.length,d=Promise.resolve(n);m{if(!r._listeners)return;let s=r._listeners.length;for(;s-- >0;)r._listeners[s](o);r._listeners=null}),this.promise.then=o=>{let s;const i=new Promise(a=>{r.subscribe(a),s=a}).then(o);return i.cancel=function(){r.unsubscribe(s)},i},t(function(s,i,a){r.reason||(r.reason=new Ns(s,i,a),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new Jd(function(o){t=o}),cancel:t}}}function Bw(e){return function(n){return e.apply(null,n)}}function Ww(e){return J.isObject(e)&&e.isAxiosError===!0}const Gc={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Gc).forEach(([e,t])=>{Gc[t]=e});function zy(e){const t=new Lo(e),n=Yg(Lo.prototype.request,t);return J.extend(n,Lo.prototype,t,{allOwnKeys:!0}),J.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return zy(Mo(e,o))},n}const de=zy(Yi);de.Axios=Lo;de.CanceledError=Ns;de.CancelToken=Jd;de.isCancel=dy;de.VERSION=yy;de.toFormData=nu;de.AxiosError=Be;de.Cancel=de.CanceledError;de.all=function(t){return Promise.all(t)};de.spread=Bw;de.isAxiosError=Ww;de.mergeConfig=Mo;de.AxiosHeaders=bn;de.formToJSON=e=>cy(J.isHTMLForm(e)?new FormData(e):e);de.getAdapter=gy.getAdapter;de.HttpStatusCode=Gc;de.default=de;/*! + */let nb;const xu=e=>nb=e,rb=Symbol();function Vm(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var pa;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(pa||(pa={}));function Rk(){const e=uu(!0),t=e.run(()=>ar({}));let n=[],r=[];const s=_u({install(o){xu(s),s._a=o,o.provide(rb,s),o.config.globalProperties.$pinia=s,r.forEach(i=>n.push(i)),r=[]},use(o){return this._a?n.push(o):r.push(o),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return s}const sb=()=>{};function Xh(e,t,n,r=sb){e.push(t);const s=()=>{const o=e.indexOf(t);o>-1&&(e.splice(o,1),r())};return!n&&$f()&&l1(s),s}function Ho(e,...t){e.slice().forEach(n=>{n(...t)})}const Dk=e=>e(),Yh=Symbol(),$d=Symbol();function Hm(e,t){e instanceof Map&&t instanceof Map?t.forEach((n,r)=>e.set(r,n)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],s=e[n];Vm(s)&&Vm(r)&&e.hasOwnProperty(n)&&!Ot(r)&&!Br(r)?e[n]=Hm(s,r):e[n]=r}return e}const Mk=Symbol();function Fk(e){return!Vm(e)||!e.hasOwnProperty(Mk)}const{assign:As}=Object;function Vk(e){return!!(Ot(e)&&e.effect)}function Hk(e,t,n,r){const{state:s,actions:o,getters:i}=t,a=n.state.value[e];let l;function c(){a||(n.state.value[e]=s?s():{});const d=k1(n.state.value[e]);return As(d,o,Object.keys(i||{}).reduce((m,f)=>(m[f]=_u(en(()=>{xu(n);const p=n._s.get(e);return i[f].call(p,p)})),m),{}))}return l=ob(e,c,t,n,r,!0),l}function ob(e,t,n={},r,s,o){let i;const a=As({actions:{}},n),l={deep:!0};let c,d,m=[],f=[],p;const h=r.state.value[e];!o&&!h&&(r.state.value[e]={}),ar({});let _;function v(N){let k;c=d=!1,typeof N=="function"?(N(r.state.value[e]),k={type:pa.patchFunction,storeId:e,events:p}):(Hm(r.state.value[e],N),k={type:pa.patchObject,payload:N,storeId:e,events:p});const R=_=Symbol();Ro().then(()=>{_===R&&(c=!0)}),d=!0,Ho(m,k,r.state.value[e])}const C=o?function(){const{state:k}=n,R=k?k():{};this.$patch(B=>{As(B,R)})}:sb;function S(){i.stop(),m=[],f=[],r._s.delete(e)}const g=(N,k="")=>{if(Yh in N)return N[$d]=k,N;const R=function(){xu(r);const B=Array.from(arguments),M=[],H=[];function X(te){M.push(te)}function ae(te){H.push(te)}Ho(f,{args:B,name:R[$d],store:E,after:X,onError:ae});let G;try{G=N.apply(this&&this.$id===e?this:E,B)}catch(te){throw Ho(H,te),te}return G instanceof Promise?G.then(te=>(Ho(M,te),te)).catch(te=>(Ho(H,te),Promise.reject(te))):(Ho(M,G),G)};return R[Yh]=!0,R[$d]=k,R},b={_p:r,$id:e,$onAction:Xh.bind(null,f),$patch:v,$reset:C,$subscribe(N,k={}){const R=Xh(m,N,k.detached,()=>B()),B=i.run(()=>Zn(()=>r.state.value[e],M=>{(k.flush==="sync"?d:c)&&N({storeId:e,type:pa.direct,events:p},M)},As({},l,k)));return R},$dispose:S},E=Oi(b);r._s.set(e,E);const P=(r._a&&r._a.runWithContext||Dk)(()=>r._e.run(()=>(i=uu()).run(()=>t({action:g}))));for(const N in P){const k=P[N];if(Ot(k)&&!Vk(k)||Br(k))o||(h&&Fk(k)&&(Ot(k)?k.value=h[N]:Hm(k,h[N])),r.state.value[e][N]=k);else if(typeof k=="function"){const R=g(k,N);P[N]=R,a.actions[N]=k}}return As(E,P),As(nt(E),P),Object.defineProperty(E,"$state",{get:()=>r.state.value[e],set:N=>{v(k=>{As(k,N)})}}),r._p.forEach(N=>{As(E,i.run(()=>N({store:E,app:r._a,pinia:r,options:a})))}),h&&o&&n.hydrate&&n.hydrate(E.$state,h),c=!0,d=!0,E}/*! #__NO_SIDE_EFFECTS__ */function _r(e,t,n){let r,s;const o=typeof t=="function";typeof e=="string"?(r=e,s=o?n:t):(s=e,r=e.id);function i(a,l){const c=ev();return a=a||(c?lr(rb,null):null),a&&xu(a),a=nb,a._s.has(r)||(o?ob(r,t,s,a):Hk(r,s,a)),a._s.get(r)}return i.$id=r,i}const ep=_r("RemotesStore",{state:()=>({pairing:{}})});function ib(e,t){return function(){return e.apply(t,arguments)}}const{toString:Uk}=Object.prototype,{getPrototypeOf:tp}=Object,Tu=(e=>t=>{const n=Uk.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),Nr=e=>(e=e.toLowerCase(),t=>Tu(t)===e),Au=e=>t=>typeof t===e,{isArray:Ii}=Array,Ra=Au("undefined");function jk(e){return e!==null&&!Ra(e)&&e.constructor!==null&&!Ra(e.constructor)&&Jn(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const ab=Nr("ArrayBuffer");function Bk(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&ab(e.buffer),t}const qk=Au("string"),Jn=Au("function"),lb=Au("number"),Ou=e=>e!==null&&typeof e=="object",Wk=e=>e===!0||e===!1,Jl=e=>{if(Tu(e)!=="object")return!1;const t=tp(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},Gk=Nr("Date"),Kk=Nr("File"),Xk=Nr("Blob"),Yk=Nr("FileList"),Zk=e=>Ou(e)&&Jn(e.pipe),Jk=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||Jn(e.append)&&((t=Tu(e))==="formdata"||t==="object"&&Jn(e.toString)&&e.toString()==="[object FormData]"))},Qk=Nr("URLSearchParams"),[ex,tx,nx,rx]=["ReadableStream","Request","Response","Headers"].map(Nr),sx=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function rl(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,s;if(typeof e!="object"&&(e=[e]),Ii(e))for(r=0,s=e.length;r0;)if(s=n[r],t===s.toLowerCase())return s;return null}const fo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,ub=e=>!Ra(e)&&e!==fo;function Um(){const{caseless:e}=ub(this)&&this||{},t={},n=(r,s)=>{const o=e&&cb(t,s)||s;Jl(t[o])&&Jl(r)?t[o]=Um(t[o],r):Jl(r)?t[o]=Um({},r):Ii(r)?t[o]=r.slice():t[o]=r};for(let r=0,s=arguments.length;r(rl(t,(s,o)=>{n&&Jn(s)?e[o]=ib(s,n):e[o]=s},{allOwnKeys:r}),e),ix=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),ax=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},lx=(e,t,n,r)=>{let s,o,i;const a={};if(t=t||{},e==null)return t;do{for(s=Object.getOwnPropertyNames(e),o=s.length;o-- >0;)i=s[o],(!r||r(i,e,t))&&!a[i]&&(t[i]=e[i],a[i]=!0);e=n!==!1&&tp(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},cx=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},ux=e=>{if(!e)return null;if(Ii(e))return e;let t=e.length;if(!lb(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},dx=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&tp(Uint8Array)),mx=(e,t)=>{const r=(e&&e[Symbol.iterator]).call(e);let s;for(;(s=r.next())&&!s.done;){const o=s.value;t.call(e,o[0],o[1])}},fx=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},px=Nr("HTMLFormElement"),hx=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,s){return r.toUpperCase()+s}),Zh=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),_x=Nr("RegExp"),db=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};rl(n,(s,o)=>{let i;(i=t(s,o,e))!==!1&&(r[o]=i||s)}),Object.defineProperties(e,r)},gx=e=>{db(e,(t,n)=>{if(Jn(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(Jn(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},yx=(e,t)=>{const n={},r=s=>{s.forEach(o=>{n[o]=!0})};return Ii(e)?r(e):r(String(e).split(t)),n},vx=()=>{},bx=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t,Nd="abcdefghijklmnopqrstuvwxyz",Jh="0123456789",mb={DIGIT:Jh,ALPHA:Nd,ALPHA_DIGIT:Nd+Nd.toUpperCase()+Jh},zx=(e=16,t=mb.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function Cx(e){return!!(e&&Jn(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const Sx=e=>{const t=new Array(10),n=(r,s)=>{if(Ou(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[s]=r;const o=Ii(r)?[]:{};return rl(r,(i,a)=>{const l=n(i,s+1);!Ra(l)&&(o[a]=l)}),t[s]=void 0,o}}return r};return n(e,0)},Ex=Nr("AsyncFunction"),wx=e=>e&&(Ou(e)||Jn(e))&&Jn(e.then)&&Jn(e.catch),fb=((e,t)=>e?setImmediate:t?((n,r)=>(fo.addEventListener("message",({source:s,data:o})=>{s===fo&&o===n&&r.length&&r.shift()()},!1),s=>{r.push(s),fo.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",Jn(fo.postMessage)),kx=typeof queueMicrotask<"u"?queueMicrotask.bind(fo):typeof process<"u"&&process.nextTick||fb,Q={isArray:Ii,isArrayBuffer:ab,isBuffer:jk,isFormData:Jk,isArrayBufferView:Bk,isString:qk,isNumber:lb,isBoolean:Wk,isObject:Ou,isPlainObject:Jl,isReadableStream:ex,isRequest:tx,isResponse:nx,isHeaders:rx,isUndefined:Ra,isDate:Gk,isFile:Kk,isBlob:Xk,isRegExp:_x,isFunction:Jn,isStream:Zk,isURLSearchParams:Qk,isTypedArray:dx,isFileList:Yk,forEach:rl,merge:Um,extend:ox,trim:sx,stripBOM:ix,inherits:ax,toFlatObject:lx,kindOf:Tu,kindOfTest:Nr,endsWith:cx,toArray:ux,forEachEntry:mx,matchAll:fx,isHTMLForm:px,hasOwnProperty:Zh,hasOwnProp:Zh,reduceDescriptors:db,freezeMethods:gx,toObjectSet:yx,toCamelCase:hx,noop:vx,toFiniteNumber:bx,findKey:cb,global:fo,isContextDefined:ub,ALPHABET:mb,generateString:zx,isSpecCompliantForm:Cx,toJSONObject:Sx,isAsyncFn:Ex,isThenable:wx,setImmediate:fb,asap:kx};function We(e,t,n,r,s){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),s&&(this.response=s,this.status=s.status?s.status:null)}Q.inherits(We,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:Q.toJSONObject(this.config),code:this.code,status:this.status}}});const pb=We.prototype,hb={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{hb[e]={value:e}});Object.defineProperties(We,hb);Object.defineProperty(pb,"isAxiosError",{value:!0});We.from=(e,t,n,r,s,o)=>{const i=Object.create(pb);return Q.toFlatObject(e,i,function(l){return l!==Error.prototype},a=>a!=="isAxiosError"),We.call(i,e.message,t,n,r,s),i.cause=e,i.name=e.name,o&&Object.assign(i,o),i};const xx=null;function jm(e){return Q.isPlainObject(e)||Q.isArray(e)}function _b(e){return Q.endsWith(e,"[]")?e.slice(0,-2):e}function Qh(e,t,n){return e?e.concat(t).map(function(s,o){return s=_b(s),!n&&o?"["+s+"]":s}).join(n?".":""):t}function Tx(e){return Q.isArray(e)&&!e.some(jm)}const Ax=Q.toFlatObject(Q,{},null,function(t){return/^is[A-Z]/.test(t)});function $u(e,t,n){if(!Q.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=Q.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(_,v){return!Q.isUndefined(v[_])});const r=n.metaTokens,s=n.visitor||d,o=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&Q.isSpecCompliantForm(t);if(!Q.isFunction(s))throw new TypeError("visitor must be a function");function c(h){if(h===null)return"";if(Q.isDate(h))return h.toISOString();if(!l&&Q.isBlob(h))throw new We("Blob is not supported. Use a Buffer instead.");return Q.isArrayBuffer(h)||Q.isTypedArray(h)?l&&typeof Blob=="function"?new Blob([h]):Buffer.from(h):h}function d(h,_,v){let C=h;if(h&&!v&&typeof h=="object"){if(Q.endsWith(_,"{}"))_=r?_:_.slice(0,-2),h=JSON.stringify(h);else if(Q.isArray(h)&&Tx(h)||(Q.isFileList(h)||Q.endsWith(_,"[]"))&&(C=Q.toArray(h)))return _=_b(_),C.forEach(function(g,b){!(Q.isUndefined(g)||g===null)&&t.append(i===!0?Qh([_],b,o):i===null?_:_+"[]",c(g))}),!1}return jm(h)?!0:(t.append(Qh(v,_,o),c(h)),!1)}const m=[],f=Object.assign(Ax,{defaultVisitor:d,convertValue:c,isVisitable:jm});function p(h,_){if(!Q.isUndefined(h)){if(m.indexOf(h)!==-1)throw Error("Circular reference detected in "+_.join("."));m.push(h),Q.forEach(h,function(C,S){(!(Q.isUndefined(C)||C===null)&&s.call(t,C,Q.isString(S)?S.trim():S,_,f))===!0&&p(C,_?_.concat(S):[S])}),m.pop()}}if(!Q.isObject(e))throw new TypeError("data must be an object");return p(e),t}function e_(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function np(e,t){this._pairs=[],e&&$u(e,this,t)}const gb=np.prototype;gb.append=function(t,n){this._pairs.push([t,n])};gb.toString=function(t){const n=t?function(r){return t.call(this,r,e_)}:e_;return this._pairs.map(function(s){return n(s[0])+"="+n(s[1])},"").join("&")};function Ox(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function yb(e,t,n){if(!t)return e;const r=n&&n.encode||Ox;Q.isFunction(n)&&(n={serialize:n});const s=n&&n.serialize;let o;if(s?o=s(t,n):o=Q.isURLSearchParams(t)?t.toString():new np(t,n).toString(r),o){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+o}return e}class t_{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){Q.forEach(this.handlers,function(r){r!==null&&t(r)})}}const vb={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},$x=typeof URLSearchParams<"u"?URLSearchParams:np,Nx=typeof FormData<"u"?FormData:null,Ix=typeof Blob<"u"?Blob:null,Px={isBrowser:!0,classes:{URLSearchParams:$x,FormData:Nx,Blob:Ix},protocols:["http","https","file","blob","url","data"]},rp=typeof window<"u"&&typeof document<"u",Bm=typeof navigator=="object"&&navigator||void 0,Lx=rp&&(!Bm||["ReactNative","NativeScript","NS"].indexOf(Bm.product)<0),Rx=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",Dx=rp&&window.location.href||"http://localhost",Mx=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:rp,hasStandardBrowserEnv:Lx,hasStandardBrowserWebWorkerEnv:Rx,navigator:Bm,origin:Dx},Symbol.toStringTag,{value:"Module"})),hn={...Mx,...Px};function Fx(e,t){return $u(e,new hn.classes.URLSearchParams,Object.assign({visitor:function(n,r,s,o){return hn.isNode&&Q.isBuffer(n)?(this.append(r,n.toString("base64")),!1):o.defaultVisitor.apply(this,arguments)}},t))}function Vx(e){return Q.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function Hx(e){const t={},n=Object.keys(e);let r;const s=n.length;let o;for(r=0;r=n.length;return i=!i&&Q.isArray(s)?s.length:i,l?(Q.hasOwnProp(s,i)?s[i]=[s[i],r]:s[i]=r,!a):((!s[i]||!Q.isObject(s[i]))&&(s[i]=[]),t(n,r,s[i],o)&&Q.isArray(s[i])&&(s[i]=Hx(s[i])),!a)}if(Q.isFormData(e)&&Q.isFunction(e.entries)){const n={};return Q.forEachEntry(e,(r,s)=>{t(Vx(r),s,n,0)}),n}return null}function Ux(e,t,n){if(Q.isString(e))try{return(t||JSON.parse)(e),Q.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const sl={transitional:vb,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",s=r.indexOf("application/json")>-1,o=Q.isObject(t);if(o&&Q.isHTMLForm(t)&&(t=new FormData(t)),Q.isFormData(t))return s?JSON.stringify(bb(t)):t;if(Q.isArrayBuffer(t)||Q.isBuffer(t)||Q.isStream(t)||Q.isFile(t)||Q.isBlob(t)||Q.isReadableStream(t))return t;if(Q.isArrayBufferView(t))return t.buffer;if(Q.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let a;if(o){if(r.indexOf("application/x-www-form-urlencoded")>-1)return Fx(t,this.formSerializer).toString();if((a=Q.isFileList(t))||r.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return $u(a?{"files[]":t}:t,l&&new l,this.formSerializer)}}return o||s?(n.setContentType("application/json",!1),Ux(t)):t}],transformResponse:[function(t){const n=this.transitional||sl.transitional,r=n&&n.forcedJSONParsing,s=this.responseType==="json";if(Q.isResponse(t)||Q.isReadableStream(t))return t;if(t&&Q.isString(t)&&(r&&!this.responseType||s)){const i=!(n&&n.silentJSONParsing)&&s;try{return JSON.parse(t)}catch(a){if(i)throw a.name==="SyntaxError"?We.from(a,We.ERR_BAD_RESPONSE,this,null,this.response):a}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:hn.classes.FormData,Blob:hn.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};Q.forEach(["delete","get","head","post","put","patch"],e=>{sl.headers[e]={}});const jx=Q.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),Bx=e=>{const t={};let n,r,s;return e&&e.split(` +`).forEach(function(i){s=i.indexOf(":"),n=i.substring(0,s).trim().toLowerCase(),r=i.substring(s+1).trim(),!(!n||t[n]&&jx[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},n_=Symbol("internals");function qi(e){return e&&String(e).trim().toLowerCase()}function Ql(e){return e===!1||e==null?e:Q.isArray(e)?e.map(Ql):String(e)}function qx(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const Wx=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function Id(e,t,n,r,s){if(Q.isFunction(r))return r.call(this,t,n);if(s&&(t=n),!!Q.isString(t)){if(Q.isString(r))return t.indexOf(r)!==-1;if(Q.isRegExp(r))return r.test(t)}}function Gx(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function Kx(e,t){const n=Q.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(s,o,i){return this[r].call(this,t,s,o,i)},configurable:!0})})}let Hn=class{constructor(t){t&&this.set(t)}set(t,n,r){const s=this;function o(a,l,c){const d=qi(l);if(!d)throw new Error("header name must be a non-empty string");const m=Q.findKey(s,d);(!m||s[m]===void 0||c===!0||c===void 0&&s[m]!==!1)&&(s[m||l]=Ql(a))}const i=(a,l)=>Q.forEach(a,(c,d)=>o(c,d,l));if(Q.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(Q.isString(t)&&(t=t.trim())&&!Wx(t))i(Bx(t),n);else if(Q.isHeaders(t))for(const[a,l]of t.entries())o(l,a,r);else t!=null&&o(n,t,r);return this}get(t,n){if(t=qi(t),t){const r=Q.findKey(this,t);if(r){const s=this[r];if(!n)return s;if(n===!0)return qx(s);if(Q.isFunction(n))return n.call(this,s,r);if(Q.isRegExp(n))return n.exec(s);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=qi(t),t){const r=Q.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||Id(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let s=!1;function o(i){if(i=qi(i),i){const a=Q.findKey(r,i);a&&(!n||Id(r,r[a],a,n))&&(delete r[a],s=!0)}}return Q.isArray(t)?t.forEach(o):o(t),s}clear(t){const n=Object.keys(this);let r=n.length,s=!1;for(;r--;){const o=n[r];(!t||Id(this,this[o],o,t,!0))&&(delete this[o],s=!0)}return s}normalize(t){const n=this,r={};return Q.forEach(this,(s,o)=>{const i=Q.findKey(r,o);if(i){n[i]=Ql(s),delete n[o];return}const a=t?Gx(o):String(o).trim();a!==o&&delete n[o],n[a]=Ql(s),r[a]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return Q.forEach(this,(r,s)=>{r!=null&&r!==!1&&(n[s]=t&&Q.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` +`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(s=>r.set(s)),r}static accessor(t){const r=(this[n_]=this[n_]={accessors:{}}).accessors,s=this.prototype;function o(i){const a=qi(i);r[a]||(Kx(s,i),r[a]=!0)}return Q.isArray(t)?t.forEach(o):o(t),this}};Hn.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);Q.reduceDescriptors(Hn.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});Q.freezeMethods(Hn);function Pd(e,t){const n=this||sl,r=t||n,s=Hn.from(r.headers);let o=r.data;return Q.forEach(e,function(a){o=a.call(n,o,s.normalize(),t?t.status:void 0)}),s.normalize(),o}function zb(e){return!!(e&&e.__CANCEL__)}function Pi(e,t,n){We.call(this,e??"canceled",We.ERR_CANCELED,t,n),this.name="CanceledError"}Q.inherits(Pi,We,{__CANCEL__:!0});function Cb(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new We("Request failed with status code "+n.status,[We.ERR_BAD_REQUEST,We.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function Xx(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function Yx(e,t){e=e||10;const n=new Array(e),r=new Array(e);let s=0,o=0,i;return t=t!==void 0?t:1e3,function(l){const c=Date.now(),d=r[o];i||(i=c),n[s]=l,r[s]=c;let m=o,f=0;for(;m!==s;)f+=n[m++],m=m%e;if(s=(s+1)%e,s===o&&(o=(o+1)%e),c-i{n=d,s=null,o&&(clearTimeout(o),o=null),e.apply(null,c)};return[(...c)=>{const d=Date.now(),m=d-n;m>=r?i(c,d):(s=c,o||(o=setTimeout(()=>{o=null,i(s)},r-m)))},()=>s&&i(s)]}const Nc=(e,t,n=3)=>{let r=0;const s=Yx(50,250);return Zx(o=>{const i=o.loaded,a=o.lengthComputable?o.total:void 0,l=i-r,c=s(l),d=i<=a;r=i;const m={loaded:i,total:a,progress:a?i/a:void 0,bytes:l,rate:c||void 0,estimated:c&&a&&d?(a-i)/c:void 0,event:o,lengthComputable:a!=null,[t?"download":"upload"]:!0};e(m)},n)},r_=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},s_=e=>(...t)=>Q.asap(()=>e(...t)),Jx=hn.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,hn.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(hn.origin),hn.navigator&&/(msie|trident)/i.test(hn.navigator.userAgent)):()=>!0,Qx=hn.hasStandardBrowserEnv?{write(e,t,n,r,s,o){const i=[e+"="+encodeURIComponent(t)];Q.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),Q.isString(r)&&i.push("path="+r),Q.isString(s)&&i.push("domain="+s),o===!0&&i.push("secure"),document.cookie=i.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function eT(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function tT(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function Sb(e,t){return e&&!eT(t)?tT(e,t):t}const o_=e=>e instanceof Hn?{...e}:e;function To(e,t){t=t||{};const n={};function r(c,d,m,f){return Q.isPlainObject(c)&&Q.isPlainObject(d)?Q.merge.call({caseless:f},c,d):Q.isPlainObject(d)?Q.merge({},d):Q.isArray(d)?d.slice():d}function s(c,d,m,f){if(Q.isUndefined(d)){if(!Q.isUndefined(c))return r(void 0,c,m,f)}else return r(c,d,m,f)}function o(c,d){if(!Q.isUndefined(d))return r(void 0,d)}function i(c,d){if(Q.isUndefined(d)){if(!Q.isUndefined(c))return r(void 0,c)}else return r(void 0,d)}function a(c,d,m){if(m in t)return r(c,d);if(m in e)return r(void 0,c)}const l={url:o,method:o,data:o,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:a,headers:(c,d,m)=>s(o_(c),o_(d),m,!0)};return Q.forEach(Object.keys(Object.assign({},e,t)),function(d){const m=l[d]||s,f=m(e[d],t[d],d);Q.isUndefined(f)&&m!==a||(n[d]=f)}),n}const Eb=e=>{const t=To({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:s,xsrfCookieName:o,headers:i,auth:a}=t;t.headers=i=Hn.from(i),t.url=yb(Sb(t.baseURL,t.url),e.params,e.paramsSerializer),a&&i.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):"")));let l;if(Q.isFormData(n)){if(hn.hasStandardBrowserEnv||hn.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if((l=i.getContentType())!==!1){const[c,...d]=l?l.split(";").map(m=>m.trim()).filter(Boolean):[];i.setContentType([c||"multipart/form-data",...d].join("; "))}}if(hn.hasStandardBrowserEnv&&(r&&Q.isFunction(r)&&(r=r(t)),r||r!==!1&&Jx(t.url))){const c=s&&o&&Qx.read(o);c&&i.set(s,c)}return t},nT=typeof XMLHttpRequest<"u",rT=nT&&function(e){return new Promise(function(n,r){const s=Eb(e);let o=s.data;const i=Hn.from(s.headers).normalize();let{responseType:a,onUploadProgress:l,onDownloadProgress:c}=s,d,m,f,p,h;function _(){p&&p(),h&&h(),s.cancelToken&&s.cancelToken.unsubscribe(d),s.signal&&s.signal.removeEventListener("abort",d)}let v=new XMLHttpRequest;v.open(s.method.toUpperCase(),s.url,!0),v.timeout=s.timeout;function C(){if(!v)return;const g=Hn.from("getAllResponseHeaders"in v&&v.getAllResponseHeaders()),E={data:!a||a==="text"||a==="json"?v.responseText:v.response,status:v.status,statusText:v.statusText,headers:g,config:e,request:v};Cb(function(P){n(P),_()},function(P){r(P),_()},E),v=null}"onloadend"in v?v.onloadend=C:v.onreadystatechange=function(){!v||v.readyState!==4||v.status===0&&!(v.responseURL&&v.responseURL.indexOf("file:")===0)||setTimeout(C)},v.onabort=function(){v&&(r(new We("Request aborted",We.ECONNABORTED,e,v)),v=null)},v.onerror=function(){r(new We("Network Error",We.ERR_NETWORK,e,v)),v=null},v.ontimeout=function(){let b=s.timeout?"timeout of "+s.timeout+"ms exceeded":"timeout exceeded";const E=s.transitional||vb;s.timeoutErrorMessage&&(b=s.timeoutErrorMessage),r(new We(b,E.clarifyTimeoutError?We.ETIMEDOUT:We.ECONNABORTED,e,v)),v=null},o===void 0&&i.setContentType(null),"setRequestHeader"in v&&Q.forEach(i.toJSON(),function(b,E){v.setRequestHeader(E,b)}),Q.isUndefined(s.withCredentials)||(v.withCredentials=!!s.withCredentials),a&&a!=="json"&&(v.responseType=s.responseType),c&&([f,h]=Nc(c,!0),v.addEventListener("progress",f)),l&&v.upload&&([m,p]=Nc(l),v.upload.addEventListener("progress",m),v.upload.addEventListener("loadend",p)),(s.cancelToken||s.signal)&&(d=g=>{v&&(r(!g||g.type?new Pi(null,e,v):g),v.abort(),v=null)},s.cancelToken&&s.cancelToken.subscribe(d),s.signal&&(s.signal.aborted?d():s.signal.addEventListener("abort",d)));const S=Xx(s.url);if(S&&hn.protocols.indexOf(S)===-1){r(new We("Unsupported protocol "+S+":",We.ERR_BAD_REQUEST,e));return}v.send(o||null)})},sT=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let r=new AbortController,s;const o=function(c){if(!s){s=!0,a();const d=c instanceof Error?c:this.reason;r.abort(d instanceof We?d:new Pi(d instanceof Error?d.message:d))}};let i=t&&setTimeout(()=>{i=null,o(new We(`timeout ${t} of ms exceeded`,We.ETIMEDOUT))},t);const a=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach(c=>{c.unsubscribe?c.unsubscribe(o):c.removeEventListener("abort",o)}),e=null)};e.forEach(c=>c.addEventListener("abort",o));const{signal:l}=r;return l.unsubscribe=()=>Q.asap(a),l}},oT=function*(e,t){let n=e.byteLength;if(n{const s=iT(e,t);let o=0,i,a=l=>{i||(i=!0,r&&r(l))};return new ReadableStream({async pull(l){try{const{done:c,value:d}=await s.next();if(c){a(),l.close();return}let m=d.byteLength;if(n){let f=o+=m;n(f)}l.enqueue(new Uint8Array(d))}catch(c){throw a(c),c}},cancel(l){return a(l),s.return()}},{highWaterMark:2})},Nu=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",wb=Nu&&typeof ReadableStream=="function",lT=Nu&&(typeof TextEncoder=="function"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),kb=(e,...t)=>{try{return!!e(...t)}catch{return!1}},cT=wb&&kb(()=>{let e=!1;const t=new Request(hn.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t}),a_=64*1024,qm=wb&&kb(()=>Q.isReadableStream(new Response("").body)),Ic={stream:qm&&(e=>e.body)};Nu&&(e=>{["text","arrayBuffer","blob","formData","stream"].forEach(t=>{!Ic[t]&&(Ic[t]=Q.isFunction(e[t])?n=>n[t]():(n,r)=>{throw new We(`Response type '${t}' is not supported`,We.ERR_NOT_SUPPORT,r)})})})(new Response);const uT=async e=>{if(e==null)return 0;if(Q.isBlob(e))return e.size;if(Q.isSpecCompliantForm(e))return(await new Request(hn.origin,{method:"POST",body:e}).arrayBuffer()).byteLength;if(Q.isArrayBufferView(e)||Q.isArrayBuffer(e))return e.byteLength;if(Q.isURLSearchParams(e)&&(e=e+""),Q.isString(e))return(await lT(e)).byteLength},dT=async(e,t)=>{const n=Q.toFiniteNumber(e.getContentLength());return n??uT(t)},mT=Nu&&(async e=>{let{url:t,method:n,data:r,signal:s,cancelToken:o,timeout:i,onDownloadProgress:a,onUploadProgress:l,responseType:c,headers:d,withCredentials:m="same-origin",fetchOptions:f}=Eb(e);c=c?(c+"").toLowerCase():"text";let p=sT([s,o&&o.toAbortSignal()],i),h;const _=p&&p.unsubscribe&&(()=>{p.unsubscribe()});let v;try{if(l&&cT&&n!=="get"&&n!=="head"&&(v=await dT(d,r))!==0){let E=new Request(t,{method:"POST",body:r,duplex:"half"}),w;if(Q.isFormData(r)&&(w=E.headers.get("content-type"))&&d.setContentType(w),E.body){const[P,N]=r_(v,Nc(s_(l)));r=i_(E.body,a_,P,N)}}Q.isString(m)||(m=m?"include":"omit");const C="credentials"in Request.prototype;h=new Request(t,{...f,signal:p,method:n.toUpperCase(),headers:d.normalize().toJSON(),body:r,duplex:"half",credentials:C?m:void 0});let S=await fetch(h);const g=qm&&(c==="stream"||c==="response");if(qm&&(a||g&&_)){const E={};["status","statusText","headers"].forEach(k=>{E[k]=S[k]});const w=Q.toFiniteNumber(S.headers.get("content-length")),[P,N]=a&&r_(w,Nc(s_(a),!0))||[];S=new Response(i_(S.body,a_,P,()=>{N&&N(),_&&_()}),E)}c=c||"text";let b=await Ic[Q.findKey(Ic,c)||"text"](S,e);return!g&&_&&_(),await new Promise((E,w)=>{Cb(E,w,{data:b,headers:Hn.from(S.headers),status:S.status,statusText:S.statusText,config:e,request:h})})}catch(C){throw _&&_(),C&&C.name==="TypeError"&&/fetch/i.test(C.message)?Object.assign(new We("Network Error",We.ERR_NETWORK,e,h),{cause:C.cause||C}):We.from(C,C&&C.code,e,h)}}),Wm={http:xx,xhr:rT,fetch:mT};Q.forEach(Wm,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const l_=e=>`- ${e}`,fT=e=>Q.isFunction(e)||e===null||e===!1,xb={getAdapter:e=>{e=Q.isArray(e)?e:[e];const{length:t}=e;let n,r;const s={};for(let o=0;o`adapter ${a} `+(l===!1?"is not supported by the environment":"is not available in the build"));let i=t?o.length>1?`since : +`+o.map(l_).join(` +`):" "+l_(o[0]):"as no adapter specified";throw new We("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return r},adapters:Wm};function Ld(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Pi(null,e)}function c_(e){return Ld(e),e.headers=Hn.from(e.headers),e.data=Pd.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),xb.getAdapter(e.adapter||sl.adapter)(e).then(function(r){return Ld(e),r.data=Pd.call(e,e.transformResponse,r),r.headers=Hn.from(r.headers),r},function(r){return zb(r)||(Ld(e),r&&r.response&&(r.response.data=Pd.call(e,e.transformResponse,r.response),r.response.headers=Hn.from(r.response.headers))),Promise.reject(r)})}const Tb="1.7.9",Iu={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Iu[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const u_={};Iu.transitional=function(t,n,r){function s(o,i){return"[Axios v"+Tb+"] Transitional option '"+o+"'"+i+(r?". "+r:"")}return(o,i,a)=>{if(t===!1)throw new We(s(i," has been removed"+(n?" in "+n:"")),We.ERR_DEPRECATED);return n&&!u_[i]&&(u_[i]=!0,console.warn(s(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(o,i,a):!0}};Iu.spelling=function(t){return(n,r)=>(console.warn(`${r} is likely a misspelling of ${t}`),!0)};function pT(e,t,n){if(typeof e!="object")throw new We("options must be an object",We.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let s=r.length;for(;s-- >0;){const o=r[s],i=t[o];if(i){const a=e[o],l=a===void 0||i(a,o,e);if(l!==!0)throw new We("option "+o+" must be "+l,We.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new We("Unknown option "+o,We.ERR_BAD_OPTION)}}const ec={assertOptions:pT,validators:Iu},Rr=ec.validators;let So=class{constructor(t){this.defaults=t,this.interceptors={request:new t_,response:new t_}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let s={};Error.captureStackTrace?Error.captureStackTrace(s):s=new Error;const o=s.stack?s.stack.replace(/^.+\n/,""):"";try{r.stack?o&&!String(r.stack).endsWith(o.replace(/^.+\n.+\n/,""))&&(r.stack+=` +`+o):r.stack=o}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=To(this.defaults,n);const{transitional:r,paramsSerializer:s,headers:o}=n;r!==void 0&&ec.assertOptions(r,{silentJSONParsing:Rr.transitional(Rr.boolean),forcedJSONParsing:Rr.transitional(Rr.boolean),clarifyTimeoutError:Rr.transitional(Rr.boolean)},!1),s!=null&&(Q.isFunction(s)?n.paramsSerializer={serialize:s}:ec.assertOptions(s,{encode:Rr.function,serialize:Rr.function},!0)),ec.assertOptions(n,{baseUrl:Rr.spelling("baseURL"),withXsrfToken:Rr.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=o&&Q.merge(o.common,o[n.method]);o&&Q.forEach(["delete","get","head","post","put","patch","common"],h=>{delete o[h]}),n.headers=Hn.concat(i,o);const a=[];let l=!0;this.interceptors.request.forEach(function(_){typeof _.runWhen=="function"&&_.runWhen(n)===!1||(l=l&&_.synchronous,a.unshift(_.fulfilled,_.rejected))});const c=[];this.interceptors.response.forEach(function(_){c.push(_.fulfilled,_.rejected)});let d,m=0,f;if(!l){const h=[c_.bind(this),void 0];for(h.unshift.apply(h,a),h.push.apply(h,c),f=h.length,d=Promise.resolve(n);m{if(!r._listeners)return;let o=r._listeners.length;for(;o-- >0;)r._listeners[o](s);r._listeners=null}),this.promise.then=s=>{let o;const i=new Promise(a=>{r.subscribe(a),o=a}).then(s);return i.cancel=function(){r.unsubscribe(o)},i},t(function(o,i,a){r.reason||(r.reason=new Pi(o,i,a),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new Ab(function(s){t=s}),cancel:t}}};function _T(e){return function(n){return e.apply(null,n)}}function gT(e){return Q.isObject(e)&&e.isAxiosError===!0}const Gm={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Gm).forEach(([e,t])=>{Gm[t]=e});function Ob(e){const t=new So(e),n=ib(So.prototype.request,t);return Q.extend(n,So.prototype,t,{allOwnKeys:!0}),Q.extend(n,t,null,{allOwnKeys:!0}),n.create=function(s){return Ob(To(e,s))},n}const me=Ob(sl);me.Axios=So;me.CanceledError=Pi;me.CancelToken=hT;me.isCancel=zb;me.VERSION=Tb;me.toFormData=$u;me.AxiosError=We;me.Cancel=me.CanceledError;me.all=function(t){return Promise.all(t)};me.spread=_T;me.isAxiosError=gT;me.mergeConfig=To;me.AxiosHeaders=Hn;me.formToJSON=e=>bb(Q.isHTMLForm(e)?new FormData(e):e);me.getAdapter=xb.getAdapter;me.HttpStatusCode=Gm;me.default=me;const{Axios:Mee,AxiosError:Fee,CanceledError:Vee,isCancel:Hee,CancelToken:Uee,VERSION:jee,all:Bee,Cancel:qee,isAxiosError:Wee,spread:Gee,toFormData:Kee,AxiosHeaders:Xee,HttpStatusCode:Yee,formToJSON:Zee,getAdapter:Jee,mergeConfig:Qee}=me;/*! * shared v9.14.2 * (c) 2024 kazuya kawaguchi * Released under the MIT License. - */const ml=typeof window<"u",go=(e,t=!1)=>t?Symbol.for(e):Symbol(e),qw=(e,t,n)=>Gw({l:e,k:t,s:n}),Gw=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),Rt=e=>typeof e=="number"&&isFinite(e),Kw=e=>vy(e)==="[object Date]",fl=e=>vy(e)==="[object RegExp]",su=e=>Qe(e)&&Object.keys(e).length===0,tn=Object.assign,Zw=Object.create,mt=(e=null)=>Zw(e);let Pf;const Qd=()=>Pf||(Pf=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:mt());function If(e){return e.replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}const Yw=Object.prototype.hasOwnProperty;function tr(e,t){return Yw.call(e,t)}const Ut=Array.isArray,Pt=e=>typeof e=="function",we=e=>typeof e=="string",xt=e=>typeof e=="boolean",rt=e=>e!==null&&typeof e=="object",Xw=e=>rt(e)&&Pt(e.then)&&Pt(e.catch),by=Object.prototype.toString,vy=e=>by.call(e),Qe=e=>{if(!rt(e))return!1;const t=Object.getPrototypeOf(e);return t===null||t.constructor===Object},Jw=e=>e==null?"":Ut(e)||Qe(e)&&e.toString===by?JSON.stringify(e,null,2):String(e);function Qw(e,t=""){return e.reduce((n,r,o)=>o===0?n+r:n+t+r,"")}function iu(e){let t=e;return()=>++t}function eS(e,t){typeof console<"u"&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const pa=e=>!rt(e)||Ut(e);function Fa(e,t){if(pa(e)||pa(t))throw new Error("Invalid value");const n=[{src:e,des:t}];for(;n.length;){const{src:r,des:o}=n.pop();Object.keys(r).forEach(s=>{s!=="__proto__"&&(rt(r[s])&&!rt(o[s])&&(o[s]=Array.isArray(r[s])?[]:mt()),pa(o[s])||pa(r[s])?o[s]=r[s]:n.push({src:r[s],des:o[s]}))})}}/*! + */const Pc=typeof window<"u",Qs=(e,t=!1)=>t?Symbol.for(e):Symbol(e),yT=(e,t,n)=>vT({l:e,k:t,s:n}),vT=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),Gt=e=>typeof e=="number"&&isFinite(e),bT=e=>Nb(e)==="[object Date]",Lc=e=>Nb(e)==="[object RegExp]",Pu=e=>st(e)&&Object.keys(e).length===0,vn=Object.assign,zT=Object.create,yt=(e=null)=>zT(e);let d_;const sp=()=>d_||(d_=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:yt());function m_(e){return e.replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}const CT=Object.prototype.hasOwnProperty;function wr(e,t){return CT.call(e,t)}const Jt=Array.isArray,Mt=e=>typeof e=="function",Ee=e=>typeof e=="string",Nt=e=>typeof e=="boolean",ct=e=>e!==null&&typeof e=="object",ST=e=>ct(e)&&Mt(e.then)&&Mt(e.catch),$b=Object.prototype.toString,Nb=e=>$b.call(e),st=e=>{if(!ct(e))return!1;const t=Object.getPrototypeOf(e);return t===null||t.constructor===Object},ET=e=>e==null?"":Jt(e)||st(e)&&e.toString===$b?JSON.stringify(e,null,2):String(e);function wT(e,t=""){return e.reduce((n,r,s)=>s===0?n+r:n+t+r,"")}function Lu(e){let t=e;return()=>++t}function kT(e,t){typeof console<"u"&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const xl=e=>!ct(e)||Jt(e);function tc(e,t){if(xl(e)||xl(t))throw new Error("Invalid value");const n=[{src:e,des:t}];for(;n.length;){const{src:r,des:s}=n.pop();Object.keys(r).forEach(o=>{o!=="__proto__"&&(ct(r[o])&&!ct(s[o])&&(s[o]=Array.isArray(r[o])?[]:yt()),xl(s[o])||xl(r[o])?s[o]=r[o]:n.push({src:r[o],des:s[o]}))})}}/*! * message-compiler v9.14.2 * (c) 2024 kazuya kawaguchi * Released under the MIT License. - */function tS(e,t,n){return{line:e,column:t,offset:n}}function pl(e,t,n){return{start:e,end:t}}const nS=/\{([0-9a-zA-Z]+)\}/g;function Cy(e,...t){return t.length===1&&rS(t[0])&&(t=t[0]),(!t||!t.hasOwnProperty)&&(t={}),e.replace(nS,(n,r)=>t.hasOwnProperty(r)?t[r]:"")}const wy=Object.assign,Lf=e=>typeof e=="string",rS=e=>e!==null&&typeof e=="object";function Sy(e,t=""){return e.reduce((n,r,o)=>o===0?n+r:n+t+r,"")}const em={USE_MODULO_SYNTAX:1,__EXTEND_POINT__:2},oS={[em.USE_MODULO_SYNTAX]:"Use modulo before '{{0}}'."};function sS(e,t,...n){const r=Cy(oS[e],...n||[]),o={message:String(r),code:e};return t&&(o.location=t),o}const Le={EXPECTED_TOKEN:1,INVALID_TOKEN_IN_PLACEHOLDER:2,UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER:3,UNKNOWN_ESCAPE_SEQUENCE:4,INVALID_UNICODE_ESCAPE_SEQUENCE:5,UNBALANCED_CLOSING_BRACE:6,UNTERMINATED_CLOSING_BRACE:7,EMPTY_PLACEHOLDER:8,NOT_ALLOW_NEST_PLACEHOLDER:9,INVALID_LINKED_FORMAT:10,MUST_HAVE_MESSAGES_IN_PLURAL:11,UNEXPECTED_EMPTY_LINKED_MODIFIER:12,UNEXPECTED_EMPTY_LINKED_KEY:13,UNEXPECTED_LEXICAL_ANALYSIS:14,UNHANDLED_CODEGEN_NODE_TYPE:15,UNHANDLED_MINIFIER_NODE_TYPE:16,__EXTEND_POINT__:17},iS={[Le.EXPECTED_TOKEN]:"Expected token: '{0}'",[Le.INVALID_TOKEN_IN_PLACEHOLDER]:"Invalid token in placeholder: '{0}'",[Le.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER]:"Unterminated single quote in placeholder",[Le.UNKNOWN_ESCAPE_SEQUENCE]:"Unknown escape sequence: \\{0}",[Le.INVALID_UNICODE_ESCAPE_SEQUENCE]:"Invalid unicode escape sequence: {0}",[Le.UNBALANCED_CLOSING_BRACE]:"Unbalanced closing brace",[Le.UNTERMINATED_CLOSING_BRACE]:"Unterminated closing brace",[Le.EMPTY_PLACEHOLDER]:"Empty placeholder",[Le.NOT_ALLOW_NEST_PLACEHOLDER]:"Not allowed nest placeholder",[Le.INVALID_LINKED_FORMAT]:"Invalid linked format",[Le.MUST_HAVE_MESSAGES_IN_PLURAL]:"Plural must have messages",[Le.UNEXPECTED_EMPTY_LINKED_MODIFIER]:"Unexpected empty linked modifier",[Le.UNEXPECTED_EMPTY_LINKED_KEY]:"Unexpected empty linked key",[Le.UNEXPECTED_LEXICAL_ANALYSIS]:"Unexpected lexical analysis in token: '{0}'",[Le.UNHANDLED_CODEGEN_NODE_TYPE]:"unhandled codegen node type: '{0}'",[Le.UNHANDLED_MINIFIER_NODE_TYPE]:"unhandled mimifier node type: '{0}'"};function Ds(e,t,n={}){const{domain:r,messages:o,args:s}=n,i=Cy((o||iS)[e]||"",...s||[]),a=new SyntaxError(String(i));return a.code=e,t&&(a.location=t),a.domain=r,a}function aS(e){throw e}const Er=" ",lS="\r",on=` -`,uS="\u2028",cS="\u2029";function dS(e){const t=e;let n=0,r=1,o=1,s=0;const i=L=>t[L]===lS&&t[L+1]===on,a=L=>t[L]===on,l=L=>t[L]===cS,c=L=>t[L]===uS,d=L=>i(L)||a(L)||l(L)||c(L),m=()=>n,f=()=>r,p=()=>o,h=()=>s,_=L=>i(L)||l(L)||c(L)?on:t[L],b=()=>_(n),C=()=>_(n+s);function w(){return s=0,d(n)&&(r++,o=0),i(n)&&n++,n++,o++,t[n]}function g(){return i(n+s)&&s++,s++,t[n+s]}function z(){n=0,r=1,o=1,s=0}function S(L=0){s=L}function k(){const L=n+s;for(;L!==n;)w();s=0}return{index:m,line:f,column:p,peekOffset:h,charAt:_,currentChar:b,currentPeek:C,next:w,peek:g,reset:z,resetPeek:S,skipToPeek:k}}const Wr=void 0,mS=".",Nf="'",fS="tokenizer";function pS(e,t={}){const n=t.location!==!1,r=dS(e),o=()=>r.index(),s=()=>tS(r.line(),r.column(),r.index()),i=s(),a=o(),l={currentType:14,offset:a,startLoc:i,endLoc:i,lastType:14,lastOffset:a,lastStartLoc:i,lastEndLoc:i,braceNest:0,inLinked:!1,text:""},c=()=>l,{onError:d}=t;function m(E,$,R,...oe){const ae=c();if($.column+=R,$.offset+=R,d){const se=n?pl(ae.startLoc,$):null,V=Ds(E,se,{domain:fS,args:oe});d(V)}}function f(E,$,R){E.endLoc=s(),E.currentType=$;const oe={type:$};return n&&(oe.loc=pl(E.startLoc,E.endLoc)),R!=null&&(oe.value=R),oe}const p=E=>f(E,14);function h(E,$){return E.currentChar()===$?(E.next(),$):(m(Le.EXPECTED_TOKEN,s(),0,$),"")}function _(E){let $="";for(;E.currentPeek()===Er||E.currentPeek()===on;)$+=E.currentPeek(),E.peek();return $}function b(E){const $=_(E);return E.skipToPeek(),$}function C(E){if(E===Wr)return!1;const $=E.charCodeAt(0);return $>=97&&$<=122||$>=65&&$<=90||$===95}function w(E){if(E===Wr)return!1;const $=E.charCodeAt(0);return $>=48&&$<=57}function g(E,$){const{currentType:R}=$;if(R!==2)return!1;_(E);const oe=C(E.currentPeek());return E.resetPeek(),oe}function z(E,$){const{currentType:R}=$;if(R!==2)return!1;_(E);const oe=E.currentPeek()==="-"?E.peek():E.currentPeek(),ae=w(oe);return E.resetPeek(),ae}function S(E,$){const{currentType:R}=$;if(R!==2)return!1;_(E);const oe=E.currentPeek()===Nf;return E.resetPeek(),oe}function k(E,$){const{currentType:R}=$;if(R!==8)return!1;_(E);const oe=E.currentPeek()===".";return E.resetPeek(),oe}function L(E,$){const{currentType:R}=$;if(R!==9)return!1;_(E);const oe=C(E.currentPeek());return E.resetPeek(),oe}function D(E,$){const{currentType:R}=$;if(!(R===8||R===12))return!1;_(E);const oe=E.currentPeek()===":";return E.resetPeek(),oe}function T(E,$){const{currentType:R}=$;if(R!==10)return!1;const oe=()=>{const se=E.currentPeek();return se==="{"?C(E.peek()):se==="@"||se==="%"||se==="|"||se===":"||se==="."||se===Er||!se?!1:se===on?(E.peek(),oe()):U(E,!1)},ae=oe();return E.resetPeek(),ae}function F(E){_(E);const $=E.currentPeek()==="|";return E.resetPeek(),$}function G(E){const $=_(E),R=E.currentPeek()==="%"&&E.peek()==="{";return E.resetPeek(),{isModulo:R,hasSpace:$.length>0}}function U(E,$=!0){const R=(ae=!1,se="",V=!1)=>{const Y=E.currentPeek();return Y==="{"?se==="%"?!1:ae:Y==="@"||!Y?se==="%"?!0:ae:Y==="%"?(E.peek(),R(ae,"%",!0)):Y==="|"?se==="%"||V?!0:!(se===Er||se===on):Y===Er?(E.peek(),R(!0,Er,V)):Y===on?(E.peek(),R(!0,on,V)):!0},oe=R();return $&&E.resetPeek(),oe}function W(E,$){const R=E.currentChar();return R===Wr?Wr:$(R)?(E.next(),R):null}function ee(E){const $=E.charCodeAt(0);return $>=97&&$<=122||$>=65&&$<=90||$>=48&&$<=57||$===95||$===36}function fe(E){return W(E,ee)}function K(E){const $=E.charCodeAt(0);return $>=97&&$<=122||$>=65&&$<=90||$>=48&&$<=57||$===95||$===36||$===45}function ne(E){return W(E,K)}function ue(E){const $=E.charCodeAt(0);return $>=48&&$<=57}function Ne(E){return W(E,ue)}function it(E){const $=E.charCodeAt(0);return $>=48&&$<=57||$>=65&&$<=70||$>=97&&$<=102}function Ve(E){return W(E,it)}function He(E){let $="",R="";for(;$=Ne(E);)R+=$;return R}function at(E){b(E);const $=E.currentChar();return $!=="%"&&m(Le.EXPECTED_TOKEN,s(),0,$),E.next(),"%"}function lt(E){let $="";for(;;){const R=E.currentChar();if(R==="{"||R==="}"||R==="@"||R==="|"||!R)break;if(R==="%")if(U(E))$+=R,E.next();else break;else if(R===Er||R===on)if(U(E))$+=R,E.next();else{if(F(E))break;$+=R,E.next()}else $+=R,E.next()}return $}function dt(E){b(E);let $="",R="";for(;$=ne(E);)R+=$;return E.currentChar()===Wr&&m(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R}function We(E){b(E);let $="";return E.currentChar()==="-"?(E.next(),$+=`-${He(E)}`):$+=He(E),E.currentChar()===Wr&&m(Le.UNTERMINATED_CLOSING_BRACE,s(),0),$}function Z(E){return E!==Nf&&E!==on}function me(E){b(E),h(E,"'");let $="",R="";for(;$=W(E,Z);)$==="\\"?R+=ce(E):R+=$;const oe=E.currentChar();return oe===on||oe===Wr?(m(Le.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,s(),0),oe===on&&(E.next(),h(E,"'")),R):(h(E,"'"),R)}function ce(E){const $=E.currentChar();switch($){case"\\":case"'":return E.next(),`\\${$}`;case"u":return ye(E,$,4);case"U":return ye(E,$,6);default:return m(Le.UNKNOWN_ESCAPE_SEQUENCE,s(),0,$),""}}function ye(E,$,R){h(E,$);let oe="";for(let ae=0;ae{const oe=E.currentChar();return oe==="{"||oe==="%"||oe==="@"||oe==="|"||oe==="("||oe===")"||!oe||oe===Er?R:(R+=oe,E.next(),$(R))};return $("")}function j(E){b(E);const $=h(E,"|");return b(E),$}function te(E,$){let R=null;switch(E.currentChar()){case"{":return $.braceNest>=1&&m(Le.NOT_ALLOW_NEST_PLACEHOLDER,s(),0),E.next(),R=f($,2,"{"),b(E),$.braceNest++,R;case"}":return $.braceNest>0&&$.currentType===2&&m(Le.EMPTY_PLACEHOLDER,s(),0),E.next(),R=f($,3,"}"),$.braceNest--,$.braceNest>0&&b(E),$.inLinked&&$.braceNest===0&&($.inLinked=!1),R;case"@":return $.braceNest>0&&m(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R=X(E,$)||p($),$.braceNest=0,R;default:{let ae=!0,se=!0,V=!0;if(F(E))return $.braceNest>0&&m(Le.UNTERMINATED_CLOSING_BRACE,s(),0),R=f($,1,j(E)),$.braceNest=0,$.inLinked=!1,R;if($.braceNest>0&&($.currentType===5||$.currentType===6||$.currentType===7))return m(Le.UNTERMINATED_CLOSING_BRACE,s(),0),$.braceNest=0,ie(E,$);if(ae=g(E,$))return R=f($,5,dt(E)),b(E),R;if(se=z(E,$))return R=f($,6,We(E)),b(E),R;if(V=S(E,$))return R=f($,7,me(E)),b(E),R;if(!ae&&!se&&!V)return R=f($,13,Ge(E)),m(Le.INVALID_TOKEN_IN_PLACEHOLDER,s(),0,R.value),b(E),R;break}}return R}function X(E,$){const{currentType:R}=$;let oe=null;const ae=E.currentChar();switch((R===8||R===9||R===12||R===10)&&(ae===on||ae===Er)&&m(Le.INVALID_LINKED_FORMAT,s(),0),ae){case"@":return E.next(),oe=f($,8,"@"),$.inLinked=!0,oe;case".":return b(E),E.next(),f($,9,".");case":":return b(E),E.next(),f($,10,":");default:return F(E)?(oe=f($,1,j(E)),$.braceNest=0,$.inLinked=!1,oe):k(E,$)||D(E,$)?(b(E),X(E,$)):L(E,$)?(b(E),f($,12,A(E))):T(E,$)?(b(E),ae==="{"?te(E,$)||oe:f($,11,P(E))):(R===8&&m(Le.INVALID_LINKED_FORMAT,s(),0),$.braceNest=0,$.inLinked=!1,ie(E,$))}}function ie(E,$){let R={type:14};if($.braceNest>0)return te(E,$)||p($);if($.inLinked)return X(E,$)||p($);switch(E.currentChar()){case"{":return te(E,$)||p($);case"}":return m(Le.UNBALANCED_CLOSING_BRACE,s(),0),E.next(),f($,3,"}");case"@":return X(E,$)||p($);default:{if(F(E))return R=f($,1,j(E)),$.braceNest=0,$.inLinked=!1,R;const{isModulo:ae,hasSpace:se}=G(E);if(ae)return se?f($,0,lt(E)):f($,4,at(E));if(U(E))return f($,0,lt(E));break}}return R}function pe(){const{currentType:E,offset:$,startLoc:R,endLoc:oe}=l;return l.lastType=E,l.lastOffset=$,l.lastStartLoc=R,l.lastEndLoc=oe,l.offset=o(),l.startLoc=s(),r.currentChar()===Wr?f(l,14):ie(r,l)}return{nextToken:pe,currentOffset:o,currentPosition:s,context:c}}const hS="parser",_S=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g;function gS(e,t,n){switch(e){case"\\\\":return"\\";case"\\'":return"'";default:{const r=parseInt(t||n,16);return r<=55295||r>=57344?String.fromCodePoint(r):"�"}}}function yS(e={}){const t=e.location!==!1,{onError:n,onWarn:r}=e;function o(g,z,S,k,...L){const D=g.currentPosition();if(D.offset+=k,D.column+=k,n){const T=t?pl(S,D):null,F=Ds(z,T,{domain:hS,args:L});n(F)}}function s(g,z,S,k,...L){const D=g.currentPosition();if(D.offset+=k,D.column+=k,r){const T=t?pl(S,D):null;r(sS(z,T,L))}}function i(g,z,S){const k={type:g};return t&&(k.start=z,k.end=z,k.loc={start:S,end:S}),k}function a(g,z,S,k){t&&(g.end=z,g.loc&&(g.loc.end=S))}function l(g,z){const S=g.context(),k=i(3,S.offset,S.startLoc);return k.value=z,a(k,g.currentOffset(),g.currentPosition()),k}function c(g,z){const S=g.context(),{lastOffset:k,lastStartLoc:L}=S,D=i(5,k,L);return D.index=parseInt(z,10),g.nextToken(),a(D,g.currentOffset(),g.currentPosition()),D}function d(g,z,S){const k=g.context(),{lastOffset:L,lastStartLoc:D}=k,T=i(4,L,D);return T.key=z,S===!0&&(T.modulo=!0),g.nextToken(),a(T,g.currentOffset(),g.currentPosition()),T}function m(g,z){const S=g.context(),{lastOffset:k,lastStartLoc:L}=S,D=i(9,k,L);return D.value=z.replace(_S,gS),g.nextToken(),a(D,g.currentOffset(),g.currentPosition()),D}function f(g){const z=g.nextToken(),S=g.context(),{lastOffset:k,lastStartLoc:L}=S,D=i(8,k,L);return z.type!==12?(o(g,Le.UNEXPECTED_EMPTY_LINKED_MODIFIER,S.lastStartLoc,0),D.value="",a(D,k,L),{nextConsumeToken:z,node:D}):(z.value==null&&o(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,S.lastStartLoc,0,Kn(z)),D.value=z.value||"",a(D,g.currentOffset(),g.currentPosition()),{node:D})}function p(g,z){const S=g.context(),k=i(7,S.offset,S.startLoc);return k.value=z,a(k,g.currentOffset(),g.currentPosition()),k}function h(g){const z=g.context(),S=i(6,z.offset,z.startLoc);let k=g.nextToken();if(k.type===9){const L=f(g);S.modifier=L.node,k=L.nextConsumeToken||g.nextToken()}switch(k.type!==10&&o(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,z.lastStartLoc,0,Kn(k)),k=g.nextToken(),k.type===2&&(k=g.nextToken()),k.type){case 11:k.value==null&&o(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,z.lastStartLoc,0,Kn(k)),S.key=p(g,k.value||"");break;case 5:k.value==null&&o(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,z.lastStartLoc,0,Kn(k)),S.key=d(g,k.value||"");break;case 6:k.value==null&&o(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,z.lastStartLoc,0,Kn(k)),S.key=c(g,k.value||"");break;case 7:k.value==null&&o(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,z.lastStartLoc,0,Kn(k)),S.key=m(g,k.value||"");break;default:{o(g,Le.UNEXPECTED_EMPTY_LINKED_KEY,z.lastStartLoc,0);const L=g.context(),D=i(7,L.offset,L.startLoc);return D.value="",a(D,L.offset,L.startLoc),S.key=D,a(S,L.offset,L.startLoc),{nextConsumeToken:k,node:S}}}return a(S,g.currentOffset(),g.currentPosition()),{node:S}}function _(g){const z=g.context(),S=z.currentType===1?g.currentOffset():z.offset,k=z.currentType===1?z.endLoc:z.startLoc,L=i(2,S,k);L.items=[];let D=null,T=null;do{const U=D||g.nextToken();switch(D=null,U.type){case 0:U.value==null&&o(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,z.lastStartLoc,0,Kn(U)),L.items.push(l(g,U.value||""));break;case 6:U.value==null&&o(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,z.lastStartLoc,0,Kn(U)),L.items.push(c(g,U.value||""));break;case 4:T=!0;break;case 5:U.value==null&&o(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,z.lastStartLoc,0,Kn(U)),L.items.push(d(g,U.value||"",!!T)),T&&(s(g,em.USE_MODULO_SYNTAX,z.lastStartLoc,0,Kn(U)),T=null);break;case 7:U.value==null&&o(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,z.lastStartLoc,0,Kn(U)),L.items.push(m(g,U.value||""));break;case 8:{const W=h(g);L.items.push(W.node),D=W.nextConsumeToken||null;break}}}while(z.currentType!==14&&z.currentType!==1);const F=z.currentType===1?z.lastOffset:g.currentOffset(),G=z.currentType===1?z.lastEndLoc:g.currentPosition();return a(L,F,G),L}function b(g,z,S,k){const L=g.context();let D=k.items.length===0;const T=i(1,z,S);T.cases=[],T.cases.push(k);do{const F=_(g);D||(D=F.items.length===0),T.cases.push(F)}while(L.currentType!==14);return D&&o(g,Le.MUST_HAVE_MESSAGES_IN_PLURAL,S,0),a(T,g.currentOffset(),g.currentPosition()),T}function C(g){const z=g.context(),{offset:S,startLoc:k}=z,L=_(g);return z.currentType===14?L:b(g,S,k,L)}function w(g){const z=pS(g,wy({},e)),S=z.context(),k=i(0,S.offset,S.startLoc);return t&&k.loc&&(k.loc.source=g),k.body=C(z),e.onCacheKey&&(k.cacheKey=e.onCacheKey(g)),S.currentType!==14&&o(z,Le.UNEXPECTED_LEXICAL_ANALYSIS,S.lastStartLoc,0,g[S.offset]||""),a(k,z.currentOffset(),z.currentPosition()),k}return{parse:w}}function Kn(e){if(e.type===14)return"EOF";const t=(e.value||"").replace(/\r?\n/gu,"\\n");return t.length>10?t.slice(0,9)+"…":t}function zS(e,t={}){const n={ast:e,helpers:new Set};return{context:()=>n,helper:s=>(n.helpers.add(s),s)}}function Df(e,t){for(let n=0;nRf(n)),e}function Rf(e){if(e.items.length===1){const t=e.items[0];(t.type===3||t.type===9)&&(e.static=t.value,delete t.value)}else{const t=[];for(let n=0;na;function c(b,C){a.code+=b}function d(b,C=!0){const w=C?o:"";c(s?w+" ".repeat(b):w)}function m(b=!0){const C=++a.indentLevel;b&&d(C)}function f(b=!0){const C=--a.indentLevel;b&&d(C)}function p(){d(a.indentLevel)}return{context:l,push:c,indent:m,deindent:f,newline:p,helper:b=>`_${b}`,needIndent:()=>a.needIndent}}function kS(e,t){const{helper:n}=e;e.push(`${n("linked")}(`),Ss(e,t.key),t.modifier?(e.push(", "),Ss(e,t.modifier),e.push(", _type")):e.push(", undefined, _type"),e.push(")")}function xS(e,t){const{helper:n,needIndent:r}=e;e.push(`${n("normalize")}([`),e.indent(r());const o=t.items.length;for(let s=0;s1){e.push(`${n("plural")}([`),e.indent(r());const o=t.cases.length;for(let s=0;s{const n=Lf(t.mode)?t.mode:"normal",r=Lf(t.filename)?t.filename:"message.intl",o=!!t.sourceMap,s=t.breakLineCode!=null?t.breakLineCode:n==="arrow"?";":` -`,i=t.needIndent?t.needIndent:n!=="arrow",a=e.helpers||[],l=SS(e,{mode:n,filename:r,sourceMap:o,breakLineCode:s,needIndent:i});l.push(n==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),l.indent(i),a.length>0&&(l.push(`const { ${Sy(a.map(m=>`${m}: _${m}`),", ")} } = ctx`),l.newline()),l.push("return "),Ss(l,e),l.deindent(i),l.push("}"),delete e.helpers;const{code:c,map:d}=l.context();return{ast:e,code:c,map:d?d.toJSON():void 0}};function AS(e,t={}){const n=wy({},t),r=!!n.jit,o=!!n.minify,s=n.optimize==null?!0:n.optimize,a=yS(n).parse(e);return r?(s&&vS(a),o&&rs(a),{ast:a,code:""}):(bS(a,n),$S(a,n))}/*! + */function xT(e,t,n){return{line:e,column:t,offset:n}}function Rc(e,t,n){return{start:e,end:t}}const TT=/\{([0-9a-zA-Z]+)\}/g;function Ib(e,...t){return t.length===1&&AT(t[0])&&(t=t[0]),(!t||!t.hasOwnProperty)&&(t={}),e.replace(TT,(n,r)=>t.hasOwnProperty(r)?t[r]:"")}const Pb=Object.assign,f_=e=>typeof e=="string",AT=e=>e!==null&&typeof e=="object";function Lb(e,t=""){return e.reduce((n,r,s)=>s===0?n+r:n+t+r,"")}const op={USE_MODULO_SYNTAX:1,__EXTEND_POINT__:2},OT={[op.USE_MODULO_SYNTAX]:"Use modulo before '{{0}}'."};function $T(e,t,...n){const r=Ib(OT[e],...n||[]),s={message:String(r),code:e};return t&&(s.location=t),s}const Le={EXPECTED_TOKEN:1,INVALID_TOKEN_IN_PLACEHOLDER:2,UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER:3,UNKNOWN_ESCAPE_SEQUENCE:4,INVALID_UNICODE_ESCAPE_SEQUENCE:5,UNBALANCED_CLOSING_BRACE:6,UNTERMINATED_CLOSING_BRACE:7,EMPTY_PLACEHOLDER:8,NOT_ALLOW_NEST_PLACEHOLDER:9,INVALID_LINKED_FORMAT:10,MUST_HAVE_MESSAGES_IN_PLURAL:11,UNEXPECTED_EMPTY_LINKED_MODIFIER:12,UNEXPECTED_EMPTY_LINKED_KEY:13,UNEXPECTED_LEXICAL_ANALYSIS:14,UNHANDLED_CODEGEN_NODE_TYPE:15,UNHANDLED_MINIFIER_NODE_TYPE:16,__EXTEND_POINT__:17},NT={[Le.EXPECTED_TOKEN]:"Expected token: '{0}'",[Le.INVALID_TOKEN_IN_PLACEHOLDER]:"Invalid token in placeholder: '{0}'",[Le.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER]:"Unterminated single quote in placeholder",[Le.UNKNOWN_ESCAPE_SEQUENCE]:"Unknown escape sequence: \\{0}",[Le.INVALID_UNICODE_ESCAPE_SEQUENCE]:"Invalid unicode escape sequence: {0}",[Le.UNBALANCED_CLOSING_BRACE]:"Unbalanced closing brace",[Le.UNTERMINATED_CLOSING_BRACE]:"Unterminated closing brace",[Le.EMPTY_PLACEHOLDER]:"Empty placeholder",[Le.NOT_ALLOW_NEST_PLACEHOLDER]:"Not allowed nest placeholder",[Le.INVALID_LINKED_FORMAT]:"Invalid linked format",[Le.MUST_HAVE_MESSAGES_IN_PLURAL]:"Plural must have messages",[Le.UNEXPECTED_EMPTY_LINKED_MODIFIER]:"Unexpected empty linked modifier",[Le.UNEXPECTED_EMPTY_LINKED_KEY]:"Unexpected empty linked key",[Le.UNEXPECTED_LEXICAL_ANALYSIS]:"Unexpected lexical analysis in token: '{0}'",[Le.UNHANDLED_CODEGEN_NODE_TYPE]:"unhandled codegen node type: '{0}'",[Le.UNHANDLED_MINIFIER_NODE_TYPE]:"unhandled mimifier node type: '{0}'"};function Li(e,t,n={}){const{domain:r,messages:s,args:o}=n,i=Ib((s||NT)[e]||"",...o||[]),a=new SyntaxError(String(i));return a.code=e,t&&(a.location=t),a.domain=r,a}function IT(e){throw e}const Yr=" ",PT="\r",Sn=` +`,LT="\u2028",RT="\u2029";function DT(e){const t=e;let n=0,r=1,s=1,o=0;const i=P=>t[P]===PT&&t[P+1]===Sn,a=P=>t[P]===Sn,l=P=>t[P]===RT,c=P=>t[P]===LT,d=P=>i(P)||a(P)||l(P)||c(P),m=()=>n,f=()=>r,p=()=>s,h=()=>o,_=P=>i(P)||l(P)||c(P)?Sn:t[P],v=()=>_(n),C=()=>_(n+o);function S(){return o=0,d(n)&&(r++,s=0),i(n)&&n++,n++,s++,t[n]}function g(){return i(n+o)&&o++,o++,t[n+o]}function b(){n=0,r=1,s=1,o=0}function E(P=0){o=P}function w(){const P=n+o;for(;P!==n;)S();o=0}return{index:m,line:f,column:p,peekOffset:h,charAt:_,currentChar:v,currentPeek:C,next:S,peek:g,reset:b,resetPeek:E,skipToPeek:w}}const Cs=void 0,MT=".",p_="'",FT="tokenizer";function VT(e,t={}){const n=t.location!==!1,r=DT(e),s=()=>r.index(),o=()=>xT(r.line(),r.column(),r.index()),i=o(),a=s(),l={currentType:14,offset:a,startLoc:i,endLoc:i,lastType:14,lastOffset:a,lastStartLoc:i,lastEndLoc:i,braceNest:0,inLinked:!1,text:""},c=()=>l,{onError:d}=t;function m(T,A,F,...se){const ce=c();if(A.column+=F,A.offset+=F,d){const oe=n?Rc(ce.startLoc,A):null,j=Li(T,oe,{domain:FT,args:se});d(j)}}function f(T,A,F){T.endLoc=o(),T.currentType=A;const se={type:A};return n&&(se.loc=Rc(T.startLoc,T.endLoc)),F!=null&&(se.value=F),se}const p=T=>f(T,14);function h(T,A){return T.currentChar()===A?(T.next(),A):(m(Le.EXPECTED_TOKEN,o(),0,A),"")}function _(T){let A="";for(;T.currentPeek()===Yr||T.currentPeek()===Sn;)A+=T.currentPeek(),T.peek();return A}function v(T){const A=_(T);return T.skipToPeek(),A}function C(T){if(T===Cs)return!1;const A=T.charCodeAt(0);return A>=97&&A<=122||A>=65&&A<=90||A===95}function S(T){if(T===Cs)return!1;const A=T.charCodeAt(0);return A>=48&&A<=57}function g(T,A){const{currentType:F}=A;if(F!==2)return!1;_(T);const se=C(T.currentPeek());return T.resetPeek(),se}function b(T,A){const{currentType:F}=A;if(F!==2)return!1;_(T);const se=T.currentPeek()==="-"?T.peek():T.currentPeek(),ce=S(se);return T.resetPeek(),ce}function E(T,A){const{currentType:F}=A;if(F!==2)return!1;_(T);const se=T.currentPeek()===p_;return T.resetPeek(),se}function w(T,A){const{currentType:F}=A;if(F!==8)return!1;_(T);const se=T.currentPeek()===".";return T.resetPeek(),se}function P(T,A){const{currentType:F}=A;if(F!==9)return!1;_(T);const se=C(T.currentPeek());return T.resetPeek(),se}function N(T,A){const{currentType:F}=A;if(!(F===8||F===12))return!1;_(T);const se=T.currentPeek()===":";return T.resetPeek(),se}function k(T,A){const{currentType:F}=A;if(F!==10)return!1;const se=()=>{const oe=T.currentPeek();return oe==="{"?C(T.peek()):oe==="@"||oe==="%"||oe==="|"||oe===":"||oe==="."||oe===Yr||!oe?!1:oe===Sn?(T.peek(),se()):M(T,!1)},ce=se();return T.resetPeek(),ce}function R(T){_(T);const A=T.currentPeek()==="|";return T.resetPeek(),A}function B(T){const A=_(T),F=T.currentPeek()==="%"&&T.peek()==="{";return T.resetPeek(),{isModulo:F,hasSpace:A.length>0}}function M(T,A=!0){const F=(ce=!1,oe="",j=!1)=>{const Z=T.currentPeek();return Z==="{"?oe==="%"?!1:ce:Z==="@"||!Z?oe==="%"?!0:ce:Z==="%"?(T.peek(),F(ce,"%",!0)):Z==="|"?oe==="%"||j?!0:!(oe===Yr||oe===Sn):Z===Yr?(T.peek(),F(!0,Yr,j)):Z===Sn?(T.peek(),F(!0,Sn,j)):!0},se=F();return A&&T.resetPeek(),se}function H(T,A){const F=T.currentChar();return F===Cs?Cs:A(F)?(T.next(),F):null}function X(T){const A=T.charCodeAt(0);return A>=97&&A<=122||A>=65&&A<=90||A>=48&&A<=57||A===95||A===36}function ae(T){return H(T,X)}function G(T){const A=T.charCodeAt(0);return A>=97&&A<=122||A>=65&&A<=90||A>=48&&A<=57||A===95||A===36||A===45}function te(T){return H(T,G)}function le(T){const A=T.charCodeAt(0);return A>=48&&A<=57}function Ae(T){return H(T,le)}function Qe(T){const A=T.charCodeAt(0);return A>=48&&A<=57||A>=65&&A<=70||A>=97&&A<=102}function De(T){return H(T,Qe)}function je(T){let A="",F="";for(;A=Ae(T);)F+=A;return F}function ft(T){v(T);const A=T.currentChar();return A!=="%"&&m(Le.EXPECTED_TOKEN,o(),0,A),T.next(),"%"}function pt(T){let A="";for(;;){const F=T.currentChar();if(F==="{"||F==="}"||F==="@"||F==="|"||!F)break;if(F==="%")if(M(T))A+=F,T.next();else break;else if(F===Yr||F===Sn)if(M(T))A+=F,T.next();else{if(R(T))break;A+=F,T.next()}else A+=F,T.next()}return A}function gt(T){v(T);let A="",F="";for(;A=te(T);)F+=A;return T.currentChar()===Cs&&m(Le.UNTERMINATED_CLOSING_BRACE,o(),0),F}function Ge(T){v(T);let A="";return T.currentChar()==="-"?(T.next(),A+=`-${je(T)}`):A+=je(T),T.currentChar()===Cs&&m(Le.UNTERMINATED_CLOSING_BRACE,o(),0),A}function Y(T){return T!==p_&&T!==Sn}function fe(T){v(T),h(T,"'");let A="",F="";for(;A=H(T,Y);)A==="\\"?F+=de(T):F+=A;const se=T.currentChar();return se===Sn||se===Cs?(m(Le.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,o(),0),se===Sn&&(T.next(),h(T,"'")),F):(h(T,"'"),F)}function de(T){const A=T.currentChar();switch(A){case"\\":case"'":return T.next(),`\\${A}`;case"u":return ye(T,A,4);case"U":return ye(T,A,6);default:return m(Le.UNKNOWN_ESCAPE_SEQUENCE,o(),0,A),""}}function ye(T,A,F){h(T,A);let se="";for(let ce=0;ce{const se=T.currentChar();return se==="{"||se==="%"||se==="@"||se==="|"||se==="("||se===")"||!se||se===Yr?F:(F+=se,T.next(),A(F))};return A("")}function q(T){v(T);const A=h(T,"|");return v(T),A}function ne(T,A){let F=null;switch(T.currentChar()){case"{":return A.braceNest>=1&&m(Le.NOT_ALLOW_NEST_PLACEHOLDER,o(),0),T.next(),F=f(A,2,"{"),v(T),A.braceNest++,F;case"}":return A.braceNest>0&&A.currentType===2&&m(Le.EMPTY_PLACEHOLDER,o(),0),T.next(),F=f(A,3,"}"),A.braceNest--,A.braceNest>0&&v(T),A.inLinked&&A.braceNest===0&&(A.inLinked=!1),F;case"@":return A.braceNest>0&&m(Le.UNTERMINATED_CLOSING_BRACE,o(),0),F=J(T,A)||p(A),A.braceNest=0,F;default:{let ce=!0,oe=!0,j=!0;if(R(T))return A.braceNest>0&&m(Le.UNTERMINATED_CLOSING_BRACE,o(),0),F=f(A,1,q(T)),A.braceNest=0,A.inLinked=!1,F;if(A.braceNest>0&&(A.currentType===5||A.currentType===6||A.currentType===7))return m(Le.UNTERMINATED_CLOSING_BRACE,o(),0),A.braceNest=0,ie(T,A);if(ce=g(T,A))return F=f(A,5,gt(T)),v(T),F;if(oe=b(T,A))return F=f(A,6,Ge(T)),v(T),F;if(j=E(T,A))return F=f(A,7,fe(T)),v(T),F;if(!ce&&!oe&&!j)return F=f(A,13,Xe(T)),m(Le.INVALID_TOKEN_IN_PLACEHOLDER,o(),0,F.value),v(T),F;break}}return F}function J(T,A){const{currentType:F}=A;let se=null;const ce=T.currentChar();switch((F===8||F===9||F===12||F===10)&&(ce===Sn||ce===Yr)&&m(Le.INVALID_LINKED_FORMAT,o(),0),ce){case"@":return T.next(),se=f(A,8,"@"),A.inLinked=!0,se;case".":return v(T),T.next(),f(A,9,".");case":":return v(T),T.next(),f(A,10,":");default:return R(T)?(se=f(A,1,q(T)),A.braceNest=0,A.inLinked=!1,se):w(T,A)||N(T,A)?(v(T),J(T,A)):P(T,A)?(v(T),f(A,12,O(T))):k(T,A)?(v(T),ce==="{"?ne(T,A)||se:f(A,11,I(T))):(F===8&&m(Le.INVALID_LINKED_FORMAT,o(),0),A.braceNest=0,A.inLinked=!1,ie(T,A))}}function ie(T,A){let F={type:14};if(A.braceNest>0)return ne(T,A)||p(A);if(A.inLinked)return J(T,A)||p(A);switch(T.currentChar()){case"{":return ne(T,A)||p(A);case"}":return m(Le.UNBALANCED_CLOSING_BRACE,o(),0),T.next(),f(A,3,"}");case"@":return J(T,A)||p(A);default:{if(R(T))return F=f(A,1,q(T)),A.braceNest=0,A.inLinked=!1,F;const{isModulo:ce,hasSpace:oe}=B(T);if(ce)return oe?f(A,0,pt(T)):f(A,4,ft(T));if(M(T))return f(A,0,pt(T));break}}return F}function pe(){const{currentType:T,offset:A,startLoc:F,endLoc:se}=l;return l.lastType=T,l.lastOffset=A,l.lastStartLoc=F,l.lastEndLoc=se,l.offset=s(),l.startLoc=o(),r.currentChar()===Cs?f(l,14):ie(r,l)}return{nextToken:pe,currentOffset:s,currentPosition:o,context:c}}const HT="parser",UT=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g;function jT(e,t,n){switch(e){case"\\\\":return"\\";case"\\'":return"'";default:{const r=parseInt(t||n,16);return r<=55295||r>=57344?String.fromCodePoint(r):"�"}}}function BT(e={}){const t=e.location!==!1,{onError:n,onWarn:r}=e;function s(g,b,E,w,...P){const N=g.currentPosition();if(N.offset+=w,N.column+=w,n){const k=t?Rc(E,N):null,R=Li(b,k,{domain:HT,args:P});n(R)}}function o(g,b,E,w,...P){const N=g.currentPosition();if(N.offset+=w,N.column+=w,r){const k=t?Rc(E,N):null;r($T(b,k,P))}}function i(g,b,E){const w={type:g};return t&&(w.start=b,w.end=b,w.loc={start:E,end:E}),w}function a(g,b,E,w){t&&(g.end=b,g.loc&&(g.loc.end=E))}function l(g,b){const E=g.context(),w=i(3,E.offset,E.startLoc);return w.value=b,a(w,g.currentOffset(),g.currentPosition()),w}function c(g,b){const E=g.context(),{lastOffset:w,lastStartLoc:P}=E,N=i(5,w,P);return N.index=parseInt(b,10),g.nextToken(),a(N,g.currentOffset(),g.currentPosition()),N}function d(g,b,E){const w=g.context(),{lastOffset:P,lastStartLoc:N}=w,k=i(4,P,N);return k.key=b,E===!0&&(k.modulo=!0),g.nextToken(),a(k,g.currentOffset(),g.currentPosition()),k}function m(g,b){const E=g.context(),{lastOffset:w,lastStartLoc:P}=E,N=i(9,w,P);return N.value=b.replace(UT,jT),g.nextToken(),a(N,g.currentOffset(),g.currentPosition()),N}function f(g){const b=g.nextToken(),E=g.context(),{lastOffset:w,lastStartLoc:P}=E,N=i(8,w,P);return b.type!==12?(s(g,Le.UNEXPECTED_EMPTY_LINKED_MODIFIER,E.lastStartLoc,0),N.value="",a(N,w,P),{nextConsumeToken:b,node:N}):(b.value==null&&s(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,E.lastStartLoc,0,gr(b)),N.value=b.value||"",a(N,g.currentOffset(),g.currentPosition()),{node:N})}function p(g,b){const E=g.context(),w=i(7,E.offset,E.startLoc);return w.value=b,a(w,g.currentOffset(),g.currentPosition()),w}function h(g){const b=g.context(),E=i(6,b.offset,b.startLoc);let w=g.nextToken();if(w.type===9){const P=f(g);E.modifier=P.node,w=P.nextConsumeToken||g.nextToken()}switch(w.type!==10&&s(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,b.lastStartLoc,0,gr(w)),w=g.nextToken(),w.type===2&&(w=g.nextToken()),w.type){case 11:w.value==null&&s(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,b.lastStartLoc,0,gr(w)),E.key=p(g,w.value||"");break;case 5:w.value==null&&s(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,b.lastStartLoc,0,gr(w)),E.key=d(g,w.value||"");break;case 6:w.value==null&&s(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,b.lastStartLoc,0,gr(w)),E.key=c(g,w.value||"");break;case 7:w.value==null&&s(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,b.lastStartLoc,0,gr(w)),E.key=m(g,w.value||"");break;default:{s(g,Le.UNEXPECTED_EMPTY_LINKED_KEY,b.lastStartLoc,0);const P=g.context(),N=i(7,P.offset,P.startLoc);return N.value="",a(N,P.offset,P.startLoc),E.key=N,a(E,P.offset,P.startLoc),{nextConsumeToken:w,node:E}}}return a(E,g.currentOffset(),g.currentPosition()),{node:E}}function _(g){const b=g.context(),E=b.currentType===1?g.currentOffset():b.offset,w=b.currentType===1?b.endLoc:b.startLoc,P=i(2,E,w);P.items=[];let N=null,k=null;do{const M=N||g.nextToken();switch(N=null,M.type){case 0:M.value==null&&s(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,b.lastStartLoc,0,gr(M)),P.items.push(l(g,M.value||""));break;case 6:M.value==null&&s(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,b.lastStartLoc,0,gr(M)),P.items.push(c(g,M.value||""));break;case 4:k=!0;break;case 5:M.value==null&&s(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,b.lastStartLoc,0,gr(M)),P.items.push(d(g,M.value||"",!!k)),k&&(o(g,op.USE_MODULO_SYNTAX,b.lastStartLoc,0,gr(M)),k=null);break;case 7:M.value==null&&s(g,Le.UNEXPECTED_LEXICAL_ANALYSIS,b.lastStartLoc,0,gr(M)),P.items.push(m(g,M.value||""));break;case 8:{const H=h(g);P.items.push(H.node),N=H.nextConsumeToken||null;break}}}while(b.currentType!==14&&b.currentType!==1);const R=b.currentType===1?b.lastOffset:g.currentOffset(),B=b.currentType===1?b.lastEndLoc:g.currentPosition();return a(P,R,B),P}function v(g,b,E,w){const P=g.context();let N=w.items.length===0;const k=i(1,b,E);k.cases=[],k.cases.push(w);do{const R=_(g);N||(N=R.items.length===0),k.cases.push(R)}while(P.currentType!==14);return N&&s(g,Le.MUST_HAVE_MESSAGES_IN_PLURAL,E,0),a(k,g.currentOffset(),g.currentPosition()),k}function C(g){const b=g.context(),{offset:E,startLoc:w}=b,P=_(g);return b.currentType===14?P:v(g,E,w,P)}function S(g){const b=VT(g,Pb({},e)),E=b.context(),w=i(0,E.offset,E.startLoc);return t&&w.loc&&(w.loc.source=g),w.body=C(b),e.onCacheKey&&(w.cacheKey=e.onCacheKey(g)),E.currentType!==14&&s(b,Le.UNEXPECTED_LEXICAL_ANALYSIS,E.lastStartLoc,0,g[E.offset]||""),a(w,b.currentOffset(),b.currentPosition()),w}return{parse:S}}function gr(e){if(e.type===14)return"EOF";const t=(e.value||"").replace(/\r?\n/gu,"\\n");return t.length>10?t.slice(0,9)+"…":t}function qT(e,t={}){const n={ast:e,helpers:new Set};return{context:()=>n,helper:o=>(n.helpers.add(o),o)}}function h_(e,t){for(let n=0;n__(n)),e}function __(e){if(e.items.length===1){const t=e.items[0];(t.type===3||t.type===9)&&(e.static=t.value,delete t.value)}else{const t=[];for(let n=0;ni;function l(_,v){i.code+=_}function c(_,v=!0){const C=v?r:"";l(s?C+" ".repeat(_):C)}function d(_=!0){const v=++i.indentLevel;_&&c(v)}function m(_=!0){const v=--i.indentLevel;_&&c(v)}function f(){c(i.indentLevel)}return{context:a,push:l,indent:d,deindent:m,newline:f,helper:_=>`_${_}`,needIndent:()=>i.needIndent}}function ZT(e,t){const{helper:n}=e;e.push(`${n("linked")}(`),yi(e,t.key),t.modifier?(e.push(", "),yi(e,t.modifier),e.push(", _type")):e.push(", undefined, _type"),e.push(")")}function JT(e,t){const{helper:n,needIndent:r}=e;e.push(`${n("normalize")}([`),e.indent(r());const s=t.items.length;for(let o=0;o1){e.push(`${n("plural")}([`),e.indent(r());const s=t.cases.length;for(let o=0;o{const n=f_(t.mode)?t.mode:"normal",r=f_(t.filename)?t.filename:"message.intl";t.sourceMap;const s=t.breakLineCode!=null?t.breakLineCode:n==="arrow"?";":` +`,o=t.needIndent?t.needIndent:n!=="arrow",i=e.helpers||[],a=YT(e,{filename:r,breakLineCode:s,needIndent:o});a.push(n==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),a.indent(o),i.length>0&&(a.push(`const { ${Lb(i.map(d=>`${d}: _${d}`),", ")} } = ctx`),a.newline()),a.push("return "),yi(a,e),a.deindent(o),a.push("}"),delete e.helpers;const{code:l,map:c}=a.context();return{ast:e,code:l,map:c?c.toJSON():void 0}};function n2(e,t={}){const n=Pb({},t),r=!!n.jit,s=!!n.minify,o=n.optimize==null?!0:n.optimize,a=BT(n).parse(e);return r?(o&>(a),s&&Jo(a),{ast:a,code:""}):(WT(a,n),t2(a,n))}/*! * core-base v9.14.2 * (c) 2024 kazuya kawaguchi * Released under the MIT License. - */function OS(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(Qd().__INTLIFY_PROD_DEVTOOLS__=!1)}const yo=[];yo[0]={w:[0],i:[3,0],"[":[4],o:[7]};yo[1]={w:[1],".":[2],"[":[4],o:[7]};yo[2]={w:[2],i:[3,0],0:[3,0]};yo[3]={i:[3,0],0:[3,0],w:[1,1],".":[2,1],"[":[4,1],o:[7,1]};yo[4]={"'":[5,0],'"':[6,0],"[":[4,2],"]":[1,3],o:8,l:[4,0]};yo[5]={"'":[4,0],o:8,l:[5,0]};yo[6]={'"':[4,0],o:8,l:[6,0]};const PS=/^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;function IS(e){return PS.test(e)}function LS(e){const t=e.charCodeAt(0),n=e.charCodeAt(e.length-1);return t===n&&(t===34||t===39)?e.slice(1,-1):e}function NS(e){if(e==null)return"o";switch(e.charCodeAt(0)){case 91:case 93:case 46:case 34:case 39:return e;case 95:case 36:case 45:return"i";case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"w"}return"i"}function DS(e){const t=e.trim();return e.charAt(0)==="0"&&isNaN(parseInt(e))?!1:IS(t)?LS(t):"*"+t}function RS(e){const t=[];let n=-1,r=0,o=0,s,i,a,l,c,d,m;const f=[];f[0]=()=>{i===void 0?i=a:i+=a},f[1]=()=>{i!==void 0&&(t.push(i),i=void 0)},f[2]=()=>{f[0](),o++},f[3]=()=>{if(o>0)o--,r=4,f[0]();else{if(o=0,i===void 0||(i=DS(i),i===!1))return!1;f[1]()}};function p(){const h=e[n+1];if(r===5&&h==="'"||r===6&&h==='"')return n++,a="\\"+h,f[0](),!0}for(;r!==null;)if(n++,s=e[n],!(s==="\\"&&p())){if(l=NS(s),m=yo[r],c=m[l]||m.l||8,c===8||(r=c[0],c[1]!==void 0&&(d=f[c[1]],d&&(a=s,d()===!1))))return;if(r===7)return t}}const Mf=new Map;function MS(e,t){return rt(e)?e[t]:null}function FS(e,t){if(!rt(e))return null;let n=Mf.get(t);if(n||(n=RS(t),n&&Mf.set(t,n)),!n)return null;const r=n.length;let o=e,s=0;for(;se,HS=e=>"",US="text",jS=e=>e.length===0?"":Qw(e),BS=Jw;function Ff(e,t){return e=Math.abs(e),t===2?e?e>1?1:0:1:e?Math.min(e,2):0}function WS(e){const t=Rt(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(Rt(e.named.count)||Rt(e.named.n))?Rt(e.named.count)?e.named.count:Rt(e.named.n)?e.named.n:t:t}function qS(e,t){t.count||(t.count=e),t.n||(t.n=e)}function GS(e={}){const t=e.locale,n=WS(e),r=rt(e.pluralRules)&&we(t)&&Pt(e.pluralRules[t])?e.pluralRules[t]:Ff,o=rt(e.pluralRules)&&we(t)&&Pt(e.pluralRules[t])?Ff:void 0,s=C=>C[r(n,C.length,o)],i=e.list||[],a=C=>i[C],l=e.named||mt();Rt(e.pluralIndex)&&qS(n,l);const c=C=>l[C];function d(C){const w=Pt(e.messages)?e.messages(C):rt(e.messages)?e.messages[C]:!1;return w||(e.parent?e.parent.message(C):HS)}const m=C=>e.modifiers?e.modifiers[C]:VS,f=Qe(e.processor)&&Pt(e.processor.normalize)?e.processor.normalize:jS,p=Qe(e.processor)&&Pt(e.processor.interpolate)?e.processor.interpolate:BS,h=Qe(e.processor)&&we(e.processor.type)?e.processor.type:US,b={list:a,named:c,plural:s,linked:(C,...w)=>{const[g,z]=w;let S="text",k="";w.length===1?rt(g)?(k=g.modifier||k,S=g.type||S):we(g)&&(k=g||k):w.length===2&&(we(g)&&(k=g||k),we(z)&&(S=z||S));const L=d(C)(b),D=S==="vnode"&&Ut(L)&&k?L[0]:L;return k?m(k)(D,S):D},message:d,type:h,interpolate:p,normalize:f,values:tn(mt(),i,l)};return b}let Di=null;function KS(e){Di=e}function ZS(e,t,n){Di&&Di.emit("i18n:init",{timestamp:Date.now(),i18n:e,version:t,meta:n})}const YS=XS("function:translate");function XS(e){return t=>Di&&Di.emit(e,t)}const ky=em.__EXTEND_POINT__,Co=iu(ky),JS={NOT_FOUND_KEY:ky,FALLBACK_TO_TRANSLATE:Co(),CANNOT_FORMAT_NUMBER:Co(),FALLBACK_TO_NUMBER_FORMAT:Co(),CANNOT_FORMAT_DATE:Co(),FALLBACK_TO_DATE_FORMAT:Co(),EXPERIMENTAL_CUSTOM_MESSAGE_COMPILER:Co(),__EXTEND_POINT__:Co()},xy=Le.__EXTEND_POINT__,wo=iu(xy),br={INVALID_ARGUMENT:xy,INVALID_DATE_ARGUMENT:wo(),INVALID_ISO_DATE_ARGUMENT:wo(),NOT_SUPPORT_NON_STRING_MESSAGE:wo(),NOT_SUPPORT_LOCALE_PROMISE_VALUE:wo(),NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:wo(),NOT_SUPPORT_LOCALE_TYPE:wo(),__EXTEND_POINT__:wo()};function Lr(e){return Ds(e,null,void 0)}function nm(e,t){return t.locale!=null?Vf(t.locale):Vf(e.locale)}let Uu;function Vf(e){if(we(e))return e;if(Pt(e)){if(e.resolvedOnce&&Uu!=null)return Uu;if(e.constructor.name==="Function"){const t=e();if(Xw(t))throw Lr(br.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return Uu=t}else throw Lr(br.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}else throw Lr(br.NOT_SUPPORT_LOCALE_TYPE)}function QS(e,t,n){return[...new Set([n,...Ut(t)?t:rt(t)?Object.keys(t):we(t)?[t]:[n]])]}function Ey(e,t,n){const r=we(n)?n:hl,o=e;o.__localeChainCache||(o.__localeChainCache=new Map);let s=o.__localeChainCache.get(r);if(!s){s=[];let i=[n];for(;Ut(i);)i=Hf(s,i,t);const a=Ut(t)||!Qe(t)?t:t.default?t.default:null;i=we(a)?[a]:a,Ut(i)&&Hf(s,i,!1),o.__localeChainCache.set(r,s)}return s}function Hf(e,t,n){let r=!0;for(let o=0;o`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;function rk(){return{upper:(e,t)=>t==="text"&&we(e)?e.toUpperCase():t==="vnode"&&rt(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>t==="text"&&we(e)?e.toLowerCase():t==="vnode"&&rt(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>t==="text"&&we(e)?jf(e):t==="vnode"&&rt(e)&&"__v_isVNode"in e?jf(e.children):e}}let Ty;function ok(e){Ty=e}let $y;function sk(e){$y=e}let Ay;function ik(e){Ay=e}let Oy=null;const ak=e=>{Oy=e},lk=()=>Oy;let Py=null;const Bf=e=>{Py=e},uk=()=>Py;let Wf=0;function ck(e={}){const t=Pt(e.onWarn)?e.onWarn:eS,n=we(e.version)?e.version:nk,r=we(e.locale)||Pt(e.locale)?e.locale:hl,o=Pt(r)?hl:r,s=Ut(e.fallbackLocale)||Qe(e.fallbackLocale)||we(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:o,i=Qe(e.messages)?e.messages:ju(o),a=Qe(e.datetimeFormats)?e.datetimeFormats:ju(o),l=Qe(e.numberFormats)?e.numberFormats:ju(o),c=tn(mt(),e.modifiers,rk()),d=e.pluralRules||mt(),m=Pt(e.missing)?e.missing:null,f=xt(e.missingWarn)||fl(e.missingWarn)?e.missingWarn:!0,p=xt(e.fallbackWarn)||fl(e.fallbackWarn)?e.fallbackWarn:!0,h=!!e.fallbackFormat,_=!!e.unresolving,b=Pt(e.postTranslation)?e.postTranslation:null,C=Qe(e.processor)?e.processor:null,w=xt(e.warnHtmlMessage)?e.warnHtmlMessage:!0,g=!!e.escapeParameter,z=Pt(e.messageCompiler)?e.messageCompiler:Ty,S=Pt(e.messageResolver)?e.messageResolver:$y||MS,k=Pt(e.localeFallbacker)?e.localeFallbacker:Ay||QS,L=rt(e.fallbackContext)?e.fallbackContext:void 0,D=e,T=rt(D.__datetimeFormatters)?D.__datetimeFormatters:new Map,F=rt(D.__numberFormatters)?D.__numberFormatters:new Map,G=rt(D.__meta)?D.__meta:{};Wf++;const U={version:n,cid:Wf,locale:r,fallbackLocale:s,messages:i,modifiers:c,pluralRules:d,missing:m,missingWarn:f,fallbackWarn:p,fallbackFormat:h,unresolving:_,postTranslation:b,processor:C,warnHtmlMessage:w,escapeParameter:g,messageCompiler:z,messageResolver:S,localeFallbacker:k,fallbackContext:L,onWarn:t,__meta:G};return U.datetimeFormats=a,U.numberFormats=l,U.__datetimeFormatters=T,U.__numberFormatters=F,__INTLIFY_PROD_DEVTOOLS__&&ZS(U,n,G),U}const ju=e=>({[e]:mt()});function rm(e,t,n,r,o){const{missing:s,onWarn:i}=e;if(s!==null){const a=s(e,n,t,o);return we(a)?a:t}else return t}function Ws(e,t,n){const r=e;r.__localeChainCache=new Map,e.localeFallbacker(e,n,t)}function dk(e,t){return e===t?!1:e.split("-")[0]===t.split("-")[0]}function mk(e,t){const n=t.indexOf(e);if(n===-1)return!1;for(let r=n+1;rfk(n,e)}function fk(e,t){const n=hk(t);if(n==null)throw Ri(0);if(om(n)===1){const s=gk(n);return e.plural(s.reduce((i,a)=>[...i,qf(e,a)],[]))}else return qf(e,n)}const pk=["b","body"];function hk(e){return zo(e,pk)}const _k=["c","cases"];function gk(e){return zo(e,_k,[])}function qf(e,t){const n=zk(t);if(n!=null)return e.type==="text"?n:e.normalize([n]);{const r=vk(t).reduce((o,s)=>[...o,Kc(e,s)],[]);return e.normalize(r)}}const yk=["s","static"];function zk(e){return zo(e,yk)}const bk=["i","items"];function vk(e){return zo(e,bk,[])}function Kc(e,t){const n=om(t);switch(n){case 3:return ha(t,n);case 9:return ha(t,n);case 4:{const r=t;if(tr(r,"k")&&r.k)return e.interpolate(e.named(r.k));if(tr(r,"key")&&r.key)return e.interpolate(e.named(r.key));throw Ri(n)}case 5:{const r=t;if(tr(r,"i")&&Rt(r.i))return e.interpolate(e.list(r.i));if(tr(r,"index")&&Rt(r.index))return e.interpolate(e.list(r.index));throw Ri(n)}case 6:{const r=t,o=kk(r),s=Ek(r);return e.linked(Kc(e,s),o?Kc(e,o):void 0,e.type)}case 7:return ha(t,n);case 8:return ha(t,n);default:throw new Error(`unhandled node on format message part: ${n}`)}}const Ck=["t","type"];function om(e){return zo(e,Ck)}const wk=["v","value"];function ha(e,t){const n=zo(e,wk);if(n)return n;throw Ri(t)}const Sk=["m","modifier"];function kk(e){return zo(e,Sk)}const xk=["k","key"];function Ek(e){const t=zo(e,xk);if(t)return t;throw Ri(6)}function zo(e,t,n){for(let r=0;re;let _a=mt();function ks(e){return rt(e)&&om(e)===0&&(tr(e,"b")||tr(e,"body"))}function $k(e,t={}){let n=!1;const r=t.onError||aS;return t.onError=o=>{n=!0,r(o)},{...AS(e,t),detectError:n}}function Ak(e,t){if(we(e)){xt(t.warnHtmlMessage)&&t.warnHtmlMessage;const r=(t.onCacheKey||Tk)(e),o=_a[r];if(o)return o;const{ast:s,detectError:i}=$k(e,{...t,location:!1,jit:!0}),a=Bu(s);return i?a:_a[r]=a}else{const n=e.cacheKey;if(n){const r=_a[n];return r||(_a[n]=Bu(e))}else return Bu(e)}}const Gf=()=>"",Nn=e=>Pt(e);function Kf(e,...t){const{fallbackFormat:n,postTranslation:r,unresolving:o,messageCompiler:s,fallbackLocale:i,messages:a}=e,[l,c]=Zc(...t),d=xt(c.missingWarn)?c.missingWarn:e.missingWarn,m=xt(c.fallbackWarn)?c.fallbackWarn:e.fallbackWarn,f=xt(c.escapeParameter)?c.escapeParameter:e.escapeParameter,p=!!c.resolvedMessage,h=we(c.default)||xt(c.default)?xt(c.default)?s?l:()=>l:c.default:n?s?l:()=>l:"",_=n||h!=="",b=nm(e,c);f&&Ok(c);let[C,w,g]=p?[l,b,a[b]||mt()]:Iy(e,l,b,i,m,d),z=C,S=l;if(!p&&!(we(z)||ks(z)||Nn(z))&&_&&(z=h,S=z),!p&&(!(we(z)||ks(z)||Nn(z))||!we(w)))return o?au:l;let k=!1;const L=()=>{k=!0},D=Nn(z)?z:Ly(e,l,w,z,S,L);if(k)return z;const T=Lk(e,w,g,c),F=GS(T),G=Pk(e,D,F),U=r?r(G,l):G;if(__INTLIFY_PROD_DEVTOOLS__){const W={timestamp:Date.now(),key:we(l)?l:Nn(z)?z.key:"",locale:w||(Nn(z)?z.locale:""),format:we(z)?z:Nn(z)?z.source:"",message:U};W.meta=tn({},e.__meta,lk()||{}),YS(W)}return U}function Ok(e){Ut(e.list)?e.list=e.list.map(t=>we(t)?If(t):t):rt(e.named)&&Object.keys(e.named).forEach(t=>{we(e.named[t])&&(e.named[t]=If(e.named[t]))})}function Iy(e,t,n,r,o,s){const{messages:i,onWarn:a,messageResolver:l,localeFallbacker:c}=e,d=c(e,r,n);let m=mt(),f,p=null;const h="translate";for(let _=0;_r;return c.locale=n,c.key=t,c}const l=i(r,Ik(e,n,o,r,a,s));return l.locale=n,l.key=t,l.source=r,l}function Pk(e,t,n){return t(n)}function Zc(...e){const[t,n,r]=e,o=mt();if(!we(t)&&!Rt(t)&&!Nn(t)&&!ks(t))throw Lr(br.INVALID_ARGUMENT);const s=Rt(t)?String(t):(Nn(t),t);return Rt(n)?o.plural=n:we(n)?o.default=n:Qe(n)&&!su(n)?o.named=n:Ut(n)&&(o.list=n),Rt(r)?o.plural=r:we(r)?o.default=r:Qe(r)&&tn(o,r),[s,o]}function Ik(e,t,n,r,o,s){return{locale:t,key:n,warnHtmlMessage:o,onError:i=>{throw s&&s(i),i},onCacheKey:i=>qw(t,n,i)}}function Lk(e,t,n,r){const{modifiers:o,pluralRules:s,messageResolver:i,fallbackLocale:a,fallbackWarn:l,missingWarn:c,fallbackContext:d}=e,f={locale:t,modifiers:o,pluralRules:s,messages:p=>{let h=i(n,p);if(h==null&&d){const[,,_]=Iy(d,p,t,a,l,c);h=i(_,p)}if(we(h)||ks(h)){let _=!1;const C=Ly(e,p,t,h,p,()=>{_=!0});return _?Gf:C}else return Nn(h)?h:Gf}};return e.processor&&(f.processor=e.processor),r.list&&(f.list=r.list),r.named&&(f.named=r.named),Rt(r.plural)&&(f.pluralIndex=r.plural),f}function Zf(e,...t){const{datetimeFormats:n,unresolving:r,fallbackLocale:o,onWarn:s,localeFallbacker:i}=e,{__datetimeFormatters:a}=e,[l,c,d,m]=Yc(...t),f=xt(d.missingWarn)?d.missingWarn:e.missingWarn;xt(d.fallbackWarn)?d.fallbackWarn:e.fallbackWarn;const p=!!d.part,h=nm(e,d),_=i(e,o,h);if(!we(l)||l==="")return new Intl.DateTimeFormat(h,m).format(c);let b={},C,w=null;const g="datetime format";for(let k=0;k<_.length&&(C=_[k],b=n[C]||{},w=b[l],!Qe(w));k++)rm(e,l,C,f,g);if(!Qe(w)||!we(C))return r?au:l;let z=`${C}__${l}`;su(m)||(z=`${z}__${JSON.stringify(m)}`);let S=a.get(z);return S||(S=new Intl.DateTimeFormat(C,tn({},w,m)),a.set(z,S)),p?S.formatToParts(c):S.format(c)}const Ny=["localeMatcher","weekday","era","year","month","day","hour","minute","second","timeZoneName","formatMatcher","hour12","timeZone","dateStyle","timeStyle","calendar","dayPeriod","numberingSystem","hourCycle","fractionalSecondDigits"];function Yc(...e){const[t,n,r,o]=e,s=mt();let i=mt(),a;if(we(t)){const l=t.match(/(\d{4}-\d{2}-\d{2})(T|\s)?(.*)/);if(!l)throw Lr(br.INVALID_ISO_DATE_ARGUMENT);const c=l[3]?l[3].trim().startsWith("T")?`${l[1].trim()}${l[3].trim()}`:`${l[1].trim()}T${l[3].trim()}`:l[1].trim();a=new Date(c);try{a.toISOString()}catch{throw Lr(br.INVALID_ISO_DATE_ARGUMENT)}}else if(Kw(t)){if(isNaN(t.getTime()))throw Lr(br.INVALID_DATE_ARGUMENT);a=t}else if(Rt(t))a=t;else throw Lr(br.INVALID_ARGUMENT);return we(n)?s.key=n:Qe(n)&&Object.keys(n).forEach(l=>{Ny.includes(l)?i[l]=n[l]:s[l]=n[l]}),we(r)?s.locale=r:Qe(r)&&(i=r),Qe(o)&&(i=o),[s.key||"",a,s,i]}function Yf(e,t,n){const r=e;for(const o in n){const s=`${t}__${o}`;r.__datetimeFormatters.has(s)&&r.__datetimeFormatters.delete(s)}}function Xf(e,...t){const{numberFormats:n,unresolving:r,fallbackLocale:o,onWarn:s,localeFallbacker:i}=e,{__numberFormatters:a}=e,[l,c,d,m]=Xc(...t),f=xt(d.missingWarn)?d.missingWarn:e.missingWarn;xt(d.fallbackWarn)?d.fallbackWarn:e.fallbackWarn;const p=!!d.part,h=nm(e,d),_=i(e,o,h);if(!we(l)||l==="")return new Intl.NumberFormat(h,m).format(c);let b={},C,w=null;const g="number format";for(let k=0;k<_.length&&(C=_[k],b=n[C]||{},w=b[l],!Qe(w));k++)rm(e,l,C,f,g);if(!Qe(w)||!we(C))return r?au:l;let z=`${C}__${l}`;su(m)||(z=`${z}__${JSON.stringify(m)}`);let S=a.get(z);return S||(S=new Intl.NumberFormat(C,tn({},w,m)),a.set(z,S)),p?S.formatToParts(c):S.format(c)}const Dy=["localeMatcher","style","currency","currencyDisplay","currencySign","useGrouping","minimumIntegerDigits","minimumFractionDigits","maximumFractionDigits","minimumSignificantDigits","maximumSignificantDigits","compactDisplay","notation","signDisplay","unit","unitDisplay","roundingMode","roundingPriority","roundingIncrement","trailingZeroDisplay"];function Xc(...e){const[t,n,r,o]=e,s=mt();let i=mt();if(!Rt(t))throw Lr(br.INVALID_ARGUMENT);const a=t;return we(n)?s.key=n:Qe(n)&&Object.keys(n).forEach(l=>{Dy.includes(l)?i[l]=n[l]:s[l]=n[l]}),we(r)?s.locale=r:Qe(r)&&(i=r),Qe(o)&&(i=o),[s.key||"",a,s,i]}function Jf(e,t,n){const r=e;for(const o in n){const s=`${t}__${o}`;r.__numberFormatters.has(s)&&r.__numberFormatters.delete(s)}}OS();/*! + */function r2(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(sp().__INTLIFY_PROD_DEVTOOLS__=!1)}const eo=[];eo[0]={w:[0],i:[3,0],"[":[4],o:[7]};eo[1]={w:[1],".":[2],"[":[4],o:[7]};eo[2]={w:[2],i:[3,0],0:[3,0]};eo[3]={i:[3,0],0:[3,0],w:[1,1],".":[2,1],"[":[4,1],o:[7,1]};eo[4]={"'":[5,0],'"':[6,0],"[":[4,2],"]":[1,3],o:8,l:[4,0]};eo[5]={"'":[4,0],o:8,l:[5,0]};eo[6]={'"':[4,0],o:8,l:[6,0]};const s2=/^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;function o2(e){return s2.test(e)}function i2(e){const t=e.charCodeAt(0),n=e.charCodeAt(e.length-1);return t===n&&(t===34||t===39)?e.slice(1,-1):e}function a2(e){if(e==null)return"o";switch(e.charCodeAt(0)){case 91:case 93:case 46:case 34:case 39:return e;case 95:case 36:case 45:return"i";case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"w"}return"i"}function l2(e){const t=e.trim();return e.charAt(0)==="0"&&isNaN(parseInt(e))?!1:o2(t)?i2(t):"*"+t}function c2(e){const t=[];let n=-1,r=0,s=0,o,i,a,l,c,d,m;const f=[];f[0]=()=>{i===void 0?i=a:i+=a},f[1]=()=>{i!==void 0&&(t.push(i),i=void 0)},f[2]=()=>{f[0](),s++},f[3]=()=>{if(s>0)s--,r=4,f[0]();else{if(s=0,i===void 0||(i=l2(i),i===!1))return!1;f[1]()}};function p(){const h=e[n+1];if(r===5&&h==="'"||r===6&&h==='"')return n++,a="\\"+h,f[0](),!0}for(;r!==null;)if(n++,o=e[n],!(o==="\\"&&p())){if(l=a2(o),m=eo[r],c=m[l]||m.l||8,c===8||(r=c[0],c[1]!==void 0&&(d=f[c[1]],d&&(a=o,d()===!1))))return;if(r===7)return t}}const g_=new Map;function u2(e,t){return ct(e)?e[t]:null}function d2(e,t){if(!ct(e))return null;let n=g_.get(t);if(n||(n=c2(t),n&&g_.set(t,n)),!n)return null;const r=n.length;let s=e,o=0;for(;oe,f2=e=>"",p2="text",h2=e=>e.length===0?"":wT(e),_2=ET;function y_(e,t){return e=Math.abs(e),t===2?e?e>1?1:0:1:e?Math.min(e,2):0}function g2(e){const t=Gt(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(Gt(e.named.count)||Gt(e.named.n))?Gt(e.named.count)?e.named.count:Gt(e.named.n)?e.named.n:t:t}function y2(e,t){t.count||(t.count=e),t.n||(t.n=e)}function v2(e={}){const t=e.locale,n=g2(e),r=ct(e.pluralRules)&&Ee(t)&&Mt(e.pluralRules[t])?e.pluralRules[t]:y_,s=ct(e.pluralRules)&&Ee(t)&&Mt(e.pluralRules[t])?y_:void 0,o=C=>C[r(n,C.length,s)],i=e.list||[],a=C=>i[C],l=e.named||yt();Gt(e.pluralIndex)&&y2(n,l);const c=C=>l[C];function d(C){const S=Mt(e.messages)?e.messages(C):ct(e.messages)?e.messages[C]:!1;return S||(e.parent?e.parent.message(C):f2)}const m=C=>e.modifiers?e.modifiers[C]:m2,f=st(e.processor)&&Mt(e.processor.normalize)?e.processor.normalize:h2,p=st(e.processor)&&Mt(e.processor.interpolate)?e.processor.interpolate:_2,h=st(e.processor)&&Ee(e.processor.type)?e.processor.type:p2,v={list:a,named:c,plural:o,linked:(C,...S)=>{const[g,b]=S;let E="text",w="";S.length===1?ct(g)?(w=g.modifier||w,E=g.type||E):Ee(g)&&(w=g||w):S.length===2&&(Ee(g)&&(w=g||w),Ee(b)&&(E=b||E));const P=d(C)(v),N=E==="vnode"&&Jt(P)&&w?P[0]:P;return w?m(w)(N,E):N},message:d,type:h,interpolate:p,normalize:f,values:vn(yt(),i,l)};return v}let Da=null;function b2(e){Da=e}function z2(e,t,n){Da&&Da.emit("i18n:init",{timestamp:Date.now(),i18n:e,version:t,meta:n})}const C2=S2("function:translate");function S2(e){return t=>Da&&Da.emit(e,t)}const E2=op.__EXTEND_POINT__,so=Lu(E2),w2={FALLBACK_TO_TRANSLATE:so(),CANNOT_FORMAT_NUMBER:so(),FALLBACK_TO_NUMBER_FORMAT:so(),CANNOT_FORMAT_DATE:so(),FALLBACK_TO_DATE_FORMAT:so(),EXPERIMENTAL_CUSTOM_MESSAGE_COMPILER:so(),__EXTEND_POINT__:so()},Rb=Le.__EXTEND_POINT__,oo=Lu(Rb),jr={INVALID_ARGUMENT:Rb,INVALID_DATE_ARGUMENT:oo(),INVALID_ISO_DATE_ARGUMENT:oo(),NOT_SUPPORT_NON_STRING_MESSAGE:oo(),NOT_SUPPORT_LOCALE_PROMISE_VALUE:oo(),NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:oo(),NOT_SUPPORT_LOCALE_TYPE:oo(),__EXTEND_POINT__:oo()};function is(e){return Li(e,null,void 0)}function ap(e,t){return t.locale!=null?v_(t.locale):v_(e.locale)}let Rd;function v_(e){if(Ee(e))return e;if(Mt(e)){if(e.resolvedOnce&&Rd!=null)return Rd;if(e.constructor.name==="Function"){const t=e();if(ST(t))throw is(jr.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return Rd=t}else throw is(jr.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}else throw is(jr.NOT_SUPPORT_LOCALE_TYPE)}function k2(e,t,n){return[...new Set([n,...Jt(t)?t:ct(t)?Object.keys(t):Ee(t)?[t]:[n]])]}function Db(e,t,n){const r=Ee(n)?n:Dc,s=e;s.__localeChainCache||(s.__localeChainCache=new Map);let o=s.__localeChainCache.get(r);if(!o){o=[];let i=[n];for(;Jt(i);)i=b_(o,i,t);const a=Jt(t)||!st(t)?t:t.default?t.default:null;i=Ee(a)?[a]:a,Jt(i)&&b_(o,i,!1),s.__localeChainCache.set(r,o)}return o}function b_(e,t,n){let r=!0;for(let s=0;s`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;function O2(){return{upper:(e,t)=>t==="text"&&Ee(e)?e.toUpperCase():t==="vnode"&&ct(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>t==="text"&&Ee(e)?e.toLowerCase():t==="vnode"&&ct(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>t==="text"&&Ee(e)?C_(e):t==="vnode"&&ct(e)&&"__v_isVNode"in e?C_(e.children):e}}let Mb;function $2(e){Mb=e}let Fb;function N2(e){Fb=e}let Vb;function I2(e){Vb=e}let Hb=null;const P2=e=>{Hb=e},L2=()=>Hb;let Ub=null;const S_=e=>{Ub=e},R2=()=>Ub;let E_=0;function D2(e={}){const t=Mt(e.onWarn)?e.onWarn:kT,n=Ee(e.version)?e.version:A2,r=Ee(e.locale)||Mt(e.locale)?e.locale:Dc,s=Mt(r)?Dc:r,o=Jt(e.fallbackLocale)||st(e.fallbackLocale)||Ee(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:s,i=st(e.messages)?e.messages:Dd(s),a=st(e.datetimeFormats)?e.datetimeFormats:Dd(s),l=st(e.numberFormats)?e.numberFormats:Dd(s),c=vn(yt(),e.modifiers,O2()),d=e.pluralRules||yt(),m=Mt(e.missing)?e.missing:null,f=Nt(e.missingWarn)||Lc(e.missingWarn)?e.missingWarn:!0,p=Nt(e.fallbackWarn)||Lc(e.fallbackWarn)?e.fallbackWarn:!0,h=!!e.fallbackFormat,_=!!e.unresolving,v=Mt(e.postTranslation)?e.postTranslation:null,C=st(e.processor)?e.processor:null,S=Nt(e.warnHtmlMessage)?e.warnHtmlMessage:!0,g=!!e.escapeParameter,b=Mt(e.messageCompiler)?e.messageCompiler:Mb,E=Mt(e.messageResolver)?e.messageResolver:Fb||u2,w=Mt(e.localeFallbacker)?e.localeFallbacker:Vb||k2,P=ct(e.fallbackContext)?e.fallbackContext:void 0,N=e,k=ct(N.__datetimeFormatters)?N.__datetimeFormatters:new Map,R=ct(N.__numberFormatters)?N.__numberFormatters:new Map,B=ct(N.__meta)?N.__meta:{};E_++;const M={version:n,cid:E_,locale:r,fallbackLocale:o,messages:i,modifiers:c,pluralRules:d,missing:m,missingWarn:f,fallbackWarn:p,fallbackFormat:h,unresolving:_,postTranslation:v,processor:C,warnHtmlMessage:S,escapeParameter:g,messageCompiler:b,messageResolver:E,localeFallbacker:w,fallbackContext:P,onWarn:t,__meta:B};return M.datetimeFormats=a,M.numberFormats=l,M.__datetimeFormatters=k,M.__numberFormatters=R,__INTLIFY_PROD_DEVTOOLS__&&z2(M,n,B),M}const Dd=e=>({[e]:yt()});function lp(e,t,n,r,s){const{missing:o,onWarn:i}=e;if(o!==null){const a=o(e,n,t,s);return Ee(a)?a:t}else return t}function Wi(e,t,n){const r=e;r.__localeChainCache=new Map,e.localeFallbacker(e,n,t)}function M2(e,t){return e===t?!1:e.split("-")[0]===t.split("-")[0]}function F2(e,t){const n=t.indexOf(e);if(n===-1)return!1;for(let r=n+1;rV2(n,e)}function V2(e,t){const n=U2(t);if(n==null)throw Ma(0);if(cp(n)===1){const o=B2(n);return e.plural(o.reduce((i,a)=>[...i,w_(e,a)],[]))}else return w_(e,n)}const H2=["b","body"];function U2(e){return to(e,H2)}const j2=["c","cases"];function B2(e){return to(e,j2,[])}function w_(e,t){const n=W2(t);if(n!=null)return e.type==="text"?n:e.normalize([n]);{const r=K2(t).reduce((s,o)=>[...s,Km(e,o)],[]);return e.normalize(r)}}const q2=["s","static"];function W2(e){return to(e,q2)}const G2=["i","items"];function K2(e){return to(e,G2,[])}function Km(e,t){const n=cp(t);switch(n){case 3:return Tl(t,n);case 9:return Tl(t,n);case 4:{const r=t;if(wr(r,"k")&&r.k)return e.interpolate(e.named(r.k));if(wr(r,"key")&&r.key)return e.interpolate(e.named(r.key));throw Ma(n)}case 5:{const r=t;if(wr(r,"i")&&Gt(r.i))return e.interpolate(e.list(r.i));if(wr(r,"index")&&Gt(r.index))return e.interpolate(e.list(r.index));throw Ma(n)}case 6:{const r=t,s=J2(r),o=eA(r);return e.linked(Km(e,o),s?Km(e,s):void 0,e.type)}case 7:return Tl(t,n);case 8:return Tl(t,n);default:throw new Error(`unhandled node on format message part: ${n}`)}}const X2=["t","type"];function cp(e){return to(e,X2)}const Y2=["v","value"];function Tl(e,t){const n=to(e,Y2);if(n)return n;throw Ma(t)}const Z2=["m","modifier"];function J2(e){return to(e,Z2)}const Q2=["k","key"];function eA(e){const t=to(e,Q2);if(t)return t;throw Ma(6)}function to(e,t,n){for(let r=0;re;let Al=yt();function vi(e){return ct(e)&&cp(e)===0&&(wr(e,"b")||wr(e,"body"))}function nA(e,t={}){let n=!1;const r=t.onError||IT;return t.onError=s=>{n=!0,r(s)},{...n2(e,t),detectError:n}}function rA(e,t){if(Ee(e)){Nt(t.warnHtmlMessage)&&t.warnHtmlMessage;const r=(t.onCacheKey||tA)(e),s=Al[r];if(s)return s;const{ast:o,detectError:i}=nA(e,{...t,location:!1,jit:!0}),a=Md(o);return i?a:Al[r]=a}else{const n=e.cacheKey;if(n){const r=Al[n];return r||(Al[n]=Md(e))}else return Md(e)}}const k_=()=>"",sr=e=>Mt(e);function x_(e,...t){const{fallbackFormat:n,postTranslation:r,unresolving:s,messageCompiler:o,fallbackLocale:i,messages:a}=e,[l,c]=Xm(...t),d=Nt(c.missingWarn)?c.missingWarn:e.missingWarn,m=Nt(c.fallbackWarn)?c.fallbackWarn:e.fallbackWarn,f=Nt(c.escapeParameter)?c.escapeParameter:e.escapeParameter,p=!!c.resolvedMessage,h=Ee(c.default)||Nt(c.default)?Nt(c.default)?o?l:()=>l:c.default:n?o?l:()=>l:"",_=n||h!=="",v=ap(e,c);f&&sA(c);let[C,S,g]=p?[l,v,a[v]||yt()]:jb(e,l,v,i,m,d),b=C,E=l;if(!p&&!(Ee(b)||vi(b)||sr(b))&&_&&(b=h,E=b),!p&&(!(Ee(b)||vi(b)||sr(b))||!Ee(S)))return s?Ru:l;let w=!1;const P=()=>{w=!0},N=sr(b)?b:Bb(e,l,S,b,E,P);if(w)return b;const k=aA(e,S,g,c),R=v2(k),B=oA(e,N,R),M=r?r(B,l):B;if(__INTLIFY_PROD_DEVTOOLS__){const H={timestamp:Date.now(),key:Ee(l)?l:sr(b)?b.key:"",locale:S||(sr(b)?b.locale:""),format:Ee(b)?b:sr(b)?b.source:"",message:M};H.meta=vn({},e.__meta,L2()||{}),C2(H)}return M}function sA(e){Jt(e.list)?e.list=e.list.map(t=>Ee(t)?m_(t):t):ct(e.named)&&Object.keys(e.named).forEach(t=>{Ee(e.named[t])&&(e.named[t]=m_(e.named[t]))})}function jb(e,t,n,r,s,o){const{messages:i,onWarn:a,messageResolver:l,localeFallbacker:c}=e,d=c(e,r,n);let m=yt(),f,p=null;const h="translate";for(let _=0;_r;return c.locale=n,c.key=t,c}const l=i(r,iA(e,n,s,r,a,o));return l.locale=n,l.key=t,l.source=r,l}function oA(e,t,n){return t(n)}function Xm(...e){const[t,n,r]=e,s=yt();if(!Ee(t)&&!Gt(t)&&!sr(t)&&!vi(t))throw is(jr.INVALID_ARGUMENT);const o=Gt(t)?String(t):(sr(t),t);return Gt(n)?s.plural=n:Ee(n)?s.default=n:st(n)&&!Pu(n)?s.named=n:Jt(n)&&(s.list=n),Gt(r)?s.plural=r:Ee(r)?s.default=r:st(r)&&vn(s,r),[o,s]}function iA(e,t,n,r,s,o){return{locale:t,key:n,warnHtmlMessage:s,onError:i=>{throw o&&o(i),i},onCacheKey:i=>yT(t,n,i)}}function aA(e,t,n,r){const{modifiers:s,pluralRules:o,messageResolver:i,fallbackLocale:a,fallbackWarn:l,missingWarn:c,fallbackContext:d}=e,f={locale:t,modifiers:s,pluralRules:o,messages:p=>{let h=i(n,p);if(h==null&&d){const[,,_]=jb(d,p,t,a,l,c);h=i(_,p)}if(Ee(h)||vi(h)){let _=!1;const C=Bb(e,p,t,h,p,()=>{_=!0});return _?k_:C}else return sr(h)?h:k_}};return e.processor&&(f.processor=e.processor),r.list&&(f.list=r.list),r.named&&(f.named=r.named),Gt(r.plural)&&(f.pluralIndex=r.plural),f}function T_(e,...t){const{datetimeFormats:n,unresolving:r,fallbackLocale:s,onWarn:o,localeFallbacker:i}=e,{__datetimeFormatters:a}=e,[l,c,d,m]=Ym(...t),f=Nt(d.missingWarn)?d.missingWarn:e.missingWarn;Nt(d.fallbackWarn)?d.fallbackWarn:e.fallbackWarn;const p=!!d.part,h=ap(e,d),_=i(e,s,h);if(!Ee(l)||l==="")return new Intl.DateTimeFormat(h,m).format(c);let v={},C,S=null;const g="datetime format";for(let w=0;w<_.length&&(C=_[w],v=n[C]||{},S=v[l],!st(S));w++)lp(e,l,C,f,g);if(!st(S)||!Ee(C))return r?Ru:l;let b=`${C}__${l}`;Pu(m)||(b=`${b}__${JSON.stringify(m)}`);let E=a.get(b);return E||(E=new Intl.DateTimeFormat(C,vn({},S,m)),a.set(b,E)),p?E.formatToParts(c):E.format(c)}const qb=["localeMatcher","weekday","era","year","month","day","hour","minute","second","timeZoneName","formatMatcher","hour12","timeZone","dateStyle","timeStyle","calendar","dayPeriod","numberingSystem","hourCycle","fractionalSecondDigits"];function Ym(...e){const[t,n,r,s]=e,o=yt();let i=yt(),a;if(Ee(t)){const l=t.match(/(\d{4}-\d{2}-\d{2})(T|\s)?(.*)/);if(!l)throw is(jr.INVALID_ISO_DATE_ARGUMENT);const c=l[3]?l[3].trim().startsWith("T")?`${l[1].trim()}${l[3].trim()}`:`${l[1].trim()}T${l[3].trim()}`:l[1].trim();a=new Date(c);try{a.toISOString()}catch{throw is(jr.INVALID_ISO_DATE_ARGUMENT)}}else if(bT(t)){if(isNaN(t.getTime()))throw is(jr.INVALID_DATE_ARGUMENT);a=t}else if(Gt(t))a=t;else throw is(jr.INVALID_ARGUMENT);return Ee(n)?o.key=n:st(n)&&Object.keys(n).forEach(l=>{qb.includes(l)?i[l]=n[l]:o[l]=n[l]}),Ee(r)?o.locale=r:st(r)&&(i=r),st(s)&&(i=s),[o.key||"",a,o,i]}function A_(e,t,n){const r=e;for(const s in n){const o=`${t}__${s}`;r.__datetimeFormatters.has(o)&&r.__datetimeFormatters.delete(o)}}function O_(e,...t){const{numberFormats:n,unresolving:r,fallbackLocale:s,onWarn:o,localeFallbacker:i}=e,{__numberFormatters:a}=e,[l,c,d,m]=Zm(...t),f=Nt(d.missingWarn)?d.missingWarn:e.missingWarn;Nt(d.fallbackWarn)?d.fallbackWarn:e.fallbackWarn;const p=!!d.part,h=ap(e,d),_=i(e,s,h);if(!Ee(l)||l==="")return new Intl.NumberFormat(h,m).format(c);let v={},C,S=null;const g="number format";for(let w=0;w<_.length&&(C=_[w],v=n[C]||{},S=v[l],!st(S));w++)lp(e,l,C,f,g);if(!st(S)||!Ee(C))return r?Ru:l;let b=`${C}__${l}`;Pu(m)||(b=`${b}__${JSON.stringify(m)}`);let E=a.get(b);return E||(E=new Intl.NumberFormat(C,vn({},S,m)),a.set(b,E)),p?E.formatToParts(c):E.format(c)}const Wb=["localeMatcher","style","currency","currencyDisplay","currencySign","useGrouping","minimumIntegerDigits","minimumFractionDigits","maximumFractionDigits","minimumSignificantDigits","maximumSignificantDigits","compactDisplay","notation","signDisplay","unit","unitDisplay","roundingMode","roundingPriority","roundingIncrement","trailingZeroDisplay"];function Zm(...e){const[t,n,r,s]=e,o=yt();let i=yt();if(!Gt(t))throw is(jr.INVALID_ARGUMENT);const a=t;return Ee(n)?o.key=n:st(n)&&Object.keys(n).forEach(l=>{Wb.includes(l)?i[l]=n[l]:o[l]=n[l]}),Ee(r)?o.locale=r:st(r)&&(i=r),st(s)&&(i=s),[o.key||"",a,o,i]}function $_(e,t,n){const r=e;for(const s in n){const o=`${t}__${s}`;r.__numberFormatters.has(o)&&r.__numberFormatters.delete(o)}}r2();/*! * vue-i18n v9.14.2 * (c) 2024 kazuya kawaguchi * Released under the MIT License. - */const Nk="9.14.2";function Dk(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(Qd().__INTLIFY_PROD_DEVTOOLS__=!1)}const Ry=JS.__EXTEND_POINT__,Tr=iu(Ry);Tr(),Tr(),Tr(),Tr(),Tr(),Tr(),Tr(),Tr(),Tr();const My=br.__EXTEND_POINT__,mn=iu(My),Bn={UNEXPECTED_RETURN_TYPE:My,INVALID_ARGUMENT:mn(),MUST_BE_CALL_SETUP_TOP:mn(),NOT_INSTALLED:mn(),NOT_AVAILABLE_IN_LEGACY_MODE:mn(),REQUIRED_VALUE:mn(),INVALID_VALUE:mn(),CANNOT_SETUP_VUE_DEVTOOLS_PLUGIN:mn(),NOT_INSTALLED_WITH_PROVIDE:mn(),UNEXPECTED_ERROR:mn(),NOT_COMPATIBLE_LEGACY_VUE_I18N:mn(),BRIDGE_SUPPORT_VUE_2_ONLY:mn(),MUST_DEFINE_I18N_OPTION_IN_ALLOW_COMPOSITION:mn(),NOT_AVAILABLE_COMPOSITION_IN_LEGACY:mn(),__EXTEND_POINT__:mn()};function sr(e,...t){return Ds(e,null,void 0)}const Jc=go("__translateVNode"),Qc=go("__datetimeParts"),ed=go("__numberParts"),Rk=go("__setPluralRules"),Mk=go("__injectWithOption"),td=go("__dispose");function Mi(e){if(!rt(e))return e;for(const t in e)if(tr(e,t))if(!t.includes("."))rt(e[t])&&Mi(e[t]);else{const n=t.split("."),r=n.length-1;let o=e,s=!1;for(let i=0;i{if("locale"in a&&"resource"in a){const{locale:l,resource:c}=a;l?(i[l]=i[l]||mt(),Fa(c,i[l])):Fa(c,i)}else we(a)&&Fa(JSON.parse(a),i)}),o==null&&s)for(const a in i)tr(i,a)&&Mi(i[a]);return i}function Vy(e){return e.type}function Fk(e,t,n){let r=rt(t.messages)?t.messages:mt();"__i18nGlobal"in n&&(r=Fy(e.locale.value,{messages:r,__i18n:n.__i18nGlobal}));const o=Object.keys(r);o.length&&o.forEach(s=>{e.mergeLocaleMessage(s,r[s])});{if(rt(t.datetimeFormats)){const s=Object.keys(t.datetimeFormats);s.length&&s.forEach(i=>{e.mergeDateTimeFormat(i,t.datetimeFormats[i])})}if(rt(t.numberFormats)){const s=Object.keys(t.numberFormats);s.length&&s.forEach(i=>{e.mergeNumberFormat(i,t.numberFormats[i])})}}}function Qf(e){return v(Nr,null,e,0)}const ep="__INTLIFY_META__",tp=()=>[],Vk=()=>!1;let np=0;function rp(e){return(t,n,r,o)=>e(n,r,cn()||void 0,o)}const Hk=()=>{const e=cn();let t=null;return e&&(t=Vy(e)[ep])?{[ep]:t}:null};function Hy(e={},t){const{__root:n,__injectWithOption:r}=e,o=n===void 0,s=e.flatJson,i=ml?Fn:Ul,a=!!e.translateExistCompatible;let l=xt(e.inheritLocale)?e.inheritLocale:!0;const c=i(n&&l?n.locale.value:we(e.locale)?e.locale:hl),d=i(n&&l?n.fallbackLocale.value:we(e.fallbackLocale)||Ut(e.fallbackLocale)||Qe(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:c.value),m=i(Fy(c.value,e)),f=i(Qe(e.datetimeFormats)?e.datetimeFormats:{[c.value]:{}}),p=i(Qe(e.numberFormats)?e.numberFormats:{[c.value]:{}});let h=n?n.missingWarn:xt(e.missingWarn)||fl(e.missingWarn)?e.missingWarn:!0,_=n?n.fallbackWarn:xt(e.fallbackWarn)||fl(e.fallbackWarn)?e.fallbackWarn:!0,b=n?n.fallbackRoot:xt(e.fallbackRoot)?e.fallbackRoot:!0,C=!!e.fallbackFormat,w=Pt(e.missing)?e.missing:null,g=Pt(e.missing)?rp(e.missing):null,z=Pt(e.postTranslation)?e.postTranslation:null,S=n?n.warnHtmlMessage:xt(e.warnHtmlMessage)?e.warnHtmlMessage:!0,k=!!e.escapeParameter;const L=n?n.modifiers:Qe(e.modifiers)?e.modifiers:{};let D=e.pluralRules||n&&n.pluralRules,T;T=(()=>{o&&Bf(null);const V={version:Nk,locale:c.value,fallbackLocale:d.value,messages:m.value,modifiers:L,pluralRules:D,missing:g===null?void 0:g,missingWarn:h,fallbackWarn:_,fallbackFormat:C,unresolving:!0,postTranslation:z===null?void 0:z,warnHtmlMessage:S,escapeParameter:k,messageResolver:e.messageResolver,messageCompiler:e.messageCompiler,__meta:{framework:"vue"}};V.datetimeFormats=f.value,V.numberFormats=p.value,V.__datetimeFormatters=Qe(T)?T.__datetimeFormatters:void 0,V.__numberFormatters=Qe(T)?T.__numberFormatters:void 0;const Y=ck(V);return o&&Bf(Y),Y})(),Ws(T,c.value,d.value);function G(){return[c.value,d.value,m.value,f.value,p.value]}const U=jt({get:()=>c.value,set:V=>{c.value=V,T.locale=c.value}}),W=jt({get:()=>d.value,set:V=>{d.value=V,T.fallbackLocale=d.value,Ws(T,c.value,V)}}),ee=jt(()=>m.value),fe=jt(()=>f.value),K=jt(()=>p.value);function ne(){return Pt(z)?z:null}function ue(V){z=V,T.postTranslation=V}function Ne(){return w}function it(V){V!==null&&(g=rp(V)),w=V,T.missing=g}const Ve=(V,Y,ke,M,H,q)=>{G();let re;try{__INTLIFY_PROD_DEVTOOLS__,o||(T.fallbackContext=n?uk():void 0),re=V(T)}finally{__INTLIFY_PROD_DEVTOOLS__,o||(T.fallbackContext=void 0)}if(ke!=="translate exists"&&Rt(re)&&re===au||ke==="translate exists"&&!re){const[_e,Te]=Y();return n&&b?M(n):H(_e)}else{if(q(re))return re;throw sr(Bn.UNEXPECTED_RETURN_TYPE)}};function He(...V){return Ve(Y=>Reflect.apply(Kf,null,[Y,...V]),()=>Zc(...V),"translate",Y=>Reflect.apply(Y.t,Y,[...V]),Y=>Y,Y=>we(Y))}function at(...V){const[Y,ke,M]=V;if(M&&!rt(M))throw sr(Bn.INVALID_ARGUMENT);return He(Y,ke,tn({resolvedMessage:!0},M||{}))}function lt(...V){return Ve(Y=>Reflect.apply(Zf,null,[Y,...V]),()=>Yc(...V),"datetime format",Y=>Reflect.apply(Y.d,Y,[...V]),()=>Uf,Y=>we(Y))}function dt(...V){return Ve(Y=>Reflect.apply(Xf,null,[Y,...V]),()=>Xc(...V),"number format",Y=>Reflect.apply(Y.n,Y,[...V]),()=>Uf,Y=>we(Y))}function We(V){return V.map(Y=>we(Y)||Rt(Y)||xt(Y)?Qf(String(Y)):Y)}const me={normalize:We,interpolate:V=>V,type:"vnode"};function ce(...V){return Ve(Y=>{let ke;const M=Y;try{M.processor=me,ke=Reflect.apply(Kf,null,[M,...V])}finally{M.processor=null}return ke},()=>Zc(...V),"translate",Y=>Y[Jc](...V),Y=>[Qf(Y)],Y=>Ut(Y))}function ye(...V){return Ve(Y=>Reflect.apply(Xf,null,[Y,...V]),()=>Xc(...V),"number format",Y=>Y[ed](...V),tp,Y=>we(Y)||Ut(Y))}function Ue(...V){return Ve(Y=>Reflect.apply(Zf,null,[Y,...V]),()=>Yc(...V),"datetime format",Y=>Y[Qc](...V),tp,Y=>we(Y)||Ut(Y))}function Ge(V){D=V,T.pluralRules=D}function A(V,Y){return Ve(()=>{if(!V)return!1;const ke=we(Y)?Y:c.value,M=te(ke),H=T.messageResolver(M,V);return a?H!=null:ks(H)||Nn(H)||we(H)},()=>[V],"translate exists",ke=>Reflect.apply(ke.te,ke,[V,Y]),Vk,ke=>xt(ke))}function P(V){let Y=null;const ke=Ey(T,d.value,c.value);for(let M=0;M{l&&(c.value=V,T.locale=V,Ws(T,c.value,d.value))}),Tn(n.fallbackLocale,V=>{l&&(d.value=V,T.fallbackLocale=V,Ws(T,c.value,d.value))}));const se={id:np,locale:U,fallbackLocale:W,get inheritLocale(){return l},set inheritLocale(V){l=V,V&&n&&(c.value=n.locale.value,d.value=n.fallbackLocale.value,Ws(T,c.value,d.value))},get availableLocales(){return Object.keys(m.value).sort()},messages:ee,get modifiers(){return L},get pluralRules(){return D||{}},get isGlobal(){return o},get missingWarn(){return h},set missingWarn(V){h=V,T.missingWarn=h},get fallbackWarn(){return _},set fallbackWarn(V){_=V,T.fallbackWarn=_},get fallbackRoot(){return b},set fallbackRoot(V){b=V},get fallbackFormat(){return C},set fallbackFormat(V){C=V,T.fallbackFormat=C},get warnHtmlMessage(){return S},set warnHtmlMessage(V){S=V,T.warnHtmlMessage=V},get escapeParameter(){return k},set escapeParameter(V){k=V,T.escapeParameter=V},t:He,getLocaleMessage:te,setLocaleMessage:X,mergeLocaleMessage:ie,getPostTranslationHandler:ne,setPostTranslationHandler:ue,getMissingHandler:Ne,setMissingHandler:it,[Rk]:Ge};return se.datetimeFormats=fe,se.numberFormats=K,se.rt=at,se.te=A,se.tm=j,se.d=lt,se.n=dt,se.getDateTimeFormat=pe,se.setDateTimeFormat=E,se.mergeDateTimeFormat=$,se.getNumberFormat=R,se.setNumberFormat=oe,se.mergeNumberFormat=ae,se[Mk]=r,se[Jc]=ce,se[Qc]=Ue,se[ed]=ye,se}const sm={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:e=>e==="parent"||e==="global",default:"parent"},i18n:{type:Object}};function Uk({slots:e},t){return t.length===1&&t[0]==="default"?(e.default?e.default():[]).reduce((r,o)=>[...r,...o.type===ze?o.children:[o]],[]):t.reduce((n,r)=>{const o=e[r];return o&&(n[r]=o()),n},mt())}function Uy(e){return ze}const jk=Vr({name:"i18n-t",props:tn({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:e=>Rt(e)||!isNaN(e)}},sm),setup(e,t){const{slots:n,attrs:r}=t,o=e.i18n||im({useScope:e.scope,__useComponent:!0});return()=>{const s=Object.keys(n).filter(m=>m!=="_"),i=mt();e.locale&&(i.locale=e.locale),e.plural!==void 0&&(i.plural=we(e.plural)?+e.plural:e.plural);const a=Uk(t,s),l=o[Jc](e.keypath,a,i),c=tn(mt(),r),d=we(e.tag)||rt(e.tag)?e.tag:Uy();return zr(d,c,l)}}}),op=jk;function Bk(e){return Ut(e)&&!we(e[0])}function jy(e,t,n,r){const{slots:o,attrs:s}=t;return()=>{const i={part:!0};let a=mt();e.locale&&(i.locale=e.locale),we(e.format)?i.key=e.format:rt(e.format)&&(we(e.format.key)&&(i.key=e.format.key),a=Object.keys(e.format).reduce((f,p)=>n.includes(p)?tn(mt(),f,{[p]:e.format[p]}):f,mt()));const l=r(e.value,i,a);let c=[i.key];Ut(l)?c=l.map((f,p)=>{const h=o[f.type],_=h?h({[f.type]:f.value,index:p,parts:l}):[f.value];return Bk(_)&&(_[0].key=`${f.type}-${p}`),_}):we(l)&&(c=[l]);const d=tn(mt(),s),m=we(e.tag)||rt(e.tag)?e.tag:Uy();return zr(m,d,c)}}const Wk=Vr({name:"i18n-n",props:tn({value:{type:Number,required:!0},format:{type:[String,Object]}},sm),setup(e,t){const n=e.i18n||im({useScope:e.scope,__useComponent:!0});return jy(e,t,Dy,(...r)=>n[ed](...r))}}),sp=Wk,qk=Vr({name:"i18n-d",props:tn({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},sm),setup(e,t){const n=e.i18n||im({useScope:e.scope,__useComponent:!0});return jy(e,t,Ny,(...r)=>n[Qc](...r))}}),ip=qk;function Gk(e,t){const n=e;if(e.mode==="composition")return n.__getInstance(t)||e.global;{const r=n.__getInstance(t);return r!=null?r.__composer:e.global.__composer}}function Kk(e){const t=i=>{const{instance:a,modifiers:l,value:c}=i;if(!a||!a.$)throw sr(Bn.UNEXPECTED_ERROR);const d=Gk(e,a.$),m=ap(c);return[Reflect.apply(d.t,d,[...lp(m)]),d]};return{created:(i,a)=>{const[l,c]=t(a);ml&&e.global===c&&(i.__i18nWatcher=Tn(c.locale,()=>{a.instance&&a.instance.$forceUpdate()})),i.__composer=c,i.textContent=l},unmounted:i=>{ml&&i.__i18nWatcher&&(i.__i18nWatcher(),i.__i18nWatcher=void 0,delete i.__i18nWatcher),i.__composer&&(i.__composer=void 0,delete i.__composer)},beforeUpdate:(i,{value:a})=>{if(i.__composer){const l=i.__composer,c=ap(a);i.textContent=Reflect.apply(l.t,l,[...lp(c)])}},getSSRProps:i=>{const[a]=t(i);return{textContent:a}}}}function ap(e){if(we(e))return{path:e};if(Qe(e)){if(!("path"in e))throw sr(Bn.REQUIRED_VALUE,"path");return e}else throw sr(Bn.INVALID_VALUE)}function lp(e){const{path:t,locale:n,args:r,choice:o,plural:s}=e,i={},a=r||{};return we(n)&&(i.locale=n),Rt(o)&&(i.plural=o),Rt(s)&&(i.plural=s),[t,a,i]}function Zk(e,t,...n){const r=Qe(n[0])?n[0]:{},o=!!r.useI18nComponentName;(xt(r.globalInstall)?r.globalInstall:!0)&&([o?"i18n":op.name,"I18nT"].forEach(i=>e.component(i,op)),[sp.name,"I18nN"].forEach(i=>e.component(i,sp)),[ip.name,"I18nD"].forEach(i=>e.component(i,ip))),e.directive("t",Kk(t))}const Yk=go("global-vue-i18n");function Xk(e={},t){const n=xt(e.globalInjection)?e.globalInjection:!0,r=!0,o=new Map,[s,i]=Jk(e),a=go("");function l(m){return o.get(m)||null}function c(m,f){o.set(m,f)}function d(m){o.delete(m)}{const m={get mode(){return"composition"},get allowComposition(){return r},async install(f,...p){if(f.__VUE_I18N_SYMBOL__=a,f.provide(f.__VUE_I18N_SYMBOL__,m),Qe(p[0])){const b=p[0];m.__composerExtend=b.__composerExtend,m.__vueI18nExtend=b.__vueI18nExtend}let h=null;n&&(h=ix(f,m.global)),Zk(f,m,...p);const _=f.unmount;f.unmount=()=>{h&&h(),m.dispose(),_()}},get global(){return i},dispose(){s.stop()},__instances:o,__getInstance:l,__setInstance:c,__deleteInstance:d};return m}}function im(e={}){const t=cn();if(t==null)throw sr(Bn.MUST_BE_CALL_SETUP_TOP);if(!t.isCE&&t.appContext.app!=null&&!t.appContext.app.__VUE_I18N_SYMBOL__)throw sr(Bn.NOT_INSTALLED);const n=Qk(t),r=tx(n),o=Vy(t),s=ex(e,o);if(s==="global")return Fk(r,e,o),r;if(s==="parent"){let l=nx(n,t,e.__useComponent);return l==null&&(l=r),l}const i=n;let a=i.__getInstance(t);if(a==null){const l=tn({},e);"__i18n"in o&&(l.__i18n=o.__i18n),r&&(l.__root=r),a=Hy(l),i.__composerExtend&&(a[td]=i.__composerExtend(a)),ox(i,t,a),i.__setInstance(t,a)}return a}function Jk(e,t,n){const r=Nl();{const o=r.run(()=>Hy(e));if(o==null)throw sr(Bn.UNEXPECTED_ERROR);return[r,o]}}function Qk(e){{const t=Vn(e.isCE?Yk:e.appContext.app.__VUE_I18N_SYMBOL__);if(!t)throw sr(e.isCE?Bn.NOT_INSTALLED_WITH_PROVIDE:Bn.UNEXPECTED_ERROR);return t}}function ex(e,t){return su(e)?"__i18n"in t?"local":"global":e.useScope?e.useScope:"local"}function tx(e){return e.mode==="composition"?e.global:e.global.__composer}function nx(e,t,n=!1){let r=null;const o=t.root;let s=rx(t,n);for(;s!=null;){const i=e;if(e.mode==="composition"&&(r=i.__getInstance(s)),r!=null||o===s)break;s=s.parent}return r}function rx(e,t=!1){return e==null?null:t&&e.vnode.ctx||e.parent}function ox(e,t,n){Is(()=>{},t),qi(()=>{const r=n;e.__deleteInstance(t);const o=r[td];o&&(o(),delete r[td])},t)}const sx=["locale","fallbackLocale","availableLocales"],up=["t","rt","d","n","tm","te"];function ix(e,t){const n=Object.create(null);return sx.forEach(o=>{const s=Object.getOwnPropertyDescriptor(t,o);if(!s)throw sr(Bn.UNEXPECTED_ERROR);const i=St(s.value)?{get(){return s.value.value},set(a){s.value.value=a}}:{get(){return s.get&&s.get()}};Object.defineProperty(n,o,i)}),e.config.globalProperties.$i18n=n,up.forEach(o=>{const s=Object.getOwnPropertyDescriptor(t,o);if(!s||!s.value)throw sr(Bn.UNEXPECTED_ERROR);Object.defineProperty(e.config.globalProperties,`$${o}`,s)}),()=>{delete e.config.globalProperties.$i18n,up.forEach(o=>{delete e.config.globalProperties[`$${o}`]})}}Dk();ok(Ak);sk(FS);ik(Ey);if(__INTLIFY_PROD_DEVTOOLS__){const e=Qd();e.__INTLIFY__=!0,KS(e.__INTLIFY_DEVTOOLS_GLOBAL_HOOK__)}const Wu=e=>e&&typeof e=="object"&&!Array.isArray(e),nd=(e,...t)=>{if(!t.length)return e;const n=t.shift();if(Wu(e)&&Wu(n))for(const r in n)Wu(n[r])?(e[r]||Object.assign(e,{[r]:{}}),nd(e[r],n[r])):Object.assign(e,{[r]:n[r]});return nd(e,...t)},ax=nd({},{de:{data:{kind:{file:e=>{const{normalize:t}=e;return t(["Datei"])},url:e=>{const{normalize:t}=e;return t(["URL"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["Stream"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},help:e=>{const{normalize:t}=e;return t(["Hinzufügen eines Podcasts führt zur Anlage einer RSS-Playlist, so kann OwnTone das Podcast-Abo verwalten."])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-rss"])},processing:e=>{const{normalize:t}=e;return t(["Verarbeite…"])},title:e=>{const{normalize:t}=e;return t(["Podcast hinzufügen"])}},stream:{add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},loading:e=>{const{normalize:t}=e;return t(["Lade…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-stream"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},title:e=>{const{normalize:t}=e;return t(["Stream hinzufügen"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"added-on":e=>{const{normalize:t}=e;return t(["Hinzugefügt am"])},artist:e=>{const{normalize:t}=e;return t(["Album Künstler"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Markiere als gespielt"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Entferne podcast"])},tracks:e=>{const{normalize:t}=e;return t(["Track Nummer"])},type:e=>{const{normalize:t}=e;return t(["Art"])},year:e=>{const{normalize:t}=e;return t(["Jahr"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"added-on":e=>{const{normalize:t}=e;return t(["Hinzugefügt am"])},albums:e=>{const{normalize:t}=e;return t(["Alben"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Art"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},albums:e=>{const{normalize:t}=e;return t(["Alben"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},albums:e=>{const{normalize:t}=e;return t(["Alben"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Art"])},save:{cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},"playlist-name":e=>{const{normalize:t}=e;return t(["Playlistname"])},save:e=>{const{normalize:t}=e;return t(["Speichern"])},saving:e=>{const{normalize:t}=e;return t(["Speichere…"])},title:e=>{const{normalize:t}=e;return t(["Warteschlange als Playlist speichern"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["Album-Künstler"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["Komponist"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},quality:e=>{const{normalize:t}=e;return t(["Qualität"])},remove:e=>{const{normalize:t}=e;return t(["Entfernen"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["Album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["Künstler"])},type:e=>{const{normalize:t}=e;return t(["Art"])},year:e=>{const{normalize:t}=e;return t(["Jahr"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},pair:e=>{const{normalize:t}=e;return t(["Remote paaren"])},"pairing-code":e=>{const{normalize:t}=e;return t(["Pairing-Code"])},title:e=>{const{normalize:t}=e;return t(["Remote-Paarungs-Anfrage"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album-Künstler"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])},type:e=>{const{normalize:t}=e;return t(["Art"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},popularity:e=>{const{normalize:t}=e;return t(["Popularität / Followers"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},owner:e=>{const{normalize:t}=e;return t(["Besitzer"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album-Künstler"])},album:e=>{const{normalize:t}=e;return t(["Album"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Als nächstes hinzufügen"])},add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},"added-on":e=>{const{normalize:t}=e;return t(["Hinzugefügt am"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album-Künstler"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Kb/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["Kommentar"])},composer:e=>{const{normalize:t}=e;return t(["Komponist"])},duration:e=>{const{normalize:t}=e;return t(["Dauer"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["Markiere als neu"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Markiere als gespielt"])},path:e=>{const{normalize:t}=e;return t(["Pfad"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},quality:e=>{const{normalize:t}=e;return t(["Qualität"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["Bewertung"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["Album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["Künstler"])},type:e=>{const{normalize:t}=e;return t(["Art"])},year:e=>{const{normalize:t}=e;return t(["Jahr"])}},update:{all:e=>{const{normalize:t}=e;return t(["Alles neu einlesen"])},cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},feeds:e=>{const{normalize:t}=e;return t(["Nur RSS-Feeds neu einlesen"])},info:e=>{const{normalize:t}=e;return t(["Suche nach neuen, gelöschten und veränderten Dateien"])},local:e=>{const{normalize:t}=e;return t(["Nur lokale Bibliothek neu einlesen"])},progress:e=>{const{normalize:t}=e;return t(["Bibliothek wird neu eingelesen…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["Metadata von unveränderten Dateien neu einlesen"])},rescan:e=>{const{normalize:t}=e;return t(["Neu einlesen"])},spotify:e=>{const{normalize:t}=e;return t(["Nur Spotify neu einlesen"])},title:e=>{const{normalize:t}=e;return t(["Bibliothek neu einlesen"])}}},language:{de:e=>{const{normalize:t}=e;return t(["Deutsch"])},en:e=>{const{normalize:t}=e;return t(["Englisch (English)"])},fr:e=>{const{normalize:t}=e;return t(["Französisch (Français)"])},"zh-CN":e=>{const{normalize:t}=e;return t(["Vereinfachtes Chinesisch (簡體中文)"])},"zh-TW":e=>{const{normalize:t}=e;return t(["Traditionelles Chinesisch (繁體中文)"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["Diesen Podcast dauerhaft aus der Bibliothek löschen?"])},"info-2":e=>{const{normalize:t}=e;return t(["Dies wir auch RSS-Playlisten löschen "])},remove:e=>{const{normalize:t}=e;return t(["Entfernen"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Entferne podcast"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["Track kann nicht gespielt werden"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([", Beschränkungsgrund: ",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["Album"])},audiobook:e=>{const{normalize:t}=e;return t(["Hörbuch"])},music:e=>{const{normalize:t}=e;return t(["Musik"])},podcast:e=>{const{normalize:t}=e;return t(["Podcast"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["Über"])},albums:e=>{const{normalize:t}=e;return t(["Alben"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},audiobooks:e=>{const{normalize:t}=e;return t(["Hörbücher"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["HTTP-stream-Fehler: Stream kann nicht geladen werden oder wurde wg. Netzwerkfehler gestopt"])},stream:e=>{const{normalize:t}=e;return t(["HTTP-stream"])},volume:e=>{const{normalize:t}=e;return t(["Lautstärke"])},files:e=>{const{normalize:t}=e;return t(["Dateien"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},music:e=>{const{normalize:t}=e;return t(["Musik"])},playlists:e=>{const{normalize:t}=e;return t(["Playlisten"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},search:e=>{const{normalize:t}=e;return t(["Suche"])},settings:e=>{const{normalize:t}=e;return t(["Einstellungen"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["Bibliothek neu einlesen"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Oberfläche erstellt mit ",n(r("bulma")),", ",n(r("mdi")),", ",n(r("vuejs")),", ",n(r("axios"))," und ",n(r("others")),"."])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Compiliert mit Unterstützung von ",n(r("options")),"."])},library:e=>{const{normalize:t}=e;return t(["Bibliothek"])},more:e=>{const{normalize:t}=e;return t(["mehr"])},"total-playtime":e=>{const{normalize:t}=e;return t(["Gesamte Spielzeit"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},update:e=>{const{normalize:t}=e;return t(["Neu einlesen"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["vor ",n(r("time"))])},updated:e=>{const{normalize:t}=e;return t(["Neu eingelesen"])},uptime:e=>{const{normalize:t}=e;return t(["Laufzeit"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Version ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Singles und Alben angezeigt, die nur in Playlisten enthalten sind."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Singles angezeigt"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Alben angezeigt, die nur in der Spotify-Bibliothek enthalten sind."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Verbirgt Spotify-Alben"])},title:e=>{const{normalize:t}=e;return t(["Alben"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["Künstler › Name"])},"artist-date":e=>{const{normalize:t}=e;return t(["Künstler › Erscheinungsdatum"])},title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Name"])},"recently-added":e=>{const{normalize:t}=e;return t(["Kürzlich hinzugefügt"])},"recently-released":e=>{const{normalize:t}=e;return t(["Kürzlich erschienen"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung wird kein Inhalt angezeigt, der nur in der Spotify-Bibliothek enthalten ist."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Verbirgt Spotify-Inhalt"])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Bewertung"])},"release-date":e=>{const{normalize:t}=e;return t(["Erscheinungsdatum"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("count"))," Künstler"])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},sort:{title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Namen"])},"recently-added":e=>{const{normalize:t}=e;return t(["Kürzlich hinzugefügt"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Singles und Alben angezeigt, die nur in Playlisten enthalten sind."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Singles angezeigt"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Nach Aktivierung werden keine Alben angezeigt, die nur in der Spotify-Bibliothek enthalten sind."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Verbirgt Künstler auf Spotify"])},title:e=>{const{normalize:t}=e;return t(["Künstler"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["Spielen"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Hörbuch"]),t([n(r("count"))," Hörbuch"]),t([n(r("count"))," Hörbücher"])])},title:e=>{const{normalize:t}=e;return t(["Hörbücher"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},play:e=>{const{normalize:t}=e;return t(["Spielen"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Autor"]),t([n(r("count"))," Autor"]),t([n(r("count"))," Autoren"])])},title:e=>{const{normalize:t}=e;return t(["Autoren"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["Autoren"])},audiobooks:e=>{const{normalize:t}=e;return t(["Hörbücher"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Bewertung"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Komponist"]),t([n(r("count"))," Komponist"]),t([n(r("count"))," Komponisten"])])},title:e=>{const{normalize:t}=e;return t(["Komponisten"])}},files:{play:e=>{const{normalize:t}=e;return t(["Spielen"])},title:e=>{const{normalize:t}=e;return t(["Dateien"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sortieren"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Bewertung"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Genre"]),t([n(r("count"))," Genre"]),t([n(r("count"))," Genres"])])},title:e=>{const{normalize:t}=e;return t(["Genres"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["Zeige mehr"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["Kürzlich hinzugefügt"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["Kürzlich gespielt"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["Alben"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},composers:e=>{const{normalize:t}=e;return t(["Komponisten"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},history:e=>{const{normalize:t}=e;return t(["Verlauf"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["Tracks durch Auswählen aus der Bibliothek anfügen"])},live:e=>{const{normalize:t}=e;return t(["Live"])},title:e=>{const{normalize:t}=e;return t(["Deine Playliste ist leer."])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," Tracks"])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["Playlisten"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Playlist"]),t([n(r("count"))," Playlisten"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["Abbrechen"])},play:e=>{const{normalize:t}=e;return t(["Spielen"])},remove:e=>{const{normalize:t}=e;return t(["Entfernen"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["Diesen Podcast wirklich dauerhaft aus der Bibliothek löschen?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["Damit wird auch die RSS-Playliste gelöscht. "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Entferne podcast"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["Hinzufügen"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Podcast"]),t([n(r("count"))," Podcasts"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["Alle abgespielten markieren"])},"new-episodes":e=>{const{normalize:t}=e;return t(["Neue Episoden"])},title:e=>{const{normalize:t}=e;return t(["Podcasts"])},update:e=>{const{normalize:t}=e;return t(["Neu einlesen"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["Stream hinzufügen"])},clear:e=>{const{normalize:t}=e;return t(["Alle entfernen"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},edit:e=>{const{normalize:t}=e;return t(["Bearbeiten"])},"hide-previous":e=>{const{normalize:t}=e;return t(["Vorherige verbergen"])},title:e=>{const{normalize:t}=e;return t(["Warteschlange"])},save:e=>{const{normalize:t}=e;return t(["Speichern"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Station"]),t([n(r("count"))," Station"]),t([n(r("count"))," Stationen"])])},title:e=>{const{normalize:t}=e;return t(["Radio"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Alben"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},audiobooks:e=>{const{normalize:t}=e;return t(["Hörbücher"])},composers:e=>{const{normalize:t}=e;return t(["Komponisten"])},expression:e=>{const{normalize:t}=e;return t(["Ausdrücken"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Tip: Du kannst mit einer Smart-Playlist-Abfrage-Sprache nach ",n(r("help"))," suchen wenn Du dem Ausdruck ein ",n(r("query"))," voranstellst."])},"no-results":e=>{const{normalize:t}=e;return t(["Keine Ergebnisse gefunden"])},placeholder:e=>{const{normalize:t}=e;return t(["Suche"])},playlists:e=>{const{normalize:t}=e;return t(["Playlisten"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige das Album"]),t(["Zeige alle ",n(r("count"))," Alben"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Künstler"]),t(["Zeige alle ",n(r("count"))," Künstler"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige das Buch"]),t(["Zeige alle ",n(r("count"))," Hörbücher"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Komponist"]),t(["Zeige alle ",n(r("count"))," Komponisten"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige die Playlist"]),t(["Zeige alle ",n(r("count"))," Playlisten"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Podcast"]),t(["Zeige alle ",n(r("count"))," Podcasts"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Track"]),t(["Zeige alle ",n(r("count"))," Tracks"])])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},tabs:{library:e=>{const{normalize:t}=e;return t(["Bibliothek"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{title:e=>{const{normalize:t}=e;return t(["Artwork"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["OwnTone verarbeitet PNG- und JPEG-Artwork, welches in einer eigenen Datei in der Bibliothek, in die Dateien eingebettet oder online von Radiostationen bereitgestellt werden kann."])},"explanation-2":e=>{const{normalize:t}=e;return t(["Zusätzlich kann auf folgende Artwork-Anbieter zugegriffen werden:"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},streaming:e=>{const{normalize:t}=e;return t(["Bereitgestellte Artwork von Radiostationen ignorieren"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["Keine aktive Pairing-Anfrage"])},"pairing-code":e=>{const{normalize:t}=e;return t(["Pairing-Code"])},"pairing-request":e=>{const{normalize:t}=e;return t(["Remote-Pairing-Anfrage von "])},pairing:e=>{const{normalize:t}=e;return t(["Pairing Remote"])},send:e=>{const{normalize:t}=e;return t(["Senden"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["Wenn der Laufsprecher PIN-basiertes Pairing verlangt, aktiviere ihn hier und gib dann den hier PIN an, der am Lautsprecher angezeigt wird."])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["Lautsprecher-Pairing und Geräteverifikation"])},"verification-code":e=>{const{normalize:t}=e;return t(["Verifikationscode"])},verify:e=>{const{normalize:t}=e;return t(["Verifizieren"])}},general:{"album-lists":e=>{const{normalize:t}=e;return t(["Album-Listen"])},audiobooks:e=>{const{normalize:t}=e;return t(["Hörbücher"])},files:e=>{const{normalize:t}=e;return t(["Dateien"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},language:e=>{const{normalize:t}=e;return t(["Sprache"])},music:e=>{const{normalize:t}=e;return t(["Musik"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["Wenn mehr Dateien ausgewählt werden, als der Bildschirm anzeigen kann, verschwindet das Burger-Menü."])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["Wähle hier die Einträge des oberen Navigationsmenüs "])},"navigation-items":e=>{const{normalize:t}=e;return t(["Navigationsmenüs"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["Aktuell läuft-Seite"])},playlists:e=>{const{normalize:t}=e;return t(["Playlisten"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(['Beschränkte die Zahl der Alben auf der "kürzlich hinzugefügt"-Seite'])},"recently-added-page":e=>{const{normalize:t}=e;return t(["Kürzlich hinzugefügt-Seite"])},search:e=>{const{normalize:t}=e;return t(["Suche"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(['Komma-separierte Liste der Genres, wo der Komponist auf der "Aktuell läuft"-Seite angezeigt werden soll'])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["Leer lassen, um ihn immer anzuzeigen."])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(['Der Genre-Tag des aktuellen Tracks wird abgeglichen als Teil-String des Genre-Tags. Z.B. "classical, soundtrack" wird den Komponisten beim Genre-Tag "Contemporary Classical" anzeigen'])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["Zeige den Komponisten für die aufgelisteten Genres an"])},"show-composer-info":e=>{const{normalize:t}=e;return t(['Wenn aktiviert, wird der Komponist auf der "Aktuell läuft"-Seite angezeigt.'])},"show-composer":e=>{const{normalize:t}=e;return t(["Komponisten anzeigen"])},"show-coverart":e=>{const{normalize:t}=e;return t(["Zeige Cover-Artwork in der Albumliste"])},"show-path":e=>{const{normalize:t}=e;return t(['Dateipfad auf der "Aktuell läuft"-Seite anzeigen'])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["Melde Dich mit Deinem Last.fm-Benutzernamen und Passwort an, um Scrobbeln zu aktivieren"])},info:e=>{const{normalize:t}=e;return t(["OwnTone wird den Benutzernamen und das Passwort von last.fm nicht speichern, nur den Sitzungs-Schlüssel. Dieser läuft nicht ab."])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["OwnTone wurde ohne Unterstützung für Last.fm erstellt."])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["OwnTone wurde entweder ohne Unterstützung für Spotify erstellt oder libspotify ist nicht installiert."])},"logged-as":e=>{const{normalize:t}=e;return t(["Angemeldet als "])},requirements:e=>{const{normalize:t}=e;return t(["Spotify Premium Abo erforderlich."])},scopes:e=>{const{normalize:t}=e;return t(["Zugriff auf die Spotify Web-Api ermöglicht scannen der Spotify-Blibliothek. Erforderliche scopes sind: "])},user:e=>{const{normalize:t}=e;return t(["Zugriff gestattet für "])},authorize:e=>{const{normalize:t}=e;return t(["Authorisiere Web-API-Zugriff"])},"grant-access":e=>{const{normalize:t}=e;return t(["Zugriff auf die Spotify Web-API gestatten"])},reauthorize:e=>{const{normalize:t}=e;return t(["Bitte den Zugriff der Web-API durch setzen folgender Zugriffsrechte für OwnTone: "])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["Einloggen"])},logout:e=>{const{normalize:t}=e;return t(["Ausloggen"])},password:e=>{const{normalize:t}=e;return t(["Passwort"])},username:e=>{const{normalize:t}=e;return t(["Benutzername"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["Artwork"])},general:e=>{const{normalize:t}=e;return t(["Allgemein"])},"online-services":e=>{const{normalize:t}=e;return t(["Online-Services"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["Fernbedienungen und Ausgänge"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Album"]),t([n(r("count"))," Album"]),t([n(r("count"))," Alben"])])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["Ausgezeichnete Playlisten"])},"new-releases":e=>{const{normalize:t}=e;return t(["Neuvorstellung"])},"show-more":e=>{const{normalize:t}=e;return t(["Zeige mehr"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track"]),t([n(r("count"))," Track"]),t([n(r("count"))," Tracks"])])},shuffle:e=>{const{normalize:t}=e;return t(["Zufallswiedergabe"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Alben"])},artists:e=>{const{normalize:t}=e;return t(["Künstler"])},"no-results":e=>{const{normalize:t}=e;return t(["Keine Ergebnisse gefunden"])},placeholder:e=>{const{normalize:t}=e;return t(["Suche"])},playlists:e=>{const{normalize:t}=e;return t(["Playlisten"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige das Album"]),t(["Zeige alle ",n(r("count"))," Alben"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Künstler"]),t(["Zeige alle ",n(r("count"))," Künstler"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige die Playlist"]),t(["Zeige alle ",n(r("count"))," Playlisten"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Zeige den Track"]),t(["Zeige alle ",n(r("count"))," Tracks"])])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["Ordner"])},plain:e=>{const{normalize:t}=e;return t(["Einfache"])},smart:e=>{const{normalize:t}=e;return t(["Intelligente"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["Verlauf löschen"])},pause:e=>{const{normalize:t}=e;return t(["Wiedergabe anhalten"])},play:e=>{const{normalize:t}=e;return t(["Wiedergeben"])},repeat:e=>{const{normalize:t}=e;return t(["Alle Tracks wiederholen"])},"repeat-off":e=>{const{normalize:t}=e;return t(["Tracks einmal lesen"])},"repeat-once":e=>{const{normalize:t}=e;return t(["Aktuellen Track wiederholen"])},"seek-backward":e=>{const{normalize:t}=e;return t(["Rückwärts im Track suchen"])},"seek-forward":e=>{const{normalize:t}=e;return t(["Vorwärts im Track suchen"])},shuffle:e=>{const{normalize:t}=e;return t(["Tracks zufällig wiedergeben"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["Tracks in Reihenfolge wiedergeben"])},"skip-backward":e=>{const{normalize:t}=e;return t(["Zum vorherigen Track springen"])},"skip-forward":e=>{const{normalize:t}=e;return t(["Zum nächsten Track springen"])},stop:e=>{const{normalize:t}=e;return t(["Wiedergabe stoppen"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["Liedtexte anzeigen/verbergen"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (Fehler beim Speichern der Einstellungen)"])},saved:e=>{const{normalize:t}=e;return t([" (Einstellungen gesichert)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["Fehler bei Verbindung zum OwnTone-Server"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Anfrage gescheitert (Status: ",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Warteschlange zu Playlist ",n(r("name"))," gesichert"])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Track an die Abspielliste angehängt"]),t([n(r("count"))," Tracks an die Abspielliste angehängt"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["Warteschlange ist leer"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["Heute"])},"last-week":e=>{const{normalize:t}=e;return t(["Letzte Woche"])},"last-month":e=>{const{normalize:t}=e;return t(["Letzer Monat"])},undefined:e=>{const{normalize:t}=e;return t(["Unbestimmt"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["Mono"])},stereo:e=>{const{normalize:t}=e;return t(["Stereo"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," Kanal"]),t([n(r("count"))," Kanäle"])])}}}},{en:{data:{kind:{file:e=>{const{normalize:t}=e;return t(["File"])},url:e=>{const{normalize:t}=e;return t(["URL"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["Stream"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["Add"])},cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},help:e=>{const{normalize:t}=e;return t(["Adding a podcast includes creating an RSS playlist, that will allow OwnTone to manage the podcast subscription."])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-rss"])},processing:e=>{const{normalize:t}=e;return t(["Processing…"])},title:e=>{const{normalize:t}=e;return t(["Add podcast"])}},stream:{add:e=>{const{normalize:t}=e;return t(["Add"])},cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},loading:e=>{const{normalize:t}=e;return t(["Loading…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-stream"])},play:e=>{const{normalize:t}=e;return t(["Play"])},title:e=>{const{normalize:t}=e;return t(["Add stream"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"added-on":e=>{const{normalize:t}=e;return t(["Added on"])},artist:e=>{const{normalize:t}=e;return t(["Album artist"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Mark as played"])},play:e=>{const{normalize:t}=e;return t(["Play"])},"release-date":e=>{const{normalize:t}=e;return t(["Release date"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Remove podcast"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Year"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"added-on":e=>{const{normalize:t}=e;return t(["Added On"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},play:e=>{const{normalize:t}=e;return t(["Play"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Type"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},play:e=>{const{normalize:t}=e;return t(["Play"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},play:e=>{const{normalize:t}=e;return t(["Play"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},play:e=>{const{normalize:t}=e;return t(["Play"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},play:e=>{const{normalize:t}=e;return t(["Play"])},path:e=>{const{normalize:t}=e;return t(["Path"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},type:e=>{const{normalize:t}=e;return t(["Type"])},save:{cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},"playlist-name":e=>{const{normalize:t}=e;return t(["Playlist name"])},save:e=>{const{normalize:t}=e;return t(["Save"])},saving:e=>{const{normalize:t}=e;return t(["Saving…"])},title:e=>{const{normalize:t}=e;return t(["Save queue to playlist"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["Album Artist"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["Composer"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},path:e=>{const{normalize:t}=e;return t(["Path"])},play:e=>{const{normalize:t}=e;return t(["Play"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},quality:e=>{const{normalize:t}=e;return t(["Quality"])},remove:e=>{const{normalize:t}=e;return t(["Remove"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["artist"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Year"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},pair:e=>{const{normalize:t}=e;return t(["Pair Remote"])},"pairing-code":e=>{const{normalize:t}=e;return t(["Pairing code"])},title:e=>{const{normalize:t}=e;return t(["Remote pairing request"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album Artist"])},play:e=>{const{normalize:t}=e;return t(["Play"])},"release-date":e=>{const{normalize:t}=e;return t(["Release Date"])},type:e=>{const{normalize:t}=e;return t(["Type"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},play:e=>{const{normalize:t}=e;return t(["Play"])},popularity:e=>{const{normalize:t}=e;return t(["Popularity / Followers"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},owner:e=>{const{normalize:t}=e;return t(["Owner"])},path:e=>{const{normalize:t}=e;return t(["Path"])},play:e=>{const{normalize:t}=e;return t(["Play"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album Artist"])},album:e=>{const{normalize:t}=e;return t(["Album"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},path:e=>{const{normalize:t}=e;return t(["Path"])},play:e=>{const{normalize:t}=e;return t(["Play"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},"release-date":e=>{const{normalize:t}=e;return t(["Release Date"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Add Next"])},add:e=>{const{normalize:t}=e;return t(["Add"])},"added-on":e=>{const{normalize:t}=e;return t(["Added On"])},"album-artist":e=>{const{normalize:t}=e;return t(["Album Artist"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["Comment"])},composer:e=>{const{normalize:t}=e;return t(["Composer"])},duration:e=>{const{normalize:t}=e;return t(["Duration"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["Mark as new"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Mark as played"])},path:e=>{const{normalize:t}=e;return t(["Path"])},play:e=>{const{normalize:t}=e;return t(["Play"])},position:e=>{const{normalize:t}=e;return t(["Disc / Track"])},quality:e=>{const{normalize:t}=e;return t(["Quality"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["Rating"])},"release-date":e=>{const{normalize:t}=e;return t(["Release Date"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["artist"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Year"])}},update:{all:e=>{const{normalize:t}=e;return t(["Update everything"])},cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},feeds:e=>{const{normalize:t}=e;return t(["Only update RSS feeds"])},info:e=>{const{normalize:t}=e;return t(["Scan for new, deleted and modified files"])},local:e=>{const{normalize:t}=e;return t(["Only update local library"])},progress:e=>{const{normalize:t}=e;return t(["Library update in progress…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["Rescan metadata of unmodified files"])},rescan:e=>{const{normalize:t}=e;return t(["Rescan"])},spotify:e=>{const{normalize:t}=e;return t(["Only update Spotify"])},title:e=>{const{normalize:t}=e;return t(["Update library"])}}},language:{de:e=>{const{normalize:t}=e;return t(["German (Deutsch)"])},en:e=>{const{normalize:t}=e;return t(["English"])},fr:e=>{const{normalize:t}=e;return t(["French (Français)"])},"zh-CN":e=>{const{normalize:t}=e;return t(["Simplified Chinese (簡體中文)"])},"zh-TW":e=>{const{normalize:t}=e;return t(["Traditional Chinese (繁體中文)"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["Permanently remove this podcast from your library?"])},"info-2":e=>{const{normalize:t}=e;return t(["This will also remove the RSS playlist "])},remove:e=>{const{normalize:t}=e;return t(["Remove"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Remove podcast"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["Track is not playable"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([", restriction reason: ",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["Album"])},audiobook:e=>{const{normalize:t}=e;return t(["Audiobook"])},music:e=>{const{normalize:t}=e;return t(["Music"])},podcast:e=>{const{normalize:t}=e;return t(["Podcast"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["About"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},audiobooks:e=>{const{normalize:t}=e;return t(["Audiobooks"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["HTTP stream error: failed to load stream or stopped loading due to network problem"])},stream:e=>{const{normalize:t}=e;return t(["HTTP stream"])},volume:e=>{const{normalize:t}=e;return t(["Volume"])},files:e=>{const{normalize:t}=e;return t(["Files"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},music:e=>{const{normalize:t}=e;return t(["Music"])},playlists:e=>{const{normalize:t}=e;return t(["Playlists"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},search:e=>{const{normalize:t}=e;return t(["Search"])},settings:e=>{const{normalize:t}=e;return t(["Settings"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["Update Library"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Web interface built with ",n(r("bulma")),", ",n(r("mdi")),", ",n(r("vuejs")),", ",n(r("axios"))," and ",n(r("others")),"."])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Compiled with support for ",n(r("options")),"."])},library:e=>{const{normalize:t}=e;return t(["Library"])},more:e=>{const{normalize:t}=e;return t(["more"])},"total-playtime":e=>{const{normalize:t}=e;return t(["Total playtime"])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},update:e=>{const{normalize:t}=e;return t(["Update"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("time"))," ago"])},updated:e=>{const{normalize:t}=e;return t(["Updated"])},uptime:e=>{const{normalize:t}=e;return t(["Uptime"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Version ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["If active, hides singles and albums with tracks that only appear in playlists."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Hide singles"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["If active, hides albums that only appear in your Spotify library."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Hide albums from Spotify"])},title:e=>{const{normalize:t}=e;return t(["Albums"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["Artist › Name"])},"artist-date":e=>{const{normalize:t}=e;return t(["Artist › Release date"])},title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},"recently-added":e=>{const{normalize:t}=e;return t(["Recently added"])},"recently-released":e=>{const{normalize:t}=e;return t(["Recently released"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["If active, hides the content only appearing in your Spotify library."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Hide the content from Spotify"])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Rating"])},"release-date":e=>{const{normalize:t}=e;return t(["Release date"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," artist"]),t([n(r("count"))," artist"]),t([n(r("count"))," artists"])])},filter:e=>{const{normalize:t}=e;return t(["Filter"])},sort:{title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},"recently-added":e=>{const{normalize:t}=e;return t(["Recently added"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["If active, hides artists that only appear on singles or playlists."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Hide singles"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["If active, hides artists that only appear in your Spotify library."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Hide artists from Spotify"])},title:e=>{const{normalize:t}=e;return t(["Artists"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["Play"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," audiobook"]),t([n(r("count"))," audiobook"]),t([n(r("count"))," audiobooks"])])},title:e=>{const{normalize:t}=e;return t(["Audiobooks"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},play:e=>{const{normalize:t}=e;return t(["Play"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," author"]),t([n(r("count"))," author"]),t([n(r("count"))," authors"])])},title:e=>{const{normalize:t}=e;return t(["Authors"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["Authors"])},audiobooks:e=>{const{normalize:t}=e;return t(["Audiobooks"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Rating"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," composer"]),t([n(r("count"))," composer"]),t([n(r("count"))," composers"])])},title:e=>{const{normalize:t}=e;return t(["Composers"])}},files:{play:e=>{const{normalize:t}=e;return t(["Play"])},title:e=>{const{normalize:t}=e;return t(["Files"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Sort"])},name:e=>{const{normalize:t}=e;return t(["Name"])},rating:e=>{const{normalize:t}=e;return t(["Rating"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," genre"]),t([n(r("count"))," genre"]),t([n(r("count"))," genres"])])},title:e=>{const{normalize:t}=e;return t(["Genres"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["Show more"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["Recently added"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["Recently played"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},composers:e=>{const{normalize:t}=e;return t(["Composers"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},history:e=>{const{normalize:t}=e;return t(["History"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["Add some tracks by browsing your library"])},live:e=>{const{normalize:t}=e;return t(["Live"])},title:e=>{const{normalize:t}=e;return t(["Your play queue is empty"])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," tracks"])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["Playlists"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," playlist"]),t([n(r("count"))," playlist"]),t([n(r("count"))," playlists"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["Cancel"])},play:e=>{const{normalize:t}=e;return t(["Play"])},remove:e=>{const{normalize:t}=e;return t(["Remove"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["Permanently remove this podcast from your library?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["This will also remove the RSS playlist "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Remove podcast"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["Add"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," podcast"]),t([n(r("count"))," podcast"]),t([n(r("count"))," podcasts"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["Mark All Played"])},"new-episodes":e=>{const{normalize:t}=e;return t(["New Episodes"])},title:e=>{const{normalize:t}=e;return t(["Podcasts"])},update:e=>{const{normalize:t}=e;return t(["Update"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["Add stream"])},clear:e=>{const{normalize:t}=e;return t(["Clear"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},edit:e=>{const{normalize:t}=e;return t(["Edit"])},"hide-previous":e=>{const{normalize:t}=e;return t(["Hide previous"])},title:e=>{const{normalize:t}=e;return t(["Queue"])},save:e=>{const{normalize:t}=e;return t(["Save"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," station"]),t([n(r("count"))," station"]),t([n(r("count"))," stations"])])},title:e=>{const{normalize:t}=e;return t(["Radio"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},audiobooks:e=>{const{normalize:t}=e;return t(["Audiobooks"])},composers:e=>{const{normalize:t}=e;return t(["Composers"])},expression:e=>{const{normalize:t}=e;return t(["expression"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Tip: you can search by a smart playlist query language ",n(r("help"))," if you prefix it with ",n(r("query")),"."])},"no-results":e=>{const{normalize:t}=e;return t(["No results found"])},placeholder:e=>{const{normalize:t}=e;return t(["Search"])},playlists:e=>{const{normalize:t}=e;return t(["Playlists"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the album"]),t(["Show all ",n(r("count"))," albums"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the artist"]),t(["Show all ",n(r("count"))," artists"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the audiobook"]),t(["Show all ",n(r("count"))," audiobooks"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the composer"]),t(["Show all ",n(r("count"))," composers"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the playlist"]),t(["Show all ",n(r("count"))," playlists"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the podcast"]),t(["Show all ",n(r("count"))," podcasts"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the track"]),t(["Show all ",n(r("count"))," tracks"])])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])},tabs:{library:e=>{const{normalize:t}=e;return t(["Library"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{title:e=>{const{normalize:t}=e;return t(["Artwork"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["OwnTone supports PNG and JPEG artwork which is either placed as separate image files in the library, embedded in the media files or made available online by radio stations."])},"explanation-2":e=>{const{normalize:t}=e;return t(["In addition to that, you can enable fetching artwork from the following artwork providers:"])},"show-coverart":e=>{const{normalize:t}=e;return t(["Show cover artwork in album list"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},streaming:e=>{const{normalize:t}=e;return t(["Ignore artwork provided by radio stations"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["No active pairing request."])},"pairing-code":e=>{const{normalize:t}=e;return t(["Pairing code"])},"pairing-request":e=>{const{normalize:t}=e;return t(["Remote pairing request from "])},pairing:e=>{const{normalize:t}=e;return t(["Remote Pairing"])},send:e=>{const{normalize:t}=e;return t(["Send"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["If your speaker requires pairing then activate it below and enter the PIN that it displays."])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["Speaker pairing and device verification"])},"verification-code":e=>{const{normalize:t}=e;return t(["Verification code"])},verify:e=>{const{normalize:t}=e;return t(["Verify"])}},general:{audiobooks:e=>{const{normalize:t}=e;return t(["Audiobooks"])},files:e=>{const{normalize:t}=e;return t(["Files"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},language:e=>{const{normalize:t}=e;return t(["Language"])},music:e=>{const{normalize:t}=e;return t(["Music"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["If you select more items than can be shown on your screen then the burger menu will disappear."])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["Select the top navigation bar menu items"])},"navigation-items":e=>{const{normalize:t}=e;return t(["Navigation Bar"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["Now playing page"])},playlists:e=>{const{normalize:t}=e;return t(["Playlists"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(['Limit the number of albums shown on the "Recently Added" page'])},"recently-added-page":e=>{const{normalize:t}=e;return t(["Recently added page"])},search:e=>{const{normalize:t}=e;return t(["Search"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(['Comma separated list of genres the composer should be displayed on the "Now playing page"'])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["Leave empty to always show the composer."])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(['The genre tag of the current track is matched by checking, if one of the defined genres are included. For example setting to "classical, soundtrack" will show the composer for tracks with a genre tag of "Contemporary Classical"'])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["Show composer only for listed genres"])},"show-composer-info":e=>{const{normalize:t}=e;return t(['If enabled the composer of the current playing track is shown on the "Now playing page"'])},"show-composer":e=>{const{normalize:t}=e;return t(["Show composer"])},"show-path":e=>{const{normalize:t}=e;return t(['Show filepath on the "Now playing" page'])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["Login with your Last.fm username and password to enable scrobbling"])},info:e=>{const{normalize:t}=e;return t(["OwnTone will not store your Last.fm username/password, only the session key. The session key does not expire."])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["OwnTone was built without support for Last.fm."])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["OwnTone was either built without support for Spotify or libspotify is not installed."])},"logged-as":e=>{const{normalize:t}=e;return t(["Logged in as "])},requirements:e=>{const{normalize:t}=e;return t(["You must have a Spotify premium account."])},scopes:e=>{const{normalize:t}=e;return t(["Access to the Spotify Web API enables scanning of your Spotify library. Required scopes are: "])},user:e=>{const{normalize:t}=e;return t(["Access granted for "])},authorize:e=>{const{normalize:t}=e;return t(["Authorize Web API access"])},"grant-access":e=>{const{normalize:t}=e;return t(["Grant access to the Spotify Web API"])},reauthorize:e=>{const{normalize:t}=e;return t(["Please reauthorize Web API access to grant OwnTone the following additional access rights: "])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["Login"])},logout:e=>{const{normalize:t}=e;return t(["Logout"])},password:e=>{const{normalize:t}=e;return t(["Password"])},username:e=>{const{normalize:t}=e;return t(["Username"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["Artwork"])},general:e=>{const{normalize:t}=e;return t(["General"])},"online-services":e=>{const{normalize:t}=e;return t(["Online Services"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["Remotes and Outputs"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["Featured Playlists"])},"new-releases":e=>{const{normalize:t}=e;return t(["New Releases"])},"show-more":e=>{const{normalize:t}=e;return t(["Show More"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track"]),t([n(r("count"))," track"]),t([n(r("count"))," tracks"])])},shuffle:e=>{const{normalize:t}=e;return t(["Shuffle"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artists"])},"no-results":e=>{const{normalize:t}=e;return t(["No results found"])},placeholder:e=>{const{normalize:t}=e;return t(["Search"])},playlists:e=>{const{normalize:t}=e;return t(["Playlists"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the album"]),t(["Show all ",n(r("count"))," albums"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the artist"]),t(["Show all ",n(r("count"))," artists"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the playlist"]),t(["Show all ",n(r("count"))," playlists"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Show the track"]),t(["Show all ",n(r("count"))," tracks"])])},tracks:e=>{const{normalize:t}=e;return t(["Tracks"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["Folder"])},plain:e=>{const{normalize:t}=e;return t(["Plain"])},smart:e=>{const{normalize:t}=e;return t(["Smart"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["Clear history"])},pause:e=>{const{normalize:t}=e;return t(["Pause"])},play:e=>{const{normalize:t}=e;return t(["Play"])},repeat:e=>{const{normalize:t}=e;return t(["Repeat all tracks"])},"repeat-off":e=>{const{normalize:t}=e;return t(["Read tracks once"])},"repeat-once":e=>{const{normalize:t}=e;return t(["Repeat current track"])},"seek-backward":e=>{const{normalize:t}=e;return t(["Seek backward in the track"])},"seek-forward":e=>{const{normalize:t}=e;return t(["Seek forward in the track"])},shuffle:e=>{const{normalize:t}=e;return t(["Play tracks randomly"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["Play tracks in order"])},"skip-backward":e=>{const{normalize:t}=e;return t(["Skip to previous track"])},"skip-forward":e=>{const{normalize:t}=e;return t(["Skip to next track"])},stop:e=>{const{normalize:t}=e;return t(["Stop"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["Toggle lyrics"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (error saving setting)"])},saved:e=>{const{normalize:t}=e;return t([" (setting saved)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["Failed to connect to OwnTone server"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Request failed (status: ",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Queue saved to playlist ",n(r("name"))])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," track appended to the queue"]),t([n(r("count"))," tracks appended to the queue"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["Queue is empty"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["Today"])},"last-week":e=>{const{normalize:t}=e;return t(["Last week"])},"last-month":e=>{const{normalize:t}=e;return t(["Last month"])},undefined:e=>{const{normalize:t}=e;return t(["Undefined"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["mono"])},stereo:e=>{const{normalize:t}=e;return t(["stereo"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," channel"]),t([n(r("count"))," channels"])])}}}},{fr:{data:{kind:{file:e=>{const{normalize:t}=e;return t(["Fichier"])},url:e=>{const{normalize:t}=e;return t(["URL"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["Flux"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["Ajouter"])},cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},help:e=>{const{normalize:t}=e;return t(["L’ajout d’un podcast inclut la création d’une liste de lecture RSS, qui permettra à OwnTone de gérer l’abonnement au podcast."])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-du-flux-rss"])},processing:e=>{const{normalize:t}=e;return t(["Traitement en cours…"])},title:e=>{const{normalize:t}=e;return t(["Ajouter un podcast"])}},stream:{add:e=>{const{normalize:t}=e;return t(["Ajouter"])},cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},loading:e=>{const{normalize:t}=e;return t(["Chargement…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-du-flux"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},title:e=>{const{normalize:t}=e;return t(["Ajouter un flux"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"added-on":e=>{const{normalize:t}=e;return t(["Ajouté le"])},artist:e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Marquer comme lu"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Supprimer le podcast"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Année"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"added-on":e=>{const{normalize:t}=e;return t(["Ajouté le"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},type:e=>{const{normalize:t}=e;return t(["Type"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},play:e=>{const{normalize:t}=e;return t(["Lire"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},type:e=>{const{normalize:t}=e;return t(["Type"])},save:{cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},"playlist-name":e=>{const{normalize:t}=e;return t(["Nom de la liste de lecture"])},save:e=>{const{normalize:t}=e;return t(["Enregistrer"])},saving:e=>{const{normalize:t}=e;return t(["Enregistrement en cours…"])},title:e=>{const{normalize:t}=e;return t(["Enregistrer la file d’attente dans une liste de lecture"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["Compositeur"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},position:e=>{const{normalize:t}=e;return t(["Disque / Piste"])},quality:e=>{const{normalize:t}=e;return t(["Qualité"])},remove:e=>{const{normalize:t}=e;return t(["Supprimer"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["artiste"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Année"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},pair:e=>{const{normalize:t}=e;return t(["Jumeler la télécommande"])},"pairing-code":e=>{const{normalize:t}=e;return t(["Code de jumelage"])},title:e=>{const{normalize:t}=e;return t(["Demande de jumelage de télécommande"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"album-artist":e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])},type:e=>{const{normalize:t}=e;return t(["Type"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},popularity:e=>{const{normalize:t}=e;return t(["Popularité / Abonnements"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},owner:e=>{const{normalize:t}=e;return t(["Propriétaire"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"album-artist":e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},album:e=>{const{normalize:t}=e;return t(["Album"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},position:e=>{const{normalize:t}=e;return t(["Disque / Piste"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["Ajouter ensuite"])},add:e=>{const{normalize:t}=e;return t(["Ajouter"])},"added-on":e=>{const{normalize:t}=e;return t(["Ajouté le"])},"album-artist":e=>{const{normalize:t}=e;return t(["Artiste de l’album"])},album:e=>{const{normalize:t}=e;return t(["Album"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["Commentaire"])},composer:e=>{const{normalize:t}=e;return t(["Compositeur"])},duration:e=>{const{normalize:t}=e;return t(["Durée"])},genre:e=>{const{normalize:t}=e;return t(["Genre"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["Marquer comme nouveau"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["Marquer comme lu"])},path:e=>{const{normalize:t}=e;return t(["Emplacement"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},position:e=>{const{normalize:t}=e;return t(["Disque / Piste"])},quality:e=>{const{normalize:t}=e;return t(["Qualité"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["Classement"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["album"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["artiste"])},type:e=>{const{normalize:t}=e;return t(["Type"])},year:e=>{const{normalize:t}=e;return t(["Année"])}},update:{all:e=>{const{normalize:t}=e;return t(["Tout actualiser"])},cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},feeds:e=>{const{normalize:t}=e;return t(["Actualiser uniquement les flux RSS"])},info:e=>{const{normalize:t}=e;return t(["Recherche les fichiers ajoutés, supprimés et modifiés"])},local:e=>{const{normalize:t}=e;return t(["Actualiser uniquement la bibliothèque locale"])},progress:e=>{const{normalize:t}=e;return t(["Actualisation de la bibliothèque en cours…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["Analyser les métadonnées des fichiers non modifiés"])},rescan:e=>{const{normalize:t}=e;return t(["Analyser"])},spotify:e=>{const{normalize:t}=e;return t(["Actualiser uniquement Spotify"])},title:e=>{const{normalize:t}=e;return t(["Actualiser la bibliothèque"])}}},language:{de:e=>{const{normalize:t}=e;return t(["Allemand (Deutsch)"])},en:e=>{const{normalize:t}=e;return t(["Anglais (English)"])},fr:e=>{const{normalize:t}=e;return t(["Français"])},"zh-CN":e=>{const{normalize:t}=e;return t(["Chinois simplifié (簡體中文)"])},"zh-TW":e=>{const{normalize:t}=e;return t(["Chinois traditionnel (繁體中文)"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["Supprimer définitivement ce podcast de votre bibliothèque ?"])},"info-2":e=>{const{normalize:t}=e;return t(["Cela supprimera également la liste de lecture RSS "])},remove:e=>{const{normalize:t}=e;return t(["Supprimer"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Supprimer le podcast"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["La piste ne peut pas être lue"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([", raison de la restriction : ",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["Album"])},audiobook:e=>{const{normalize:t}=e;return t(["Livre audio"])},music:e=>{const{normalize:t}=e;return t(["Musique"])},podcast:e=>{const{normalize:t}=e;return t(["Podcast"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["À propos"])},albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},audiobooks:e=>{const{normalize:t}=e;return t(["Livres audio"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["Erreur du flux HTTP : échec du chargement du flux ou arrêt du chargement en raison d’un problème réseau"])},stream:e=>{const{normalize:t}=e;return t(["Flux HTTP"])},volume:e=>{const{normalize:t}=e;return t(["Volume"])},files:e=>{const{normalize:t}=e;return t(["Fichiers"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},music:e=>{const{normalize:t}=e;return t(["Musique"])},playlists:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},search:e=>{const{normalize:t}=e;return t(["Recherche"])},settings:e=>{const{normalize:t}=e;return t(["Réglages"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["Actualiser la bibliothèque"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Interface utilisateur construite avec ",n(r("bulma")),", ",n(r("mdi")),", ",n(r("vuejs")),", ",n(r("axios"))," et ",n(r("others")),"."])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Compilé avec les options ",n(r("options")),"."])},library:e=>{const{normalize:t}=e;return t(["Bibliothèque"])},more:e=>{const{normalize:t}=e;return t(["plus"])},"total-playtime":e=>{const{normalize:t}=e;return t(["Durée totale de lecture"])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},update:e=>{const{normalize:t}=e;return t(["Actualiser"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["il y a ",n(r("time"))])},updated:e=>{const{normalize:t}=e;return t(["Mis à jour"])},uptime:e=>{const{normalize:t}=e;return t(["Temps de fonctionnement"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Version ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},filter:e=>{const{normalize:t}=e;return t(["Filtrer"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["Si actif, masque les singles et les albums dont les pistes n’apparaissent que dans les listes de lecture."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Masquer les singles"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Si actif, masque les albums qui n’apparaissent que dans votre bibliothèque Spotify."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Masquer les albums de Spotify"])},title:e=>{const{normalize:t}=e;return t(["Albums"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["Artiste › Nom"])},"artist-date":e=>{const{normalize:t}=e;return t(["Artiste › Date de sortie"])},title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},"recently-added":e=>{const{normalize:t}=e;return t(["Ajouts récents"])},"recently-released":e=>{const{normalize:t}=e;return t(["Sorties récentes"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},filter:e=>{const{normalize:t}=e;return t(["Filtrer"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Si actif, masque le contenu qui n’apparaît que dans votre bibliothèque Spotify."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Masquer le contenu de Spotify"])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},rating:e=>{const{normalize:t}=e;return t(["Classement"])},"release-date":e=>{const{normalize:t}=e;return t(["Date de sortie"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," artiste"]),t([n(r("count"))," artiste"]),t([n(r("count"))," artistes"])])},filter:e=>{const{normalize:t}=e;return t(["Filtrer"])},sort:{title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},"recently-added":e=>{const{normalize:t}=e;return t(["Ajouts récents"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["Si actif, masque les artistes qui n’apparaissent que dans des singles ou des listes de lecture."])},"hide-singles":e=>{const{normalize:t}=e;return t(["Masquer les singles"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["Si actif, masque les artistes qui n’apparaissent que dans votre bibliothèque Spotify."])},"hide-spotify":e=>{const{normalize:t}=e;return t(["Masquer les artistes de Spotify"])},title:e=>{const{normalize:t}=e;return t(["Artistes"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["Lire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," livre audio"]),t([n(r("count"))," livre audio"]),t([n(r("count"))," livres audio"])])},title:e=>{const{normalize:t}=e;return t(["Livres audio"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},play:e=>{const{normalize:t}=e;return t(["Lire"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," auteur"]),t([n(r("count"))," auteur"]),t([n(r("count"))," auteurs"])])},title:e=>{const{normalize:t}=e;return t(["Auteurs"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["Auteurs"])},audiobooks:e=>{const{normalize:t}=e;return t(["Livres audio"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},rating:e=>{const{normalize:t}=e;return t(["Classement"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," compositeur"]),t([n(r("count"))," compositeur"]),t([n(r("count"))," compositeurs"])])},title:e=>{const{normalize:t}=e;return t(["Compositeurs"])}},files:{play:e=>{const{normalize:t}=e;return t(["Lire"])},title:e=>{const{normalize:t}=e;return t(["Fichiers"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},sort:{title:e=>{const{normalize:t}=e;return t(["Trier"])},name:e=>{const{normalize:t}=e;return t(["Nom"])},rating:e=>{const{normalize:t}=e;return t(["Classement"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," genre"]),t([n(r("count"))," genre"]),t([n(r("count"))," genres"])])},title:e=>{const{normalize:t}=e;return t(["Genres"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["Afficher plus"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["Ajouts récents"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["Lectures récentes"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},composers:e=>{const{normalize:t}=e;return t(["Compositeurs"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},history:e=>{const{normalize:t}=e;return t(["Historique"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["Ajoutez des pistes en parcourant votre bibliothèque"])},live:e=>{const{normalize:t}=e;return t(["En direct"])},title:e=>{const{normalize:t}=e;return t(["La file d’attente est vide"])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," pistes"])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," liste de lecture"]),t([n(r("count"))," liste de lecture"]),t([n(r("count"))," listes de lecture"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["Annuler"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},remove:e=>{const{normalize:t}=e;return t(["Supprimer"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["Supprimer ce podcast de manière permanente de la bibliothèque ?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["Cela supprimera également la liste de lecture RSS "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["Supprimer le podcast"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["Ajouter"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," podcast"]),t([n(r("count"))," podcast"]),t([n(r("count"))," podcasts"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["Marquer comme lus"])},"new-episodes":e=>{const{normalize:t}=e;return t(["Nouveaux épisodes"])},title:e=>{const{normalize:t}=e;return t(["Podcasts"])},update:e=>{const{normalize:t}=e;return t(["Actualiser"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["Ajouter un flux"])},clear:e=>{const{normalize:t}=e;return t(["Effacer"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},edit:e=>{const{normalize:t}=e;return t(["Éditer"])},"hide-previous":e=>{const{normalize:t}=e;return t(["Masquer l’historique"])},queue:e=>{const{normalize:t}=e;return t(["File d’attente"])},save:e=>{const{normalize:t}=e;return t(["Enregistrer"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," station"]),t([n(r("count"))," station"]),t([n(r("count"))," stations"])])},title:e=>{const{normalize:t}=e;return t(["Radio"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},audiobooks:e=>{const{normalize:t}=e;return t(["Livres audio"])},composers:e=>{const{normalize:t}=e;return t(["Compositeurs"])},expression:e=>{const{normalize:t}=e;return t(["expression"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["Astuce : vous pouvez effectuer une recherche avec une ",n(r("help"))," du langage de requête de liste de lecture intelligente en préfixant votre requête avec ",n(r("query"))])},"no-results":e=>{const{normalize:t}=e;return t(["Aucun résultat trouvé"])},placeholder:e=>{const{normalize:t}=e;return t(["Recherche"])},playlists:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher l’album"]),t(["Afficher les ",n(r("count"))," albums"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher l’artiste"]),t(["Afficher les ",n(r("count"))," artistes"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher le livre audio"]),t(["Afficher les ",n(r("count"))," livres audio"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher le compositeur"]),t(["Afficher les ",n(r("count"))," compositeurs"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher la liste de lecture"]),t(["Afficher les ",n(r("count"))," listes de lecture"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher le podcast"]),t(["Afficher les ",n(r("count"))," podcasts"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher la piste"]),t(["Afficher les ",n(r("n"))," pistes"])])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])},tabs:{library:e=>{const{normalize:t}=e;return t(["Bibliothèque"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{title:e=>{const{normalize:t}=e;return t(["Illustrations"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["OwnTone prend en charge les illustrations au format PNG et JPEG qui sont soit placées dans la bibliothèque en tant que fichiers image séparés, soit intégrées dans les fichiers média, soit mises à disposition en ligne par les stations de radio."])},"explanation-2":e=>{const{normalize:t}=e;return t(["En outre, vous pouvez activer la récupération des illustrations à partir des fournisseurs d’illustrations suivants :"])},"show-coverart":e=>{const{normalize:t}=e;return t(["Afficher les illustrations dans la liste d’albums"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},streaming:e=>{const{normalize:t}=e;return t(["Ignorer les illustrations fournies par les stations de radio"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["Aucune demande de jumelage active."])},"pairing-code":e=>{const{normalize:t}=e;return t(["Code de jumelage"])},"pairing-request":e=>{const{normalize:t}=e;return t(["Demande de jumelage de télécommande "])},pairing:e=>{const{normalize:t}=e;return t(["Jumelage de télécommande"])},send:e=>{const{normalize:t}=e;return t(["Envoyer"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["Si votre enceinte nécessite un jumelage, activez-la ci-dessous et entrez le code PIN qu’elle affiche."])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["Jumelage d’enceinte et vérification d’appareil"])},"verification-code":e=>{const{normalize:t}=e;return t(["Code de vérification"])},verify:e=>{const{normalize:t}=e;return t(["Vérifier"])}},general:{audiobooks:e=>{const{normalize:t}=e;return t(["Livres audio"])},files:e=>{const{normalize:t}=e;return t(["Fichiers"])},genres:e=>{const{normalize:t}=e;return t(["Genres"])},language:e=>{const{normalize:t}=e;return t(["Langue"])},music:e=>{const{normalize:t}=e;return t(["Musique"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["Si vous sélectionnez plus d’éléments que ce qui peut être affiché sur votre écran, le menu disparaîtra."])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["Sélectionnez les éléments de la barre de navigation supérieure"])},"navigation-items":e=>{const{normalize:t}=e;return t(["Barre de navigation"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["Page « En cours de lecture »"])},playlists:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcasts"])},radio:e=>{const{normalize:t}=e;return t(["Radio"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(["Limiter le nombre d’albums affichés dans la section « Ajouts récents »"])},"recently-added-page":e=>{const{normalize:t}=e;return t(["Page « Ajouts récents »"])},search:e=>{const{normalize:t}=e;return t(["Recherche"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(["Liste des genres, séparés par des virgules, que le compositeur doit afficher sur la page « En cours de lecture »."])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["Laissez vide pour toujours afficher le compositeur."])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(['L’étiquette de genre de la piste actuelle est comparée en vérifiant si l’un des genres définis est inclus. Par exemple, en choisissant "classique, bande sonore", le compositeur pour les pistes dont l’étiquette de genre est "classique contemporain" sera affiché.'])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["Afficher le compositeur uniquement pour les genres listés"])},"show-composer-info":e=>{const{normalize:t}=e;return t(["Si actif, le compositeur de la piste en cours de lecture est affiché sur la page « En cours de lecture »"])},"show-composer":e=>{const{normalize:t}=e;return t(["Afficher le compositeur"])},"show-path":e=>{const{normalize:t}=e;return t(["Afficher le chemin du fichier sur la page « En cours de lecture »"])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["Connectez-vous avec votre nom d’utilisateur et votre mot de passe Last.fm pour activer le scrobbling."])},info:e=>{const{normalize:t}=e;return t(["Le nom d’utilisateur et le mot de passe Last.fm ne sont pas enregistrés, uniquement la clé de session. La clé de session n’expire pas."])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["L’option Last.fm n’est pas présente."])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["L’option Spotify n’est pas présente."])},"logged-as":e=>{const{normalize:t}=e;return t(["Connecté en tant que "])},requirements:e=>{const{normalize:t}=e;return t(["Vous devez posséder un compte Spotify Premium."])},scopes:e=>{const{normalize:t}=e;return t(["L’accès à l’API de Spotify permet l’analyse de votre bibliothèque Spotify. Les champs d’application requis sont les suivants :"])},user:e=>{const{normalize:t}=e;return t(["Accès autorisé pour "])},authorize:e=>{const{normalize:t}=e;return t(["Autoriser l’accès à l’API"])},"grant-access":e=>{const{normalize:t}=e;return t(["Accordez l’accès à l’API de Spotify"])},reauthorize:e=>{const{normalize:t}=e;return t(["Veuillez autoriser à nouveau l’accès à l’API pour accorder à OwnTone les droits d’accès supplémentaires suivants :"])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["Se connecter"])},logout:e=>{const{normalize:t}=e;return t(["Se déconnecter"])},password:e=>{const{normalize:t}=e;return t(["Mot de passe"])},username:e=>{const{normalize:t}=e;return t(["Nom d’utilisateur"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["Illustrations"])},general:e=>{const{normalize:t}=e;return t(["Général"])},"online-services":e=>{const{normalize:t}=e;return t(["Services en ligne"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["Télécommandes et sorties"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," album"]),t([n(r("count"))," album"]),t([n(r("count"))," albums"])])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["Listes de lecture en vedette"])},"new-releases":e=>{const{normalize:t}=e;return t(["Nouvelle sorties"])},"show-more":e=>{const{normalize:t}=e;return t(["Afficher plus"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste"]),t([n(r("count"))," piste"]),t([n(r("count"))," pistes"])])},shuffle:e=>{const{normalize:t}=e;return t(["Lecture aléatoire"])}},search:{albums:e=>{const{normalize:t}=e;return t(["Albums"])},artists:e=>{const{normalize:t}=e;return t(["Artistes"])},"no-results":e=>{const{normalize:t}=e;return t(["Aucun résultat trouvé"])},placeholder:e=>{const{normalize:t}=e;return t(["Recherche"])},playlists:e=>{const{normalize:t}=e;return t(["Listes de lecture"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher l’album"]),t(["Afficher les ",n(r("count"))," albums"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher l’artiste"]),t(["Afficher les ",n(r("count"))," artistes"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher la liste de lecture"]),t(["Afficher les ",n(r("count"))," listes de lecture"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["Afficher la piste"]),t(["Afficher les ",n(r("count"))," pistes"])])},tracks:e=>{const{normalize:t}=e;return t(["Pistes"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["Dossier"])},plain:e=>{const{normalize:t}=e;return t(["Simple"])},smart:e=>{const{normalize:t}=e;return t(["Intelligente"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["Effacer l’historique"])},pause:e=>{const{normalize:t}=e;return t(["Mettre la lecture en pause"])},play:e=>{const{normalize:t}=e;return t(["Lire"])},repeat:e=>{const{normalize:t}=e;return t(["Répéter toutes les pistes"])},"repeat-off":e=>{const{normalize:t}=e;return t(["Lire les pistes une fois"])},"repeat-once":e=>{const{normalize:t}=e;return t(["Répéter la piste en cours"])},"seek-backward":e=>{const{normalize:t}=e;return t(["Reculer dans la piste"])},"seek-forward":e=>{const{normalize:t}=e;return t(["Avancer dans la piste"])},shuffle:e=>{const{normalize:t}=e;return t(["Lire les pistes aléatoirement"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["Lire les pistes dans l’ordre"])},"skip-backward":e=>{const{normalize:t}=e;return t(["Reculer à la piste précédente"])},"skip-forward":e=>{const{normalize:t}=e;return t(["Avancer à la piste suivante"])},stop:e=>{const{normalize:t}=e;return t(["Arrêter la lecture"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["Voir/Cacher les paroles"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (erreur à l’enregistrement du réglage)"])},saved:e=>{const{normalize:t}=e;return t([" (réglage enregistré)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["Échec de connexion au serveur"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["La requête a échoué (status: ",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["La file d’attente enregistrée dans la liste de lecture ",n(r("name"))])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," piste ajoutée à la file d’attente"]),t([n(r("count"))," pistes ajoutées à la file d’attente"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["La file d’attente est vide"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["Aujourd’hui"])},"last-week":e=>{const{normalize:t}=e;return t(["La semaine dernière"])},"last-month":e=>{const{normalize:t}=e;return t(["Le mois dernier"])},undefined:e=>{const{normalize:t}=e;return t(["Indéfini"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["mono"])},stereo:e=>{const{normalize:t}=e;return t(["stéréo"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," canal"]),t([n(r("count"))," canaux"])])}}}},{"zh-CN":{data:{kind:{file:e=>{const{normalize:t}=e;return t(["文件"])},url:e=>{const{normalize:t}=e;return t(["链接"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["流"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["添加"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},help:e=>{const{normalize:t}=e;return t(["添加一个可生成播放列表的播客RSS链接,这将允许OwnTone管理订阅"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-rss"])},processing:e=>{const{normalize:t}=e;return t(["处理中…"])},title:e=>{const{normalize:t}=e;return t(["添加播客"])}},stream:{add:e=>{const{normalize:t}=e;return t(["添加"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},loading:e=>{const{normalize:t}=e;return t(["加载中…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-stream"])},play:e=>{const{normalize:t}=e;return t(["播放"])},title:e=>{const{normalize:t}=e;return t(["添加流"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"added-on":e=>{const{normalize:t}=e;return t(["添加时间"])},artist:e=>{const{normalize:t}=e;return t(["专辑艺人"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["标记为已播"])},play:e=>{const{normalize:t}=e;return t(["播放"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除播客"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])},type:e=>{const{normalize:t}=e;return t(["类型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"added-on":e=>{const{normalize:t}=e;return t(["添加时间"])},albums:e=>{const{normalize:t}=e;return t(["张专辑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])},type:e=>{const{normalize:t}=e;return t(["类型"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},albums:e=>{const{normalize:t}=e;return t(["张专辑"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},play:e=>{const{normalize:t}=e;return t(["播放"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},albums:e=>{const{normalize:t}=e;return t(["张专辑"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},play:e=>{const{normalize:t}=e;return t(["播放"])},path:e=>{const{normalize:t}=e;return t(["路径"])},tracks:e=>{const{normalize:t}=e;return t(["只曲目"])},type:e=>{const{normalize:t}=e;return t(["类型"])},save:{cancel:e=>{const{normalize:t}=e;return t(["取消"])},"playlist-name":e=>{const{normalize:t}=e;return t(["播放列表名称"])},save:e=>{const{normalize:t}=e;return t(["保存"])},saving:e=>{const{normalize:t}=e;return t(["保存中…"])},title:e=>{const{normalize:t}=e;return t(["保存播放清单到列表"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["专辑艺人"])},album:e=>{const{normalize:t}=e;return t(["专辑"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["作曲家"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},genre:e=>{const{normalize:t}=e;return t(["流派"])},path:e=>{const{normalize:t}=e;return t(["路径"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盘符 / 曲目"])},quality:e=>{const{normalize:t}=e;return t(["质量"])},remove:e=>{const{normalize:t}=e;return t(["移除"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["专辑"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["艺人"])},type:e=>{const{normalize:t}=e;return t(["类型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["取消"])},pair:e=>{const{normalize:t}=e;return t(["遥控配对"])},"pairing-code":e=>{const{normalize:t}=e;return t(["配对码"])},title:e=>{const{normalize:t}=e;return t(["请求遥控配对"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"album-artist":e=>{const{normalize:t}=e;return t(["专辑艺人"])},play:e=>{const{normalize:t}=e;return t(["播放"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])},type:e=>{const{normalize:t}=e;return t(["类型"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},genres:e=>{const{normalize:t}=e;return t(["流派"])},play:e=>{const{normalize:t}=e;return t(["播放"])},popularity:e=>{const{normalize:t}=e;return t(["流行度 / 粉丝数"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},owner:e=>{const{normalize:t}=e;return t(["所有者"])},path:e=>{const{normalize:t}=e;return t(["路径"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"album-artist":e=>{const{normalize:t}=e;return t(["专辑艺人"])},album:e=>{const{normalize:t}=e;return t(["专辑"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},path:e=>{const{normalize:t}=e;return t(["路径"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盘符 / 曲目"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["添加"])},"added-on":e=>{const{normalize:t}=e;return t(["添加时间"])},"album-artist":e=>{const{normalize:t}=e;return t(["专辑艺人"])},album:e=>{const{normalize:t}=e;return t(["专辑"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["评论"])},composer:e=>{const{normalize:t}=e;return t(["作曲家"])},duration:e=>{const{normalize:t}=e;return t(["时长"])},genre:e=>{const{normalize:t}=e;return t(["流派"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["标记为最新"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["标记为已播放"])},path:e=>{const{normalize:t}=e;return t(["路径"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盘符 / 曲目"])},quality:e=>{const{normalize:t}=e;return t(["质量"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["评级"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["专辑"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["艺人"])},type:e=>{const{normalize:t}=e;return t(["类型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},update:{all:e=>{const{normalize:t}=e;return t(["更新所有内容"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},feeds:e=>{const{normalize:t}=e;return t(["仅更新RSS订阅内容"])},info:e=>{const{normalize:t}=e;return t(["扫描新的、删除的和修改的文件"])},local:e=>{const{normalize:t}=e;return t(["仅更新本地资料库"])},progress:e=>{const{normalize:t}=e;return t(["正在更新本地资料库…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["重新扫描未修改文件的元数据"])},rescan:e=>{const{normalize:t}=e;return t(["重新扫描"])},spotify:e=>{const{normalize:t}=e;return t(["仅更新Spotify"])},title:e=>{const{normalize:t}=e;return t(["更新资料库"])}}},language:{de:e=>{const{normalize:t}=e;return t(["德语 (Deutsch)"])},en:e=>{const{normalize:t}=e;return t(["英语 (English)"])},fr:e=>{const{normalize:t}=e;return t(["法语 (Français)"])},"zh-CN":e=>{const{normalize:t}=e;return t(["简体中文"])},"zh-TW":e=>{const{normalize:t}=e;return t(["繁體中文"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["从资料库中永久移除该播客吗?"])},"info-2":e=>{const{normalize:t}=e;return t(["这也将移除RSS播放列表 "])},remove:e=>{const{normalize:t}=e;return t(["移除"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除播客"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["曲目无法播放"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([",被限制原因:",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["专辑"])},audiobook:e=>{const{normalize:t}=e;return t(["有声读物"])},music:e=>{const{normalize:t}=e;return t(["音乐"])},podcast:e=>{const{normalize:t}=e;return t(["播客"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["关于"])},albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},audiobooks:e=>{const{normalize:t}=e;return t(["有声读物"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["HTTP流错误:流载入失败或者由于网络原因无法载入"])},stream:e=>{const{normalize:t}=e;return t(["HTTP流"])},volume:e=>{const{normalize:t}=e;return t(["音量"])},files:e=>{const{normalize:t}=e;return t(["文件"])},genres:e=>{const{normalize:t}=e;return t(["流派"])},music:e=>{const{normalize:t}=e;return t(["音乐"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["播客"])},radio:e=>{const{normalize:t}=e;return t(["广播电台"])},search:e=>{const{normalize:t}=e;return t(["搜索"])},settings:e=>{const{normalize:t}=e;return t(["设置"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["更新资料库"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["界面贡献者包括 ",n(r("bulma")),",",n(r("mdi")),",",n(r("vuejs")),",",n(r("axios"))," 和 ",n(r("others"))])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["编译支持来自于 ",n(r("options"))])},library:e=>{const{normalize:t}=e;return t(["资料库"])},more:e=>{const{normalize:t}=e;return t(["更多"])},"total-playtime":e=>{const{normalize:t}=e;return t(["总播放时长"])},tracks:e=>{const{normalize:t}=e;return t(["曲目总数"])},update:e=>{const{normalize:t}=e;return t(["更新"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("time"))," 前"])},updated:e=>{const{normalize:t}=e;return t(["更新于"])},uptime:e=>{const{normalize:t}=e;return t(["运行时长"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["版本 ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},filter:e=>{const{normalize:t}=e;return t(["筛选"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏仅在播放列表出现的单曲和专辑"])},"hide-singles":e=>{const{normalize:t}=e;return t(["隐藏单曲"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏仅在Spotify资料库出现的专辑"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隐藏来自Spotify的专辑"])},title:e=>{const{normalize:t}=e;return t(["专辑"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["艺人 › 名称"])},"artist-date":e=>{const{normalize:t}=e;return t(["艺人 › 发行日期"])},title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},"recently-added":e=>{const{normalize:t}=e;return t(["最近添加"])},"recently-released":e=>{const{normalize:t}=e;return t(["最近发行"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},filter:e=>{const{normalize:t}=e;return t(["筛选"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏只出现在Spotify库中的内容"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隐藏来自Spotify的内容"])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},rating:e=>{const{normalize:t}=e;return t(["评级"])},"release-date":e=>{const{normalize:t}=e;return t(["发行日期"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位艺人"]),t([n(r("count"))," 位艺人"])])},filter:e=>{const{normalize:t}=e;return t(["筛选"])},sort:{title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},"recently-added":e=>{const{normalize:t}=e;return t(["最近添加"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏仅在播放列表出现的单曲和专辑"])},"hide-singles":e=>{const{normalize:t}=e;return t(["隐藏单曲"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果激活,将隐藏仅在Spotify资料库出现的专辑"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隐藏来自Spotify的艺人"])},title:e=>{const{normalize:t}=e;return t(["艺人"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个有声读物"]),t([n(r("count"))," 个有声读物"])])},title:e=>{const{normalize:t}=e;return t(["有声读物"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},play:e=>{const{normalize:t}=e;return t(["播放"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位作者"]),t([n(r("count"))," 位作者"])])},title:e=>{const{normalize:t}=e;return t(["作者"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["作者"])},audiobooks:e=>{const{normalize:t}=e;return t(["有声读物"])},genres:e=>{const{normalize:t}=e;return t(["流派"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},rating:e=>{const{normalize:t}=e;return t(["评级"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位作曲家"]),t([n(r("count"))," 位作曲家"])])},title:e=>{const{normalize:t}=e;return t(["作曲家"])}},files:{play:e=>{const{normalize:t}=e;return t(["播放"])},title:e=>{const{normalize:t}=e;return t(["文件"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分类"])},name:e=>{const{normalize:t}=e;return t(["名称"])},rating:e=>{const{normalize:t}=e;return t(["评级"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个流派"]),t([n(r("count"))," 个流派"])])},title:e=>{const{normalize:t}=e;return t(["流派"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["显示更多"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["最近添加"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["最近播放"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},composers:e=>{const{normalize:t}=e;return t(["作曲家"])},genres:e=>{const{normalize:t}=e;return t(["流派"])},history:e=>{const{normalize:t}=e;return t(["历史"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["浏览资料库添加曲目"])},live:e=>{const{normalize:t}=e;return t(["直播"])},title:e=>{const{normalize:t}=e;return t(["播放清单是空的"])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," 曲目"])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["播放列表"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个播放列表"]),t([n(r("count"))," 个播放列表"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["取消"])},play:e=>{const{normalize:t}=e;return t(["播放"])},remove:e=>{const{normalize:t}=e;return t(["移除"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["从资料库中永久移除该播客?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["这也将移除该播客RSS列表 "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除播客"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["添加"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个播客"]),t([n(r("count"))," 个播客"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["全部标记为已播放"])},"new-episodes":e=>{const{normalize:t}=e;return t(["最新单集"])},title:e=>{const{normalize:t}=e;return t(["播客"])},update:e=>{const{normalize:t}=e;return t(["更新"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["添加流"])},clear:e=>{const{normalize:t}=e;return t(["清除"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},edit:e=>{const{normalize:t}=e;return t(["编辑"])},"hide-previous":e=>{const{normalize:t}=e;return t(["隐藏历史"])},title:e=>{const{normalize:t}=e;return t(["清单"])},save:e=>{const{normalize:t}=e;return t(["保存"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 个电台"]),t([n(r("count"))," 个电台"])])},title:e=>{const{normalize:t}=e;return t(["广播电台"])}},search:{albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},audiobooks:e=>{const{normalize:t}=e;return t(["有声读物"])},composers:e=>{const{normalize:t}=e;return t(["作曲家"])},expression:e=>{const{normalize:t}=e;return t(["表达式"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["提示:如果您使用 ",n(r("query"))," 前缀,则可以通过智能播放列表查询语言 ",n(r("help"))," 进行搜索"])},"no-results":e=>{const{normalize:t}=e;return t(["未找到结果"])},placeholder:e=>{const{normalize:t}=e;return t(["搜索"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["播客"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示专辑"]),t(["显示所有 ",n(r("count"))," 个专辑"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示艺人"]),t(["显示所有 ",n(r("count"))," 位艺人"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示有声书"]),t(["显示所有 ",n(r("count"))," 本有声书"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示作曲家"]),t(["显示所有 ",n(r("count"))," 位作曲家"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示播放列表"]),t(["显示所有 ",n(r("count"))," 个播放列表"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示播客"]),t(["显示所有 ",n(r("count"))," 个播客"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示曲目"]),t(["显示所有 ",n(r("count"))," 只曲目"])])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])},tabs:{library:e=>{const{normalize:t}=e;return t(["资料库"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{title:e=>{const{normalize:t}=e;return t(["封面"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["OwnTone支持PNG和 JPEG封面,这些封面可以作为单独的图像文件放置在库中或嵌入到媒体文件中,也可以通过广播电台在线提供"])},"explanation-2":e=>{const{normalize:t}=e;return t(["除此之外,您还可以从以下素材提供者获取封面:"])},"show-coverart":e=>{const{normalize:t}=e;return t(["在专辑列表中显示封面艺术作品"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},streaming:e=>{const{normalize:t}=e;return t(["忽略广播电台提供的作品"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["没有活跃的配对请求"])},"pairing-code":e=>{const{normalize:t}=e;return t(["配对代码"])},"pairing-request":e=>{const{normalize:t}=e;return t(["远程配对请求来自于 "])},pairing:e=>{const{normalize:t}=e;return t(["遥控配对"])},send:e=>{const{normalize:t}=e;return t(["发送"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["如果您的扬声器需要配对,请在下面输入它显示的 PIN以激活"])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["扬声器配对和设备验证"])},"verification-code":e=>{const{normalize:t}=e;return t(["验证码"])},verify:e=>{const{normalize:t}=e;return t(["验证"])}},general:{audiobooks:e=>{const{normalize:t}=e;return t(["有声读物"])},files:e=>{const{normalize:t}=e;return t(["文件"])},genres:e=>{const{normalize:t}=e;return t(["流派"])},language:e=>{const{normalize:t}=e;return t(["语言"])},music:e=>{const{normalize:t}=e;return t(["音乐"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["如果您选择的项目多于屏幕上可以显示的项目,则侧边栏菜单将会消失"])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["选择顶部导航栏菜单项"])},"navigation-items":e=>{const{normalize:t}=e;return t(["导航条"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["“正在播放”页面"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["播客"])},radio:e=>{const{normalize:t}=e;return t(["广播电台"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(["限制“最近添加”页面上显示的专辑数量"])},"recently-added-page":e=>{const{normalize:t}=e;return t(["“最近添加”页面"])},search:e=>{const{normalize:t}=e;return t(["搜索"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(["以逗号分隔流派,作曲家会在“正在播放的页面”上显示"])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["留空以始终显示作曲家"])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(["通过检查是否包含定义的流派之一来匹配当前曲目的流派标签。例如,设置为“古典、原声带”将显示流派标签为“当代古典”的曲目的作曲家"])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["仅显示列出的流派的作曲家"])},"show-composer-info":e=>{const{normalize:t}=e;return t(["如果启用,当前播放曲目的作曲家将显示在“正在播放页面”上"])},"show-composer":e=>{const{normalize:t}=e;return t(["显示作曲家"])},"show-path":e=>{const{normalize:t}=e;return t(["在“正在播放”页面显示文件路径"])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["使用您的 Last.fm 用户名和密码登录以启用记录功能"])},info:e=>{const{normalize:t}=e;return t(["OwnTone不会存储您的 Last.fm 用户名/密码,仅存储会话密钥。会话密钥不会过期"])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["OwnTone的构建没有来自Last.fm的官方支持"])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["OwnTone的构建没有来自 Spotify 官方的支持,也未安装 libspotify"])},"logged-as":e=>{const{normalize:t}=e;return t(["登录为 "])},requirements:e=>{const{normalize:t}=e;return t(["您必须拥有 Spotify付费帐户"])},scopes:e=>{const{normalize:t}=e;return t(["访问 Spotify Web API 可以扫描您的 Spotify库。所需范围是:"])},user:e=>{const{normalize:t}=e;return t(["授予访问权限"])},authorize:e=>{const{normalize:t}=e;return t(["授权 Web API 访问"])},"grant-access":e=>{const{normalize:t}=e;return t(["授予对 Spotify Web API 的访问权限"])},reauthorize:e=>{const{normalize:t}=e;return t(["请重新授权 Web API 访问权限,以授予 OwnTone 以下附加访问权限:"])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["登入"])},logout:e=>{const{normalize:t}=e;return t(["退出"])},password:e=>{const{normalize:t}=e;return t(["密码"])},username:e=>{const{normalize:t}=e;return t(["用户名"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["封面"])},general:e=>{const{normalize:t}=e;return t(["概览"])},"online-services":e=>{const{normalize:t}=e;return t(["在线服务"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["遥控和输出"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 张专辑"]),t([n(r("count"))," 张专辑"])])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["特色列表"])},"new-releases":e=>{const{normalize:t}=e;return t(["最新发行"])},"show-more":e=>{const{normalize:t}=e;return t(["显示更多"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 只曲目"]),t([n(r("count"))," 只曲目"])])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放"])}},search:{albums:e=>{const{normalize:t}=e;return t(["专辑"])},artists:e=>{const{normalize:t}=e;return t(["艺人"])},"no-results":e=>{const{normalize:t}=e;return t(["未找到结果"])},placeholder:e=>{const{normalize:t}=e;return t(["搜索"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示专辑"]),t(["显示所有 ",n(r("count"))," 个专辑"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示艺人"]),t(["显示所有 ",n(r("count"))," 位艺人"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示播放列表"]),t(["显示所有 ",n(r("count"))," 个播放列表"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["显示曲目"]),t(["显示所有 ",n(r("count"))," 只曲目"])])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["文件夹"])},plain:e=>{const{normalize:t}=e;return t(["简单"])},smart:e=>{const{normalize:t}=e;return t(["智能"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["清除历史"])},pause:e=>{const{normalize:t}=e;return t(["暂停"])},play:e=>{const{normalize:t}=e;return t(["播放"])},repeat:e=>{const{normalize:t}=e;return t(["重复播放所有曲目"])},"repeat-off":e=>{const{normalize:t}=e;return t(["所有曲目仅播放一遍"])},"repeat-once":e=>{const{normalize:t}=e;return t(["重复当前曲目"])},"seek-backward":e=>{const{normalize:t}=e;return t(["在当前曲目后退"])},"seek-forward":e=>{const{normalize:t}=e;return t(["在当前曲目前进"])},shuffle:e=>{const{normalize:t}=e;return t(["随机播放曲目"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["按顺序播放曲目"])},"skip-backward":e=>{const{normalize:t}=e;return t(["播放上一首"])},"skip-forward":e=>{const{normalize:t}=e;return t(["播放下一首"])},stop:e=>{const{normalize:t}=e;return t(["停止"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["显示/隐藏歌词"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (设置保存错误)"])},saved:e=>{const{normalize:t}=e;return t([" (设置已保存)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["无法连接到 OwnTone 服务器"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["请求失败 (状态:",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["清单以添加到播放列表 ",n(r("name"))])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["已附加到队列的 ",n(r("count"))," 只曲目"]),t(["已附加到队列的 ",n(r("count"))," 只曲目"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["清单是空的"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["今日"])},"last-week":e=>{const{normalize:t}=e;return t(["上周"])},"last-month":e=>{const{normalize:t}=e;return t(["上月"])},undefined:e=>{const{normalize:t}=e;return t(["未定义"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["单声道"])},stereo:e=>{const{normalize:t}=e;return t(["立体声"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 信道"]),t([n(r("count"))," 信道"])])}}}},{"zh-TW":{data:{kind:{file:e=>{const{normalize:t}=e;return t(["文件"])},url:e=>{const{normalize:t}=e;return t(["鏈接"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},pipe:e=>{const{normalize:t}=e;return t(["串流"])}}},dialog:{add:{rss:{add:e=>{const{normalize:t}=e;return t(["新增"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},help:e=>{const{normalize:t}=e;return t(["新增一個可生成播放列表的Podcast RSS鏈接,這將允許OwnTone管理訂閱"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-rss"])},processing:e=>{const{normalize:t}=e;return t(["處理中…"])},title:e=>{const{normalize:t}=e;return t(["新增Podcast"])}},stream:{add:e=>{const{normalize:t}=e;return t(["新增"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},loading:e=>{const{normalize:t}=e;return t(["載入中…"])},placeholder:e=>{const{normalize:t}=e;return t(["https://url-to-stream"])},play:e=>{const{normalize:t}=e;return t(["播放"])},title:e=>{const{normalize:t}=e;return t(["新增串流"])}}},album:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"added-on":e=>{const{normalize:t}=e;return t(["新增時間"])},artist:e=>{const{normalize:t}=e;return t(["專輯藝人"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["標記為已播"])},play:e=>{const{normalize:t}=e;return t(["播放"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除Podcast"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])},type:e=>{const{normalize:t}=e;return t(["類型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"added-on":e=>{const{normalize:t}=e;return t(["新增時間"])},albums:e=>{const{normalize:t}=e;return t(["張專輯"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])},type:e=>{const{normalize:t}=e;return t(["類型"])}},composer:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},albums:e=>{const{normalize:t}=e;return t(["張專輯"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])}},directory:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},play:e=>{const{normalize:t}=e;return t(["播放"])}},genre:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},albums:e=>{const{normalize:t}=e;return t(["張專輯"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},play:e=>{const{normalize:t}=e;return t(["播放"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},tracks:e=>{const{normalize:t}=e;return t(["首曲目"])},type:e=>{const{normalize:t}=e;return t(["類型"])},save:{cancel:e=>{const{normalize:t}=e;return t(["取消"])},"playlist-name":e=>{const{normalize:t}=e;return t(["播放列表名稱"])},save:e=>{const{normalize:t}=e;return t(["儲存"])},saving:e=>{const{normalize:t}=e;return t(["儲存中…"])},title:e=>{const{normalize:t}=e;return t(["儲存播放清單到列表"])}}},"queue-item":{"album-artist":e=>{const{normalize:t}=e;return t(["專輯藝人"])},album:e=>{const{normalize:t}=e;return t(["專輯"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},composer:e=>{const{normalize:t}=e;return t(["作曲"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},genre:e=>{const{normalize:t}=e;return t(["音樂類型"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盤符 / 曲目"])},quality:e=>{const{normalize:t}=e;return t(["品質"])},remove:e=>{const{normalize:t}=e;return t(["移除"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["專輯"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["藝人"])},type:e=>{const{normalize:t}=e;return t(["類型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},"remote-pairing":{cancel:e=>{const{normalize:t}=e;return t(["取消"])},pair:e=>{const{normalize:t}=e;return t(["遙控配對"])},"pairing-code":e=>{const{normalize:t}=e;return t(["配對碼"])},title:e=>{const{normalize:t}=e;return t(["請求遙控配對"])}},spotify:{album:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"album-artist":e=>{const{normalize:t}=e;return t(["專輯藝人"])},play:e=>{const{normalize:t}=e;return t(["播放"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])},type:e=>{const{normalize:t}=e;return t(["類型"])}},artist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])},play:e=>{const{normalize:t}=e;return t(["播放"])},popularity:e=>{const{normalize:t}=e;return t(["流行度 / 粉絲數"])}},playlist:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},owner:e=>{const{normalize:t}=e;return t(["所有者"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])}},track:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"album-artist":e=>{const{normalize:t}=e;return t(["專輯藝人"])},album:e=>{const{normalize:t}=e;return t(["專輯"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盤符 / 曲目"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])}}},track:{"add-next":e=>{const{normalize:t}=e;return t(["插播"])},add:e=>{const{normalize:t}=e;return t(["新增"])},"added-on":e=>{const{normalize:t}=e;return t(["新增時間"])},"album-artist":e=>{const{normalize:t}=e;return t(["專輯藝人"])},album:e=>{const{normalize:t}=e;return t(["專輯"])},bitrate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," kbit/s"])},channels:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("channels"))])},comment:e=>{const{normalize:t}=e;return t(["評論"])},composer:e=>{const{normalize:t}=e;return t(["作曲家"])},duration:e=>{const{normalize:t}=e;return t(["時長"])},genre:e=>{const{normalize:t}=e;return t(["音樂類型"])},"mark-as-new":e=>{const{normalize:t}=e;return t(["標記為最新"])},"mark-as-played":e=>{const{normalize:t}=e;return t(["標記為已播放"])},path:e=>{const{normalize:t}=e;return t(["路徑"])},play:e=>{const{normalize:t}=e;return t(["播放"])},position:e=>{const{normalize:t}=e;return t(["盤符 / 曲目"])},quality:e=>{const{normalize:t}=e;return t(["品質"])},"rating-value":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("rating"))," / 10"])},rating:e=>{const{normalize:t}=e;return t(["評級"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])},samplerate:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" ","|"," ",n(r("rate"))," Hz"])},"spotify-album":e=>{const{normalize:t}=e;return t(["專輯"])},"spotify-artist":e=>{const{normalize:t}=e;return t(["藝人"])},type:e=>{const{normalize:t}=e;return t(["類型"])},year:e=>{const{normalize:t}=e;return t(["年份"])}},update:{all:e=>{const{normalize:t}=e;return t(["更新所有內容"])},cancel:e=>{const{normalize:t}=e;return t(["取消"])},feeds:e=>{const{normalize:t}=e;return t(["僅更新RSS訂閱內容"])},info:e=>{const{normalize:t}=e;return t(["掃描新的、刪除的和修改的文件"])},local:e=>{const{normalize:t}=e;return t(["僅更新本地資料庫"])},progress:e=>{const{normalize:t}=e;return t(["正在更新本地資料庫…"])},"rescan-metadata":e=>{const{normalize:t}=e;return t(["重新掃描未修改文件的中繼資料"])},rescan:e=>{const{normalize:t}=e;return t(["重新掃描"])},spotify:e=>{const{normalize:t}=e;return t(["僅更新Spotify"])},title:e=>{const{normalize:t}=e;return t(["更新資料庫"])}}},language:{de:e=>{const{normalize:t}=e;return t(["德語 (Deutsch)"])},en:e=>{const{normalize:t}=e;return t(["英語 (English)"])},fr:e=>{const{normalize:t}=e;return t(["法語 (Français)"])},"zh-CN":e=>{const{normalize:t}=e;return t(["簡體中文"])},"zh-TW":e=>{const{normalize:t}=e;return t(["繁體中文"])}},list:{albums:{"info-1":e=>{const{normalize:t}=e;return t(["從資料庫中永久移除該Podcast嗎?"])},"info-2":e=>{const{normalize:t}=e;return t(["這也將移除RSS播放列表 "])},remove:e=>{const{normalize:t}=e;return t(["移除"])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除Podcast"])}},spotify:{"not-playable-track":e=>{const{normalize:t}=e;return t(["曲目無法播放"])},"restriction-reason":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([",被限制原因:",n(r("reason"))])}}},media:{kind:{album:e=>{const{normalize:t}=e;return t(["專輯"])},audiobook:e=>{const{normalize:t}=e;return t(["有聲書"])},music:e=>{const{normalize:t}=e;return t(["音樂"])},podcast:e=>{const{normalize:t}=e;return t(["Podcast"])}}},navigation:{about:e=>{const{normalize:t}=e;return t(["關於"])},albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},audiobooks:e=>{const{normalize:t}=e;return t(["有聲書"])},"now-playing":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([" - ",n(r("album"))])},"stream-error":e=>{const{normalize:t}=e;return t(["HTTP串流錯誤:串流載入失敗或者由於網絡原因無法載入"])},stream:e=>{const{normalize:t}=e;return t(["HTTP串流"])},volume:e=>{const{normalize:t}=e;return t(["音量"])},files:e=>{const{normalize:t}=e;return t(["文件"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])},music:e=>{const{normalize:t}=e;return t(["音樂"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcast"])},radio:e=>{const{normalize:t}=e;return t(["電台"])},search:e=>{const{normalize:t}=e;return t(["搜尋"])},settings:e=>{const{normalize:t}=e;return t(["設定"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},"update-library":e=>{const{normalize:t}=e;return t(["更新資料庫"])}},page:{about:{albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},"built-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["界面貢獻者包括 ",n(r("bulma")),",",n(r("mdi")),",",n(r("vuejs")),",",n(r("axios"))," 和 ",n(r("others"))])},"compiled-with":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["編譯支持來自於 ",n(r("options"))])},library:e=>{const{normalize:t}=e;return t(["資料庫"])},more:e=>{const{normalize:t}=e;return t(["更多"])},"total-playtime":e=>{const{normalize:t}=e;return t(["總播放時長"])},tracks:e=>{const{normalize:t}=e;return t(["曲目總數"])},update:e=>{const{normalize:t}=e;return t(["更新"])},"updated-on":e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("time"))," 前"])},updated:e=>{const{normalize:t}=e;return t(["更新於"])},uptime:e=>{const{normalize:t}=e;return t(["運行時長"])},version:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["版本 ",n(r("version"))])}},album:{shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},filter:e=>{const{normalize:t}=e;return t(["篩選"])},"hide-singles-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏僅在播放列表出現的單曲和專輯"])},"hide-singles":e=>{const{normalize:t}=e;return t(["隱藏單曲"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏僅在Spotify資料庫出現的專輯"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隱藏來自Spotify的專輯"])},title:e=>{const{normalize:t}=e;return t(["專輯"])},sort:{"artist-name":e=>{const{normalize:t}=e;return t(["藝人 › 名稱"])},"artist-date":e=>{const{normalize:t}=e;return t(["藝人 › 發行日期"])},title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},"recently-added":e=>{const{normalize:t}=e;return t(["最近新增"])},"recently-released":e=>{const{normalize:t}=e;return t(["最近發行"])}}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},filter:e=>{const{normalize:t}=e;return t(["篩選"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏只出現在Spotify庫中的內容"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隱藏來自Spotify的內容"])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},rating:e=>{const{normalize:t}=e;return t(["評級"])},"release-date":e=>{const{normalize:t}=e;return t(["發行日期"])}}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位藝人"]),t([n(r("count"))," 位藝人"])])},filter:e=>{const{normalize:t}=e;return t(["篩選"])},sort:{title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},"recently-added":e=>{const{normalize:t}=e;return t(["最近新增"])}},"hide-singles-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏僅在播放列表出現的單曲和專輯"])},"hide-singles":e=>{const{normalize:t}=e;return t(["隱藏單曲"])},"hide-spotify-help":e=>{const{normalize:t}=e;return t(["如果啓用,將隱藏僅在Spotify資料庫出現的專輯"])},"hide-spotify":e=>{const{normalize:t}=e;return t(["隱藏來自Spotify的藝人"])},title:e=>{const{normalize:t}=e;return t(["藝人"])}},audiobooks:{album:{play:e=>{const{normalize:t}=e;return t(["播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},albums:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個有聲書"]),t([n(r("count"))," 個有聲書"])])},title:e=>{const{normalize:t}=e;return t(["有聲書"])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},play:e=>{const{normalize:t}=e;return t(["播放"])}},artists:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位作者"]),t([n(r("count"))," 位作者"])])},title:e=>{const{normalize:t}=e;return t(["作者"])}},tabs:{authors:e=>{const{normalize:t}=e;return t(["作者"])},audiobooks:e=>{const{normalize:t}=e;return t(["有聲書"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])}}},composer:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},rating:e=>{const{normalize:t}=e;return t(["評級"])}}},composers:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 位作曲家"]),t([n(r("count"))," 位作曲家"])])},title:e=>{const{normalize:t}=e;return t(["作曲家"])}},files:{play:e=>{const{normalize:t}=e;return t(["播放"])},title:e=>{const{normalize:t}=e;return t(["文件"])}},genre:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},sort:{title:e=>{const{normalize:t}=e;return t(["分類"])},name:e=>{const{normalize:t}=e;return t(["名稱"])},rating:e=>{const{normalize:t}=e;return t(["評級"])}}},genres:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個音樂類型"]),t([n(r("count"))," 個音樂類型"])])},title:e=>{const{normalize:t}=e;return t(["音樂類型"])}},music:{"show-more":e=>{const{normalize:t}=e;return t(["顯示更多"])},"recently-added":{title:e=>{const{normalize:t}=e;return t(["最近新增"])}},"recently-played":{title:e=>{const{normalize:t}=e;return t(["最近播放"])}},tabs:{albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},composers:e=>{const{normalize:t}=e;return t(["作曲家"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])},history:e=>{const{normalize:t}=e;return t(["歷史"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},"now-playing":{info:e=>{const{normalize:t}=e;return t(["瀏覽資料庫新增曲目"])},live:e=>{const{normalize:t}=e;return t(["直播"])},title:e=>{const{normalize:t}=e;return t(["播放清單是空的"])}},playlist:{length:e=>{const{normalize:t,interpolate:n,named:r}=e;return t([n(r("length"))," 曲目"])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},playlists:{title:e=>{const{normalize:t}=e;return t(["播放列表"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個播放列表"]),t([n(r("count"))," 個播放列表"])])}},podcast:{cancel:e=>{const{normalize:t}=e;return t(["取消"])},play:e=>{const{normalize:t}=e;return t(["播放"])},remove:e=>{const{normalize:t}=e;return t(["移除"])},"remove-info-1":e=>{const{normalize:t}=e;return t(["從資料庫中永久移除該Podcast?"])},"remove-info-2":e=>{const{normalize:t}=e;return t(["這也將移除該PodcastRSS列表 "])},"remove-podcast":e=>{const{normalize:t}=e;return t(["移除Podcast"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},podcasts:{add:e=>{const{normalize:t}=e;return t(["新增"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個Podcast"]),t([n(r("count"))," 個Podcast"])])},"mark-all-played":e=>{const{normalize:t}=e;return t(["全部標記為已播放"])},"new-episodes":e=>{const{normalize:t}=e;return t(["最新單集"])},title:e=>{const{normalize:t}=e;return t(["Podcast"])},update:e=>{const{normalize:t}=e;return t(["更新"])}},queue:{"add-stream":e=>{const{normalize:t}=e;return t(["新增串流"])},clear:e=>{const{normalize:t}=e;return t(["清除"])},count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},edit:e=>{const{normalize:t}=e;return t(["編輯"])},"hide-previous":e=>{const{normalize:t}=e;return t(["隱藏歷史"])},title:e=>{const{normalize:t}=e;return t(["清單"])},save:e=>{const{normalize:t}=e;return t(["儲存"])}},radio:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 個電台"]),t([n(r("count"))," 個電台"])])},title:e=>{const{normalize:t}=e;return t(["電台"])}},search:{albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},audiobooks:e=>{const{normalize:t}=e;return t(["有聲書"])},composers:e=>{const{normalize:t}=e;return t(["作曲家"])},expression:e=>{const{normalize:t}=e;return t(["表達式"])},help:e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["提示:如果您使用 ",n(r("query"))," 前綴,則可以通過智能播放列表查詢語言 ",n(r("help"))," 進行搜尋"])},"no-results":e=>{const{normalize:t}=e;return t(["未找到結果"])},placeholder:e=>{const{normalize:t}=e;return t(["搜尋"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcast"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示專輯"]),t(["顯示所有 ",n(r("count"))," 個專輯"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示藝人"]),t(["顯示所有 ",n(r("count"))," 位藝人"])])},"show-audiobooks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示有聲書"]),t(["顯示所有 ",n(r("count"))," 本有聲書"])])},"show-composers":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示作曲家"]),t(["顯示所有 ",n(r("count"))," 位作曲家"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示播放列表"]),t(["顯示所有 ",n(r("count"))," 個播放列表"])])},"show-podcasts":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示Podcast"]),t(["顯示所有 ",n(r("count"))," 個Podcast"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示曲目"]),t(["顯示所有 ",n(r("count"))," 首曲目"])])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])},tabs:{library:e=>{const{normalize:t}=e;return t(["資料庫"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])}}},settings:{artwork:{title:e=>{const{normalize:t}=e;return t(["封面"])},coverartarchive:e=>{const{normalize:t}=e;return t(["Cover Art Archive"])},discogs:e=>{const{normalize:t}=e;return t(["Discogs"])},"explanation-1":e=>{const{normalize:t}=e;return t(["OwnTone支持PNG和 JPEG封面,這些封面可以作為單獨的圖像文件放置在庫中或嵌入到媒體文件中,也可以通過電台在線提供"])},"explanation-2":e=>{const{normalize:t}=e;return t(["除此之外,您還可以從以下素材提供者獲取封面:"])},"show-coverart":e=>{const{normalize:t}=e;return t(["在專輯列表中顯示封面藝術作品"])},spotify:e=>{const{normalize:t}=e;return t(["Spotify"])},streaming:e=>{const{normalize:t}=e;return t(["忽略電台提供的作品"])}},devices:{"no-active-pairing":e=>{const{normalize:t}=e;return t(["沒有活躍的配對請求"])},"pairing-code":e=>{const{normalize:t}=e;return t(["配對代碼"])},"pairing-request":e=>{const{normalize:t}=e;return t(["遠程配對請求來自於 "])},pairing:e=>{const{normalize:t}=e;return t(["遙控配對"])},send:e=>{const{normalize:t}=e;return t(["發送"])},"speaker-pairing-info":e=>{const{normalize:t}=e;return t(["如果您的揚聲器需要配對,請在下面輸入它顯示的 PIN以啓用"])},"speaker-pairing":e=>{const{normalize:t}=e;return t(["揚聲器配對和設備驗證"])},"verification-code":e=>{const{normalize:t}=e;return t(["驗證碼"])},verify:e=>{const{normalize:t}=e;return t(["驗證"])}},general:{audiobooks:e=>{const{normalize:t}=e;return t(["有聲書"])},files:e=>{const{normalize:t}=e;return t(["文件"])},genres:e=>{const{normalize:t}=e;return t(["音樂類型"])},language:e=>{const{normalize:t}=e;return t(["語言"])},music:e=>{const{normalize:t}=e;return t(["音樂"])},"navigation-item-selection-info":e=>{const{normalize:t}=e;return t(["如果您選擇的項目多於屏幕上可以顯示的項目,則側邊欄菜單將會消失"])},"navigation-item-selection":e=>{const{normalize:t}=e;return t(["選擇頂部導航欄菜單項"])},"navigation-items":e=>{const{normalize:t}=e;return t(["導航條"])},"now-playing-page":e=>{const{normalize:t}=e;return t(["“正在播放”頁面"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},podcasts:e=>{const{normalize:t}=e;return t(["Podcast"])},radio:e=>{const{normalize:t}=e;return t(["電台"])},"recently-added-page-info":e=>{const{normalize:t}=e;return t(["限制“最近新增”頁面上顯示的專輯數量"])},"recently-added-page":e=>{const{normalize:t}=e;return t(["“最近新增”頁面"])},search:e=>{const{normalize:t}=e;return t(["搜尋"])},"show-composer-genres-info-1":e=>{const{normalize:t}=e;return t(["以逗號分隔音樂類型,作曲家會在“正在播放的頁面”上顯示"])},"show-composer-genres-info-2":e=>{const{normalize:t}=e;return t(["留空以始終顯示作曲家"])},"show-composer-genres-info-3":e=>{const{normalize:t}=e;return t(["通過檢查是否包含定義的音樂類型之一來匹配當前曲目的音樂類型標籤。例如,設定為“古典、原聲帶”將顯示音樂類型標籤為“當代古典”的曲目的作曲家"])},"show-composer-genres":e=>{const{normalize:t}=e;return t(["僅顯示列出的音樂類型的作曲家"])},"show-composer-info":e=>{const{normalize:t}=e;return t(["如果啓用,當前播放曲目的作曲家將顯示在“正在播放頁面”上"])},"show-composer":e=>{const{normalize:t}=e;return t(["顯示作曲家"])},"show-path":e=>{const{normalize:t}=e;return t(["在“正在播放”頁面顯示文件路徑"])}},services:{lastfm:{"grant-access":e=>{const{normalize:t}=e;return t(["使用您的 Last.fm 用戶名和密碼登入以啓用記錄功能"])},info:e=>{const{normalize:t}=e;return t(["OwnTone不會存儲您的 Last.fm 用戶名/密碼,僅存儲會話密鑰。會話密鑰不會過期"])},title:e=>{const{normalize:t}=e;return t(["Last.fm"])},"no-support":e=>{const{normalize:t}=e;return t(["OwnTone並無Last.fm的官方支持"])}},spotify:{"no-support":e=>{const{normalize:t}=e;return t(["OwnTone並無 Spotify 官方的支持,也未安裝 libspotify"])},"logged-as":e=>{const{normalize:t}=e;return t(["登入為 "])},requirements:e=>{const{normalize:t}=e;return t(["您必須擁有 Spotify付費帳戶"])},scopes:e=>{const{normalize:t}=e;return t(["訪問 Spotify Web API 可以掃描您的 Spotify庫。所需範圍是:"])},user:e=>{const{normalize:t}=e;return t(["授予訪問權限"])},authorize:e=>{const{normalize:t}=e;return t(["授權 Web API 訪問"])},"grant-access":e=>{const{normalize:t}=e;return t(["授予對 Spotify Web API 的訪問權限"])},reauthorize:e=>{const{normalize:t}=e;return t(["請重新授權 Web API 訪問權限,以授予 OwnTone 以下附加訪問權限:"])},title:e=>{const{normalize:t}=e;return t(["Spotify"])}},login:e=>{const{normalize:t}=e;return t(["登入"])},logout:e=>{const{normalize:t}=e;return t(["退出"])},password:e=>{const{normalize:t}=e;return t(["密碼"])},username:e=>{const{normalize:t}=e;return t(["用戶名"])}},tabs:{artwork:e=>{const{normalize:t}=e;return t(["封面"])},general:e=>{const{normalize:t}=e;return t(["概覽"])},"online-services":e=>{const{normalize:t}=e;return t(["在線服務"])},"remotes-and-outputs":e=>{const{normalize:t}=e;return t(["遙控和輸出"])}}},spotify:{album:{shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])},"track-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])}},artist:{"album-count":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 張專輯"]),t([n(r("count"))," 張專輯"])])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])}},music:{"featured-playlists":e=>{const{normalize:t}=e;return t(["特色列表"])},"new-releases":e=>{const{normalize:t}=e;return t(["最新發行"])},"show-more":e=>{const{normalize:t}=e;return t(["顯示更多"])}},playlist:{count:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 首曲目"]),t([n(r("count"))," 首曲目"])])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放"])}},search:{albums:e=>{const{normalize:t}=e;return t(["專輯"])},artists:e=>{const{normalize:t}=e;return t(["藝人"])},"no-results":e=>{const{normalize:t}=e;return t(["未找到結果"])},placeholder:e=>{const{normalize:t}=e;return t(["搜尋"])},playlists:e=>{const{normalize:t}=e;return t(["播放列表"])},"show-albums":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示專輯"]),t(["顯示所有 ",n(r("count"))," 個專輯"])])},"show-artists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示藝人"]),t(["顯示所有 ",n(r("count"))," 位藝人"])])},"show-playlists":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示播放列表"]),t(["顯示所有 ",n(r("count"))," 個播放列表"])])},"show-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["顯示曲目"]),t(["顯示所有 ",n(r("count"))," 首曲目"])])},tracks:e=>{const{normalize:t}=e;return t(["曲目"])}}}},playlist:{type:{folder:e=>{const{normalize:t}=e;return t(["檔案夾"])},plain:e=>{const{normalize:t}=e;return t(["簡單"])},smart:e=>{const{normalize:t}=e;return t(["智能"])}}},player:{button:{consume:e=>{const{normalize:t}=e;return t(["清除歷史"])},pause:e=>{const{normalize:t}=e;return t(["暫停"])},play:e=>{const{normalize:t}=e;return t(["播放"])},repeat:e=>{const{normalize:t}=e;return t(["重復播放所有曲目"])},"repeat-off":e=>{const{normalize:t}=e;return t(["所有曲目僅播放一遍"])},"repeat-once":e=>{const{normalize:t}=e;return t(["重復當前曲目"])},"seek-backward":e=>{const{normalize:t}=e;return t(["在當前曲目後退"])},"seek-forward":e=>{const{normalize:t}=e;return t(["在當前曲目前進"])},shuffle:e=>{const{normalize:t}=e;return t(["隨機播放曲目"])},"shuffle-disabled":e=>{const{normalize:t}=e;return t(["按順序播放曲目"])},"skip-backward":e=>{const{normalize:t}=e;return t(["播放上一首"])},"skip-forward":e=>{const{normalize:t}=e;return t(["播放下一首"])},stop:e=>{const{normalize:t}=e;return t(["停止"])},"toggle-lyrics":e=>{const{normalize:t}=e;return t(["顯示/隱藏歌詞"])}}},setting:{"not-saved":e=>{const{normalize:t}=e;return t([" (設定儲存錯誤)"])},saved:e=>{const{normalize:t}=e;return t([" (設定已儲存)"])}},server:{"connection-failed":e=>{const{normalize:t}=e;return t(["無法連接到 OwnTone 伺服器"])},"request-failed":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["請求失敗 (狀態:",n(r("status"))," ",n(r("cause"))," ",n(r("url")),")"])},"queue-saved":e=>{const{normalize:t,interpolate:n,named:r}=e;return t(["清單以新增到播放列表 ",n(r("name"))])},"appended-tracks":e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t(["已附加到隊列的 ",n(r("count"))," 首曲目"]),t(["已附加到隊列的 ",n(r("count"))," 首曲目"])])},"empty-queue":e=>{const{normalize:t}=e;return t(["清單是空的"])}},"grouped-list":{today:e=>{const{normalize:t}=e;return t(["今日"])},"last-week":e=>{const{normalize:t}=e;return t(["上周"])},"last-month":e=>{const{normalize:t}=e;return t(["上月"])},undefined:e=>{const{normalize:t}=e;return t(["未定義"])}},filter:{mono:e=>{const{normalize:t}=e;return t(["單聲道"])},stereo:e=>{const{normalize:t}=e;return t(["立體聲"])},channels:e=>{const{normalize:t,interpolate:n,named:r,plural:o}=e;return o([t([n(r("count"))," 信道"]),t([n(r("count"))," 信道"])])}}}}),lu=Xk({availableLocales:"zh-TW",fallbackLocale:"en",fallbackWarn:!1,legacy:!1,locale:navigator.language,messages:ax,missingWarn:!1}),yr=Gn("NotificationsStore",{state:()=>({list:[],next_id:1}),actions:{add(e){const t={id:this.next_id++,text:e.text,timeout:e.timeout,topic:e.topic,type:e.type};if(t.topic){const n=this.list.findIndex(r=>r.topic===t.topic);if(n>=0){this.list.splice(n,1,t);return}}this.list.push(t),e.timeout>0&&setTimeout(()=>{this.remove(t)},e.timeout)},remove(e){const t=this.list.indexOf(e);t!==-1&&this.list.splice(t,1)}}}),On=Gn("PlayerStore",{state:()=>({consume:!1,item_id:0,item_length_ms:0,item_progress_ms:0,repeat:"off",shuffle:!1,state:"stop",volume:0})}),ir=Gn("QueueStore",{state:()=>({count:0,items:[],version:0}),getters:{current(e){const t=On();return e.items.find(n=>n.id===t.item_id)??{}}}}),{t:os}=lu.global;de.interceptors.response.use(e=>e,e=>(e.request.status&&e.request.responseURL&&yr().add({text:os("server.request-failed",{cause:e.request.statusText,status:e.request.status,url:e.request.responseURL}),type:"danger"}),Promise.reject(e)));const B={config(){return de.get("./api/config")},lastfm(){return de.get("./api/lastfm")},lastfm_login(e){return de.post("./api/lastfm-login",e)},lastfm_logout(){return de.get("./api/lastfm-logout")},library_add(e){return de.post("./api/library/add",null,{params:{url:e}})},library_album(e){return de.get(`./api/library/albums/${e}`)},library_album_track_update(e,t){return de.put(`./api/library/albums/${e}/tracks`,null,{params:t})},library_album_tracks(e,t={limit:-1,offset:0}){return de.get(`./api/library/albums/${e}/tracks`,{params:t})},library_albums(e){return de.get("./api/library/albums",{params:{media_kind:e}})},library_artist(e){return de.get(`./api/library/artists/${e}`)},library_artist_albums(e){return de.get(`./api/library/artists/${e}/albums`)},library_artist_tracks(e){const t={expression:`songartistid is "${e}"`,type:"tracks"};return de.get("./api/search",{params:t})},library_artists(e){return de.get("./api/library/artists",{params:{media_kind:e}})},library_composer(e){return de.get(`./api/library/composers/${encodeURIComponent(e)}`)},library_composer_albums(e){const t={expression:`composer is "${e}" and media_kind is music`,type:"albums"};return de.get("./api/search",{params:t})},library_composer_tracks(e){const t={expression:`composer is "${e}" and media_kind is music`,type:"tracks"};return de.get("./api/search",{params:t})},library_composers(e){return de.get("./api/library/composers",{params:{media_kind:e}})},library_count(e){return de.get(`./api/library/count?expression=${e}`)},library_files(e){return de.get("./api/library/files",{params:{directory:e}})},library_genre(e,t){const n={expression:`genre is "${e}" and media_kind is ${t}`,type:"genres"};return de.get("./api/search",{params:n})},library_genre_albums(e,t){const n={expression:`genre is "${e}" and media_kind is ${t}`,type:"albums"};return de.get("./api/search",{params:n})},library_genre_tracks(e,t){const n={expression:`genre is "${e}" and media_kind is ${t}`,type:"tracks"};return de.get("./api/search",{params:n})},library_genres(e){const t={expression:`media_kind is ${e}`,type:"genres"};return de.get("./api/search",{params:t})},library_playlist(e){return de.get(`./api/library/playlists/${e}`)},library_playlist_delete(e){return de.delete(`./api/library/playlists/${e}`,null)},library_playlist_folder(e=0){return de.get(`./api/library/playlists/${e}/playlists`)},library_playlist_tracks(e){return de.get(`./api/library/playlists/${e}/tracks`)},library_podcast_episodes(e){const t={expression:`media_kind is podcast and songalbumid is "${e}" ORDER BY date_released DESC`,type:"tracks"};return de.get("./api/search",{params:t})},library_podcasts_new_episodes(){const e={expression:"media_kind is podcast and play_count = 0 ORDER BY time_added DESC",type:"tracks"};return de.get("./api/search",{params:e})},library_radio_streams(){const e={expression:"data_kind is url and song_length = 0",media_kind:"music",type:"tracks"};return de.get("./api/search",{params:e})},library_rescan(e){return de.put("./api/rescan",null,{params:{scan_kind:e}})},library_stats(){return de.get("./api/library")},library_track(e){return de.get(`./api/library/tracks/${e}`)},library_track_playlists(e){return de.get(`./api/library/tracks/${e}/playlists`)},library_track_update(e,t={}){return de.put(`./api/library/tracks/${e}`,null,{params:t})},library_update(e){return de.put("./api/update",null,{params:{scan_kind:e}})},output_toggle(e){return de.put(`./api/outputs/${e}/toggle`)},output_update(e,t){return de.put(`./api/outputs/${e}`,t)},outputs(){return de.get("./api/outputs")},pairing(){return de.get("./api/pairing")},pairing_kickoff(e){return de.post("./api/pairing",e)},player_consume(e){return de.put(`./api/player/consume?state=${e}`)},player_next(){return de.put("./api/player/next")},player_output_volume(e,t){return de.put(`./api/player/volume?volume=${t}&output_id=${e}`)},player_pause(){return de.put("./api/player/pause")},player_play(e={}){return de.put("./api/player/play",null,{params:e})},player_play_expression(e,t,n){const r={clear:"true",expression:e,playback:"start",playback_from_position:n,shuffle:t};return de.post("./api/queue/items/add",null,{params:r})},player_play_uri(e,t,n){const r={clear:"true",playback:"start",playback_from_position:n,shuffle:t,uris:e};return de.post("./api/queue/items/add",null,{params:r})},player_previous(){return de.put("./api/player/previous")},player_repeat(e){return de.put(`./api/player/repeat?state=${e}`)},player_seek(e){return de.put(`./api/player/seek?seek_ms=${e}`)},player_seek_to_pos(e){return de.put(`./api/player/seek?position_ms=${e}`)},player_shuffle(e){return de.put(`./api/player/shuffle?state=${e}`)},player_status(){return de.get("./api/player")},player_stop(){return de.put("./api/player/stop")},player_volume(e){return de.put(`./api/player/volume?volume=${e}`)},queue(){return de.get("./api/queue")},queue_add(e){return de.post(`./api/queue/items/add?uris=${e}`).then(t=>(yr().add({text:os("server.appended-tracks",{count:t.data.count}),timeout:2e3,type:"info"}),Promise.resolve(t)))},queue_add_next(e){let t=0;const{current:n}=ir();return n!=null&&n.id&&(t=n.position+1),de.post(`./api/queue/items/add?uris=${e}&position=${t}`).then(r=>(yr().add({text:os("server.appended-tracks",{count:r.data.count}),timeout:2e3,type:"info"}),Promise.resolve(r)))},queue_clear(){return de.put("./api/queue/clear")},queue_expression_add(e){return de.post("./api/queue/items/add",null,{params:{expression:e}}).then(t=>(yr().add({text:os("server.appended-tracks",{count:t.data.count}),timeout:2e3,type:"info"}),Promise.resolve(t)))},queue_expression_add_next(e){const t={};t.expression=e,t.position=0;const{current:n}=ir();return n!=null&&n.id&&(t.position=n.position+1),de.post("./api/queue/items/add",null,{params:t}).then(r=>(yr().add({text:os("server.appended-tracks",{count:r.data.count}),timeout:2e3,type:"info"}),Promise.resolve(r)))},queue_move(e,t){return de.put(`./api/queue/items/${e}?new_position=${t}`)},queue_remove(e){return de.delete(`./api/queue/items/${e}`)},queue_save_playlist(e){return de.post("./api/queue/save",null,{params:{name:e}}).then(t=>(yr().add({text:os("server.queue-saved",{name:e}),timeout:2e3,type:"info"}),Promise.resolve(t)))},search(e){return de.get("./api/search",{params:e})},settings(){return de.get("./api/settings")},settings_update(e,t){return de.put(`./api/settings/${e}/${t.name}`,t)},spotify(){return de.get("./api/spotify")},spotify_logout(){return de.get("./api/spotify-logout")}},le=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},lx={name:"ModalDialogRemotePairing",props:{show:Boolean},emits:["close"],setup(){return{remoteStore:Kd()}},data(){return{pairing_req:{pin:""}}},computed:{pairing(){return this.remoteStore.pairing}},watch:{show(){this.show&&(this.loading=!1,setTimeout(()=>{this.$refs.pin_field.focus()},10))}},methods:{kickoff_pairing(){B.pairing_kickoff(this.pairing_req).then(()=>{this.pairing_req.pin=""})}}},ux={key:0,class:"modal is-active"},cx={class:"modal-content"},dx={class:"card"},mx={class:"card-content"},fx=["textContent"],px=["textContent"],hx={class:"field"},_x={class:"control"},gx=["placeholder"],yx={class:"card-footer is-clipped"},zx=["textContent"],bx=["textContent"];function vx(e,t,n,r,o,s){const i=O("mdicon");return x(),ve(Bt,{name:"fade"},{default:N(()=>[n.show?(x(),I("div",ux,[u("div",{class:"modal-background",onClick:t[0]||(t[0]=a=>e.$emit("close"))}),u("div",cx,[u("div",dx,[u("div",mx,[u("p",{class:"title is-4",textContent:y(e.$t("dialog.remote-pairing.title"))},null,8,fx),u("form",{onSubmit:t[2]||(t[2]=bt((...a)=>s.kickoff_pairing&&s.kickoff_pairing(...a),["prevent"]))},[u("label",{class:"label",textContent:y(s.pairing.remote)},null,8,px),u("div",hx,[u("div",_x,[gt(u("input",{ref:"pin_field","onUpdate:modelValue":t[1]||(t[1]=a=>o.pairing_req.pin=a),class:"input",inputmode:"numeric",pattern:"[\\d]{4}",placeholder:e.$t("dialog.remote-pairing.pairing-code")},null,8,gx),[[vn,o.pairing_req.pin]])])])],32)]),u("footer",yx,[u("a",{class:"card-footer-item has-text-danger",onClick:t[3]||(t[3]=a=>e.$emit("close"))},[v(i,{class:"icon",name:"cancel",size:"16"}),u("span",{class:"is-size-7",textContent:y(e.$t("dialog.remote-pairing.cancel"))},null,8,zx)]),u("a",{class:"card-footer-item has-background-info has-text-white has-text-weight-bold",onClick:t[4]||(t[4]=(...a)=>s.kickoff_pairing&&s.kickoff_pairing(...a))},[v(i,{class:"icon",name:"cellphone",size:"16"}),u("span",{class:"is-size-7",textContent:y(e.$t("dialog.remote-pairing.pair"))},null,8,bx)])])])]),u("button",{class:"modal-close is-large","aria-label":"close",onClick:t[5]||(t[5]=a=>e.$emit("close"))})])):Q("",!0)]),_:1})}const Cx=le(lx,[["render",vx]]),wx={name:"ModalDialog",props:{close_action:{default:"",type:String},delete_action:{default:"",type:String},ok_action:{default:"",type:String},show:Boolean,title:{required:!0,type:String}},emits:["delete","close","ok"]},Sx={key:0,class:"modal is-active"},kx={class:"modal-content"},xx={class:"card"},Ex={class:"card-content"},Tx=["textContent"],$x={class:"card-footer is-clipped"},Ax=["textContent"],Ox=["textContent"],Px=["textContent"];function Ix(e,t,n,r,o,s){const i=O("mdicon");return x(),ve(Bt,{name:"fade"},{default:N(()=>[n.show?(x(),I("div",Sx,[u("div",{class:"modal-background",onClick:t[0]||(t[0]=a=>e.$emit("close"))}),u("div",kx,[u("div",xx,[u("div",Ex,[n.title?(x(),I("p",{key:0,class:"title is-4",textContent:y(n.title)},null,8,Tx)):Q("",!0),wt(e.$slots,"modal-content")]),u("footer",$x,[u("a",{class:"card-footer-item has-text-dark",onClick:t[1]||(t[1]=a=>e.$emit("close"))},[v(i,{class:"icon",name:"cancel",size:"16"}),u("span",{class:"is-size-7",textContent:y(n.close_action)},null,8,Ax)]),n.delete_action?(x(),I("a",{key:0,class:"card-footer-item has-background-danger has-text-white has-text-weight-bold",onClick:t[2]||(t[2]=a=>e.$emit("delete"))},[v(i,{class:"icon",name:"delete",size:"16"}),u("span",{class:"is-size-7",textContent:y(n.delete_action)},null,8,Ox)])):Q("",!0),n.ok_action?(x(),I("a",{key:1,class:"card-footer-item has-background-info has-text-white has-text-weight-bold",onClick:t[3]||(t[3]=a=>e.$emit("ok"))},[v(i,{class:"icon",name:"check",size:"16"}),u("span",{class:"is-size-7",textContent:y(n.ok_action)},null,8,Px)])):Q("",!0)])])]),u("button",{class:"modal-close is-large","aria-label":"close",onClick:t[4]||(t[4]=a=>e.$emit("close"))})])):Q("",!0)]),_:3})}const am=le(wx,[["render",Ix]]),uu=Gn("LibraryStore",{state:()=>({albums:0,artists:0,db_playtime:0,songs:0,rss:{},started_at:"01",updated_at:"01",update_dialog_scan_kind:"",updating:!1})}),It=Gn("ServicesStore",{state:()=>({lastfm:{},spotify:{}})}),Lx={name:"ModalDialogUpdate",components:{ModalDialog:am},props:{show:Boolean},emits:["close"],setup(){return{libraryStore:uu(),servicesStore:It()}},data(){return{rescan_metadata:!1}},computed:{library(){return this.libraryStore.$state},rss(){return this.libraryStore.rss},spotify_enabled(){return this.servicesStore.spotify.webapi_token_valid},update_dialog_scan_kind:{get(){return this.library.update_dialog_scan_kind},set(e){this.library.update_dialog_scan_kind=e}}},methods:{close(){this.update_dialog_scan_kind="",this.$emit("close")},update_library(){this.rescan_metadata?B.library_rescan(this.update_dialog_scan_kind):B.library_update(this.update_dialog_scan_kind)}}},Nx={key:0},Dx=["textContent"],Rx={key:0,class:"field"},Mx={class:"control"},Fx={class:"select is-small"},Vx=["textContent"],Hx=["textContent"],Ux=["textContent"],jx=["textContent"],Bx={class:"field"},Wx=["textContent"],qx={key:1},Gx=["textContent"];function Kx(e,t,n,r,o,s){const i=O("modal-dialog");return x(),ve(i,{show:n.show,title:e.$t("dialog.update.title"),ok_action:s.library.updating?"":e.$t("dialog.update.rescan"),close_action:e.$t("dialog.update.cancel"),onOk:s.update_library,onClose:t[2]||(t[2]=a=>s.close())},{"modal-content":N(()=>[s.library.updating?(x(),I("div",qx,[u("p",{class:"mb-3",textContent:y(e.$t("dialog.update.progress"))},null,8,Gx)])):(x(),I("div",Nx,[u("p",{class:"mb-3",textContent:y(e.$t("dialog.update.info"))},null,8,Dx),s.spotify_enabled||s.rss.tracks>0?(x(),I("div",Rx,[u("div",Mx,[u("div",Fx,[gt(u("select",{"onUpdate:modelValue":t[0]||(t[0]=a=>s.update_dialog_scan_kind=a)},[u("option",{value:"",textContent:y(e.$t("dialog.update.all"))},null,8,Vx),u("option",{value:"files",textContent:y(e.$t("dialog.update.local"))},null,8,Hx),s.spotify_enabled?(x(),I("option",{key:0,value:"spotify",textContent:y(e.$t("dialog.update.spotify"))},null,8,Ux)):Q("",!0),s.rss.tracks>0?(x(),I("option",{key:1,value:"rss",textContent:y(e.$t("dialog.update.feeds"))},null,8,jx)):Q("",!0)],512),[[Gd,s.update_dialog_scan_kind]])])])])):Q("",!0),u("div",Bx,[gt(u("input",{id:"rescan","onUpdate:modelValue":t[1]||(t[1]=a=>o.rescan_metadata=a),type:"checkbox",class:"switch is-rounded is-small"},null,512),[[jn,o.rescan_metadata]]),u("label",{for:"rescan",textContent:y(e.$t("dialog.update.rescan-metadata"))},null,8,Wx)])]))]),_:1},8,["show","title","ok_action","close_action","onOk"])}const Zx=le(Lx,[["render",Kx]]),Yx={name:"ControlSlider",props:{cursor:{default:"",type:String},disabled:Boolean,max:{required:!0,type:Number},value:{required:!0,type:Number}},emits:["update:value"],computed:{ratio(){return this.value/this.max}}},Xx=["value","disabled","max"];function Jx(e,t,n,r,o,s){return x(),I("input",{value:n.value,disabled:n.disabled,class:Se(["slider",{"is-inactive":n.disabled}]),max:n.max,type:"range",style:po({"--ratio":s.ratio,"--cursor":e.$filters.cursor(n.cursor)}),onInput:t[0]||(t[0]=i=>e.$emit("update:value",i.target.valueAsNumber))},null,46,Xx)}const lm=le(Yx,[["render",Jx]]),wn=Gn("UIStore",{state:()=>({albums_sort:1,artist_albums_sort:1,artist_tracks_sort:1,artists_sort:1,composer_tracks_sort:1,genre_tracks_sort:1,hide_singles:!1,hide_spotify:!1,show_burger_menu:!1,show_only_next_items:!1,show_player_menu:!1,show_update_dialog:!1})}),Qx={name:"NavbarItemLink",props:{to:{required:!0,type:Object}},setup(){return{uiStore:wn()}},computed:{href(){return this.$router.resolve(this.to).href}},methods:{open(){this.uiStore.show_burger_menu&&(this.uiStore.show_burger_menu=!1),this.uiStore.show_player_menu&&(this.uiStore.show_player_menu=!1),this.$router.push(this.to)}}},eE=["href"];function tE(e,t,n,r,o,s){return x(),I("a",{class:"navbar-item",href:s.href,onClick:t[0]||(t[0]=bt((...i)=>s.open&&s.open(...i),["stop","prevent"]))},[wt(e.$slots,"default")],8,eE)}const By=le(Qx,[["render",tE]]);var nE="M11,14C12,14 13.05,14.16 14.2,14.44C13.39,15.31 13,16.33 13,17.5C13,18.39 13.25,19.23 13.78,20H3V18C3,16.81 3.91,15.85 5.74,15.12C7.57,14.38 9.33,14 11,14M11,12C9.92,12 9,11.61 8.18,10.83C7.38,10.05 7,9.11 7,8C7,6.92 7.38,6 8.18,5.18C9,4.38 9.92,4 11,4C12.11,4 13.05,4.38 13.83,5.18C14.61,6 15,6.92 15,8C15,9.11 14.61,10.05 13.83,10.83C13.05,11.61 12.11,12 11,12M18.5,10H20L22,10V12H20V17.5A2.5,2.5 0 0,1 17.5,20A2.5,2.5 0 0,1 15,17.5A2.5,2.5 0 0,1 17.5,15C17.86,15 18.19,15.07 18.5,15.21V10Z",rE="M12,11A1,1 0 0,0 11,12A1,1 0 0,0 12,13A1,1 0 0,0 13,12A1,1 0 0,0 12,11M12,16.5C9.5,16.5 7.5,14.5 7.5,12C7.5,9.5 9.5,7.5 12,7.5C14.5,7.5 16.5,9.5 16.5,12C16.5,14.5 14.5,16.5 12,16.5M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z",oE="M13 14H11V9H13M13 18H11V16H13M1 21H23L12 2L1 21Z",sE="M19.92,12.08L12,20L4.08,12.08L5.5,10.67L11,16.17V2H13V16.17L18.5,10.66L19.92,12.08M12,20H2V22H22V20H12Z",iE="M19 2L14 6.5V17.5L19 13V2M6.5 5C4.55 5 2.45 5.4 1 6.5V21.16C1 21.41 1.25 21.66 1.5 21.66C1.6 21.66 1.65 21.59 1.75 21.59C3.1 20.94 5.05 20.5 6.5 20.5C8.45 20.5 10.55 20.9 12 22C13.35 21.15 15.8 20.5 17.5 20.5C19.15 20.5 20.85 20.81 22.25 21.56C22.35 21.61 22.4 21.59 22.5 21.59C22.75 21.59 23 21.34 23 21.09V6.5C22.4 6.05 21.75 5.75 21 5.5V19C19.9 18.65 18.7 18.5 17.5 18.5C15.8 18.5 13.35 19.15 12 20V6.5C10.55 5.4 8.45 5 6.5 5Z",aE="M12 21.5C10.65 20.65 8.2 20 6.5 20C4.85 20 3.15 20.3 1.75 21.05C1.65 21.1 1.6 21.1 1.5 21.1C1.25 21.1 1 20.85 1 20.6V6C1.6 5.55 2.25 5.25 3 5C4.11 4.65 5.33 4.5 6.5 4.5C8.45 4.5 10.55 4.9 12 6C13.45 4.9 15.55 4.5 17.5 4.5C18.67 4.5 19.89 4.65 21 5C21.75 5.25 22.4 5.55 23 6V20.6C23 20.85 22.75 21.1 22.5 21.1C22.4 21.1 22.35 21.1 22.25 21.05C20.85 20.3 19.15 20 17.5 20C15.8 20 13.35 20.65 12 21.5M12 8V19.5C13.35 18.65 15.8 18 17.5 18C18.7 18 19.9 18.15 21 18.5V7C19.9 6.65 18.7 6.5 17.5 6.5C15.8 6.5 13.35 7.15 12 8M13 11.5C14.11 10.82 15.6 10.5 17.5 10.5C18.41 10.5 19.26 10.59 20 10.78V9.23C19.13 9.08 18.29 9 17.5 9C15.73 9 14.23 9.28 13 9.84V11.5M17.5 11.67C15.79 11.67 14.29 11.93 13 12.46V14.15C14.11 13.5 15.6 13.16 17.5 13.16C18.54 13.16 19.38 13.24 20 13.4V11.9C19.13 11.74 18.29 11.67 17.5 11.67M20 14.57C19.13 14.41 18.29 14.33 17.5 14.33C15.67 14.33 14.17 14.6 13 15.13V16.82C14.11 16.16 15.6 15.83 17.5 15.83C18.54 15.83 19.38 15.91 20 16.07V14.57Z",lE="M9 3V18H12V3H9M12 5L16 18L19 17L15 4L12 5M5 5V18H8V5H5M3 19V21H21V19H3Z",uE="M12 10C10.9 10 10 10.9 10 12S10.9 14 12 14 14 13.1 14 12 13.1 10 12 10M18 12C18 8.7 15.3 6 12 6S6 8.7 6 12C6 14.2 7.2 16.1 9 17.2L10 15.5C8.8 14.8 8 13.5 8 12.1C8 9.9 9.8 8.1 12 8.1S16 9.9 16 12.1C16 13.6 15.2 14.9 14 15.5L15 17.2C16.8 16.2 18 14.2 18 12M12 2C6.5 2 2 6.5 2 12C2 15.7 4 18.9 7 20.6L8 18.9C5.6 17.5 4 14.9 4 12C4 7.6 7.6 4 12 4S20 7.6 20 12C20 15 18.4 17.5 16 18.9L17 20.6C20 18.9 22 15.7 22 12C22 6.5 17.5 2 12 2Z",cu="M12 2C17.5 2 22 6.5 22 12S17.5 22 12 22 2 17.5 2 12 6.5 2 12 2M12 4C10.1 4 8.4 4.6 7.1 5.7L18.3 16.9C19.3 15.5 20 13.8 20 12C20 7.6 16.4 4 12 4M16.9 18.3L5.7 7.1C4.6 8.4 4 10.1 4 12C4 16.4 7.6 20 12 20C13.9 20 15.6 19.4 16.9 18.3Z",cE="M1,10V12A9,9 0 0,1 10,21H12C12,14.92 7.07,10 1,10M1,14V16A5,5 0 0,1 6,21H8A7,7 0 0,0 1,14M1,18V21H4A3,3 0 0,0 1,18M21,3H3C1.89,3 1,3.89 1,5V8H3V5H21V19H14V21H21A2,2 0 0,0 23,19V5C23,3.89 22.1,3 21,3Z",dE="M6,22H18L12,16M21,3H3A2,2 0 0,0 1,5V17A2,2 0 0,0 3,19H7V17H3V5H21V17H17V19H21A2,2 0 0,0 23,17V5A2,2 0 0,0 21,3Z",mE="M17,19H7V5H17M17,1H7C5.89,1 5,1.89 5,3V21A2,2 0 0,0 7,23H17A2,2 0 0,0 19,21V3C19,1.89 18.1,1 17,1Z",fE="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z",pE="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z",hE="M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z",_E="M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z",gE="M15,9H5V5H15M12,19A3,3 0 0,1 9,16A3,3 0 0,1 12,13A3,3 0 0,1 15,16A3,3 0 0,1 12,19M17,3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V7L17,3Z",yE="M19,4H15.5L14.5,3H9.5L8.5,4H5V6H19M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19Z",zE="M20.37,8.91L19.37,10.64L7.24,3.64L8.24,1.91L11.28,3.66L12.64,3.29L16.97,5.79L17.34,7.16L20.37,8.91M6,19V7H11.07L18,11V19A2,2 0 0,1 16,21H8A2,2 0 0,1 6,19Z",bE="M16,12A2,2 0 0,1 18,10A2,2 0 0,1 20,12A2,2 0 0,1 18,14A2,2 0 0,1 16,12M10,12A2,2 0 0,1 12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12M4,12A2,2 0 0,1 6,10A2,2 0 0,1 8,12A2,2 0 0,1 6,14A2,2 0 0,1 4,12Z",vE="M12,16A2,2 0 0,1 14,18A2,2 0 0,1 12,20A2,2 0 0,1 10,18A2,2 0 0,1 12,16M12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12A2,2 0 0,1 12,10M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8A2,2 0 0,1 10,6A2,2 0 0,1 12,4Z",CE="M3,15V13H5V15H3M3,11V9H5V11H3M7,15V13H9V15H7M7,11V9H9V11H7M11,15V13H13V15H11M11,11V9H13V11H11M15,15V13H17V15H15M15,11V9H17V11H15M19,15V13H21V15H19M19,11V9H21V11H19Z",wE="M11.5,3C6.85,3 2.92,6.03 1.53,10.22L3.9,11C4.95,7.81 7.96,5.5 11.5,5.5C13.46,5.5 15.23,6.22 16.62,7.38L14,10H21V3L18.4,5.6C16.55,4 14.15,3 11.5,3M19,14V20C19,21.11 18.11,22 17,22H15A2,2 0 0,1 13,20V14A2,2 0 0,1 15,12H17C18.11,12 19,12.9 19,14M15,14V20H17V14H15M11,20C11,21.11 10.1,22 9,22H5V20H9V18H7V16H9V14H5V12H9A2,2 0 0,1 11,14V15.5A1.5,1.5 0 0,1 9.5,17A1.5,1.5 0 0,1 11,18.5V20Z",SE="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M13,13H11V18A2,2 0 0,1 9,20A2,2 0 0,1 7,18A2,2 0 0,1 9,16C9.4,16 9.7,16.1 10,16.3V11H13V13M13,9V3.5L18.5,9H13Z",kE="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z",xE="M17.66 11.2C17.43 10.9 17.15 10.64 16.89 10.38C16.22 9.78 15.46 9.35 14.82 8.72C13.33 7.26 13 4.85 13.95 3C13 3.23 12.17 3.75 11.46 4.32C8.87 6.4 7.85 10.07 9.07 13.22C9.11 13.32 9.15 13.42 9.15 13.55C9.15 13.77 9 13.97 8.8 14.05C8.57 14.15 8.33 14.09 8.14 13.93C8.08 13.88 8.04 13.83 8 13.76C6.87 12.33 6.69 10.28 7.45 8.64C5.78 10 4.87 12.3 5 14.47C5.06 14.97 5.12 15.47 5.29 15.97C5.43 16.57 5.7 17.17 6 17.7C7.08 19.43 8.95 20.67 10.96 20.92C13.1 21.19 15.39 20.8 17.03 19.32C18.86 17.66 19.5 15 18.56 12.72L18.43 12.46C18.22 12 17.66 11.2 17.66 11.2M14.5 17.5C14.22 17.74 13.76 18 13.4 18.1C12.28 18.5 11.16 17.94 10.5 17.28C11.69 17 12.4 16.12 12.61 15.23C12.78 14.43 12.46 13.77 12.33 13C12.21 12.26 12.23 11.63 12.5 10.94C12.69 11.32 12.89 11.7 13.13 12C13.9 13 15.11 13.44 15.37 14.8C15.41 14.94 15.43 15.08 15.43 15.23C15.46 16.05 15.1 16.95 14.5 17.5H14.5Z",EE="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z",TE="M19,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H10L12,6H19A2,2 0 0,1 21,8H21L4,8V18L6.14,10H23.21L20.93,18.5C20.7,19.37 19.92,20 19,20Z",$E="M13.5,8H12V13L16.28,15.54L17,14.33L13.5,12.25V8M13,3A9,9 0 0,0 4,12H1L4.96,16.03L9,12H6A7,7 0 0,1 13,5A7,7 0 0,1 20,12A7,7 0 0,1 13,19C11.07,19 9.32,18.21 8.06,16.94L6.64,18.36C8.27,20 10.5,21 13,21A9,9 0 0,0 22,12A9,9 0 0,0 13,3",AE="M12,4V2A10,10 0 0,0 2,12H4A8,8 0 0,1 12,4Z",OE="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z",PE="M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z",IE="M12,2A3,3 0 0,1 15,5V11A3,3 0 0,1 12,14A3,3 0 0,1 9,11V5A3,3 0 0,1 12,2M19,11C19,14.53 16.39,17.44 13,17.93V21H11V17.93C7.61,17.44 5,14.53 5,11H7A5,5 0 0,0 12,16A5,5 0 0,0 17,11H19Z",LE="M21,3V15.5A3.5,3.5 0 0,1 17.5,19A3.5,3.5 0 0,1 14,15.5A3.5,3.5 0 0,1 17.5,12C18.04,12 18.55,12.12 19,12.34V6.47L9,8.6V17.5A3.5,3.5 0 0,1 5.5,21A3.5,3.5 0 0,1 2,17.5A3.5,3.5 0 0,1 5.5,14C6.04,14 6.55,14.12 7,14.34V6L21,3Z",NE="M4,6H2V20A2,2 0 0,0 4,22H18V20H4M18,7H15V12.5A2.5,2.5 0 0,1 12.5,15A2.5,2.5 0 0,1 10,12.5A2.5,2.5 0 0,1 12.5,10C13.07,10 13.58,10.19 14,10.5V5H18M20,2H8A2,2 0 0,0 6,4V16A2,2 0 0,0 8,18H20A2,2 0 0,0 22,16V4A2,2 0 0,0 20,2Z",DE="M14,3V5H17.59L7.76,14.83L9.17,16.24L19,6.41V10H21V3M19,19H5V5H12V3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V12H19V19Z",RE="M14,19H18V5H14M6,19H10V5H6V19Z",ME="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z",FE="M22,14H20V16H14V13H16V11H14V6A2,2 0 0,0 12,4H4V2H2V10H4V8H10V11H8V13H10V18A2,2 0 0,0 12,20H20V22H22",VE="M8,5.14V19.14L19,12.14L8,5.14Z",HE="M3 10H14V12H3V10M3 6H14V8H3V6M3 14H10V16H3V14M16 13V21L22 17L16 13Z",UE="M3 16H10V14H3M18 14V10H16V14H12V16H16V20H18V16H22V14M14 6H3V8H14M14 10H3V12H14V10Z",jE="M20,6A2,2 0 0,1 22,8V20A2,2 0 0,1 20,22H4A2,2 0 0,1 2,20V8C2,7.15 2.53,6.42 3.28,6.13L15.71,1L16.47,2.83L8.83,6H20M20,8H4V12H16V10H18V12H20V8M7,14A3,3 0 0,0 4,17A3,3 0 0,0 7,20A3,3 0 0,0 10,17A3,3 0 0,0 7,14Z",BE="M12,10A2,2 0 0,1 14,12C14,12.5 13.82,12.94 13.53,13.29L16.7,22H14.57L12,14.93L9.43,22H7.3L10.47,13.29C10.18,12.94 10,12.5 10,12A2,2 0 0,1 12,10M12,8A4,4 0 0,0 8,12C8,12.5 8.1,13 8.28,13.46L7.4,15.86C6.53,14.81 6,13.47 6,12A6,6 0 0,1 12,6A6,6 0 0,1 18,12C18,13.47 17.47,14.81 16.6,15.86L15.72,13.46C15.9,13 16,12.5 16,12A4,4 0 0,0 12,8M12,4A8,8 0 0,0 4,12C4,14.36 5,16.5 6.64,17.94L5.92,19.94C3.54,18.11 2,15.23 2,12A10,10 0 0,1 12,2A10,10 0 0,1 22,12C22,15.23 20.46,18.11 18.08,19.94L17.36,17.94C19,16.5 20,14.36 20,12A8,8 0 0,0 12,4Z",WE="M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z",qE="M17,17H7V14L3,18L7,22V19H19V13H17M7,7H17V10L21,6L17,2V5H5V11H7V7Z",GE="M2,5.27L3.28,4L20,20.72L18.73,22L15.73,19H7V22L3,18L7,14V17H13.73L7,10.27V11H5V8.27L2,5.27M17,13H19V17.18L17,15.18V13M17,5V2L21,6L17,10V7H8.82L6.82,5H17Z",KE="M13,15V9H12L10,10V11H11.5V15M17,17H7V14L3,18L7,22V19H19V13H17M7,7H17V10L21,6L17,2V5H5V11H7V7Z",ZE="M12.5,3C17.15,3 21.08,6.03 22.47,10.22L20.1,11C19.05,7.81 16.04,5.5 12.5,5.5C10.54,5.5 8.77,6.22 7.38,7.38L10,10H3V3L5.6,5.6C7.45,4 9.85,3 12.5,3M10,12V22H8V14H6V12H10M18,14V20C18,21.11 17.11,22 16,22H14A2,2 0 0,1 12,20V14A2,2 0 0,1 14,12H16C17.11,12 18,12.9 18,14M14,14V20H16V14H14Z",YE="M6.18,15.64A2.18,2.18 0 0,1 8.36,17.82C8.36,19 7.38,20 6.18,20C5,20 4,19 4,17.82A2.18,2.18 0 0,1 6.18,15.64M4,4.44A15.56,15.56 0 0,1 19.56,20H16.73A12.73,12.73 0 0,0 4,7.27V4.44M4,10.1A9.9,9.9 0 0,1 13.9,20H11.07A7.07,7.07 0 0,0 4,12.93V10.1Z",XE="M15,20A1,1 0 0,0 16,19V4H8A1,1 0 0,0 7,5V16H5V5A3,3 0 0,1 8,2H19A3,3 0 0,1 22,5V6H20V5A1,1 0 0,0 19,4A1,1 0 0,0 18,5V9L18,19A3,3 0 0,1 15,22H5A3,3 0 0,1 2,19V18H13A2,2 0 0,0 15,20M9,6H14V8H9V6M9,10H14V12H9V10M9,14H14V16H9V14Z",JE="M13.8 22H5C3.3 22 2 20.7 2 19V18H13.1C13 18.3 13 18.7 13 19C13 20.1 13.3 21.1 13.8 22M13.8 16H5V5C5 3.3 6.3 2 8 2H19C20.7 2 22 3.3 22 5V6H20V5C20 4.4 19.6 4 19 4S18 4.4 18 5V13.1C16.2 13.4 14.7 14.5 13.8 16M8 8H15V6H8V8M8 12H14V10H8V12M17 16V22L22 19L17 16Z",QE="M4,1H20A1,1 0 0,1 21,2V6A1,1 0 0,1 20,7H4A1,1 0 0,1 3,6V2A1,1 0 0,1 4,1M4,9H20A1,1 0 0,1 21,10V14A1,1 0 0,1 20,15H4A1,1 0 0,1 3,14V10A1,1 0 0,1 4,9M4,17H20A1,1 0 0,1 21,18V22A1,1 0 0,1 20,23H4A1,1 0 0,1 3,22V18A1,1 0 0,1 4,17M9,5H10V3H9V5M9,13H10V11H9V13M9,21H10V19H9V21M5,3V5H7V3H5M5,11V13H7V11H5M5,19V21H7V19H5Z",e2="M14.83,13.41L13.42,14.82L16.55,17.95L14.5,20H20V14.5L17.96,16.54L14.83,13.41M14.5,4L16.54,6.04L4,18.59L5.41,20L17.96,7.46L20,9.5V4M10.59,9.17L5.41,4L4,5.41L9.17,10.58L10.59,9.17Z",t2="M16,4.5V7H5V9H16V11.5L19.5,8M16,12.5V15H5V17H16V19.5L19.5,16",n2="M20,5V19L13,12M6,5V19H4V5M13,5V19L6,12",r2="M4,5V19L11,12M18,5V19H20V5M11,5V19L18,12",o2="M12,12A3,3 0 0,0 9,15A3,3 0 0,0 12,18A3,3 0 0,0 15,15A3,3 0 0,0 12,12M12,20A5,5 0 0,1 7,15A5,5 0 0,1 12,10A5,5 0 0,1 17,15A5,5 0 0,1 12,20M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8C10.89,8 10,7.1 10,6C10,4.89 10.89,4 12,4M17,2H7C5.89,2 5,2.89 5,4V20A2,2 0 0,0 7,22H17A2,2 0 0,0 19,20V4C19,2.89 18.1,2 17,2Z",s2="M17.9,10.9C14.7,9 9.35,8.8 6.3,9.75C5.8,9.9 5.3,9.6 5.15,9.15C5,8.65 5.3,8.15 5.75,8C9.3,6.95 15.15,7.15 18.85,9.35C19.3,9.6 19.45,10.2 19.2,10.65C18.95,11 18.35,11.15 17.9,10.9M17.8,13.7C17.55,14.05 17.1,14.2 16.75,13.95C14.05,12.3 9.95,11.8 6.8,12.8C6.4,12.9 5.95,12.7 5.85,12.3C5.75,11.9 5.95,11.45 6.35,11.35C10,10.25 14.5,10.8 17.6,12.7C17.9,12.85 18.05,13.35 17.8,13.7M16.6,16.45C16.4,16.75 16.05,16.85 15.75,16.65C13.4,15.2 10.45,14.9 6.95,15.7C6.6,15.8 6.3,15.55 6.2,15.25C6.1,14.9 6.35,14.6 6.65,14.5C10.45,13.65 13.75,14 16.35,15.6C16.7,15.75 16.75,16.15 16.6,16.45M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z",i2="M18,18H6V6H18V18Z",a2="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z",l2="M12,4L9.91,6.09L12,8.18M4.27,3L3,4.27L7.73,9H3V15H7L12,20V13.27L16.25,17.53C15.58,18.04 14.83,18.46 14,18.7V20.77C15.38,20.45 16.63,19.82 17.68,18.96L19.73,21L21,19.73L12,10.73M19,12C19,12.94 18.8,13.82 18.46,14.64L19.97,16.15C20.62,14.91 21,13.5 21,12C21,7.72 18,4.14 14,3.23V5.29C16.89,6.15 19,8.83 19,12M16.5,12C16.5,10.23 15.5,8.71 14,7.97V10.18L16.45,12.63C16.5,12.43 16.5,12.21 16.5,12Z",u2="M16.36,14C16.44,13.34 16.5,12.68 16.5,12C16.5,11.32 16.44,10.66 16.36,10H19.74C19.9,10.64 20,11.31 20,12C20,12.69 19.9,13.36 19.74,14M14.59,19.56C15.19,18.45 15.65,17.25 15.97,16H18.92C17.96,17.65 16.43,18.93 14.59,19.56M14.34,14H9.66C9.56,13.34 9.5,12.68 9.5,12C9.5,11.32 9.56,10.65 9.66,10H14.34C14.43,10.65 14.5,11.32 14.5,12C14.5,12.68 14.43,13.34 14.34,14M12,19.96C11.17,18.76 10.5,17.43 10.09,16H13.91C13.5,17.43 12.83,18.76 12,19.96M8,8H5.08C6.03,6.34 7.57,5.06 9.4,4.44C8.8,5.55 8.35,6.75 8,8M5.08,16H8C8.35,17.25 8.8,18.45 9.4,19.56C7.57,18.93 6.03,17.65 5.08,16M4.26,14C4.1,13.36 4,12.69 4,12C4,11.31 4.1,10.64 4.26,10H7.64C7.56,10.66 7.5,11.32 7.5,12C7.5,12.68 7.56,13.34 7.64,14M12,4.03C12.83,5.23 13.5,6.57 13.91,8H10.09C10.5,6.57 11.17,5.23 12,4.03M18.92,8H15.97C15.65,6.75 15.19,5.55 14.59,4.44C16.43,5.07 17.96,6.34 18.92,8M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z";const c2={name:"NavbarItemOutput",components:{ControlSlider:lm},props:{output:{required:!0,type:Object}},data(){return{cursor:cu,volume:this.output.selected?this.output.volume:0}},computed:{type_class(){return this.output.type.startsWith("AirPlay")?"cast-variant":this.output.type==="Chromecast"?"cast":this.output.type==="fifo"?"pipe":"server"}},watch:{output(){this.volume=this.output.volume}},methods:{change_volume(){B.player_output_volume(this.output.id,this.volume)},set_enabled(){const e={selected:!this.output.selected};B.output_update(this.output.id,e)}}},d2={class:"navbar-item"},m2={class:"level is-mobile"},f2={class:"level-left is-flex-grow-1"},p2={class:"level-item is-flex-grow-0"},h2={class:"level-item"},_2={class:"is-flex-grow-1"},g2=["textContent"];function y2(e,t,n,r,o,s){const i=O("mdicon"),a=O("control-slider");return x(),I("div",d2,[u("div",m2,[u("div",f2,[u("div",p2,[u("a",{class:Se(["button is-white is-small",{"has-text-grey-light":!n.output.selected}]),onClick:t[0]||(t[0]=(...l)=>s.set_enabled&&s.set_enabled(...l))},[v(i,{class:"icon",name:s.type_class,size:"18",title:n.output.type},null,8,["name","title"])],2)]),u("div",h2,[u("div",_2,[u("p",{class:Se(["heading",{"has-text-grey-light":!n.output.selected}]),textContent:y(n.output.name)},null,10,g2),v(a,{value:o.volume,"onUpdate:value":t[1]||(t[1]=l=>o.volume=l),disabled:!n.output.selected,max:100,cursor:o.cursor,onChange:s.change_volume},null,8,["value","disabled","cursor","onChange"])])])])])])}const z2=le(c2,[["render",y2]]),b2={name:"PlayerButtonConsume",props:{icon_size:{default:16,type:Number}},setup(){return{playerStore:On()}},computed:{is_consume(){return this.playerStore.consume}},methods:{toggle_consume_mode(){B.player_consume(!this.is_consume)}}};function v2(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{class:Se({"is-info":s.is_consume}),onClick:t[0]||(t[0]=(...a)=>s.toggle_consume_mode&&s.toggle_consume_mode(...a))},[v(i,{class:"icon",name:"fire",size:n.icon_size,title:e.$t("player.button.consume")},null,8,["size","title"])],2)}const C2=le(b2,[["render",v2]]),du=Gn("LyricsStore",{state:()=>({content:[],pane:!1})}),w2={name:"PlayerButtonLyrics",props:{icon_size:{default:16,type:Number}},setup(){return{lyricsStore:du()}},computed:{icon_name(){return this.is_active?"script-text-play":"script-text-outline"},is_active(){return this.lyricsStore.pane}},methods:{toggle_lyrics(){this.lyricsStore.pane=!this.lyricsStore.pane}}};function S2(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{class:Se({"is-info":s.is_active}),onClick:t[0]||(t[0]=(...a)=>s.toggle_lyrics&&s.toggle_lyrics(...a))},[v(i,{class:"icon",name:s.icon_name,size:n.icon_size,title:e.$t("player.button.toggle-lyrics")},null,8,["name","size","title"])],2)}const k2=le(w2,[["render",S2]]),x2={name:"PlayerButtonNext",props:{icon_size:{default:16,type:Number}},computed:{disabled(){var e;return((e=ir())==null?void 0:e.count)<=0}},methods:{play_next(){this.disabled||B.player_next()}}},E2=["disabled"];function T2(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.play_next&&s.play_next(...a))},[v(i,{name:"skip-forward",size:n.icon_size,title:e.$t("player.button.skip-forward")},null,8,["size","title"])],8,E2)}const $2=le(x2,[["render",T2]]),A2={name:"PlayerButtonPlayPause",props:{icon_size:{default:16,type:Number},show_disabled_message:Boolean},setup(){return{notificationsStore:yr(),playerStore:On(),queueStore:ir()}},computed:{disabled(){var e;return((e=this.queueStore)==null?void 0:e.count)<=0},icon_name(){if(this.is_playing){if(this.is_pause_allowed)return"pause"}else return"play";return"stop"},is_pause_allowed(){const{current:e}=this.queueStore;return e&&e.data_kind!=="pipe"},is_playing(){return this.playerStore.state==="play"}},methods:{toggle_play_pause(){if(this.disabled){this.show_disabled_message&&this.notificationsStore.add({text:this.$t("server.empty-queue"),timeout:2e3,topic:"connection",type:"info"});return}this.is_playing&&this.is_pause_allowed?B.player_pause():this.is_playing&&!this.is_pause_allowed?B.player_stop():B.player_play()}}},O2=["disabled"];function P2(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.toggle_play_pause&&s.toggle_play_pause(...a))},[v(i,{name:s.icon_name,size:n.icon_size,title:e.$t(`player.button.${s.icon_name}`)},null,8,["name","size","title"])],8,O2)}const I2=le(A2,[["render",P2]]),L2={name:"PlayerButtonPrevious",props:{icon_size:{default:16,type:Number}},setup(){return{queueStore:ir()}},computed:{disabled(){return this.queueStore.count<=0}},methods:{play_previous(){this.disabled||B.player_previous()}}},N2=["disabled"];function D2(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.play_previous&&s.play_previous(...a))},[v(i,{name:"skip-backward",size:n.icon_size,title:e.$t("player.button.skip-backward")},null,8,["size","title"])],8,N2)}const R2=le(L2,[["render",D2]]),M2={name:"PlayerButtonRepeat",props:{icon_size:{default:16,type:Number}},setup(){return{playerStore:On()}},computed:{icon_name(){return this.is_repeat_all?"repeat":this.is_repeat_single?"repeat-once":"repeat-off"},is_repeat_all(){return this.playerStore.repeat==="all"},is_repeat_off(){return!this.is_repeat_all&&!this.is_repeat_single},is_repeat_single(){return this.playerStore.repeat==="single"}},methods:{toggle_repeat_mode(){this.is_repeat_all?B.player_repeat("single"):this.is_repeat_single?B.player_repeat("off"):B.player_repeat("all")}}};function F2(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{class:Se({"is-info":!s.is_repeat_off}),onClick:t[0]||(t[0]=(...a)=>s.toggle_repeat_mode&&s.toggle_repeat_mode(...a))},[v(i,{class:"icon",name:s.icon_name,size:n.icon_size,title:e.$t(`player.button.${s.icon_name}`)},null,8,["name","size","title"])],2)}const V2=le(M2,[["render",F2]]),H2={name:"PlayerButtonSeekBack",props:{icon_size:{default:16,type:Number},seek_ms:{required:!0,type:Number}},setup(){return{playerStore:On(),queueStore:ir()}},computed:{disabled(){var e;return((e=this.queueStore)==null?void 0:e.count)<=0||this.is_stopped||this.current.data_kind==="pipe"},is_stopped(){return this.player.state==="stop"},current(){return this.queueStore.current},player(){return this.playerStore},visible(){return["podcast","audiobook"].includes(this.current.media_kind)}},methods:{seek(){this.disabled||B.player_seek(this.seek_ms*-1)}}},U2=["disabled"];function j2(e,t,n,r,o,s){const i=O("mdicon");return s.visible?(x(),I("a",{key:0,disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.seek&&s.seek(...a))},[v(i,{name:"rewind-10",size:n.icon_size,title:e.$t("player.button.seek-backward")},null,8,["size","title"])],8,U2)):Q("",!0)}const B2=le(H2,[["render",j2]]),W2={name:"PlayerButtonSeekForward",props:{icon_size:{default:16,type:Number},seek_ms:{required:!0,type:Number}},setup(){return{playerStore:On(),queueStore:ir()}},computed:{disabled(){var e;return((e=this.queueStore)==null?void 0:e.count)<=0||this.is_stopped||this.current.data_kind==="pipe"},is_stopped(){return this.player.state==="stop"},current(){return this.queueStore.current},player(){return this.playerStore},visible(){return["podcast","audiobook"].includes(this.current.media_kind)}},methods:{seek(){this.disabled||B.player_seek(this.seek_ms)}}},q2=["disabled"];function G2(e,t,n,r,o,s){const i=O("mdicon");return s.visible?(x(),I("a",{key:0,disabled:s.disabled,onClick:t[0]||(t[0]=(...a)=>s.seek&&s.seek(...a))},[v(i,{name:"fast-forward-30",size:n.icon_size,title:e.$t("player.button.seek-forward")},null,8,["size","title"])],8,q2)):Q("",!0)}const K2=le(W2,[["render",G2]]),Z2={name:"PlayerButtonShuffle",props:{icon_size:{default:16,type:Number}},setup(){return{playerStore:On()}},computed:{icon_name(){return this.is_shuffle?"shuffle":"shuffle-disabled"},is_shuffle(){return this.playerStore.shuffle}},methods:{toggle_shuffle_mode(){B.player_shuffle(!this.is_shuffle)}}};function Y2(e,t,n,r,o,s){const i=O("mdicon");return x(),I("a",{class:Se({"is-info":s.is_shuffle}),onClick:t[0]||(t[0]=(...a)=>s.toggle_shuffle_mode&&s.toggle_shuffle_mode(...a))},[v(i,{class:"icon",name:s.icon_name,size:n.icon_size,title:e.$t(`player.button.${s.icon_name}`)},null,8,["name","size","title"])],2)}const X2=le(Z2,[["render",Y2]]),qs={audio:new Audio,context:null,play(e){this.stop(),this.context.resume().then(()=>{this.audio.src=`${String(e||"")}?x=${Date.now()}`,this.audio.crossOrigin="anonymous",this.audio.load()})},setVolume(e){this.audio&&(this.audio.volume=Math.min(1,Math.max(0,parseFloat(e)||0)))},setup(){return this.context=new(window.AudioContext||window.webkitAudioContext),this.context.createMediaElementSource(this.audio).connect(this.context.destination),this.audio.addEventListener("canplaythrough",()=>{this.audio.play()}),this.audio.addEventListener("canplay",()=>{this.audio.play()}),this.audio},stop(){try{this.audio.pause()}catch{}try{this.audio.stop()}catch{}try{this.audio.close()}catch{}}},um=Gn("OutputsStore",{state:()=>({outputs:[]})}),J2={name:"NavbarBottom",components:{ControlSlider:lm,NavbarItemLink:By,NavbarItemOutput:z2,PlayerButtonConsume:C2,PlayerButtonLyrics:k2,PlayerButtonNext:$2,PlayerButtonPlayPause:I2,PlayerButtonPrevious:R2,PlayerButtonRepeat:V2,PlayerButtonSeekBack:B2,PlayerButtonSeekForward:K2,PlayerButtonShuffle:X2},setup(){return{notificationsStore:yr(),outputsStore:um(),playerStore:On(),queueStore:ir(),uiStore:wn()}},data(){return{cursor:cu,loading:!1,old_volume:0,playing:!1,show_desktop_outputs_menu:!1,show_outputs_menu:!1,stream_volume:10}},computed:{is_now_playing_page(){return this.$route.name==="now-playing"},current(){return this.queueStore.current},outputs(){return this.outputsStore.outputs},player(){return this.playerStore},show_player_menu:{get(){return this.uiStore.show_player_menu},set(e){this.uiStore.show_player_menu=e}}},watch:{"playerStore.volume"(){this.player.volume>0&&(this.old_volume=this.player.volume)}},mounted(){this.setupAudio()},unmounted(){this.closeAudio()},methods:{change_stream_volume(){qs.setVolume(this.stream_volume/100)},change_volume(){B.player_volume(this.player.volume)},closeAudio(){qs.stop(),this.playing=!1},on_click_outside_outputs(){this.show_outputs_menu=!1},playChannel(){this.playing||(this.loading=!0,qs.play("/stream.mp3"),qs.setVolume(this.stream_volume/100))},setupAudio(){const e=qs.setup();e.addEventListener("waiting",()=>{this.playing=!1,this.loading=!0}),e.addEventListener("playing",()=>{this.playing=!0,this.loading=!1}),e.addEventListener("ended",()=>{this.playing=!1,this.loading=!1}),e.addEventListener("error",()=>{this.closeAudio(),this.notificationsStore.add({text:this.$t("navigation.stream-error"),type:"danger"}),this.playing=!1,this.loading=!1})},togglePlay(){this.loading||(this.playing&&this.closeAudio(),this.playChannel())},toggle_mute_volume(){this.player.volume=this.player.volume>0?0:this.old_volume,this.change_volume()}}},Q2={class:"navbar-dropdown is-right fd-width-auto"},eT={class:"navbar-item"},tT={class:"level is-mobile"},nT={class:"level-left is-flex-grow-1"},rT={class:"level-item is-flex-grow-0"},oT={class:"level-item"},sT=["textContent"],iT={class:"navbar-item"},aT={class:"level is-mobile"},lT={class:"level-left is-flex-grow-1"},uT={class:"level-item is-flex-grow-0"},cT={class:"level-item"},dT={class:"is-flex-grow-1"},mT=["textContent"],fT={href:"stream.mp3",class:"heading ml-2",target:"_blank"},pT={class:"navbar-item is-justify-content-center"},hT={class:"buttons has-addons"},_T={class:"navbar-brand is-flex-grow-1"},gT={class:"fd-is-text-clipped"},yT=["textContent"],zT=["textContent"],bT=["textContent"],vT={class:"navbar-item"},CT={class:"buttons has-addons is-centered"},wT={class:"navbar-item"},ST={class:"level is-mobile"},kT={class:"level-left is-flex-grow-1"},xT={class:"level-item is-flex-grow-0"},ET={class:"level-item"},TT={class:"is-flex-grow-1"},$T=["textContent"],AT={class:"navbar-item mb-5"},OT={class:"level is-mobile"},PT={class:"level-left is-flex-grow-1"},IT={class:"level-item is-flex-grow-0"},LT={class:"level-item"},NT={class:"is-flex-grow-1"},DT=["textContent"],RT={href:"stream.mp3",class:"heading ml-2",target:"_blank"};function MT(e,t,n,r,o,s){const i=O("mdicon"),a=O("control-slider"),l=O("navbar-item-output"),c=O("player-button-repeat"),d=O("player-button-shuffle"),m=O("player-button-consume"),f=O("player-button-lyrics"),p=O("navbar-item-link"),h=O("player-button-previous"),_=O("player-button-seek-back"),b=O("player-button-play-pause"),C=O("player-button-seek-forward"),w=O("player-button-next");return x(),I("nav",{class:Se(["navbar is-block is-white is-fixed-bottom fd-bottom-navbar",{"is-transparent":s.is_now_playing_page,"is-dark":!s.is_now_playing_page}]),role:"navigation","aria-label":"player controls"},[u("div",{class:Se(["navbar-item has-dropdown has-dropdown-up is-hidden-touch",{"is-active":s.show_player_menu}])},[u("div",Q2,[u("div",eT,[u("div",tT,[u("div",nT,[u("div",rT,[u("a",{class:"button is-white is-small",onClick:t[0]||(t[0]=(...g)=>s.toggle_mute_volume&&s.toggle_mute_volume(...g))},[v(i,{class:"icon",name:s.player.volume>0?"volume-high":"volume-off",size:"18"},null,8,["name"])])]),u("div",oT,[u("div",null,[u("p",{class:"heading",textContent:y(e.$t("navigation.volume"))},null,8,sT),v(a,{value:s.player.volume,"onUpdate:value":t[1]||(t[1]=g=>s.player.volume=g),max:100,onChange:s.change_volume},null,8,["value","onChange"])])])])])]),t[9]||(t[9]=u("hr",{class:"my-3"},null,-1)),(x(!0),I(ze,null,zt(s.outputs,g=>(x(),ve(l,{key:g.id,output:g},null,8,["output"]))),128)),t[10]||(t[10]=u("hr",{class:"my-3"},null,-1)),u("div",iT,[u("div",aT,[u("div",lT,[u("div",uT,[u("a",{class:Se(["button is-white is-small",{"has-text-grey-light":!o.playing&&!o.loading,"is-loading":o.loading}]),onClick:t[2]||(t[2]=(...g)=>s.togglePlay&&s.togglePlay(...g))},[v(i,{class:"icon",name:"broadcast",size:"18"})],2)]),u("div",cT,[u("div",dT,[u("div",{class:Se(["is-flex is-align-content-center",{"has-text-grey-light":!o.playing}])},[u("p",{class:"heading",textContent:y(e.$t("navigation.stream"))},null,8,mT),u("a",fT,[v(i,{class:"icon is-small",name:"open-in-new",size:"16"})])],2),v(a,{value:o.stream_volume,"onUpdate:value":t[3]||(t[3]=g=>o.stream_volume=g),disabled:!o.playing,max:100,cursor:o.cursor,onChange:s.change_stream_volume},null,8,["value","disabled","cursor","onChange"])])])])])]),t[11]||(t[11]=u("hr",{class:"my-3"},null,-1)),u("div",pT,[u("div",hT,[v(c,{class:"button"}),v(d,{class:"button"}),v(m,{class:"button"}),v(f,{class:"button"})])])])],2),u("div",_T,[v(p,{to:{name:"queue"},class:"mr-auto"},{default:N(()=>[v(i,{class:"icon",name:"playlist-play",size:"24"})]),_:1}),s.is_now_playing_page?Q("",!0):(x(),ve(p,{key:0,to:{name:"now-playing"},exact:"",class:"is-expanded is-clipped is-size-7"},{default:N(()=>[u("div",gT,[u("strong",{textContent:y(s.current.title)},null,8,yT),t[12]||(t[12]=u("br",null,null,-1)),u("span",{textContent:y(s.current.artist)},null,8,zT),s.current.album?(x(),I("span",{key:0,textContent:y(e.$t("navigation.now-playing",{album:s.current.album}))},null,8,bT)):Q("",!0)])]),_:1})),s.is_now_playing_page?(x(),ve(h,{key:1,class:"navbar-item px-2",icon_size:24})):Q("",!0),s.is_now_playing_page?(x(),ve(_,{key:2,seek_ms:1e4,class:"navbar-item px-2",icon_size:24})):Q("",!0),v(b,{class:"navbar-item px-2",icon_size:36,show_disabled_message:""}),s.is_now_playing_page?(x(),ve(C,{key:3,seek_ms:3e4,class:"navbar-item px-2",icon_size:24})):Q("",!0),s.is_now_playing_page?(x(),ve(w,{key:4,class:"navbar-item px-2",icon_size:24})):Q("",!0),u("a",{class:"navbar-item ml-auto",onClick:t[4]||(t[4]=g=>s.show_player_menu=!s.show_player_menu)},[v(i,{class:"icon",name:s.show_player_menu?"chevron-down":"chevron-up"},null,8,["name"])])]),u("div",{class:Se(["navbar-menu is-hidden-desktop",{"is-active":s.show_player_menu}])},[u("div",vT,[u("div",CT,[v(c,{class:"button"}),v(d,{class:"button"}),v(m,{class:"button"}),v(f,{class:"button"})])]),t[13]||(t[13]=u("hr",{class:"my-3"},null,-1)),u("div",wT,[u("div",ST,[u("div",kT,[u("div",xT,[u("a",{class:"button is-white is-small",onClick:t[5]||(t[5]=(...g)=>s.toggle_mute_volume&&s.toggle_mute_volume(...g))},[v(i,{class:"icon",name:s.player.volume>0?"volume-high":"volume-off",size:"18"},null,8,["name"])])]),u("div",ET,[u("div",TT,[u("p",{class:"heading",textContent:y(e.$t("navigation.volume"))},null,8,$T),v(a,{value:s.player.volume,"onUpdate:value":t[6]||(t[6]=g=>s.player.volume=g),max:100,onChange:s.change_volume},null,8,["value","onChange"])])])])])]),t[14]||(t[14]=u("hr",{class:"my-3"},null,-1)),(x(!0),I(ze,null,zt(s.outputs,g=>(x(),ve(l,{key:g.id,output:g},null,8,["output"]))),128)),t[15]||(t[15]=u("hr",{class:"my-3"},null,-1)),u("div",AT,[u("div",OT,[u("div",PT,[u("div",IT,[u("a",{class:Se(["button is-white is-small",{"has-text-grey-light":!o.playing&&!o.loading,"is-loading":o.loading}]),onClick:t[7]||(t[7]=(...g)=>s.togglePlay&&s.togglePlay(...g))},[v(i,{class:"icon",name:"radio-tower",size:"16"})],2)]),u("div",LT,[u("div",NT,[u("div",{class:Se(["is-flex is-align-content-center",{"has-text-grey-light":!o.playing}])},[u("p",{class:"heading",textContent:y(e.$t("navigation.stream"))},null,8,DT),u("a",RT,[v(i,{class:"icon is-small",name:"open-in-new",size:"16"})])],2),v(a,{value:o.stream_volume,"onUpdate:value":t[8]||(t[8]=g=>o.stream_volume=g),disabled:!o.playing,max:100,cursor:o.cursor,onChange:s.change_stream_volume},null,8,["value","disabled","cursor","onChange"])])])])])])],2)],2)}const FT=le(J2,[["render",MT]]),cm=Gn("SearchStore",{state:()=>({recent_searches:[],search_query:"",search_source:"search-library"}),actions:{add(e){const t=this.recent_searches.indexOf(e);t!==-1&&this.recent_searches.splice(t,1),this.recent_searches.unshift(e),this.recent_searches.length>5&&this.recent_searches.pop()},remove(e){const t=this.recent_searches.indexOf(e);t!==-1&&this.recent_searches.splice(t,1)}}}),cr=Gn("SettingsStore",{state:()=>({categories:[]}),getters:{recently_added_limit:e=>{var t;return((t=e.setting("webinterface","recently_added_limit"))==null?void 0:t.value)??100},show_composer_for_genre:e=>{var t;return((t=e.setting("webinterface","show_composer_for_genre"))==null?void 0:t.value)??null},show_composer_now_playing:e=>{var t;return((t=e.setting("webinterface","show_composer_now_playing"))==null?void 0:t.value)??!1},show_cover_artwork_in_album_lists:e=>{var t;return((t=e.setting("artwork","show_cover_artwork_in_album_lists"))==null?void 0:t.value)??!1},show_filepath_now_playing:e=>{var t;return((t=e.setting("webinterface","show_filepath_now_playing"))==null?void 0:t.value)??!1},show_menu_item_audiobooks:e=>{var t;return((t=e.setting("webinterface","show_menu_item_audiobooks"))==null?void 0:t.value)??!1},show_menu_item_files:e=>{var t;return((t=e.setting("webinterface","show_menu_item_files"))==null?void 0:t.value)??!1},show_menu_item_music:e=>{var t;return((t=e.setting("webinterface","show_menu_item_music"))==null?void 0:t.value)??!1},show_menu_item_playlists:e=>{var t;return((t=e.setting("webinterface","show_menu_item_playlists"))==null?void 0:t.value)??!1},show_menu_item_podcasts:e=>{var t;return((t=e.setting("webinterface","show_menu_item_podcasts"))==null?void 0:t.value)??!1},show_menu_item_radio:e=>{var t;return((t=e.setting("webinterface","show_menu_item_radio"))==null?void 0:t.value)??!1},show_menu_item_search:e=>{var t;return((t=e.setting("webinterface","show_menu_item_search"))==null?void 0:t.value)??!1}},actions:{update(e){const t=this.categories.find(r=>r.name===e.category);if(!t)return;const n=t.options.find(r=>r.name===e.name);n&&(n.value=e.value)},setting(e,t){var n;return((n=this.categories.find(r=>r.name===e))==null?void 0:n.options.find(r=>r.name===t))??{}}}}),VT={name:"NavbarTop",components:{NavbarItemLink:By},setup(){return{searchStore:cm(),servicesStore:It(),settingsStore:cr(),uiStore:wn()}},data(){return{show_settings_menu:!1}},computed:{show_burger_menu:{get(){return this.uiStore.show_burger_menu},set(e){this.uiStore.show_burger_menu=e}},show_update_dialog:{get(){return this.uiStore.show_update_dialog},set(e){this.uiStore.show_update_dialog=e}},spotify_enabled(){return this.servicesStore.spotify.webapi_token_valid},zindex(){return this.uiStore.show_player_menu?"z-index: 21":""}},watch:{$route(e,t){this.show_settings_menu=!1}},methods:{on_click_outside_settings(){this.show_settings_menu=!this.show_settings_menu},open_update_dialog(){this.show_update_dialog=!0,this.show_settings_menu=!1,this.show_burger_menu=!1}}},HT={class:"navbar-brand"},UT={class:"navbar-end"},jT={class:"navbar-item is-arrowless is-hidden-touch"},BT={class:"navbar-dropdown is-right"},WT=["textContent"],qT=["textContent"],GT=["textContent"],KT=["textContent"],ZT=["textContent"],YT=["textContent"],XT=["textContent"],JT=["textContent"],QT=["textContent"],e$=["textContent"],t$=["textContent"],n$=["textContent"];function r$(e,t,n,r,o,s){const i=O("mdicon"),a=O("navbar-item-link");return x(),I("nav",{class:"navbar is-light is-fixed-top",style:po(s.zindex),role:"navigation","aria-label":"main navigation"},[u("div",HT,[r.settingsStore.show_menu_item_playlists?(x(),ve(a,{key:0,to:{name:"playlists"}},{default:N(()=>[v(i,{class:"icon",name:"music-box-multiple",size:"16"})]),_:1})):Q("",!0),r.settingsStore.show_menu_item_music?(x(),ve(a,{key:1,to:{name:"music"}},{default:N(()=>[v(i,{class:"icon",name:"music",size:"16"})]),_:1})):Q("",!0),r.settingsStore.show_menu_item_podcasts?(x(),ve(a,{key:2,to:{name:"podcasts"}},{default:N(()=>[v(i,{class:"icon",name:"microphone",size:"16"})]),_:1})):Q("",!0),r.settingsStore.show_menu_item_audiobooks?(x(),ve(a,{key:3,to:{name:"audiobooks"}},{default:N(()=>[v(i,{class:"icon",name:"book-open-variant",size:"16"})]),_:1})):Q("",!0),r.settingsStore.show_menu_item_radio?(x(),ve(a,{key:4,to:{name:"radio"}},{default:N(()=>[v(i,{class:"icon",name:"radio",size:"16"})]),_:1})):Q("",!0),r.settingsStore.show_menu_item_files?(x(),ve(a,{key:5,to:{name:"files"}},{default:N(()=>[v(i,{class:"icon",name:"folder-open",size:"16"})]),_:1})):Q("",!0),r.settingsStore.show_menu_item_search?(x(),ve(a,{key:6,to:{name:r.searchStore.search_source}},{default:N(()=>[v(i,{class:"icon",name:"magnify",size:"16"})]),_:1},8,["to"])):Q("",!0),u("div",{class:Se(["navbar-burger",{"is-active":s.show_burger_menu}]),onClick:t[0]||(t[0]=l=>s.show_burger_menu=!s.show_burger_menu)},t[4]||(t[4]=[u("span",null,null,-1),u("span",null,null,-1),u("span",null,null,-1)]),2)]),u("div",{class:Se(["navbar-menu",{"is-active":s.show_burger_menu}])},[t[6]||(t[6]=u("div",{class:"navbar-start"},null,-1)),u("div",UT,[u("div",{class:Se(["navbar-item has-dropdown is-hoverable",{"is-active":o.show_settings_menu}]),onClick:t[2]||(t[2]=(...l)=>s.on_click_outside_settings&&s.on_click_outside_settings(...l))},[u("a",jT,[v(i,{class:"icon",name:"menu",size:"24"})]),u("div",BT,[v(a,{to:{name:"playlists"}},{default:N(()=>[v(i,{class:"icon",name:"music-box-multiple",size:"16"}),u("b",{textContent:y(e.$t("navigation.playlists"))},null,8,WT)]),_:1}),v(a,{to:{name:"music"}},{default:N(()=>[v(i,{class:"icon",name:"music",size:"16"}),u("b",{textContent:y(e.$t("navigation.music"))},null,8,qT)]),_:1}),v(a,{to:{name:"music-artists"}},{default:N(()=>[u("span",{class:"pl-5",textContent:y(e.$t("navigation.artists"))},null,8,GT)]),_:1}),v(a,{to:{name:"music-albums"}},{default:N(()=>[u("span",{class:"pl-5",textContent:y(e.$t("navigation.albums"))},null,8,KT)]),_:1}),v(a,{to:{name:"music-genres"}},{default:N(()=>[u("span",{class:"pl-5",textContent:y(e.$t("navigation.genres"))},null,8,ZT)]),_:1}),s.spotify_enabled?(x(),ve(a,{key:0,to:{name:"music-spotify"}},{default:N(()=>[u("span",{class:"pl-5",textContent:y(e.$t("navigation.spotify"))},null,8,YT)]),_:1})):Q("",!0),v(a,{to:{name:"podcasts"}},{default:N(()=>[v(i,{class:"icon",name:"microphone",size:"16"}),u("b",{textContent:y(e.$t("navigation.podcasts"))},null,8,XT)]),_:1}),v(a,{to:{name:"audiobooks"}},{default:N(()=>[v(i,{class:"icon",name:"book-open-variant",size:"16"}),u("b",{textContent:y(e.$t("navigation.audiobooks"))},null,8,JT)]),_:1}),v(a,{to:{name:"radio"}},{default:N(()=>[v(i,{class:"icon",name:"radio",size:"16"}),u("b",{textContent:y(e.$t("navigation.radio"))},null,8,QT)]),_:1}),v(a,{to:{name:"files"}},{default:N(()=>[v(i,{class:"icon",name:"folder-open",size:"16"}),u("b",{textContent:y(e.$t("navigation.files"))},null,8,e$)]),_:1}),v(a,{to:{name:r.searchStore.search_source}},{default:N(()=>[v(i,{class:"icon",name:"magnify",size:"16"}),u("b",{textContent:y(e.$t("navigation.search"))},null,8,t$)]),_:1},8,["to"]),t[5]||(t[5]=u("hr",{class:"my-3"},null,-1)),v(a,{to:{name:"settings-webinterface"}},{default:N(()=>[Mt(y(e.$t("navigation.settings")),1)]),_:1}),u("a",{class:"navbar-item",onClick:t[1]||(t[1]=bt(l=>s.open_update_dialog(),["stop","prevent"])),textContent:y(e.$t("navigation.update-library"))},null,8,n$),v(a,{to:{name:"about"}},{default:N(()=>[Mt(y(e.$t("navigation.about")),1)]),_:1})])],2)])],2),gt(u("div",{class:"is-overlay",onClick:t[3]||(t[3]=l=>o.show_settings_menu=!1)},null,512),[[Li,o.show_settings_menu]])],4)}const o$=le(VT,[["render",r$]]),s$={name:"NotificationList",setup(){return{notificationsStore:yr()}},computed:{notifications(){return this.notificationsStore.list}},methods:{remove(e){this.notificationsStore.remove(e)}}},i$={key:0,class:"notifications"},a$={class:"columns is-centered"},l$={class:"column is-half"},u$=["onClick"],c$=["textContent"];function d$(e,t,n,r,o,s){return s.notifications.length>0?(x(),I("section",i$,[u("div",a$,[u("div",l$,[(x(!0),I(ze,null,zt(s.notifications,i=>(x(),I("div",{key:i.id,class:Se(["notification",i.type?`is-${i.type}`:""])},[u("button",{class:"delete",onClick:a=>s.remove(i)},null,8,u$),u("div",{class:"text",textContent:y(i.text)},null,8,c$)],2))),128))])])])):Q("",!0)}const m$=le(s$,[["render",d$],["__scopeId","data-v-a896a8d3"]]);var Wy=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function mu(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function qy(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var n=function r(){return this instanceof r?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(r){var o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,o.get?o:{enumerable:!0,get:function(){return e[r]}})}),n}var Gy={exports:{}};(function(e){(function(t,n){e.exports?e.exports=n():t.ReconnectingWebSocket=n()})(Wy,function(){if(!("WebSocket"in window))return;function t(n,r,o){var s={debug:!1,automaticOpen:!0,reconnectInterval:1e3,maxReconnectInterval:3e4,reconnectDecay:1.5,timeoutInterval:2e3,maxReconnectAttempts:null};o||(o={});for(var i in s)typeof o[i]<"u"?this[i]=o[i]:this[i]=s[i];this.url=n,this.reconnectAttempts=0,this.readyState=WebSocket.CONNECTING,this.protocol=null;var a=this,l,c=!1,d=!1,m=document.createElement("div");m.addEventListener("open",function(p){a.onopen(p)}),m.addEventListener("close",function(p){a.onclose(p)}),m.addEventListener("connecting",function(p){a.onconnecting(p)}),m.addEventListener("message",function(p){a.onmessage(p)}),m.addEventListener("error",function(p){a.onerror(p)}),this.addEventListener=m.addEventListener.bind(m),this.removeEventListener=m.removeEventListener.bind(m),this.dispatchEvent=m.dispatchEvent.bind(m);function f(p,h){var _=document.createEvent("CustomEvent");return _.initCustomEvent(p,!1,!1,h),_}this.open=function(p){if(l=new WebSocket(a.url,r||[]),p){if(this.maxReconnectAttempts&&this.reconnectAttempts>this.maxReconnectAttempts)return}else m.dispatchEvent(f("connecting")),this.reconnectAttempts=0;(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","attempt-connect",a.url);var h=l,_=setTimeout(function(){(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","connection-timeout",a.url),d=!0,h.close(),d=!1},a.timeoutInterval);l.onopen=function(b){clearTimeout(_),(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","onopen",a.url),a.protocol=l.protocol,a.readyState=WebSocket.OPEN,a.reconnectAttempts=0;var C=f("open");C.isReconnect=p,p=!1,m.dispatchEvent(C)},l.onclose=function(b){if(clearTimeout(w),l=null,c)a.readyState=WebSocket.CLOSED,m.dispatchEvent(f("close"));else{a.readyState=WebSocket.CONNECTING;var C=f("connecting");C.code=b.code,C.reason=b.reason,C.wasClean=b.wasClean,m.dispatchEvent(C),!p&&!d&&((a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","onclose",a.url),m.dispatchEvent(f("close")));var w=a.reconnectInterval*Math.pow(a.reconnectDecay,a.reconnectAttempts);setTimeout(function(){a.reconnectAttempts++,a.open(!0)},w>a.maxReconnectInterval?a.maxReconnectInterval:w)}},l.onmessage=function(b){(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","onmessage",a.url,b.data);var C=f("message");C.data=b.data,m.dispatchEvent(C)},l.onerror=function(b){(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","onerror",a.url,b),m.dispatchEvent(f("error"))}},this.automaticOpen==!0&&this.open(!1),this.send=function(p){if(l)return(a.debug||t.debugAll)&&console.debug("ReconnectingWebSocket","send",a.url,p),l.send(p);throw"INVALID_STATE_ERR : Pausing to reconnect websocket"},this.close=function(p,h){typeof p>"u"&&(p=1e3),c=!0,l&&l.close(p,h)},this.refresh=function(){l&&l.close()}}return t.prototype.onopen=function(n){},t.prototype.onclose=function(n){},t.prototype.onconnecting=function(n){},t.prototype.onmessage=function(n){},t.prototype.onerror=function(n){},t.debugAll=!1,t.CONNECTING=WebSocket.CONNECTING,t.OPEN=WebSocket.OPEN,t.CLOSING=WebSocket.CLOSING,t.CLOSED=WebSocket.CLOSED,t})})(Gy);var f$=Gy.exports;const p$=mu(f$),Fo=Gn("ConfigurationStore",{state:()=>({buildoptions:[],version:"",websocket_port:0,allow_modifying_stored_playlists:!1,default_playlist_directory:""})}),h$={name:"App",components:{ModalDialogRemotePairing:Cx,ModalDialogUpdate:Zx,NavbarBottom:FT,NavbarTop:o$,NotificationList:m$},setup(){return{configurationStore:Fo(),libraryStore:uu(),lyricsStore:du(),notificationsStore:yr(),outputsStore:um(),playerStore:On(),queueStore:ir(),remotesStore:Kd(),servicesStore:It(),settingsStore:cr(),uiStore:wn()}},data(){return{pairing_active:!1,reconnect_attempts:0,token_timer_id:0}},computed:{show_burger_menu:{get(){return this.uiStore.show_burger_menu},set(e){this.uiStore.show_burger_menu=e}},show_player_menu:{get(){return this.uiStore.show_player_menu},set(e){this.uiStore.show_player_menu=e}},show_update_dialog:{get(){return this.uiStore.show_update_dialog},set(e){this.uiStore.show_update_dialog=e}}},watch:{show_burger_menu(){this.update_is_clipped()},show_player_menu(){this.update_is_clipped()}},created(){this.connect(),this.$Progress.start(),this.$router.beforeEach((e,t,n)=>{e.meta.show_progress&&!(e.path===t.path&&e.hash)&&(e.meta.progress&&this.$Progress.parseMeta(e.meta.progress),this.$Progress.start()),n()}),this.$router.afterEach((e,t)=>{e.meta.show_progress&&this.$Progress.finish()})},methods:{connect(){B.config().then(({data:e})=>{this.configurationStore.$state=e,this.uiStore.hide_singles=e.hide_singles,document.title=e.library_name,this.open_websocket(),this.$Progress.finish()}).catch(()=>{this.notificationsStore.add({text:this.$t("server.connection-failed"),topic:"connection",type:"danger"})})},open_websocket(){const e=this.create_websocket(),t=this;e.onopen=()=>{t.reconnect_attempts=0,e.send(JSON.stringify({notify:["update","database","player","options","outputs","volume","queue","spotify","lastfm","pairing"]})),t.update_outputs(),t.update_player_status(),t.update_library_stats(),t.update_settings(),t.update_queue(),t.update_spotify(),t.update_lastfm(),t.update_pairing()};let n=!1;const r=()=>{n||(t.update_outputs(),t.update_player_status(),t.update_library_stats(),t.update_settings(),t.update_queue(),t.update_spotify(),t.update_lastfm(),t.update_pairing(),n=!0,setTimeout(()=>{n=!1},500))};window.addEventListener("focus",r),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&r()}),e.onmessage=o=>{const s=JSON.parse(o.data);(s.notify.includes("update")||s.notify.includes("database"))&&t.update_library_stats(),(s.notify.includes("player")||s.notify.includes("options")||s.notify.includes("volume"))&&t.update_player_status(),(s.notify.includes("outputs")||s.notify.includes("volume"))&&t.update_outputs(),s.notify.includes("queue")&&t.update_queue(),s.notify.includes("spotify")&&t.update_spotify(),s.notify.includes("lastfm")&&t.update_lastfm(),s.notify.includes("pairing")&&t.update_pairing()}},create_websocket(){const e=window.location.protocol.replace("http","ws"),t=window.location.hostname,n=this.configurationStore.websocket_port||`${window.location.port}/ws`,r=`${e}${t}:${n}`;return new p$(r,"notify",{maxReconnectInterval:2e3,reconnectInterval:1e3})},update_is_clipped(){this.show_burger_menu||this.show_player_menu?document.querySelector("html").classList.add("is-clipped"):document.querySelector("html").classList.remove("is-clipped")},update_lastfm(){B.lastfm().then(({data:e})=>{this.servicesStore.lastfm=e})},update_library_stats(){B.library_stats().then(({data:e})=>{this.libraryStore.$state=e}),B.library_count("scan_kind is rss").then(({data:e})=>{this.libraryStore.rss=e})},update_lyrics(){const e=this.queueStore.current;e!=null&&e.track_id?B.library_track(e.track_id).then(({data:t})=>{this.lyricsStore.lyrics=t.lyrics}):this.lyricsStore.$reset()},update_outputs(){B.outputs().then(({data:e})=>{this.outputsStore.outputs=e.outputs})},update_pairing(){B.pairing().then(({data:e})=>{this.remotesStore.$state=e,this.pairing_active=e.active})},update_player_status(){B.player_status().then(({data:e})=>{this.playerStore.$state=e,this.update_lyrics()})},update_queue(){B.queue().then(({data:e})=>{this.queueStore.$state=e,this.update_lyrics()})},update_settings(){B.settings().then(({data:e})=>{this.settingsStore.$state=e})},update_spotify(){B.spotify().then(({data:e})=>{this.servicesStore.spotify=e,this.token_timer_id>0&&(window.clearTimeout(this.token_timer_id),this.token_timer_id=0),e.webapi_token_expires_in>0&&e.webapi_token&&(this.token_timer_id=window.setTimeout(this.update_spotify,1e3*e.webapi_token_expires_in))})}},template:""},_$={id:"app"};function g$(e,t,n,r,o,s){const i=O("navbar-top"),a=O("vue-progress-bar"),l=O("router-view"),c=O("modal-dialog-remote-pairing"),d=O("modal-dialog-update"),m=O("notification-list"),f=O("navbar-bottom");return x(),I("div",_$,[v(i),v(a,{class:"has-background-info"}),v(l,null,{default:N(({Component:p})=>[(x(),ve(Kl(p)))]),_:1}),v(c,{show:o.pairing_active,onClose:t[0]||(t[0]=p=>o.pairing_active=!1)},null,8,["show"]),v(d,{show:s.show_update_dialog,onClose:t[1]||(t[1]=p=>s.show_update_dialog=!1)},null,8,["show"]),gt(v(m,null,null,512),[[Li,!s.show_burger_menu]]),v(f),gt(u("div",{class:"fd-overlay-fullscreen",onClick:t[2]||(t[2]=p=>s.show_burger_menu=s.show_player_menu=!1)},null,512),[[Li,s.show_burger_menu||s.show_player_menu]])])}const y$=le(h$,[["render",g$]]),Ky=function(){return document.ontouchstart!==null?"click":"touchstart"},_l="__vue_click_away__",Zy=function(e,t,n){Yy(e);let r=n.context,o=t.value,s=!1;setTimeout(function(){s=!0},0),e[_l]=function(i){if((!e||!e.contains(i.target))&&o&&s&&typeof o=="function")return o.call(r,i)},document.addEventListener(Ky(),e[_l],!1)},Yy=function(e){document.removeEventListener(Ky(),e[_l],!1),delete e[_l]},z$=function(e,t,n){t.value!==t.oldValue&&Zy(e,t,n)},b$={install:function(e){e.directive("click-away",v$)}},v$={mounted:Zy,updated:z$,unmounted:Yy};var hr=(e=>(e.LOADING="loading",e.LOADED="loaded",e.ERROR="error",e))(hr||{});const C$=typeof window<"u"&&window!==null,w$=E$(),S$=Object.prototype.propertyIsEnumerable,cp=Object.getOwnPropertySymbols;function _i(e){return typeof e=="function"||toString.call(e)==="[object Object]"}function k$(e){return typeof e=="object"?e===null:typeof e!="function"}function x$(e){return e!=="__proto__"&&e!=="constructor"&&e!=="prototype"}function E$(){return C$&&"IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype?("isIntersecting"in window.IntersectionObserverEntry.prototype||Object.defineProperty(window.IntersectionObserverEntry.prototype,"isIntersecting",{get(){return this.intersectionRatio>0}}),!0):!1}function T$(e,...t){if(!_i(e))throw new TypeError("expected the first argument to be an object");if(t.length===0||typeof Symbol!="function"||typeof cp!="function")return e;for(const n of t){const r=cp(n);for(const o of r)S$.call(n,o)&&(e[o]=n[o])}return e}function Xy(e,...t){let n=0;for(k$(e)&&(e=t[n++]),e||(e={});n{this._logger("Not support IntersectionObserver!")})),this._initIntersectionObserver(t,r,s,i,a)}update(t,n){var a;if(!t)return;(a=this._realObserver(t))==null||a.unobserve(t);const{src:r,error:o,lifecycle:s,delay:i}=this._valueFormatter(typeof n=="string"?n:n.value);this._initIntersectionObserver(t,r,o,s,i)}unmount(t){var n;t&&((n=this._realObserver(t))==null||n.unobserve(t),this._images.delete(t))}loadImages(t,n,r,o){this._setImageSrc(t,n,r,o)}_setImageSrc(t,n,r,o){t.tagName.toLowerCase()==="img"?(n&&t.getAttribute("src")!==n&&t.setAttribute("src",n),this._listenImageStatus(t,()=>{this._lifecycle(hr.LOADED,o,t)},()=>{var s;t.onload=null,this._lifecycle(hr.ERROR,o,t),(s=this._realObserver(t))==null||s.disconnect(),r&&t.getAttribute("src")!==r&&t.setAttribute("src",r),this._log(()=>{this._logger(`Image failed to load!And failed src was: ${n} `)})})):t.style.backgroundImage=`url('${n}')`}_initIntersectionObserver(t,n,r,o,s){var a;const i=this.options.observerOptions;this._images.set(t,new IntersectionObserver(l=>{Array.prototype.forEach.call(l,c=>{s&&s>0?this._delayedIntersectionCallback(t,c,s,n,r,o):this._intersectionCallback(t,c,n,r,o)})},i)),(a=this._realObserver(t))==null||a.observe(t)}_intersectionCallback(t,n,r,o,s){var i;n.isIntersecting&&((i=this._realObserver(t))==null||i.unobserve(n.target),this._setImageSrc(t,r,o,s))}_delayedIntersectionCallback(t,n,r,o,s,i){if(n.isIntersecting){if(n.target.hasAttribute(Ko))return;const a=setTimeout(()=>{this._intersectionCallback(t,n,o,s,i),n.target.removeAttribute(Ko)},r);n.target.setAttribute(Ko,String(a))}else n.target.hasAttribute(Ko)&&(clearTimeout(Number(n.target.getAttribute(Ko))),n.target.removeAttribute(Ko))}_listenImageStatus(t,n,r){t.onload=n,t.onerror=r}_valueFormatter(t){let n=t,r=this.options.loading,o=this.options.error,s=this.options.lifecycle,i=this.options.delay;return _i(t)&&(n=t.src,r=t.loading||this.options.loading,o=t.error||this.options.error,s=t.lifecycle||this.options.lifecycle,i=t.delay||this.options.delay),{src:n,loading:r,error:o,lifecycle:s,delay:i}}_log(t){this.options.log&&t()}_lifecycle(t,n,r){switch(t){case hr.LOADING:r==null||r.setAttribute("lazy",hr.LOADING),n!=null&&n.loading&&n.loading(r);break;case hr.LOADED:r==null||r.setAttribute("lazy",hr.LOADED),n!=null&&n.loaded&&n.loaded(r);break;case hr.ERROR:r==null||r.setAttribute("lazy",hr.ERROR),n!=null&&n.error&&n.error(r);break}}_realObserver(t){return this._images.get(t)}_logger(t,...n){let r=console.error;switch(this.options.logLevel){case"error":r=console.error;break;case"warn":r=console.warn;break;case"info":r=console.info;break;case"debug":r=console.debug;break}r(t,n)}}const P$={install(e,t){const n=new O$(t);e.config.globalProperties.$Lazyload=n,e.provide("Lazyload",n),e.directive("lazy",{mounted:n.mount.bind(n),updated:n.update.bind(n),unmounted:n.unmount.bind(n)})}};var Jy={exports:{}};const Qy=qy(cC);(function(e){e.exports=function(t){var n={};function r(o){if(n[o])return n[o].exports;var s=n[o]={i:o,l:!1,exports:{}};return t[o].call(s.exports,s,s.exports,r),s.l=!0,s.exports}return r.m=t,r.c=n,r.d=function(o,s,i){r.o(o,s)||Object.defineProperty(o,s,{enumerable:!0,get:i})},r.r=function(o){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(o,"__esModule",{value:!0})},r.t=function(o,s){if(s&1&&(o=r(o)),s&8||s&4&&typeof o=="object"&&o&&o.__esModule)return o;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:o}),s&2&&typeof o!="string")for(var a in o)r.d(i,a,(function(l){return o[l]}).bind(null,a));return i},r.n=function(o){var s=o&&o.__esModule?function(){return o.default}:function(){return o};return r.d(s,"a",s),s},r.o=function(o,s){return Object.prototype.hasOwnProperty.call(o,s)},r.p="",r(r.s="fb15")}({8875:function(t,n,r){var o,s,i;(function(a,l){s=[],o=l,i=typeof o=="function"?o.apply(n,s):o,i!==void 0&&(t.exports=i)})(typeof self<"u"?self:this,function(){function a(){var l=Object.getOwnPropertyDescriptor(document,"currentScript");if(!l&&"currentScript"in document&&document.currentScript||l&&l.get!==a&&document.currentScript)return document.currentScript;try{throw new Error}catch(z){var c=/.*at [^(]*\((.*):(.+):(.+)\)$/ig,d=/@([^@]*):(\d+):(\d+)\s*$/ig,m=c.exec(z.stack)||d.exec(z.stack),f=m&&m[1]||!1,p=m&&m[2]||!1,h=document.location.href.replace(document.location.hash,""),_,b,C,w=document.getElementsByTagName("script");f===h&&(_=document.documentElement.outerHTML,b=new RegExp("(?:[^\\n]+?\\n){0,"+(p-2)+"}[^<]*