mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
remove useless autoplay script and add folder for settings
This commit is contained in:
parent
33ed166ec9
commit
6728f5b718
8 changed files with 27 additions and 106 deletions
|
@ -167,24 +167,24 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet
|
||||||
if (browser.mobile) {
|
if (browser.mobile) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var savedResult = appSettings.get(htmlMediaAutoplayAppStorageKey);
|
|
||||||
return "true" === savedResult || "false" !== savedResult && null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function cueSupported() {
|
function supportsCue() {
|
||||||
try {
|
try {
|
||||||
var video = document.createElement("video");
|
var video = document.createElement("video");
|
||||||
var style = document.createElement("style");
|
var style = document.createElement("style");
|
||||||
|
|
||||||
style.textContent = "video::cue {background: inherit}";
|
style.textContent = "video::cue {background: inherit}";
|
||||||
document.body.appendChild(style);
|
document.body.appendChild(style);
|
||||||
document.body.appendChild(video);
|
document.body.appendChild(video);
|
||||||
|
|
||||||
var cue = window.getComputedStyle(video, "::cue").background;
|
var cue = window.getComputedStyle(video, "::cue").background;
|
||||||
document.body.removeChild(style);
|
document.body.removeChild(style);
|
||||||
document.body.removeChild(video);
|
document.body.removeChild(video);
|
||||||
|
|
||||||
return !!cue.length;
|
return !!cue.length;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log("Error detecting cue support:" + err);
|
console.log("error detecting cue support: " + err);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -204,8 +204,6 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var htmlMediaAutoplayAppStorageKey = "supportshtmlmediaautoplay0";
|
|
||||||
|
|
||||||
var supportedFeatures = function () {
|
var supportedFeatures = function () {
|
||||||
var features = [];
|
var features = [];
|
||||||
|
|
||||||
|
@ -280,7 +278,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet
|
||||||
//features.push("multiserver");
|
//features.push("multiserver");
|
||||||
features.push("screensaver");
|
features.push("screensaver");
|
||||||
|
|
||||||
if (!browser.orsay && !browser.tizen && !browser.msie && (browser.firefox || browser.ps4 || browser.edge || cueSupported())) {
|
if (!browser.orsay && !browser.tizen && !browser.msie && (browser.firefox || browser.ps4 || browser.edge || supportsCue())) {
|
||||||
features.push("subtitleappearancesettings");
|
features.push("subtitleappearancesettings");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -299,18 +297,6 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet
|
||||||
return features;
|
return features;
|
||||||
}();
|
}();
|
||||||
|
|
||||||
if (supportedFeatures.indexOf("htmlvideoautoplay") === -1 && supportsHtmlMediaAutoplay() !== false) {
|
|
||||||
require(["autoPlayDetect"], function (autoPlayDetect) {
|
|
||||||
autoPlayDetect.supportsHtmlMediaAutoplay().then(function () {
|
|
||||||
appSettings.set(htmlMediaAutoplayAppStorageKey, "true");
|
|
||||||
supportedFeatures.push("htmlvideoautoplay");
|
|
||||||
supportedFeatures.push("htmlaudioautoplay");
|
|
||||||
}, function () {
|
|
||||||
appSettings.set(htmlMediaAutoplayAppStorageKey, "false");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var deviceId;
|
var deviceId;
|
||||||
var deviceName;
|
var deviceName;
|
||||||
var appName = "Jellyfin Web";
|
var appName = "Jellyfin Web";
|
||||||
|
@ -395,7 +381,9 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var doc = self.document;
|
var doc = self.document;
|
||||||
|
var isHidden = false;
|
||||||
|
|
||||||
if (doc) {
|
if (doc) {
|
||||||
if (void 0 !== doc.visibilityState) {
|
if (void 0 !== doc.visibilityState) {
|
||||||
|
@ -419,8 +407,6 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var isHidden = false;
|
|
||||||
|
|
||||||
if (doc) {
|
if (doc) {
|
||||||
doc.addEventListener(visibilityChange, function () {
|
doc.addEventListener(visibilityChange, function () {
|
||||||
if (document[visibilityState]) {
|
if (document[visibilityState]) {
|
||||||
|
|
|
@ -1401,7 +1401,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
||||||
dlg.classList.add('videoPlayerContainer');
|
dlg.classList.add('videoPlayerContainer');
|
||||||
|
|
||||||
if (options.backdropUrl) {
|
if (options.backdropUrl) {
|
||||||
|
|
||||||
dlg.classList.add('videoPlayerContainer-withBackdrop');
|
dlg.classList.add('videoPlayerContainer-withBackdrop');
|
||||||
dlg.style.backgroundImage = "url('" + options.backdropUrl + "')";
|
dlg.style.backgroundImage = "url('" + options.backdropUrl + "')";
|
||||||
}
|
}
|
||||||
|
@ -1410,11 +1409,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
||||||
dlg.classList.add('videoPlayerContainer-onTop');
|
dlg.classList.add('videoPlayerContainer-onTop');
|
||||||
}
|
}
|
||||||
|
|
||||||
// playsinline new for iOS 10
|
|
||||||
// https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_10_0.html
|
|
||||||
|
|
||||||
var html = '';
|
var html = '';
|
||||||
|
|
||||||
var cssClass = 'htmlvideoplayer';
|
var cssClass = 'htmlvideoplayer';
|
||||||
|
|
||||||
if (!browser.chromecast) {
|
if (!browser.chromecast) {
|
||||||
|
@ -1449,7 +1444,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
||||||
self._mediaElement = videoElement;
|
self._mediaElement = videoElement;
|
||||||
|
|
||||||
if (mediaManager) {
|
if (mediaManager) {
|
||||||
|
|
||||||
if (!mediaManager.embyInit) {
|
if (!mediaManager.embyInit) {
|
||||||
initMediaManager();
|
initMediaManager();
|
||||||
mediaManager.embyInit = true;
|
mediaManager.embyInit = true;
|
||||||
|
@ -1465,9 +1459,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
||||||
} else {
|
} else {
|
||||||
resolve(videoElement);
|
resolve(videoElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (options.backdropUrl) {
|
if (options.backdropUrl) {
|
||||||
dlg.classList.add('videoPlayerContainer-withBackdrop');
|
dlg.classList.add('videoPlayerContainer-withBackdrop');
|
||||||
|
|
|
@ -2,7 +2,6 @@ define(['browser', 'appSettings', 'events'], function (browser, appSettings, eve
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
function setLayout(instance, layout, selectedLayout) {
|
function setLayout(instance, layout, selectedLayout) {
|
||||||
|
|
||||||
if (layout === selectedLayout) {
|
if (layout === selectedLayout) {
|
||||||
instance[layout] = true;
|
instance[layout] = true;
|
||||||
document.documentElement.classList.add('layout-' + layout);
|
document.documentElement.classList.add('layout-' + layout);
|
||||||
|
@ -38,7 +37,6 @@ define(['browser', 'appSettings', 'events'], function (browser, appSettings, eve
|
||||||
};
|
};
|
||||||
|
|
||||||
LayoutManager.prototype.getSavedLayout = function (layout) {
|
LayoutManager.prototype.getSavedLayout = function (layout) {
|
||||||
|
|
||||||
return appSettings.get('layout');
|
return appSettings.get('layout');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -64,4 +62,4 @@ define(['browser', 'appSettings', 'events'], function (browser, appSettings, eve
|
||||||
};
|
};
|
||||||
|
|
||||||
return new LayoutManager();
|
return new LayoutManager();
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,61 +0,0 @@
|
||||||
define([], function () {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
function supportsHtmlMediaAutoplay() {
|
|
||||||
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
|
|
||||||
var timeout;
|
|
||||||
var elem = document.createElement('video');
|
|
||||||
var elemStyle = elem.style;
|
|
||||||
//skip the test if video itself, or the autoplay
|
|
||||||
//element on it isn't supported
|
|
||||||
if (!('autoplay' in elem)) {
|
|
||||||
reject();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
elemStyle.position = 'absolute';
|
|
||||||
elemStyle.height = 0;
|
|
||||||
elemStyle.width = 0;
|
|
||||||
|
|
||||||
elem.setAttribute('autoplay', 'autoplay');
|
|
||||||
elem.style.display = 'none';
|
|
||||||
document.body.appendChild(elem);
|
|
||||||
|
|
||||||
var testAutoplay = function (arg) {
|
|
||||||
clearTimeout(timeout);
|
|
||||||
elem.removeEventListener('playing', testAutoplay);
|
|
||||||
elem.removeEventListener('play', testAutoplay);
|
|
||||||
var supported = (arg && arg.type === 'playing') || (arg && arg.type === 'play') || elem.currentTime !== 0;
|
|
||||||
elem.parentNode.removeChild(elem);
|
|
||||||
|
|
||||||
if (supported) {
|
|
||||||
resolve();
|
|
||||||
} else {
|
|
||||||
reject();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// play needed for firefox
|
|
||||||
elem.addEventListener('play', testAutoplay);
|
|
||||||
elem.addEventListener('playing', testAutoplay);
|
|
||||||
|
|
||||||
try {
|
|
||||||
elem.src = 'data:video/mp4;base64,AAAAHGZ0eXBtcDQyAAAAAG1wNDJpc29tYXZjMQAAAz5tb292AAAAbG12aGQAAAAAzaNacc2jWnEAAV+QAAFfkAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAGGlvZHMAAAAAEICAgAcAT////3//AAACQ3RyYWsAAABcdGtoZAAAAAHNo1pxzaNacQAAAAEAAAAAAAFfkAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAEAAAABAAAAAAAd9tZGlhAAAAIG1kaGQAAAAAzaNacc2jWnEAAV+QAAFfkFXEAAAAAAAhaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAAAAAAGWbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAABVnN0YmwAAACpc3RzZAAAAAAAAAABAAAAmWF2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAEAAQAEgAAABIAAAAAAAAAAEOSlZUL0FWQyBDb2RpbmcAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAAxYXZjQwH0AAr/4QAZZ/QACq609NQYBBkAAAMAAQAAAwAKjxImoAEABWjOAa8gAAAAEmNvbHJuY2xjAAYAAQAGAAAAGHN0dHMAAAAAAAAAAQAAAAUAAEZQAAAAKHN0c3oAAAAAAAAAAAAAAAUAAAIqAAAACAAAAAgAAAAIAAAACAAAAChzdHNjAAAAAAAAAAIAAAABAAAABAAAAAEAAAACAAAAAQAAAAEAAAAYc3RjbwAAAAAAAAACAAADYgAABaQAAAAUc3RzcwAAAAAAAAABAAAAAQAAABFzZHRwAAAAAAREREREAAAAb3VkdGEAAABnbWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcgAAAAAAAAAAAAAAAAAAAAA6aWxzdAAAADKpdG9vAAAAKmRhdGEAAAABAAAAAEhhbmRCcmFrZSAwLjkuOCAyMDEyMDcxODAwAAACUm1kYXQAAAHkBgX/4NxF6b3m2Ui3lizYINkj7u94MjY0IC0gY29yZSAxMjAgLSBILjI2NC9NUEVHLTQgQVZDIGNvZGVjIC0gQ29weWxlZnQgMjAwMy0yMDExIC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcveDI2NC5odG1sIC0gb3B0aW9uczogY2FiYWM9MCByZWY9MSBkZWJsb2NrPTE6MDowIGFuYWx5c2U9MHgxOjAgbWU9ZXNhIHN1Ym1lPTkgcHN5PTAgbWl4ZWRfcmVmPTAgbWVfcmFuZ2U9NCBjaHJvbWFfbWU9MSB0cmVsbGlzPTAgOHg4ZGN0PTAgY3FtPTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0wIGNocm9tYV9xcF9vZmZzZXQ9MCB0aHJlYWRzPTYgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MCB3ZWlnaHRwPTAga2V5aW50PTUwIGtleWludF9taW49NSBzY2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmM9Y3FwIG1idHJlZT0wIHFwPTAAgAAAAD5liISscR8A+E4ACAACFoAAITAAAgsAAPgYCoKgoC+L4vi+KAvi+L4YfAEAACMzgABF9AAEUGUgABDJiXnf4AAAAARBmiKUAAAABEGaQpQAAAAEQZpilAAAAARBmoKU';
|
|
||||||
var promise = elem.play();
|
|
||||||
if (promise && promise.catch) {
|
|
||||||
promise.catch(reject);
|
|
||||||
}
|
|
||||||
|
|
||||||
timeout = setTimeout(testAutoplay, 500);
|
|
||||||
} catch (e) {
|
|
||||||
reject();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
supportsHtmlMediaAutoplay: supportsHtmlMediaAutoplay
|
|
||||||
};
|
|
||||||
});
|
|
|
@ -1,5 +0,0 @@
|
||||||
define(['userSettingsBuilder'], function (userSettingsBuilder) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
return new userSettingsBuilder();
|
|
||||||
});
|
|
|
@ -10,13 +10,13 @@ define(['appStorage', 'events'], function (appStorage, events) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function AppSettings() {
|
function AppSettings() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AppSettings.prototype.enableAutoLogin = function (val) {
|
AppSettings.prototype.enableAutoLogin = function (val) {
|
||||||
if (val != null) {
|
if (val != null) {
|
||||||
this.set('enableAutoLogin', val.toString());
|
this.set('enableAutoLogin', val.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.get('enableAutoLogin') !== 'false';
|
return this.get('enableAutoLogin') !== 'false';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -132,4 +132,4 @@ define(['appStorage', 'events'], function (appStorage, events) {
|
||||||
};
|
};
|
||||||
|
|
||||||
return new AppSettings();
|
return new AppSettings();
|
||||||
});
|
});
|
|
@ -242,5 +242,5 @@ define(['appSettings', 'events'], function (appSettings, events) {
|
||||||
return this.get(key, true);
|
return this.get(key, true);
|
||||||
};
|
};
|
||||||
|
|
||||||
return UserSettings;
|
return new UserSettings();
|
||||||
});
|
});
|
|
@ -315,6 +315,14 @@ var AppInfo = {};
|
||||||
return "components";
|
return "components";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getElementsPath() {
|
||||||
|
return "elements"
|
||||||
|
}
|
||||||
|
|
||||||
|
function getScriptsPath() {
|
||||||
|
return "scripts"
|
||||||
|
}
|
||||||
|
|
||||||
function getPlaybackManager(playbackManager) {
|
function getPlaybackManager(playbackManager) {
|
||||||
window.addEventListener("beforeunload", function () {
|
window.addEventListener("beforeunload", function () {
|
||||||
try {
|
try {
|
||||||
|
@ -650,8 +658,12 @@ var AppInfo = {};
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
var urlArgs = "v=" + (window.dashboardVersion || new Date().getDate());
|
var urlArgs = "v=" + (window.dashboardVersion || new Date().getDate());
|
||||||
|
|
||||||
var bowerPath = getBowerPath();
|
var bowerPath = getBowerPath();
|
||||||
var componentsPath = getComponentsPath();
|
var componentsPath = getComponentsPath();
|
||||||
|
var elementsPath = getElementsPath();
|
||||||
|
var scriptsPath = getScriptsPath();
|
||||||
|
|
||||||
var paths = {
|
var paths = {
|
||||||
browserdeviceprofile: "scripts/browserdeviceprofile",
|
browserdeviceprofile: "scripts/browserdeviceprofile",
|
||||||
browser: "scripts/browser",
|
browser: "scripts/browser",
|
||||||
|
@ -672,7 +684,6 @@ var AppInfo = {};
|
||||||
itemHelper: componentsPath + "/itemhelper",
|
itemHelper: componentsPath + "/itemhelper",
|
||||||
itemShortcuts: componentsPath + "/shortcuts",
|
itemShortcuts: componentsPath + "/shortcuts",
|
||||||
playQueueManager: componentsPath + "/playback/playqueuemanager",
|
playQueueManager: componentsPath + "/playback/playqueuemanager",
|
||||||
autoPlayDetect: componentsPath + "/playback/autoplaydetect",
|
|
||||||
nowPlayingHelper: componentsPath + "/playback/nowplayinghelper",
|
nowPlayingHelper: componentsPath + "/playback/nowplayinghelper",
|
||||||
pluginManager: componentsPath + "/pluginManager",
|
pluginManager: componentsPath + "/pluginManager",
|
||||||
packageManager: componentsPath + "/packagemanager",
|
packageManager: componentsPath + "/packagemanager",
|
||||||
|
@ -765,7 +776,6 @@ var AppInfo = {};
|
||||||
return queryString;
|
return queryString;
|
||||||
});
|
});
|
||||||
|
|
||||||
var elementsPath = "elements"
|
|
||||||
define("emby-button", [elementsPath + "/emby-button/emby-button"], returnFirstDependency);
|
define("emby-button", [elementsPath + "/emby-button/emby-button"], returnFirstDependency);
|
||||||
define("paper-icon-button-light", [elementsPath + "/emby-button/paper-icon-button-light"], returnFirstDependency);
|
define("paper-icon-button-light", [elementsPath + "/emby-button/paper-icon-button-light"], returnFirstDependency);
|
||||||
define("emby-checkbox", [elementsPath + "/emby-checkbox/emby-checkbox"], returnFirstDependency);
|
define("emby-checkbox", [elementsPath + "/emby-checkbox/emby-checkbox"], returnFirstDependency);
|
||||||
|
@ -778,6 +788,9 @@ var AppInfo = {};
|
||||||
define("emby-textarea", [elementsPath + "/emby-textarea/emby-textarea"], returnFirstDependency);
|
define("emby-textarea", [elementsPath + "/emby-textarea/emby-textarea"], returnFirstDependency);
|
||||||
define("emby-toggle", [elementsPath + "/emby-toggle/emby-toggle"], returnFirstDependency);
|
define("emby-toggle", [elementsPath + "/emby-toggle/emby-toggle"], returnFirstDependency);
|
||||||
|
|
||||||
|
define("appSettings", [scriptsPath + "/settings/appSettings"], returnFirstDependency);
|
||||||
|
define("userSettings", [scriptsPath + "/settings/userSettings"], returnFirstDependency);
|
||||||
|
|
||||||
define("chromecastHelper", [componentsPath + "/chromecast/chromecasthelpers"], returnFirstDependency);
|
define("chromecastHelper", [componentsPath + "/chromecast/chromecasthelpers"], returnFirstDependency);
|
||||||
define("mediaSession", [componentsPath + "/playback/mediasession"], returnFirstDependency);
|
define("mediaSession", [componentsPath + "/playback/mediasession"], returnFirstDependency);
|
||||||
define("actionsheet", [componentsPath + "/actionsheet/actionsheet"], returnFirstDependency);
|
define("actionsheet", [componentsPath + "/actionsheet/actionsheet"], returnFirstDependency);
|
||||||
|
@ -865,8 +878,6 @@ var AppInfo = {};
|
||||||
define("toast", [componentsPath + "/toast/toast"], returnFirstDependency);
|
define("toast", [componentsPath + "/toast/toast"], returnFirstDependency);
|
||||||
define("scrollHelper", [componentsPath + "/scrollhelper"], returnFirstDependency);
|
define("scrollHelper", [componentsPath + "/scrollhelper"], returnFirstDependency);
|
||||||
define("touchHelper", [componentsPath + "/touchhelper"], returnFirstDependency);
|
define("touchHelper", [componentsPath + "/touchhelper"], returnFirstDependency);
|
||||||
define("appSettings", [componentsPath + "/appSettings"], returnFirstDependency);
|
|
||||||
define("userSettings", [componentsPath + "/usersettings/usersettings"], returnFirstDependency);
|
|
||||||
define("userSettingsBuilder", [componentsPath + "/usersettings/usersettingsbuilder", "layoutManager", "browser"], returnFirstDependency);
|
define("userSettingsBuilder", [componentsPath + "/usersettings/usersettingsbuilder", "layoutManager", "browser"], returnFirstDependency);
|
||||||
define("imageUploader", [componentsPath + "/imageuploader/imageuploader"], returnFirstDependency);
|
define("imageUploader", [componentsPath + "/imageuploader/imageuploader"], returnFirstDependency);
|
||||||
define("htmlMediaHelper", [componentsPath + "/htmlMediaHelper"], returnFirstDependency);
|
define("htmlMediaHelper", [componentsPath + "/htmlMediaHelper"], returnFirstDependency);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue