MacBook-Pro-de-Oscar.local 2026-1-29:13:46:9

This commit is contained in:
oskar
2026-01-29 13:46:10 +01:00
parent 935905c653
commit 9fd740a2dd
31 changed files with 1577 additions and 1094 deletions

View File

@@ -98,21 +98,22 @@ function children(element) {
}
function set_data(text, data) {
data = '' + data;
if (text.wholeText !== data)
text.data = data;
if (text.data === data)
return;
text.data = data;
}
function set_input_value(input, value) {
input.value = value == null ? '' : value;
}
function set_style(node, key, value, important) {
if (value === null) {
if (value == null) {
node.style.removeProperty(key);
}
else {
node.style.setProperty(key, value, important ? 'important' : '');
}
}
function select_option(select, value) {
function select_option(select, value, mounting) {
for (let i = 0; i < select.options.length; i += 1) {
const option = select.options[i];
if (option.__value === value) {
@@ -120,10 +121,12 @@ function select_option(select, value) {
return;
}
}
select.selectedIndex = -1; // no option should be selected
if (!mounting || value !== undefined) {
select.selectedIndex = -1; // no option should be selected
}
}
function select_value(select) {
const selected_option = select.querySelector(':checked') || select.options[0];
const selected_option = select.querySelector(':checked');
return selected_option && selected_option.__value;
}
@@ -151,9 +154,9 @@ function onMount(fn) {
const dirty_components = [];
const binding_callbacks = [];
const render_callbacks = [];
let render_callbacks = [];
const flush_callbacks = [];
const resolved_promise = Promise.resolve();
const resolved_promise = /* @__PURE__ */ Promise.resolve();
let update_scheduled = false;
function schedule_update() {
if (!update_scheduled) {
@@ -244,6 +247,16 @@ function update($$) {
$$.after_update.forEach(add_render_callback);
}
}
/**
* Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`.
*/
function flush_render_callbacks(fns) {
const filtered = [];
const targets = [];
render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c));
targets.forEach((c) => c());
render_callbacks = filtered;
}
const outroing = new Set();
function transition_in(block, local) {
if (block && block.i) {
@@ -277,6 +290,7 @@ function mount_component(component, target, anchor, customElement) {
function destroy_component(component, detaching) {
const $$ = component.$$;
if ($$.fragment !== null) {
flush_render_callbacks($$.after_update);
run_all($$.on_destroy);
$$.fragment && $$.fragment.d(detaching);
// TODO null out other refs, including component.$$ (but need to
@@ -390,7 +404,7 @@ var ProgressPropertyOptions;
ProgressPropertyOptions["TaskIncomplete"] = "Incomplete Tasks";
})(ProgressPropertyOptions || (ProgressPropertyOptions = {}));
/* src/Modals/ProgressPropertiesSettingModal/ProgressPropertiesModalContent.svelte generated by Svelte v3.55.1 */
/* src/Modals/ProgressPropertiesSettingModal/ProgressPropertiesModalContent.svelte generated by Svelte v3.59.2 */
function add_css$3(target) {
append_styles(target, "svelte-kqcr7b", ".buttonContainer.svelte-kqcr7b{display:flex;justify-content:center;margin-top:1rem}select.svelte-kqcr7b{border-radius:4px;width:100%;height:30px;border:1px solid #dbdbdc;color:#383a42;background-color:#fff;padding:3px}button.svelte-kqcr7b{margin-left:5px;margin-right:5px;font-size:15px}");
@@ -500,10 +514,12 @@ function create_each_block$3(ctx) {
append(td1, select);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(select, null);
if (each_blocks[i]) {
each_blocks[i].m(select, null);
}
}
select_option(select, /*property*/ ctx[10].type);
select_option(select, /*property*/ ctx[10].type, true);
append(tr, t1);
append(tr, td2);
append(td2, input1);
@@ -612,7 +628,9 @@ function create_fragment$4(ctx) {
append(table, t3);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(table, null);
if (each_blocks[i]) {
each_blocks[i].m(table, null);
}
}
append(div1, t4);
@@ -722,7 +740,7 @@ class ProgressPropertiesModalContent extends SvelteComponent {
}
}
/* src/Modals/AutoPropertiesSettingModal/AutoPropertiesModalContent.svelte generated by Svelte v3.55.1 */
/* src/Modals/AutoPropertiesSettingModal/AutoPropertiesModalContent.svelte generated by Svelte v3.59.2 */
function add_css$2(target) {
append_styles(target, "svelte-kqcr7b", ".buttonContainer.svelte-kqcr7b{display:flex;justify-content:center;margin-top:1rem}button.svelte-kqcr7b{margin-left:5px;margin-right:5px;font-size:15px}");
@@ -891,7 +909,9 @@ function create_each_block$2(ctx) {
append(tr, td2);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(td2, null);
if (each_blocks[i]) {
each_blocks[i].m(td2, null);
}
}
append(tr, t2);
@@ -1001,7 +1021,9 @@ function create_fragment$3(ctx) {
append(table, t4);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(table, null);
if (each_blocks[i]) {
each_blocks[i].m(table, null);
}
}
append(div1, t5);
@@ -1291,7 +1313,7 @@ var round = Math.round;
function getUAString() {
var uaData = navigator.userAgentData;
if (uaData != null && uaData.brands) {
if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {
return uaData.brands.map(function (item) {
return item.brand + "/" + item.version;
}).join(' ');
@@ -1578,17 +1600,7 @@ function effect$1(_ref2) {
}
}
if (process.env.NODE_ENV !== "production") {
if (!isHTMLElement(arrowElement)) {
console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));
}
}
if (!contains(state.elements.popper, arrowElement)) {
if (process.env.NODE_ENV !== "production") {
console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', 'element.'].join(' '));
}
return;
}
@@ -1619,10 +1631,9 @@ var unsetSides = {
// Zooming can change the DPR, but it seems to report a value that will
// cleanly divide the values into the appropriate subpixels.
function roundOffsetsByDPR(_ref) {
function roundOffsetsByDPR(_ref, win) {
var x = _ref.x,
y = _ref.y;
var win = window;
var dpr = win.devicePixelRatio || 1;
return {
x: round(x * dpr) / dpr || 0,
@@ -1705,7 +1716,7 @@ function mapToStyles(_ref2) {
var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
x: x,
y: y
}) : {
}, getWindow(popper)) : {
x: x,
y: y
};
@@ -1731,17 +1742,6 @@ function computeStyles(_ref5) {
adaptive = _options$adaptive === void 0 ? true : _options$adaptive,
_options$roundOffsets = options.roundOffsets,
roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
if (process.env.NODE_ENV !== "production") {
var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';
if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {
return transitionProperty.indexOf(property) >= 0;
})) {
console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: "transform", "top", "right", "bottom", "left".', '\n\n', 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\n\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));
}
}
var commonStyles = {
placement: getBasePlacement(state.placement),
variation: getVariation(state.placement),
@@ -2182,10 +2182,6 @@ function computeAutoPlacement(state, options) {
if (allowedPlacements.length === 0) {
allowedPlacements = placements$1;
if (process.env.NODE_ENV !== "production") {
console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(' '));
}
} // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...
@@ -2737,108 +2733,6 @@ function debounce(fn) {
};
}
function format(str) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
return [].concat(args).reduce(function (p, c) {
return p.replace(/%s/, c);
}, str);
}
var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s';
var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available';
var VALID_PROPERTIES = ['name', 'enabled', 'phase', 'fn', 'effect', 'requires', 'options'];
function validateModifiers(modifiers) {
modifiers.forEach(function (modifier) {
[].concat(Object.keys(modifier), VALID_PROPERTIES) // IE11-compatible replacement for `new Set(iterable)`
.filter(function (value, index, self) {
return self.indexOf(value) === index;
}).forEach(function (key) {
switch (key) {
case 'name':
if (typeof modifier.name !== 'string') {
console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', "\"" + String(modifier.name) + "\""));
}
break;
case 'enabled':
if (typeof modifier.enabled !== 'boolean') {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', "\"" + String(modifier.enabled) + "\""));
}
break;
case 'phase':
if (modifierPhases.indexOf(modifier.phase) < 0) {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + modifierPhases.join(', '), "\"" + String(modifier.phase) + "\""));
}
break;
case 'fn':
if (typeof modifier.fn !== 'function') {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', "\"" + String(modifier.fn) + "\""));
}
break;
case 'effect':
if (modifier.effect != null && typeof modifier.effect !== 'function') {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', "\"" + String(modifier.fn) + "\""));
}
break;
case 'requires':
if (modifier.requires != null && !Array.isArray(modifier.requires)) {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', "\"" + String(modifier.requires) + "\""));
}
break;
case 'requiresIfExists':
if (!Array.isArray(modifier.requiresIfExists)) {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', "\"" + String(modifier.requiresIfExists) + "\""));
}
break;
case 'options':
case 'data':
break;
default:
console.error("PopperJS: an invalid property has been provided to the \"" + modifier.name + "\" modifier, valid properties are " + VALID_PROPERTIES.map(function (s) {
return "\"" + s + "\"";
}).join(', ') + "; but \"" + key + "\" was provided.");
}
modifier.requires && modifier.requires.forEach(function (requirement) {
if (modifiers.find(function (mod) {
return mod.name === requirement;
}) == null) {
console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement));
}
});
});
});
}
function uniqueBy(arr, fn) {
var identifiers = new Set();
return arr.filter(function (item) {
var identifier = fn(item);
if (!identifiers.has(identifier)) {
identifiers.add(identifier);
return true;
}
});
}
function mergeByName(modifiers) {
var merged = modifiers.reduce(function (merged, current) {
var existing = merged[current.name];
@@ -2854,8 +2748,6 @@ function mergeByName(modifiers) {
});
}
var INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';
var INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';
var DEFAULT_OPTIONS = {
placement: 'bottom',
modifiers: [],
@@ -2917,42 +2809,7 @@ function popperGenerator(generatorOptions) {
state.orderedModifiers = orderedModifiers.filter(function (m) {
return m.enabled;
}); // Validate the provided modifiers so that the consumer will get warned
// if one of the modifiers is invalid for any reason
if (process.env.NODE_ENV !== "production") {
var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {
var name = _ref.name;
return name;
});
validateModifiers(modifiers);
if (getBasePlacement(state.options.placement) === auto) {
var flipModifier = state.orderedModifiers.find(function (_ref2) {
var name = _ref2.name;
return name === 'flip';
});
if (!flipModifier) {
console.error(['Popper: "auto" placements require the "flip" modifier be', 'present and enabled to work.'].join(' '));
}
}
var _getComputedStyle = getComputedStyle(popper),
marginTop = _getComputedStyle.marginTop,
marginRight = _getComputedStyle.marginRight,
marginBottom = _getComputedStyle.marginBottom,
marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can
// cause bugs with positioning, so we'll warn the consumer
if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {
return parseFloat(margin);
})) {
console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));
}
}
});
runModifierEffects();
return instance.update();
},
@@ -2972,10 +2829,6 @@ function popperGenerator(generatorOptions) {
// anymore
if (!areValidElements(reference, popper)) {
if (process.env.NODE_ENV !== "production") {
console.error(INVALID_ELEMENT_ERROR);
}
return;
} // Store the reference and popper rects to be read by modifiers
@@ -2998,18 +2851,8 @@ function popperGenerator(generatorOptions) {
state.orderedModifiers.forEach(function (modifier) {
return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
});
var __debug_loops__ = 0;
for (var index = 0; index < state.orderedModifiers.length; index++) {
if (process.env.NODE_ENV !== "production") {
__debug_loops__ += 1;
if (__debug_loops__ > 100) {
console.error(INFINITE_LOOP_ERROR);
break;
}
}
if (state.reset === true) {
state.reset = false;
index = -1;
@@ -3047,10 +2890,6 @@ function popperGenerator(generatorOptions) {
};
if (!areValidElements(reference, popper)) {
if (process.env.NODE_ENV !== "production") {
console.error(INVALID_ELEMENT_ERROR);
}
return instance;
}
@@ -3065,11 +2904,11 @@ function popperGenerator(generatorOptions) {
// one.
function runModifierEffects() {
state.orderedModifiers.forEach(function (_ref3) {
var name = _ref3.name,
_ref3$options = _ref3.options,
options = _ref3$options === void 0 ? {} : _ref3$options,
effect = _ref3.effect;
state.orderedModifiers.forEach(function (_ref) {
var name = _ref.name,
_ref$options = _ref.options,
options = _ref$options === void 0 ? {} : _ref$options,
effect = _ref.effect;
if (typeof effect === 'function') {
var cleanupFn = effect({
@@ -3284,7 +3123,7 @@ class LogManager {
LogManager.loggers = [];
const log = new LogManager();
/* src/Modals/KanbanHelperSetting/KanbanHelperSettingContent.svelte generated by Svelte v3.55.1 */
/* src/Modals/KanbanHelperSetting/KanbanHelperSettingContent.svelte generated by Svelte v3.59.2 */
function add_css$1(target) {
append_styles(target, "svelte-kqcr7b", ".buttonContainer.svelte-kqcr7b{display:flex;justify-content:center;margin-top:1rem}button.svelte-kqcr7b{margin-left:5px;margin-right:5px;font-size:15px}");
@@ -3451,7 +3290,9 @@ function create_fragment$2(ctx) {
append(table, t6);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(table, null);
if (each_blocks[i]) {
each_blocks[i].m(table, null);
}
}
append(div1, t7);
@@ -3617,7 +3458,7 @@ class KanbanHelperSettingContent extends SvelteComponent {
}
}
/* src/Modals/shared/SingleValueTableEditorContent.svelte generated by Svelte v3.55.1 */
/* src/Modals/shared/SingleValueTableEditorContent.svelte generated by Svelte v3.59.2 */
function add_css(target) {
append_styles(target, "svelte-kqcr7b", ".buttonContainer.svelte-kqcr7b{display:flex;justify-content:center;margin-top:1rem}button.svelte-kqcr7b{margin-left:5px;margin-right:5px;font-size:15px}");
@@ -3750,7 +3591,9 @@ function create_fragment$1(ctx) {
append(table, t2);
for (let i = 0; i < each_blocks.length; i += 1) {
each_blocks[i].m(table, null);
if (each_blocks[i]) {
each_blocks[i].m(table, null);
}
}
append(div1, t3);
@@ -4462,7 +4305,7 @@ class GenericTextSuggester extends TextInputSuggest {
}
}
/* src/Modals/GenericPrompt/GenericPromptContent.svelte generated by Svelte v3.55.1 */
/* src/Modals/GenericPrompt/GenericPromptContent.svelte generated by Svelte v3.59.2 */
function create_fragment(ctx) {
let div;
@@ -5357,6 +5200,8 @@ var OnModifyAutomatorType;
OnModifyAutomatorType["ProgressProperties"] = "ProgressProperties";
})(OnModifyAutomatorType || (OnModifyAutomatorType = {}));
const MARKDOWN_HEADING = /#+\s+(.+)/;
const TASK_REGEX = /(\s*)-\s*\[([ Xx\.]?)\]\s*(.+)/i;
class KanbanHelper extends OnFileModifyAutomator {
get boards() { return this.plugin.settings.KanbanHelper.boards; }
constructor(plugin) {
@@ -5371,20 +5216,87 @@ class KanbanHelper extends OnFileModifyAutomator {
const { links } = kanbanBoardFileCache;
if (!links)
return;
await this.updateFilesInBoard(links, targetBoard, kanbanBoardFileContent);
await this.updateFilesInBoard(links, targetBoard, file.path, kanbanBoardFileContent);
}
findBoardByName(boardName) {
return this.boards.find(board => board.boardName === boardName);
}
getLinkFile(link) {
const markdownFiles = this.app.vault.getMarkdownFiles();
return markdownFiles.find(f => f.path.endsWith(`/${link.link}.md`) || f.path === `${link.link}.md`);
resolveLinkFile(link, sourcePath) {
const linkpath = this.normalizeLinkpath(link === null || link === void 0 ? void 0 : link.link);
if (!linkpath)
return null;
const candidates = this.buildLinkpathCandidates(linkpath);
const resolvedFromCache = this.resolveByMetadataCache(candidates, sourcePath);
if (resolvedFromCache)
return resolvedFromCache;
const resolvedByPath = this.resolveByPathCandidates(candidates);
if (resolvedByPath)
return resolvedByPath;
return this.resolveByBasenameCandidates(candidates);
}
async updateFilesInBoard(links, board, kanbanBoardFileContent) {
normalizeLinkpath(link) {
if (!link)
return null;
let normalized = link;
try {
normalized = decodeURIComponent(normalized);
}
catch (_a) {
// Keep original link if decoding fails
}
normalized = normalized.replace(/^\/+/, "");
normalized = obsidian.normalizePath(normalized);
return obsidian.getLinkpath(normalized);
}
buildLinkpathCandidates(linkpath) {
const withoutExtension = this.stripMarkdownExtension(linkpath);
return Array.from(new Set([linkpath, withoutExtension]));
}
stripMarkdownExtension(path) {
return path.toLowerCase().endsWith(".md") ? path.slice(0, -3) : path;
}
ensureMarkdownExtension(path) {
return path.toLowerCase().endsWith(".md") ? path : `${path}.md`;
}
resolveByMetadataCache(candidates, sourcePath) {
for (const candidate of candidates) {
const resolved = this.app.metadataCache.getFirstLinkpathDest(candidate, sourcePath);
if (resolved)
return resolved;
}
return null;
}
resolveByPathCandidates(candidates) {
for (const candidate of candidates) {
const file = this.app.vault.getAbstractFileByPath(this.ensureMarkdownExtension(candidate));
const markdownFile = abstractFileToMarkdownTFile(file);
if (markdownFile)
return markdownFile;
}
return null;
}
resolveByBasenameCandidates(candidates) {
var _a;
const markdownFiles = this.app.vault.getMarkdownFiles();
for (const candidate of candidates) {
if (candidate.includes("/"))
continue;
const basename = this.stripMarkdownExtension((_a = candidate.split("/").pop()) !== null && _a !== void 0 ? _a : "");
if (!basename)
continue;
const found = markdownFiles.find(f => f.basename === basename);
if (found)
return found;
}
return null;
}
isMarkdownFile(file) {
return !!file && file.extension === "md";
}
async updateFilesInBoard(links, board, sourcePath, kanbanBoardFileContent) {
for (const link of links) {
const linkFile = this.getLinkFile(link);
const linkIsMarkdownFile = !!abstractFileToMarkdownTFile(linkFile);
if (!linkFile || !linkIsMarkdownFile) {
const linkFile = this.resolveLinkFile(link, sourcePath);
if (!this.isMarkdownFile(linkFile)) {
log.logMessage(`${link.link} is not updatable for the KanbanHelper.`);
continue;
}
@@ -5404,19 +5316,17 @@ class KanbanHelper extends OnFileModifyAutomator {
}
const targetProperty = fileProperties.find(prop => prop.key === board.property);
if (!targetProperty) {
log.logWarning(`'${board.property} not found in ${board.boardName} for file "${linkFile.name}".'`);
new obsidian.Notice(`'${board.property} not found in ${board.boardName} for file "${linkFile.name}".'`); // This notice will help users debug "Property not found in board" errors.
log.logWarning(`'${board.property}' not found in '${board.boardName}' for file "${linkFile.name}".`);
new obsidian.Notice(`'${board.property}' not found in '${board.boardName}' for file "${linkFile.name}".`); // This notice will help users debug "Property not found in board" errors.
return;
}
const propertyHasChanged = (targetProperty.content != heading); // Kanban Helper will check if the file's property is different from its current heading in the kanban and will only make changes to the file if there's a difference
const propertyHasChanged = targetProperty.content !== heading;
if (propertyHasChanged) {
console.debug("Updating " + targetProperty.key + " of file " + linkFile.name + " to " + heading);
console.debug(`Updating ${targetProperty.key} of file ${linkFile.name} to ${heading}`);
await this.plugin.controller.updatePropertyInFile(targetProperty, heading, linkFile);
}
}
getTaskHeading(targetTaskContent, fileContent) {
const MARKDOWN_HEADING = new RegExp(/#+\s+(.+)/);
const TASK_REGEX = new RegExp(/(\s*)-\s*\[([ Xx\.]?)\]\s*(.+)/, "i");
let lastHeading = "";
const contentLines = fileContent.split("\n");
for (const line of contentLines) {
@@ -5429,7 +5339,7 @@ class KanbanHelper extends OnFileModifyAutomator {
if (taskMatch) {
const taskContent = taskMatch[3];
if (taskContent.includes(targetTaskContent)) {
return lastHeading;
return lastHeading || null;
}
}
}
@@ -5536,3 +5446,5 @@ class MetaEdit extends obsidian.Plugin {
}
module.exports = MetaEdit;
/* nosourcemap */

View File

@@ -1,7 +1,7 @@
{
"id": "metaedit",
"name": "MetaEdit",
"version": "1.8.2",
"version": "1.8.4",
"minAppVersion": "1.4.1",
"description": "MetaEdit helps you manage your metadata.",
"author": "Christian B. B. Houmann",