Compare commits

...

11 Commits

Author SHA1 Message Date
Paulus Schoutsen
d225b6aad0 Allow ingress links to have more data 2021-06-03 13:53:11 -07:00
Bram Kragten
e87a2b36cf Bumped version to 20210603.0 2021-06-03 22:51:53 +02:00
Bram Kragten
5418474f64 Polyfill globalThis in latest build (#9352) 2021-06-03 22:50:33 +02:00
Philip Allgaier
8836ba6ceb Pick the correct backend-selected active theme (#9357) 2021-06-03 22:48:52 +02:00
Bram Kragten
509c5b497a Disable babel compact option (#9335) 2021-06-03 12:34:30 -07:00
Joakim Sørensen
e00bcc9f48 Better exit navigation for my-ingress (#9342) 2021-06-03 10:01:12 -07:00
Joakim Sørensen
bdef9fd040 Add missing media folder to snapshot (#9341) 2021-06-03 10:21:04 +02:00
GitHub Action
c956491ec5 Translation update 2021-06-03 03:48:04 +00:00
Bram Kragten
68bc549d6a Use HLS light build (#9338)
* Use HLS light build

* Bump hls, backBufferLength
2021-06-02 18:34:18 +02:00
Bram Kragten
9c64eafc21 Fix ZHA visualization (#9337) 2021-06-02 18:33:55 +02:00
Bram Kragten
b05e86d442 Fix noUnderline in search input (#9339) 2021-06-02 18:33:44 +02:00
24 changed files with 192 additions and 105 deletions

View File

@@ -52,6 +52,7 @@ module.exports.terserOptions = (latestBuild) => ({
module.exports.babelOptions = ({ latestBuild }) => ({
babelrc: false,
compact: false,
presets: [
!latestBuild && [
"@babel/preset-env",
@@ -79,12 +80,6 @@ module.exports.babelOptions = ({ latestBuild }) => ({
].filter(Boolean),
});
// Are already ES5, cause warnings when babelified.
module.exports.babelExclude = () => [
require.resolve("@mdi/js/mdi.js"),
require.resolve("hls.js"),
];
const outputPath = (outputRoot, latestBuild) =>
path.resolve(outputRoot, latestBuild ? "frontend_latest" : "frontend_es5");

View File

@@ -57,7 +57,6 @@ const createRollupConfig = ({
babel({
...bundle.babelOptions({ latestBuild }),
extensions,
exclude: bundle.babelExclude(),
babelHelpers: isWDS ? "inline" : "bundled",
}),
string({

View File

@@ -47,7 +47,6 @@ const createWebpackConfig = ({
rules: [
{
test: /\.m?js$|\.ts$/,
exclude: bundle.babelExclude(),
use: {
loader: "babel-loader",
options: bundle.babelOptions({ latestBuild }),

View File

@@ -44,6 +44,9 @@ const _computeFolders = (folders): CheckboxItem[] => {
if (folders.includes("share")) {
list.push({ slug: "share", name: "Share", checked: false });
}
if (folders.includes("media")) {
list.push({ slug: "media", name: "Media", checked: false });
}
if (folders.includes("addons/local")) {
list.push({ slug: "addons/local", name: "Local add-ons", checked: false });
}

View File

@@ -97,16 +97,23 @@ class HassioIngressView extends LitElement {
title: requestedAddon,
});
await nextRender();
history.back();
navigate("/hassio/store", { replace: true });
return;
}
if (!addonInfo.ingress) {
if (!addonInfo.version) {
await showAlertDialog(this, {
text: this.supervisor.localize("my.error_addon_not_installed"),
title: addonInfo.name,
});
await nextRender();
navigate(`/hassio/addon/${addonInfo.slug}/info`, { replace: true });
} else if (!addonInfo.ingress) {
await showAlertDialog(this, {
text: this.supervisor.localize("my.error_addon_no_ingress"),
title: addonInfo.name,
});
await nextRender();
history.back();
navigate(`/hassio/addon/${addonInfo.slug}/info`, { replace: true });
} else {
navigate(`/hassio/ingress/${addonInfo.slug}`, { replace: true });
}
@@ -121,10 +128,12 @@ class HassioIngressView extends LitElement {
return;
}
const addon = this.route.path.substr(1);
const addon = this.route.path.substr(1).split("/")[0];
const oldRoute = changedProps.get("route") as this["route"] | undefined;
const oldAddon = oldRoute ? oldRoute.path.substr(1) : undefined;
const oldAddon = oldRoute
? oldRoute.path.substr(1).split("/")[0]
: undefined;
if (addon && addon !== oldAddon) {
this._fetchData(addon);

View File

@@ -108,7 +108,7 @@
"fecha": "^4.2.0",
"fuse.js": "^6.0.0",
"google-timezones-json": "^1.0.2",
"hls.js": "^1.0.4",
"hls.js": "^1.0.5",
"home-assistant-js-websocket": "^5.10.0",
"idb-keyval": "^5.0.5",
"intl-messageformat": "^9.6.16",

View File

@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup(
name="home-assistant-frontend",
version="20210601.1",
version="20210603.0",
description="The Home Assistant frontend",
url="https://github.com/home-assistant/home-assistant-polymer",
author="The Home Assistant Authors",

View File

@@ -1,9 +1,16 @@
import "@material/mwc-icon-button/mwc-icon-button";
import { mdiClose, mdiMagnify } from "@mdi/js";
import "@polymer/paper-input/paper-input";
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
import { customElement, property } from "lit/decorators";
import { classMap } from "lit/directives/class-map";
import type { PaperInputElement } from "@polymer/paper-input/paper-input";
import {
css,
CSSResultGroup,
html,
LitElement,
PropertyValues,
TemplateResult,
} from "lit";
import { customElement, property, query } from "lit/decorators";
import "../../components/ha-svg-icon";
import { fireEvent } from "../dom/fire_event";
@@ -27,18 +34,11 @@ class SearchInput extends LitElement {
this.shadowRoot!.querySelector("paper-input")!.focus();
}
@query("paper-input", true) private _input!: PaperInputElement;
protected render(): TemplateResult {
return html`
<style>
.no-underline:not(.focused) {
--paper-input-container-underline: {
display: none;
height: 0;
}
}
</style>
<paper-input
class=${classMap({ "no-underline": this.noUnderline })}
.autofocus=${this.autofocus}
.label=${this.label || "Search"}
.value=${this.filter}
@@ -62,6 +62,17 @@ class SearchInput extends LitElement {
`;
}
protected updated(changedProps: PropertyValues) {
if (
changedProps.has("noUnderline") &&
(this.noUnderline || changedProps.get("noUnderline") !== undefined)
) {
(this._input.inputElement!.parentElement!.shadowRoot!.querySelector(
"div.unfocused-line"
) as HTMLElement).style.display = this.noUnderline ? "none" : "block";
}
}
private async _filterChanged(value: string) {
fireEvent(this, "value-changed", { value: String(value) });
}

View File

@@ -13,6 +13,11 @@ import { nextRender } from "../common/util/render-status";
import { getExternalConfig } from "../external_app/external_config";
import type { HomeAssistant } from "../types";
type HlsLite = Omit<
HlsType,
"subtitleTrackController" | "audioTrackController" | "emeController"
>;
@customElement("ha-hls-player")
class HaHLSPlayer extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@@ -39,7 +44,7 @@ class HaHLSPlayer extends LitElement {
@state() private _attached = false;
private _hlsPolyfillInstance?: HlsType;
private _hlsPolyfillInstance?: HlsLite;
private _useExoPlayer = false;
@@ -103,7 +108,8 @@ class HaHLSPlayer extends LitElement {
const useExoPlayerPromise = this._getUseExoPlayer();
const masterPlaylistPromise = fetch(this.url);
const Hls = (await import("hls.js")).default;
const Hls: typeof HlsType = (await import("hls.js/dist/hls.light.min.js"))
.default;
let hlsSupported = Hls.isSupported();
if (!hlsSupported) {
@@ -182,7 +188,7 @@ class HaHLSPlayer extends LitElement {
url: string
) {
const hls = new Hls({
liveBackBufferLength: 60,
backBufferLength: 60,
fragLoadingTimeOut: 30000,
manifestLoadingTimeOut: 30000,
levelLoadingTimeOut: 30000,

View File

@@ -48,6 +48,9 @@
window.providersPromise = fetch("/auth/providers", {
credentials: "same-origin",
});
if (!window.globalThis) {
window.globalThis = window;
}
</script>
<script>

View File

@@ -71,6 +71,9 @@
import("<%= latestAppJS %>");
window.customPanelJS = "<%= latestCustomPanelJS %>";
window.latestJS = true;
if (!window.globalThis) {
window.globalThis = window;
}
</script>
<script>
{% for extra_module in extra_modules -%}

View File

@@ -80,6 +80,9 @@
window.stepsPromise = fetch("/api/onboarding", {
credentials: "same-origin",
});
if (!window.globalThis) {
window.globalThis = window;
}
</script>
<script>

View File

@@ -9,7 +9,12 @@ import {
} from "../../../../../data/zha";
import "../../../../../layouts/hass-tabs-subpage";
import type { HomeAssistant, Route } from "../../../../../types";
import { Network, Edge, Node, EdgeOptions } from "vis-network/peer";
import {
Network,
Edge,
Node,
EdgeOptions,
} from "vis-network/peer/esm/vis-network";
import "../../../../../common/search/search-input";
import "../../../../../components/device/ha-device-picker";
import "../../../../../components/ha-button-menu";
@@ -21,6 +26,7 @@ import "../../../../../components/ha-checkbox";
import type { HaCheckbox } from "../../../../../components/ha-checkbox";
import { zhaTabs } from "./zha-config-dashboard";
import { customElement, property, query, state } from "lit/decorators";
import "../../../../../components/ha-formfield";
@customElement("zha-network-visualization-page")
export class ZHANetworkVisualizationPage extends LitElement {
@@ -28,7 +34,7 @@ export class ZHANetworkVisualizationPage extends LitElement {
@property({ attribute: false }) public route!: Route;
@property({ type: Boolean }) public narrow!: boolean;
@property({ type: Boolean, reflect: true }) public narrow!: boolean;
@property({ type: Boolean }) public isWide!: boolean;
@@ -67,8 +73,6 @@ export class ZHANetworkVisualizationPage extends LitElement {
{},
{
autoResize: true,
height: window.innerHeight + "px",
width: window.innerWidth + "px",
layout: {
improvedLayout: true,
},
@@ -135,17 +139,35 @@ export class ZHANetworkVisualizationPage extends LitElement {
"ui.panel.config.zha.visualization.header"
)}
>
<div class="table-header">
<search-input
no-label-float
no-underline
@value-changed=${this._handleSearchChange}
.filter=${this._filter}
.label=${this.hass.localize(
"ui.panel.config.zha.visualization.highlight_label"
)}
>
</search-input>
${this.narrow
? html`
<div slot="header">
<search-input
no-label-float
no-underline
class="header"
@value-changed=${this._handleSearchChange}
.filter=${this._filter}
.label=${this.hass.localize(
"ui.panel.config.zha.visualization.highlight_label"
)}
>
</search-input>
</div>
`
: ""}
<div class="header">
${!this.narrow
? html`<search-input
no-label-float
no-underline
@value-changed=${this._handleSearchChange}
.filter=${this._filter}
.label=${this.hass.localize(
"ui.panel.config.zha.visualization.highlight_label"
)}
></search-input>`
: ""}
<ha-device-picker
.hass=${this.hass}
.value=${this.zoomedDeviceId}
@@ -155,16 +177,24 @@ export class ZHANetworkVisualizationPage extends LitElement {
.deviceFilter=${(device) => this._filterDevices(device)}
@value-changed=${this._onZoomToDevice}
></ha-device-picker>
<ha-checkbox
@change=${this._handleCheckboxChange}
.checked=${this._autoZoom}
></ha-checkbox
>${this.hass!.localize("ui.panel.config.zha.visualization.auto_zoom")}
<mwc-button @click=${this._refreshTopology}
>${this.hass!.localize(
"ui.panel.config.zha.visualization.refresh_topology"
)}</mwc-button
>
<div class="controls">
<ha-formfield
.label=${this.hass!.localize(
"ui.panel.config.zha.visualization.auto_zoom"
)}
>
<ha-checkbox
@change=${this._handleCheckboxChange}
.checked=${this._autoZoom}
>
</ha-checkbox>
</ha-formfield>
<mwc-button @click=${this._refreshTopology}>
${this.hass!.localize(
"ui.panel.config.zha.visualization.refresh_topology"
)}
</mwc-button>
</div>
</div>
<div id="visualization"></div>
</hass-tabs-subpage>
@@ -352,30 +382,23 @@ export class ZHANetworkVisualizationPage extends LitElement {
return [
css`
.header {
font-family: var(--paper-font-display1_-_font-family);
-webkit-font-smoothing: var(
--paper-font-display1_-_-webkit-font-smoothing
);
font-size: var(--paper-font-display1_-_font-size);
font-weight: var(--paper-font-display1_-_font-weight);
letter-spacing: var(--paper-font-display1_-_letter-spacing);
line-height: var(--paper-font-display1_-_line-height);
opacity: var(--dark-primary-opacity);
}
.table-header {
border-bottom: 1px solid --divider-color;
padding: 0 16px;
border-bottom: 1px solid var(--divider-color);
padding: 0 8px;
display: flex;
align-items: center;
flex-direction: row;
justify-content: space-between;
height: var(--header-height);
box-sizing: border-box;
}
:host([narrow]) .table-header {
.header > * {
padding: 0 8px;
}
:host([narrow]) .header {
flex-direction: column;
align-items: stretch;
height: var(--header-height) * 3;
height: var(--header-height) * 2;
}
.search-toolbar {
@@ -386,34 +409,34 @@ export class ZHANetworkVisualizationPage extends LitElement {
}
search-input {
position: relative;
top: 2px;
flex: 1;
}
:host(:not([narrow])) search-input {
margin: 5px;
}
search-input.header {
left: -8px;
display: block;
position: relative;
top: -2px;
color: var(--secondary-text-color);
}
ha-device-picker {
flex: 1;
position: relative;
top: -4px;
}
:host(:not([narrow])) ha-device-picker {
margin: 5px;
.controls {
display: flex;
align-items: center;
justify-content: space-between;
}
mwc-button {
font-weight: 500;
color: var(--primary-color);
#visualization {
height: calc(100% - var(--header-height));
width: 100%;
}
:host(:not([narrow])) mwc-button {
margin: 5px;
:host([narrow]) #visualization {
height: calc(100% - (var(--header-height) * 2));
}
`,
];

View File

@@ -36,7 +36,9 @@ export class HaPickThemeRow extends LitElement {
const hasThemes =
this.hass.themes.themes && Object.keys(this.hass.themes.themes).length;
const curTheme =
this.hass.selectedTheme?.theme || this.hass.themes.default_theme;
this.hass.selectedTheme?.theme || this.hass.themes.darkMode
? this.hass.themes.default_dark_theme || this.hass.themes.default_theme
: this.hass.themes.default_theme;
const themeSettings = this.hass.selectedTheme;

View File

@@ -1,10 +1,10 @@
// For localize
import "@formatjs/intl-getcanonicallocales/polyfill";
import "lit/polyfill-support";
import "core-js";
import "regenerator-runtime/runtime";
import "lit/polyfill-support";
import "@formatjs/intl-getcanonicallocales/polyfill";
// To use comlink under ES5
import "proxy-polyfill";
import "regenerator-runtime/runtime";
import "unfetch/polyfill";
// Source: https://github.com/jserz/js_piece/blob/master/DOM/ParentNode/append()/append().md
@@ -32,3 +32,16 @@ import "unfetch/polyfill";
});
});
})([Element.prototype, Document.prototype, DocumentFragment.prototype]);
// Source: https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNames
if (Element.prototype.getAttributeNames === undefined) {
Element.prototype.getAttributeNames = function () {
const attributes = this.attributes;
const length = attributes.length;
const result = new Array(length);
for (let i = 0; i < length; i++) {
result[i] = attributes[i].name;
}
return result;
};
}

View File

@@ -3813,6 +3813,8 @@
"faq_link": "[%key:ui::panel::my::faq_link%]",
"error": "[%key:ui::panel::my::error%]",
"error_addon_not_found": "Add-on not found",
"error_addon_not_started": "The requested add-on are not running. Please start it first",
"error_addon_not_installed": "The requested add-on is not installed. Please install it first",
"error_addon_no_ingress": "The requested add-on does not support ingress"
},
"system": {

View File

@@ -1391,7 +1391,7 @@
"type_select": "Tipus de repetició",
"type": {
"count": {
"label": "Compta"
"label": "Comptador"
},
"until": {
"conditions": "Condicions de \"Fins que\"",

View File

@@ -2076,7 +2076,8 @@
"scripts": "Scripts",
"unknown_error": "Error desconocido",
"unnamed_device": "Dispositivo sin nombre",
"update": "Actualizar"
"update": "Actualizar",
"update_device_error": "Error al actualizar el dispositivo"
},
"entities": {
"caption": "Entidades",
@@ -2209,6 +2210,7 @@
"depends_on_cloud": "Depende de la nube",
"device_unavailable": "Dispositivo no disponible",
"devices": "{count} {count, plural,\n one {dispositivo}\n other {dispositivos}\n}",
"disable_error": "Error al habilitar o deshabilitar la integración",
"disable_restart_confirm": "Reinicia Home Assistant para terminar de deshabilitar esta integración",
"disable": {
"disable_confirm": "¿Estás seguro de que deseas deshabilitar esta entrada de configuración? Sus dispositivos y entidades estarán deshabilitados.",

View File

@@ -2076,7 +2076,8 @@
"scripts": "Skriptid",
"unknown_error": "Tundmatu viga",
"unnamed_device": "Nimetu seade",
"update": "Uuenda"
"update": "Uuenda",
"update_device_error": "Seadme värskendamine nurjus"
},
"entities": {
"caption": "Olemite register",
@@ -2209,6 +2210,7 @@
"depends_on_cloud": "Sõltub pilveteenusest",
"device_unavailable": "Seade pole saadaval",
"devices": "{count} {count, plural,\n one {seade}\n other {seadet}\n}",
"disable_error": "Sidumise lubamine või keelamine nurjus",
"disable_restart_confirm": "Taaskäivita Home Assistant, et lõpetada selle sidumise keelamine",
"disable": {
"disable_confirm": "Kas soovid selle seadistuskirje kindlasti keelata? Selle seadmed ja üksused keelatakse.",

View File

@@ -929,8 +929,11 @@
},
"dialogs": {
"config_entry_system_options": {
"enable_new_entities_description": "Hvis den er deaktivert, blir ikke nyoppdagede entiteter for {integration} automatisk lagt til i Home Assistant.",
"enable_new_entities_description": "Hvis nylig oppdagede enheter for {integration} skal legges til automatisk.",
"enable_new_entities_label": "Aktiver entiteter som nylig er lagt til.",
"enable_polling_description": "Hvis Home Assistant automatisk skal avstemme {integration} enheter for oppdateringer.",
"enable_polling_label": "Aktiver avstemning for oppdateringer.",
"restart_home_assistant": "Du må starte Home Assistant på nytt for at endringene skal tre i kraft.",
"title": "Systemalternativer for {integration}",
"update": "Oppdater"
},
@@ -2073,7 +2076,8 @@
"scripts": "Skript",
"unknown_error": "Ukjent feil",
"unnamed_device": "Enhet uten navn",
"update": "Oppdater"
"update": "Oppdater",
"update_device_error": "Oppdatering av enheten mislyktes"
},
"entities": {
"caption": "Entiteter",
@@ -2206,6 +2210,7 @@
"depends_on_cloud": "Avhenger av skyen",
"device_unavailable": "Enheten er utilgjengelig",
"devices": "{count} {count, plural,\n one {enhet}\n other {enheter}\n}",
"disable_error": "Aktivering eller deaktivering av integrasjonen mislyktes",
"disable_restart_confirm": "Start Home Assistant på nytt for å fullføre deaktiveringen av denne integreringen",
"disable": {
"disable_confirm": "Er du sikker på at du vil deaktivere denne config-oppføringen? Enhetene og enhetene deaktiveres.",
@@ -2217,6 +2222,7 @@
},
"disabled_cause": "Deaktivert av {cause}"
},
"disabled_polling": "Automatisk avstemning for oppdaterte data deaktivert",
"documentation": "Dokumentasjon",
"enable_restart_confirm": "Start Home Assistant på nytt for å fullføre aktiveringen av denne integreringen",
"entities": "{count} {count, plural,\n one {entitet}\n other {entiteter}\n}",

View File

@@ -394,7 +394,7 @@
"failed_to_delete": "Не удалось удалить",
"folder": {
"addons/local": "Локальные дополнения",
"homeassistant": "Home Assistant",
"homeassistant": "Home Assistant configuration",
"media": "Media",
"share": "Share",
"ssl": "SSL"
@@ -411,7 +411,7 @@
"select_type": "Выберите что нужно восстановить",
"selected": "Выбрано: {number}",
"type": "Тип снимка",
"upload_snapshot": "Загрузить снимок"
"upload_snapshot": "Загрузить снимок на сервер"
},
"store": {
"missing_addons": "Пропали дополнения? Активируйте расширенный режим на странице Вашего профиля пользователя",
@@ -2076,7 +2076,8 @@
"scripts": "Скрипты",
"unknown_error": "Неизвестная ошибка.",
"unnamed_device": "Устройство без названия",
"update": "Обновить"
"update": "Обновить",
"update_device_error": "Не удалось обновить устройство"
},
"entities": {
"caption": "Объекты",
@@ -2209,6 +2210,7 @@
"depends_on_cloud": "Зависит от облачных сервисов",
"device_unavailable": "Устройство недоступно",
"devices": "{count} {count, plural,\n one {устройство}\n few {устройства}\n many {устройств}\n other {устройств}\n}",
"disable_error": "Не удалось активировать или деактивировать интеграцию",
"disable_restart_confirm": "Перезапустите Home Assistant, чтобы завершить деактивацию этой интеграции.",
"disable": {
"disable_confirm": "Вы уверены, что хотите деактивировать эту запись конфигурации? Её дочерние устройства и объекты будут также деактивированы.",

View File

@@ -2076,7 +2076,8 @@
"scripts": "脚本",
"unknown_error": "未知错误",
"unnamed_device": "未命名设备",
"update": "更新"
"update": "更新",
"update_device_error": "更新设备失败"
},
"entities": {
"caption": "实体注册表",
@@ -2209,6 +2210,7 @@
"depends_on_cloud": "依赖云端服务",
"device_unavailable": "设备不可用",
"devices": "{count} {count, plural,\n one {个设备}\n other {个设备}\n}",
"disable_error": "启用/禁用集成失败",
"disable_restart_confirm": "重启 Home Assistant 以完成此集成的禁用",
"disable": {
"disable_confirm": "您确定要禁用此配置条目吗?其设备和实体也将被禁用。",

View File

@@ -2076,7 +2076,8 @@
"scripts": "腳本",
"unknown_error": "未知錯誤",
"unnamed_device": "未命名的裝置",
"update": "更新"
"update": "更新",
"update_device_error": "更新裝置失敗"
},
"entities": {
"caption": "實體",
@@ -2209,6 +2210,7 @@
"depends_on_cloud": "跟隨雲服務",
"device_unavailable": "裝置不可用",
"devices": "{count} {count, plural,\n one {個裝置}\n other {個裝置}\n}",
"disable_error": "開啟或關閉整合失敗",
"disable_restart_confirm": "重啟 Home Assistant 以完成整合關閉",
"disable": {
"disable_confirm": "確定要關閉此設定實體?其裝置與實體將會關閉。",

View File

@@ -7462,10 +7462,10 @@ he@1.2.0, he@^1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
hls.js@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.0.4.tgz#1b191f0f49c992e5c22d4a648ac73630d13d3c2e"
integrity sha512-sTea9L0ORE9u5dThUjEhDP4t9YzakEYRyMHEYQctaLZf2X9ihjmUbqKneExQWHXZz2cYQs5ihaKUe8QnrQDp7Q==
hls.js@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.0.5.tgz#3879bcf5ebcd6cdc188279cf9c15a74ac773630c"
integrity sha512-G7euEVuzM2AMZ69OzpQikO0HDJTMReX8OMUJmGhgwcjyh2OSsL2mGiqbL+6aK6wmUJelUfIh+FLyH73udZVYKQ==
hmac-drbg@^1.0.1:
version "1.0.1"