code:
const linkmatch = require('./linkmatch.js');
/* eslint-disable no-useless-escape */
const linkRegex = /\[(?[^\[][^\]]*?)\]\((?<url>(?:/[^\s<>\[\]{}|\\^)]+|https?\://[^\s<>\[\]{}|\\^)]+))\)|(?<urlOnly>https?\://[^\s<>\[\]{}|\\^]+)/g;
const Permission = require('../../../permission/permission.js');
const ROOT = new Permission();
ROOT.setAll(Permission.allPermissions);
const NO_PERMISSION = new Permission();

describe('link markdown', () => {

	const rootCases = [
		{ in: 'http://something.com', out: 'href=' },
		{ in: 'https://something.com', out: 'href=' },
		{ in: '[test](http://something.com)', out: '>test' },
		{ in: '[test](https://something.com)', out: '>test' },
		{ in: 'http://', out: 'http://' },
		{ in: 'https://', out: 'https://' },
	];

	for (let i in rootCases) {
		test(`should contain ${rootCases[i].out} for an input of ${rootCases[i].in}`, () => {
			expect(rootCases[i].in.replace(linkRegex, linkmatch.bind(null, ROOT))).toContain(rootCases[i].out);
		});
	}

	const cases = [
		{ in: 'http://something.com', out: 'href=' },
		{ in: 'https://something.com', out: 'href=' },
		{ in: '[http://something.com](test)', out: '>http://something.com' },
		{ in: '[https://something.com](test)', out: '>https://something.com' },
		{ in: 'http://', out: 'http://' },
		{ in: 'https://', out: 'https://' },
	];

	for (let i in cases) {
		test(`should contain ${cases[i].out} for an input of ${cases[i].in}`, () => {
			expect(cases[i].in.replace(linkRegex, linkmatch.bind(null, NO_PERMISSION))).toContain(cases[i].out);
		});
	}

});


code:
'use strict';

const greentextRegex = /^>((?!>\d+|>>/\w+(/\d*)?|>>#/).*)/gm
	, pinktextRegex = /^<(.+)/gm
	, boldRegex = /''(.+?)''/gm
	, titleRegex = /==(.+?)==/gm
	, monoRegex = /`(.+?)`/gm
	, underlineRegex = /__(.+?)__/gm
	, strikeRegex = /~~(.+?)~~/gm
	, italicRegex = /\*\*(.+?)\*\*/gm
	, spoilerRegex = /\|\|([\s\S]+?)\|\|/gm
	, detectedRegex = /\(\(\((.+?)\)\)\)/gm
	/* eslint-disable no-useless-escape */
	, linkRegex = /\[(?<label>[^\[][^\]]*?)\]\((?<url>(?:/[^\s<>\[\]{}|\\^)]+|https?\://[^\s<>\[\]{}|\\^)]+|mailto:[\w.@]+))\)|(?<urlOnly>https?\://[^\s<>\[\]{}|\\^]+)/g
	, codeRegex = /(?:(?<language>[a-z+]{1,14})\r?\n)?(?<code>[\s\S]+)/i
	, includeSplitRegex = /(\[code\][\s\S]+?\[\/code\])/gm
	, splitRegex = /\[code\]([\s\S]+?)\[\/code\]/gm
	, trimNewlineRegex = /^(\s*\r?\n)*/g
	, simpleEscape = require(__dirname+'/escape.js')
	, { highlight, highlightAuto, listLanguages } = require('highlight.js')
	, validLanguages = listLanguages() //precompute
	, { addCallback } = require(__dirname+'/../../redis/redis.js')
	, config = require(__dirname+'/../../misc/config.js')
	, diceroll = require(__dirname+'/handler/diceroll.js')
	, fortune = require(__dirname+'/handler/fortune.js')
	, linkmatch = require(__dirname+'/handler/linkmatch.js')
	, { Permissions } = require(__dirname+'/../../permission/permissions.js');

let replacements = [];

const updateMarkdownPerms = () => {
	replacements = [
		{ permission: Permissions.USE_MARKDOWN_PINKTEXT, regex: pinktextRegex, cb: (permissions, match, pinktext) => `<span class='pinktext'><${pinktext}</span>` },
		{ permission: Permissions.USE_MARKDOWN_GREENTEXT, regex: greentextRegex, cb: (permissions, match, greentext) => `<span class='greentext'>>${greentext}</span>` },
		{ permission: Permissions.USE_MARKDOWN_BOLD, regex: boldRegex, cb: (permissions, match, bold) => `<span class='bold'>${bold}</span>` },
		{ permission: Permissions.USE_MARKDOWN_UNDERLINE, regex: underlineRegex, cb: (permissions, match, underline) => `<span class='underline'>${underline}</span>` },
		{ permission: Permissions.USE_MARKDOWN_STRIKETHROUGH, regex: strikeRegex, cb: (permissions, match, strike) => `<span class='strike'>${strike}</span>` },
		{ permission: Permissions.USE_MARKDOWN_TITLE, regex: titleRegex, cb: (permissions, match, title) => `<span class='title'>${title}</span>` },
		{ permission: Permissions.USE_MARKDOWN_ITALIC, regex: italicRegex, cb: (permissions, match, italic) => `<span class='em'>${italic}</span>` },
		{ permission: Permissions.USE_MARKDOWN_SPOILER, regex: spoilerRegex, cb: (permissions, match, spoiler) => `<span class='spoiler'>${spoiler}</span>` },
		{ permission: Permissions.USE_MARKDOWN_MONO, regex: monoRegex, cb: (permissions, match, mono) => `<span class='mono'>${mono}</span>` },
		{ permission: Permissions.USE_MARKDOWN_DETECTED, regex: detectedRegex, cb: (permissions, match, detected) => `<span class='detected'>((( ${detected} )))</span>` },
		{ permission: Permissions.USE_MARKDOWN_LINK, regex: linkRegex, cb: linkmatch },
		{ permission: Permissions.USE_MARKDOWN_DICE, regex: diceroll.regexMarkdown, cb: diceroll.markdown },
		{ permission: Permissions.USE_MARKDOWN_FORTUNE, regex: fortune.regex, cb: fortune.markdown },
	];
};

updateMarkdownPerms();
addCallback('config', updateMarkdownPerms);

module.exports = {

	prepareMarkdown: (text, force) => {
		if (!text || text.length === 0) {
			return text;
		}
		const chunks = text.split(includeSplitRegex);
		for (let i = 0; i < chunks.length; i++) {
			//every other chunk will be a code block
			if (i % 2 === 0) {
				chunks[i] = chunks[i].replace(
					diceroll.regexPrepare, diceroll.prepare.bind(null, force));
			}
		}
		return chunks.join('');
	},

	markdown: (text, permissions) => {
		const chunks = text.split(splitRegex);
		const { highlightOptions } = config.get;
		for (let i = 0; i < chunks.length; i++) {
			//every other chunk will be a code block
			if (i % 2 === 0) {
				const escaped = simpleEscape(chunks[i]);
				const newlineFix = escaped.replace(/^\r?\n/,''); //fix ending newline because of codeblock
				chunks[i] = module.exports.processRegularChunk(newlineFix, permissions);
			} else if (permissions.get(Permissions.USE_MARKDOWN_CODE)) {
				chunks[i] = module.exports.processCodeChunk(chunks[i], highlightOptions);
			}
		}
		return chunks.join('');
	},

	processCodeChunk: (text, highlightOptions) => {
		const matches = text.match(codeRegex);
		const trimFix = matches.groups.code.replace(trimNewlineRegex, '');
		let lang;
		if (matches.groups.language && matches.groups.language.length > 0) {
			lang = matches.groups.language.toLowerCase();
		}
		if (!lang) {
			//no language specified, try automatic syntax highlighting
			const { relevance, value } = highlightAuto(trimFix, highlightOptions.languageSubset);
			if (relevance > highlightOptions.threshold) {
				return `<span class='code hljs'>${value}</span>`;
			}
		} else if (lang === 'aa') {
			return `<span class='aa'>${simpleEscape(matches.groups.code)}</span>`;
		} else if (validLanguages.includes(lang)) {
			const { value } = highlight(trimFix, { language: lang, ignoreIllegals: true });
			return `<span class='code hljs'>${value}</span>`;
		}
		//else, auto highlight relevance threshold was too low, lang was not a valid language, or lang was 'plain'
		return `<span class='code'>${simpleEscape(trimFix)}</span>`;
	},

	processRegularChunk: (text, permissions) => {
		//filter replacements based on their permissions
		const allowedReplacements = replacements.filter(r => permissions.get(r.permission));
		for (let i = 0; i < allowedReplacements.length; i++) {
			//could bind more variables here and make them available as additional arguments. would pass more args -> markdown -> procesRegularChunk, etc.
			text = text.replace(allowedReplacements[i].regex, allowedReplacements[i].cb.bind(null, permissions));
		}
		return text;
	},

};

repo_name: diegolegion/algochan

license: mit


code:
'use strict';

module.exports = {

	before: {
		allowedTags: [],
		allowedAttributes: {}
	},

	after: {
		allowedTags: [ 'span', 'a', 'img', 'small'],
		allowedAttributes: {
			'a': [ 'href', 'rel', 'class', 'referrerpolicy', 'target' ],
			'span': [ 'class' ],
			'img': ['src', 'height', 'width']
		}
	}

};


code:
'use strict';

const quoteHandler = require(__dirname+'/quotes.js')
	, { markdown } = require(__dirname+'/markdown/markdown.js')
	, sanitizeOptions = require(__dirname+'/markdown/sanitizeoptions.js')
	, Permission = require(__dirname+'/../permission/permission.js')
	, roleManager = require(__dirname+'/../permission/rolemanager.js')
	, sanitize = require('sanitize-html');

module.exports = async (inputMessage, boardName, threadId=null, permissions=null) => {

	let message = inputMessage;
	let quotes = [];
	let crossquotes = [];

	if (permissions === null) {
		//technically there has for a long time been a bug here, but it can be fixed later. permissions unknown for old msgs
		permissions = new Permission(roleManager.roles.ANON.base64);
	}

	//markdown a post, link the quotes, sanitize and return message and quote arrays
	if (message && message.length > 0) {
		message = markdown(message, permissions);
		const { quotedMessage, threadQuotes, crossQuotes } = await quoteHandler.process(boardName, message, threadId);
		message = quotedMessage;
		quotes = threadQuotes;
		crossquotes = crossQuotes;
		message = sanitize(message, sanitizeOptions.after);
	}

	return { message, quotes, crossquotes };

};


code:
'use strict';

const { getInsecureTrip, getSecureTrip } = require(__dirname+'/tripcode.js')
	, { Permissions } = require(__dirname+'/../permission/permissions.js')
	, nameRegex = /^(?<name>[^#].*?)?(?:(?<tripcode>##(?<strip>[^ ].*?)|#(?<itrip>[^#].*?)))?(?<capcode>##(?<capcodetext> .*?)?)?$/
	, staffLevels = ['Admin', 'Global Staff', 'Board Owner', 'Board Staff'];

module.exports = async (inputName, permissions, boardSettings, boardOwner, boardStaff, username, __) => {

	const { forceAnon, defaultName } = boardSettings;
	const isBoardOwner = username === boardOwner; //why not just check staffboards and ownedboards?
	const staffUsernames = Object.keys(boardStaff);
	const isBoardMod = staffUsernames.includes(username);
	const staffPermissions = [permissions.get(Permissions.ROOT), permissions.get(Permissions.MANAGE_GLOBAL_GENERAL), isBoardOwner, isBoardMod];
	const langStaffLevels = staffLevels.map(l => __(l));
	const staffLevelsRegex = new RegExp(`(${langStaffLevels.join('|')})+`, 'igm');

	let name = defaultName;
	let tripcode = null;
	let capcode = null;
	if ((permissions.get(Permissions.MANAGE_BOARD_GENERAL) || !forceAnon) && inputName && inputName.length > 0) {
		// get matches with named groups for name, trip and capcode in 1 regex
		const matches = inputName.match(nameRegex);
		if (matches && matches.groups) {

			const groups = matches.groups;

			//name
			if (groups.name) {
				name = groups.name;
			}

			//tripcode
			if (groups.tripcode) {
				let tripcodeText = groups.strip || groups.itrip;
				if (!permissions.get(Permissions.MANAGE_BOARD_GENERAL) && groups.capcode === '##' && !groups.capcodetext) {
					//for the complaining non-staff troglodyte who puts the name as all #s
					tripcodeText = tripcodeText.concat('##');
				}
				if (groups.strip) {
					tripcode = `!!${(await getSecureTrip(tripcodeText))}`;
				} else if (groups.itrip) {
					tripcode = `!${getInsecureTrip(tripcodeText)}`;
				}
			}

			//capcode
			if (permissions.get(Permissions.MANAGE_BOARD_GENERAL) && groups.capcode) {
				let capcodeInput = groups.capcodetext ? groups.capcodetext.trim() : '';
				const { staffLevelDirect, staffLevelFallback } = staffPermissions.reduce((acc, sp, i) => {
					if (sp === true) {
						if (!acc.staffLevelFallback) {
							acc.staffLevelFallback = langStaffLevels[i];
						}
						if (!acc.staffLevelDirect && capcodeInput.toLowerCase().startsWith(staffLevels[i].toLowerCase())) {
							acc.staffLevelDirect = langStaffLevels[i];
						}
					}
					return acc;
				}, { 'staffLevelDirect': null, 'staffLevelFallback': null });
				//we still get the same fallbacks as before, its just more annoying without the direct permlevel mapping
				const staffLevel = staffLevelDirect ||
						(isBoardOwner ? langStaffLevels[2]
							: isBoardMod ? langStaffLevels[3]
								: staffLevelFallback);
				capcode = staffLevel;
				if (capcodeInput && capcodeInput.toLowerCase() !== staffLevel.toLowerCase()) {
					capcode = `${staffLevel} ${capcodeInput.replace(staffLevelsRegex, '').trim()}`;
				}
				capcode = `## ${capcode.trim()}`;
			}
		}
	}

	return { name, tripcode, capcode };

};


code:
const name = require('./name.js');
const Permission = require('../permission/permission.js');
const i18n = require('../locale/locale.js');
const ROOT = new Permission();
ROOT.setAll(Permission.allPermissions);
const NO_PERMISSION = new Permission();

describe('name/trip/capcode handler', () => {

	const cases = [
		{ in: '## Admin', out: { name: 'Anon', tripcode: null, capcode: '## Admin' } },
		{ in: '## Global Staff', out: { name: 'Anon', tripcode: null, capcode: '## Global Staff' } },
		{ in: '## Board Owner', out: { name: 'Anon', tripcode: null, capcode: '## Admin' } },
		{ in: '## Board Staff', out: { name: 'Anon', tripcode: null, capcode: '## Admin' } },
		{ in: '##', out: { name: 'Anon', tripcode: null, capcode: '## Admin' } },
		{ in: '', out: { name: 'Anon', tripcode: null, capcode: null } },
		{ in: 'test', out: { name: 'test', tripcode: null, capcode: null } },
		{ in: 'test#12345', out: { name: 'test', tripcode: '!CSZ6G0yP9Q', capcode: null } },
		{ in: '#12345', out: { name: 'Anon', tripcode: '!CSZ6G0yP9Q', capcode: null } },
		{ in: '#12345## Admin', out: { name: 'Anon', tripcode: '!CSZ6G0yP9Q', capcode: '## Admin' } },
		{ in: '###########', perm: NO_PERMISSION, out: { name: 'Anon', tripcode: '!!AR2Fv1lg4=', capcode: null } },
		{ in: '##test', out: { name: 'Anon', tripcode: '!!4XzKAGoCE=', capcode: null } },
		{ in: 'test#12345## Admin', out: { name: 'test', tripcode: '!CSZ6G0yP9Q', capcode: '## Admin' } },
	];

	for (let i in cases) {
		test(`should contain ${cases[i].out.capcode} for an input of ${cases[i].in}`, async () => {
			const output = await name(cases[i].in, (cases[i].perm || ROOT), {forceAnon: false, defaultName: 'Anon'}, 'a', {a:ROOT}, 'b', i18n.__);
			expect(output).toStrictEqual(cases[i].out);
		});
	}

});


code:
'use strict';

const Posts = require(__dirname+'/../../db/posts.js')
	, Boards = require(__dirname+'/../../db/boards.js')
	, quoteRegex = />>(?<quotenum>\d+)/g
	, crossQuoteRegex = />>>/(?<board>\w+)(?:/(?<quotenum>\d*))?/gm
	, catalogSearchQuoteRegex = />>>#/(?<search>\w+)//gm;

module.exports = {

	quoteRegex, crossQuoteRegex, catalogSearchQuoteRegex,

	process: async (board, text, thread) => {

		//get the matches
		const quotes = text.match(quoteRegex);
		const crossQuotes = text.match(crossQuoteRegex);
		const catalogSearchQuotes = text.match(catalogSearchQuoteRegex);
		if (!quotes && !crossQuotes && !catalogSearchQuotes) {
			return { quotedMessage: text, threadQuotes: [], crossQuotes: [] };
		}

		//make query for db including crossquotes
		const postQueryOrs = [];
		const boardQueryIns = [];
		const crossQuoteMap = {};
		if (quotes && board) {
			const quoteIds = [...new Set(quotes.map(q => { return Number(q.substring(8)); }))];
			postQueryOrs.push({
				'board': board,
				'postId': {
					'$in': quoteIds
				}
			});
		}

		if (crossQuotes) {
			for (let i = 0; i < crossQuotes.length; i++) {
				const crossQuote = crossQuotes[i].split('/');
				const crossQuoteBoard = crossQuote[1];
				const crossQuotePostId = +crossQuote[2];
				if (!crossQuoteMap[crossQuoteBoard]) {
					crossQuoteMap[crossQuoteBoard] = [];
				}
				if (!isNaN(crossQuotePostId) && crossQuotePostId > 0) {
					crossQuoteMap[crossQuoteBoard].push(crossQuotePostId);
				}
			}
			const crossQuoteBoards = Object.keys(crossQuoteMap);
			for (let i = 0; i < crossQuoteBoards.length; i++) {
				const crossQuoteBoard = crossQuoteBoards[i];
				boardQueryIns.push(crossQuoteBoard);
				const crossQuoteBoardPostIds = crossQuoteMap[crossQuoteBoard];
				if (crossQuoteBoardPostIds.length > 0) {
					postQueryOrs.push({
						'board': crossQuoteBoard,
						'postId': {
							'$in': crossQuoteBoardPostIds
						}
					});
				}
			}
		}

		//get all the posts from quotes
		const postThreadIdMap = {};
		if (crossQuotes || quotes) {
			const [ posts, boards ] = await Promise.all([
				postQueryOrs.length > 0 ? Posts.getPostsForQuotes(postQueryOrs) : [],
				boardQueryIns.length > 0 ? Boards.db.find({ '_id': { '$in': boardQueryIns } }, { projection: { '_id': 1 } }).toArray() : []
			]);

			//turn the result into a map of postId => threadId/postId
			for (let i = 0; i < posts.length; i++) {
				const post = posts[i];
				if (!postThreadIdMap[post.board]) {
					postThreadIdMap[post.board] = {};
				}
				postThreadIdMap[post.board][post.postId] = {
					'_id': post._id,
					'thread': post.thread || post.postId,
					'postId': post.postId
				};
			}
			for (let i = 0; i < boards.length; i++) {
				const boardName = boards[i]._id;
				if (!postThreadIdMap[boardName]) {
					postThreadIdMap[boardName] = {};
				}
			}
		}

		//then replace the quotes with only ones that exist
		const threadQuotes = new Set();
		const nonThreadQuotes = new Set();
		if (quotes) {
			text = text.replace(quoteRegex, (match, quotenum) => {
				if (postThreadIdMap[board] && postThreadIdMap[board][quotenum]) {
					if (postThreadIdMap[board][quotenum].thread === thread) {
						threadQuotes.add(postThreadIdMap[board][quotenum]);
					} else {
						nonThreadQuotes.add(postThreadIdMap[board][quotenum]);
					}
					return `>>${quotenum}${postThreadIdMap[board][quotenum].postId == thread ? ' (OP) ' : ''}`;
				}
				return `<span class='invalid-quote'>>>${quotenum}</span>`;
			});
		}
		if (crossQuotes) {
			text = text.replace(crossQuoteRegex, (match, quoteboard, quotenum) => {
				if (postThreadIdMap[quoteboard]) {
					if (!quotenum) {
						return `<a class='quote' href='/${quoteboard}/index.html'>>>>/${quoteboard}/</a>`;
					} else if (!isNaN(quotenum) && quotenum > 0 && postThreadIdMap[quoteboard][quotenum]) {
						return `<a class='quote' href='/${quoteboard}/thread/${postThreadIdMap[quoteboard][quotenum].thread}.html#${quotenum}'>>>>/${quoteboard}/${quotenum}</a>`;
					}
				}
				return `<span class='invalid-quote'>>>>/${quoteboard}/${quotenum || ''}</span>`;
			});
		}
		if (catalogSearchQuotes) {
			text = text.replace(catalogSearchQuoteRegex, (match, search) => {
				return `<a href='/${board}/catalog.html#${board}-/${search}/'>>>>#/${search}/</a>`;
			});
		}

		return { quotedMessage: text, threadQuotes: [...threadQuotes], crossQuotes: [...nonThreadQuotes] };

	},

};


code:
'use strict';

const { tripcodeSecret } = require(__dirname+'/../../configs/secrets.js')
	, { createHash } = require('crypto')
	, { encode } = require('iconv-lite')
	, crypt = require('unix-crypt-td-js')
	, replace = {
		':': 'A',
		';': 'B',
		'<': 'C',
		'=': 'D',
		'>': 'E',
		'?': 'F',
		'@': 'G',
		'[': 'a',
		'\\': 'b',
		']': 'c',
		'^': 'd',
		'_': 'e',
		'`': 'f',
	};

module.exports = {

	getSecureTrip: async (password) => {
		const tripcodeHash = createHash('sha256').update(password + tripcodeSecret).digest('base64');
		const tripcode = tripcodeHash.substring(tripcodeHash.length-10);
		return tripcode;
	},

	getInsecureTrip: (password) => {
		const encoded = encode(password, 'SHIFT_JIS')
			.toString('latin1');
		let salt = `${encoded}H..`
			.substring(1, 3)
			.replace(/[^.-z]/g, '.');
		for (let find in replace) {
			salt = salt.split(find).join(replace[find]);
		}
		const hashed = crypt(encoded, salt);
		return hashed.slice(-10);
	},

};


code:
const { getSecureTrip, getInsecureTrip } = require('./tripcode.js');

describe('getSecureTrip() - "secure" tripcodes', () => {
	const cases = [
		{ in: '' },
		{ in: null },
		{ in: '13245' },
		{ in: '1324512345123451234512345123451234512345' },
	];
	for (let i in cases) {
		test(`should not error for an input of ${cases[i].in}`, async () => {
			expect((await getSecureTrip(cases[i].in)));
		});
	}
});

describe('getInsecureTrip() - "insecure" tripcodes', () => {
	const cases = [
		{ in: '', out: '8NBuQ4l6uQ' },
		{ in: null, out: '8NBuQ4l6uQ' },
		{ in: '13245', out: 'VPkdFNhOGY' },
		{ in: '1324512345123451234512345123451234512345', out: '9ovLU2O1wk' },
	];
	for (let i in cases) {
		test(`should contain ${cases[i].out} for an input of ${cases[i].in}`, () => {
			expect(getInsecureTrip(cases[i].in)).toBe(cases[i].out);
		});
	}
});


code:
'use strict';

const Redis = require('ioredis')
	, { redis, debugLogs } = require(__dirname+'/../../configs/secrets.js')
	, sharedClient = new Redis(redis)
	, subscriber = new Redis(redis)
	, publisher = new Redis(redis)
	, messageCallbacks = {
		'config': [],
		'roles': [],
	};

module.exports = {

	redisClient: sharedClient,
	redisSubscriber: subscriber,
	redisPublisher: publisher,

	close: () => {
		sharedClient.quit();
		publisher.quit();
		subscriber.quit();
	},

	addCallback: (channel, cb) => {
		if (messageCallbacks[channel].length === 0) {
			subscriber.subscribe('config', (err) => {
				if (err) {
					return console.error(err);
				}
			});
			subscriber.subscribe('roles', (err) => {
				if (err) {
					return console.error(err);
				}
			});
			subscriber.on('message', (channel, message) => {
				debugLogs && console.log(`Subscriber message from channel ${channel}`);
				let data;
				if (message) {
					data = JSON.parse(message);
				}
				messageCallbacks[channel].forEach(cb => {
					cb(data);
				});
			});
		}
		messageCallbacks[channel].push(cb);
	},

	//get a value with key
	get: (key) => {
		return sharedClient.get(key).then(res => { return JSON.parse(res); });
	},

	//set a value on key
	set: (key, value, ttl) => {
		if (ttl) {
			return sharedClient.set(key, JSON.stringify(value), 'EX', ttl);
		} else {
			return sharedClient.set(key, JSON.stringify(value));
		}
	},

	incr: (key) => {
		return sharedClient.incr(key);
	},

	expire: (key, ttl) => {
		return sharedClient.expire(key, ttl);
	},

	//set a value on key if not exist
	setnx: (key, value) => {
		return sharedClient.setnx(key, JSON.stringify(value));
	},

	//add items to a set
	sadd: (key, value) => {
		return sharedClient.sadd(key, value);
	},

	//get all members of a set
	sgetall: (key) => {
		return sharedClient.smembers(key);
	},

	//remove item from a set
	srem: (key, values) => {
		return sharedClient.srem(key, values);
	},

	//get random item from set
	srand: (key) => {
		return sharedClient.srandmember(key);
	},

	//delete value with key
	del: (keyOrKeys) => {
		debugLogs && console.log('redis del():', keyOrKeys);
		if (Array.isArray(keyOrKeys)) {
			return sharedClient.del(...keyOrKeys);
		} else {
			return sharedClient.del(keyOrKeys);
		}
	},

	getPattern: (pattern) => {
		return new Promise((resolve, reject) => {
			const stream = sharedClient.scanStream({
				match: pattern
			});
			let allKeys = [];
			stream.on('data', (keys) => {
				allKeys = allKeys.concat(keys);
			});
			stream.on('end', async () => {
				const pipeline = sharedClient.pipeline();
				for (let i = 0; i < allKeys.length; i++) {
					pipeline.get(allKeys[i]);
				}
				let results;
				try {
					results = await pipeline.exec();
				} catch (e) {
					return reject(e);
				}
				const data = {};
				for (let i = 0; i < results.length; i++) {
					data[allKeys[i]] = JSON.parse(results[i][1]);
				}
				resolve(data);
			});
			stream.on('error', (err) => {
				reject(err);
			});
		});
	},

	deletePattern: (pattern) => {
		return new Promise((resolve, reject) => {
			let totalDeleted = 0;
			const stream = sharedClient.scanStream({
				match: pattern
			});
			stream.on('data', (keys) => {
				if (keys.length > 0) {
					totalDeleted += keys.length;
					const pipeline = sharedClient.pipeline();
					for (let i = 0; i < keys.length; i++) {
						pipeline.del(keys[i]);
					}
					pipeline.exec();
				}
			});
			stream.on('end', () => {
				resolve(totalDeleted);
			});
			stream.on('error', (err) => {
				reject(err);
			});
		});
	},

};


code:
'use strict';

const Redlock = require('redlock')
	, { redisClient } = require(__dirname+'/redis.js')
	, redlock = new Redlock([redisClient]);

redlock.on('clientError', console.error);

module.exports = redlock;


code:
'use strict';

//NOTE: unused (for now)
const { Web3 } = require('web3')
	, config = require(__dirname+'/../misc/config.js')
	, { addCallback } = require(__dirname+'/../redis/redis.js')
	, web3 = new Web3(config.get.ethereumNode);

const updateWeb3Provider = () => {
	web3.setProvider(config.get.ethereumNode);
};

addCallback('config', updateWeb3Provider);

module.exports = web3;


Name

.html name: .html name

.html name must be 50 characters or less: .html name must be 50 characters or less

.html name must be unique: .html name must be unique

.html name must contain a-z 0-9 _ - only: .html name must contain a-z 0-9 _ - only

(You): (You)

(You)s: (You)s

one: %s character

other: %s characters

one: %s day ago

other: %s days ago

one: %s day from now

other: %s days from now

one: %s file

other: %s files

%s files are being served, totaling %s.: %s files are being served, totaling %s.

one: %s file selected

other: %s files selected

one: %s hour ago

other: %s hours ago

one: %s hour from now

other: %s hours from now

one: %s minute ago

other: %s minutes ago

one: %s minute from now

other: %s minutes from now

one: %s month ago

other: %s months ago

one: %s month from now

other: %s months from now

one: %s reply

other: %s replies

one: %s UID

other: %s UIDs

one: %s week ago

other: %s weeks ago

one: %s week from now

other: %s weeks from now

one: %s year ago

other: %s years ago

one: %s year from now

other: %s years from now

⊖ Thread has reached reply limit.: ⊖ Thread has reached reply limit.

24 Hour Time: 24 Hour Time

24h time: 24h time

2FA Code: 2FA Code

2FA code must be 6 characters: 2FA code must be 6 characters

2FA QR code expired, try again: 2FA QR code expired, try again

404 Not Found: 404 Not Found

500 Internal Server Error: 500 Internal Server Error

502 Bad Gateway: 502 Bad Gateway

503 Service Unavailable: 503 Service Unavailable

504 Gateway Timeout: 504 Gateway Timeout

6 digits: 6 digits

a-zA-Z0-9-_ only: a-zA-Z0-9-_ only

Abandoned Board Action: Abandoned Board Action

Abandoned board action must be a number from 0-3: Abandoned board action must be a number from 0-3

Ability to create new boards.: Ability to create new boards.

Ability to register an account.: Ability to register an account.

Ability to see raw IPs in moderation interfaces.: Ability to see raw IPs in moderation interfaces.

Access board bans. Ability to unban, edit, or deny appeals.: Access board bans. Ability to unban, edit, or deny appeals.

Access board logs. Ability to search/filter.: Access board logs. Ability to search/filter.

Access board settings. Ability to change any settings. Settings page will show transfer/delete forms for those with "Board Owner" permission.

Access global bans. Ability to unban, edit, or deny appeals.: Access global bans. Ability to unban, edit, or deny appeals.

Access global logs. Ability to search/filter: Access global logs. Ability to search/filter

Access global settings. Ability to change any settings.: Access global settings. Ability to change any settings.

Access news posting. Ability to add, edit, or delete newsposts.: Access news posting. Ability to add, edit, or delete newsposts.

Access roles list. Ability to edit roles: Access roles list. Ability to edit roles

Access the accounts list. Ability to search/sort. Ability to edit permissions of any user.

Access the global board list. Ability to search/filter. Also grants the ability to transfer or delete any board.

Access to board assets and custompages. Ability to upload, create, edit, delete.

Access to staff management, and ability to add or remove permissions from others. Can only be given by somebody else with "Board Owner" permission. Use with caution!

Account: Account

Account deleted: Account deleted

Account does not exist: Account does not exist

Account permissions: Account permissions

Account with that username already exists: Account with that username already exists

Accounts: Accounts

Actions: Actions

Active sessions: Active sessions

Active Sessions: Active Sessions

Add: Add

one: Add Asset (Max %s)

other: Add Assets (Max %s)

one: Add Banner (Max %s)

other: Add Banners (Max %s)

Add Boards: Add Boards

Add Custom Page: Add Custom Page

one: Add Flag (Max %s)

other: Add Flags (Max %s)

Add layer: Add layer

Add News: Add News

Add Staff: Add Staff

one: Added %s ban

other: Added %s bans

Added custom page: Added custom page

Added newspost: Added newspost

Added staff: Added staff

Admin: Admin

Airbrush: Airbrush

Allow Animated Image Files: Allow Animated Image Files

Allow Audio Files: Allow Audio Files

Allow Custom Overboard: Allow Custom Overboard

Allow Image Files: Allow Image Files

Allow Other Files: Allow Other Files

Allow Video Files: Allow Video Files

Allowed Code Themes: Allowed Code Themes

Allowed Hosts: Allowed Hosts

Allowed hosts must not exceed 10000 characters: Allowed hosts must not exceed 10000 characters

Allowed Themes: Allowed Themes

alphanumeric only: alphanumeric only

Always Reveal Spoiler Markdown: Always Reveal Spoiler Markdown

Always reveal text spoilers: Always reveal text spoilers

Animated .gif Thumbnails: Animated .gif Thumbnails

Announcement: Announcement

Anon Name: Anon Name

Anon name must be 50 characters or less: Anon name must be 50 characters or less

Another role already exists with the same permissions: "%s": Another role already exists with the same permissions: "%s"

Antispam: Antispam

Antispam FAQ: Antispam FAQ

Appeal message must be %s characters or less: Appeal message must be %s characters or less

Arbitrary assets that can be used for other purposes e.g. custom CSS

Are you sure? Changing the canvas will clear all layers and history and disable replay recording.

At least the following file is not unique: %s: At least the following file is not unique: %s

At least the following files are not unique: %s: At least the following files are not unique: %s

Ban reason must be %s characters or less: Ban reason must be %s characters or less

Banner files height must be a number > 0: Banner files height must be a number > 0

Block bypass expire after uses must be a number > 0: Block bypass expire after uses must be a number > 0

Block bypass expired or exceeded max uses: Block bypass expired or exceeded max uses

Board announcements must be 5000 characters or less: Board announcements must be 5000 characters or less

Board default captcha mode must be a number from 0-2: Board default captcha mode must be a number from 0-2

Board default file r9k mode must be a number from 0-2: Board default file r9k mode must be a number from 0-2

Board default lock mode must be a number from 0-2: Board default lock mode must be a number from 0-2

Board default message r9k mode must be a number from 0-2: Board default message r9k mode must be a number from 0-2

Board default pph trigger action must be a number from 0-4: Board default pph trigger action must be a number from 0-4

Board default pph trigger must be a number: Board default pph trigger must be a number

Board default tph trigger action must be a number from 0-4: Board default tph trigger action must be a number from 0-4

Board default tph trigger must be a number: Board default tph trigger must be a number

Board defaults bump limit must be within global limits: Board defaults bump limit must be within global limits

Board defaults captcha reset must be a number from 0-2: Board defaults captcha reset must be a number from 0-2

Board defaults filter ban duration must be a number: Board defaults filter ban duration must be a number

Board defaults filter mode must be a number from 0-2: Board defaults filter mode must be a number from 0-2

Board defaults lock reset must be a number from 0-2: Board defaults lock reset must be a number from 0-2

Board defaults max files must be within global limits: Board defaults max files must be within global limits

Board defaults max reply message length must be within global limits

Board defaults max thread message length must be within global limits

Board defaults min reply message length must be a number: Board defaults min reply message length must be a number

Board defaults min thread message length must be a number: Board defaults min thread message length must be a number

Board defaults reply limit must be within global limits: Board defaults reply limit must be within global limits

Board defaults reply message length min must be less than max: Board defaults reply message length min must be less than max

Board defaults thread limit must be within global limits: Board defaults thread limit must be within global limits

Board defaults thread message length min must be less than max: Board defaults thread message length min must be less than max

Board description must be %s characters or less: Board description must be %s characters or less

Bypass anonymizer restrictions e.g. disabled file posting.: Bypass anonymizer restrictions e.g. disabled file posting.

Bypass ratelimits for getting new captchas, editing posts, editing board settings, etc.

Bypass the basic anti-flood spamcheck for too frequent similar posting.

Cannot transfer to account that does not exist: Cannot transfer to account that does not exist

Captcha options distortion must be a number from 0-50: Captcha options distortion must be a number from 0-50

Captcha options distorts min must be less than max: Captcha options distorts min must be less than max

Captcha options generate limit must be a number > 0: Captcha options generate limit must be a number > 0

Captcha options grid edge effect strength must be a number from 0-50

Captcha options grid image size must be a number from 50-500: Captcha options grid image size must be a number from 50-500

Captcha options grid noise effect strength must be a number from 0-10

Captcha options grid size must be a number from 2-6: Captcha options grid size must be a number from 2-6

Captcha options icon y offset must be a number from 0-50: Captcha options icon y offset must be a number from 0-50

Captcha options max distorts must be a number from 0-10: Captcha options max distorts must be a number from 0-10

Captcha options min distorts must be a number from 0-10: Captcha options min distorts must be a number from 0-10

Captcha options text noise effect strength must be a number from 0-10

Captcha options text paint effect strength must be a number from 0-10

Captcha options text wave effect strength must be a number form 0-10

Click here if you are not redirected automatically.: Click here if you are not redirected automatically.

Code Highlight Language Detect Threshold: Code Highlight Language Detect Threshold

Completed block bypass, you may go back and make your post.: Completed block bypass, you may go back and make your post.

Country code header length must not exceed 100 characters: Country code header length must not exceed 100 characters

Custom css filters must not exceed 10000 characters: Custom css filters must not exceed 10000 characters

Custom CSS must be %s characters or less: Custom CSS must be %s characters or less

Custom CSS strict mode is enabled and does not allow the following: "%s"

Custom pages max length must be a number: Custom pages max length must be a number

Default volume must be a number from 0-100: Default volume must be a number from 0-100

Description: Description

Description must be %s characters or less: Description must be %s characters or less

Destination for move does not exist, or you do not have permission

Enabling 2FA will invalidate all your existing sessions and you will have to login again.

Exceeded max asset uploads in one request of %s: Exceeded max asset uploads in one request of %s

Exceeded max banner uploads in one request of %s: Exceeded max banner uploads in one request of %s

Exceeded max flag uploads in one request of %s: Exceeded max flag uploads in one request of %s

Export does not include post password or (You)'s: Export does not include post password or (You)'s

Extra mime types must be like type/subtype: Extra mime types must be like type/subtype

Filter text cannot exceed 50000 characters: Filter text cannot exceed 50000 characters

Filters length must be 20000 characters or less: Filters length must be 20000 characters or less

Flags that can be applied to posts if custom flags are enabled in board settings

Full control of the board, equivalent to the BO. Can delete and/or transfer the board. Can only be given by somebody else with "Board Owner" permission. Use with caution!

General board staff permission. Access mod index, catalog, recent posts and reports. Ability to submit mod actions. Bypass board-specific bans and post filters.

General global staff permission. Access to recent posts and reports. Ability to submit global actions.

Global announcement must not exceed 10000 characters: Global announcement must not exceed 10000 characters

Global bump limit min must be less than max: Global bump limit min must be less than max

Global bump limit minimum must be a number: Global bump limit minimum must be a number

Global limit ban reason field length must be a number: Global limit ban reason field length must be a number

Global limit board description field length must be a number: Global limit board description field length must be a number

Global limit board name field length must be a number: Global limit board name field length must be a number

Global limit board uri field length must be a number: Global limit board uri field length must be a number

Global limit email field length must be a number: Global limit email field length must be a number

Global limit log message field length must be a number: Global limit log message field length must be a number

Global limit message field length must be a number: Global limit message field length must be a number

Global limit name field length must be a number: Global limit name field length must be a number

Global limit postpassword field length must be a number >=20: Global limit postpassword field length must be a number >=20

Global limit report reason field length must be a number: Global limit report reason field length must be a number

Global limit subject field length must be a number: Global limit subject field length must be a number

Global reply limit maximum must be a number: Global reply limit maximum must be a number

Global reply limit min must be less than max: Global reply limit min must be less than max

Global reply limit minimum must be a number: Global reply limit minimum must be a number

Global thread limit maximum must be a number: Global thread limit maximum must be a number

Global thread limit min must be less than max: Global thread limit min must be less than max

Global thread limit minimum must be a number: Global thread limit minimum must be a number

Highlight options language subset must not exceed 10000 characters

Highlight options threshold must be a number: Highlight options threshold must be a number

Images randomly chosen and displayed at the top of most pages on the board

Inactive account action must be a number from 0-2: Inactive account action must be a number from 0-2

Invalid archive links URL format, must be a link containing %s where the url param belongs.

Invalid ethereum links URL format, must be a link containing %s where the url param belongs.

Invalid board defaults OP thread age delete protection: Invalid board defaults OP thread age delete protection

Invalid board defaults OP thread reply count delete protection: Invalid board defaults OP thread reply count delete protection

Invalid file "%s". Max banner dimensions are %sx%s and must be a 3:1 aspect ratio.

Invalid file "%s". Max banner dimensions are %sx%s.: Invalid file "%s". Max banner dimensions are %sx%s.

Invalid file type for %s. Mimetype %s not allowed.: Invalid file type for %s. Mimetype %s not allowed.

Invalid OP thread reply count delete protection: Invalid OP thread reply count delete protection

Invalid or missing "Referer" header. Are you posting from the correct URL?

Invalid reverse image search links URL format, must be a link containing %s where the url param belongs.

Invalid selected posts or destination thread: Invalid selected posts or destination thread

IP header length must not exceed 100 characters: IP header length must not exceed 100 characters

Max reply message length must be 0-%s and not less than "Min Reply Message Length" (currently %s)

Max thread message length must be 0-%s and not less than "Min Thread Message Length" (currently %s)

Message: Message

Message must be 10000 characters or less: Message must be 10000 characters or less

Messages must be unique in this thread. Your message is not unique.

Messages must be unique on this board. Your message is not unique.

Meta site name must not exceed 100 characters: Meta site name must not exceed 100 characters

Min and max reply message lengths must not violate eachother: Min and max reply message lengths must not violate eachother

Min and max thread message lengths must not violate eachother: Min and max thread message lengths must not violate eachother

Min reply message length must be 0-%s and not more than "Max Reply Message Length" (currently %s)

Min thread message length must be 0-%s and not more than "Max Thread Message Length" (currently %s)

Modlog message must be %s characters or less: Modlog message must be %s characters or less

Multi input staff limit must be a number: Multi input staff limit must be a number

Must check parent post if checking reports for report action: Must check parent post if checking reports for report action

Must input destinaton thread number or board to move posts: Must input destinaton thread number or board to move posts

Must select a report action if checked reports: Must select a report action if checked reports

Must select at least one asset to delete: Must select at least one asset to delete

Must select at least one banner to delete: Must select at least one banner to delete

Must select at least one custom page to delete: Must select at least one custom page to delete

Must select at least one newspost to delete: Must select at least one newspost to delete

Must select at least one session to delete: Must select at least one session to delete

Must select at least one staff to delete: Must select at least one staff to delete

Must select post and reports to ban reporter: Must select post and reports to ban reporter

New owner must be different from current owner: New owner must be different from current owner

New owner username must be 50 characters or less: New owner username must be 50 characters or less

New owner username must contain a-z 0-9 only: New owner username must contain a-z 0-9 only

New password and password confirmation must match: New password and password confirmation must match

New password confirmation must be 100 characters or less: New password confirmation must be 100 characters or less

New pasword must be 100 characters or less: New pasword must be 100 characters or less

No camera? Use this secret in your authenticator app instead: No camera? Use this secret in your authenticator app instead

Note: Setting board management permissions on an account/role level will grant them globally i.e for all boards.
To make somebody a normal board owner/staff, transfer them the board or give them the appropriate permissions in the board staff permission editing interface.

Password and password confirmation must match: Password and password confirmation must match

Password confirmation must be 100 characters or less: Password confirmation must be 100 characters or less

Password did not match any selected posts: Password did not match any selected posts

Please complete a block bypass to continue: Please complete a block bypass to continue

Please enable JavaScript to solve the captcha.: Please enable JavaScript to solve the captcha.

Please wait before generating another 2FA QR code.: Please wait before generating another 2FA QR code.

Please wait before making another post, or a post similar to another user

Posting files through anonymizers has been disabled globally: Posting files through anonymizers has been disabled globally

Posting files through anonymizers has been disabled on this board

Rate limit cost board settings must be a number from 1-100: Rate limit cost board settings must be a number from 1-100

Rate limit cost captcha must be a number from 1-100: Rate limit cost captcha must be a number from 1-100

Rate limit cost edit post must be a number from 1-100: Rate limit cost edit post must be a number from 1-100

Recently bumped threads from multiple boards: Recently bumped threads from multiple boards

Right click to replace with the current color: Right click to replace with the current color

Scan the QR Code in an authenticator app, and submit the code: Scan the QR Code in an authenticator app, and submit the code

Space file name replacement must be 1 character: Space file name replacement must be 1 character

Subject: Subject

Tags length must be 2000 characters or less: Tags length must be 2000 characters or less

Test first in top-right settings if you have javascript enabled: Test first in top-right settings if you have javascript enabled

Text: Text

The server acting as a gateway or proxy did not get a response in time from the upstream server.

The server acting as a gateway or proxy received an invalid response from the upstream server.

The server encountered an error and was unable to fulfill your request.

The server failed to process "%s". Possible unsupported or corrupt file.

The server is currently unable to handle the request due to a temporary overload or scheduled maintenance.

There are currently %s public boards, %s in total. Sitewide, %s posts have been made in the last day, %s in the last hour, %s in total.

There are currently %s sites and %s boards in the known webring. Across all webring boards, %s posts have been made in the last hour, %s in total.

Thread messages must be %s-%s characters: Thread messages must be %s-%s characters

Thumbnail extension must be at least 1 character: Thumbnail extension must be at least 1 character

Title: Title

Too many files. Max files per post is %s: Too many files. Max files per post is %s

Too many files. Max files per post on this board is %s: Too many files. Max files per post on this board is %s

Total number of banners would exceed global limit of %s: Total number of banners would exceed global limit of %s

Total number of flags would exceed global limit of %s: Total number of flags would exceed global limit of %s

Two factor authentication enabled successfully: Two factor authentication enabled successfully

Uploaded files must be unique in this thread.: Uploaded files must be unique in this thread.

Uploaded files must be unique on this board.: Uploaded files must be unique on this board.

User file spoiling is disabled on this board: User file spoiling is disabled on this board

User file unlinking is disabled on this board: User file unlinking is disabled on this board

User post deletion is disabled on this board: User post deletion is disabled on this board

Video thumbnail percentage must be a number from 1-100: Video thumbnail percentage must be a number from 1-100

Webring blacklist must not exceed 10000 characters: Webring blacklist must not exceed 10000 characters

Webring following list must not exceed 10000 characters: Webring following list must not exceed 10000 characters

Webring logos list must not exceed 10000 characters: Webring logos list must not exceed 10000 characters

You are changing settings too quickly, please wait a minute and try again

You are editing posts too quickly, please wait a minute and try again

You can't apply template permissions to a ROOT user.: You can't apply template permissions to a ROOT user.

You can't edit the permissions of the board owner: You can't edit the permissions of the board owner

You cannot delete your account while you hold staff position on any board

Your country "%s" is not allowed to post on this board: Your country "%s" is not allowed to post on this board

Your request was blocked because your IP address is listed on a blacklist.

Please enter at least one allowed host in the "Allowed Hosts" field when the "Referer Check" option is selected.

Must select at least one filter to delete: Must select at least one filter to delete

Total number of filters would exceed global limit of %s: Total number of filters would exceed global limit of %s

Username must not be an ethereum address: Username must not be an ethereum address


Nome

.html name: nome .html

.html name must be 50 characters or less: Il nome .html deve contenere al massimo 50 caratteri

.html name must be unique: Il nome .html deve essere unico

.html name must contain a-z 0-9 _ - only: Il nome .html deve contenere solo caratteri a-z 0-9 _ -

(You): (Tu)

(You)s: (Tu)

one: %s carattere

other: %s caratteri

one: %s giorno fa

other: %s giorni fa

one: %s giorno da adesso

other: %s giorni da adesso

one: %s file

other: %s file

%s files are being served, totaling %s.: Sono hostati %s file, per un totale di %s.

one: %s file selezionato

other: %s file selezionati

one: %s ora fa

other: %s ore fa

one: %s ora da adesso

other: %s ore da adesso

one: %s minuto fa

other: %s minuti fa

one: %s minuto da adesso

other: %s minuti da adesso

one: %s mese fa

other: %s mesi fa

one: %s mese da adesso

other: %s mesi da adesso

one: %s risposta

other: %s risposte

other: %s UID

one: %s settimana fa

other: %s settimane fa

one: %s settimana da adesso

other: %s settimane da adesso

one: %s anno fa

other: %s anni fa

one: %s anno da adesso

other: %s anni da adesso

⊖ Thread has reached reply limit.: ⊖ Il thread ha raggiunto il limite di risposte.

24 Hour Time: Formato 24 ore

24h time: Orario 24h

2FA Code: Codice 2FA

2FA code must be 6 characters: Il codice 2FA deve essere di 6 caratteri

2FA QR code expired, try again: Il codice QR 2FA è scaduto, riprova

404 Not Found: 404 Non trovato

500 Internal Server Error: 500 Errore interno del server

502 Bad Gateway: 502 Gateway non valido

503 Service Unavailable: 503 Servizio non disponibile

504 Gateway Timeout: 504 Timeout del gateway

6 digits: 6 cifre

a-zA-Z0-9-_ only: Solo a-zA-Z0-9-_

Abandoned Board Action: Azione board abbandonata

Abandoned board action must be a number from 0-3: L'azione della board abbandonata deve essere un numero compreso tra 0 e 3

Ability to create new boards.: Abilità di creare nuove board.

Ability to register an account.: Abilità di registrare un account.

Ability to see raw IPs in moderation interfaces.: Abilità di vedere gli IP completi nelle interfacce di moderazione.

Access board bans. Ability to unban, edit, or deny appeals.: Accesso ai ban delle board. Abilità di sbloccare, modificare o negare appelli.

Access board logs. Ability to search/filter.: Accesso ai log delle board. Abilità di cercare / filtrare.

Accesso alle impostazioni delle board. Abilità di cambiare qualsiasi impostazione. La pagina delle impostazioni mostrerà i moduli di trasferimento / eliminazione per coloro che hanno il permesso di "Proprietario della board".

Access global bans. Ability to unban, edit, or deny appeals.: Accesso ai ban globali. Abilità di sbannare, modificare o negare appelli.

Access global logs. Ability to search/filter: Accesso ai log globali. Abilità di cercare / filtrare

Access global settings. Ability to change any settings.: Accesso alle impostazioni globali. Abilità di cambiare qualsiasi impostazione.

Access news posting. Ability to add, edit, or delete newsposts.: Accesso alla pubblicazione di notizie. Abilità di aggiungere, modificare o eliminare le notizie.

Access roles list. Ability to edit roles: Accesso alla lista dei ruoli. Abilità di modificare i ruoli

Accesso alla lista degli account. Abilità di cercare / ordinare. Abilità di modificare i permessi di qualsiasi utente.

Accesso alla lista globale delle board. Da anche l'abilità di cambiare proprietà o cancellare qualsiasi board.

Accesso agli asset e alle pagine custom. Abilita all'upload, creazione, modifica, cancellazione.

Accesso alla gestione dello staff, abilita all'aggiunta o rimozione di permessi dagli altri. Si può solo dare con permessi di proprietario board. Utilizzalo con cautela!

Account with that username already exists: Esiste già un account con quel username

Accounts: Account

Actions: Azioni

Active sessions: Sessioni attive

Active Sessions: Sessioni Attive

Add: Aggiungi

one: Aggiungi Asset (Max %s)

other: Aggiungi Assets (Max %s)

one: Aggiungi Banner (Max %s)

other: Aggiungi Banners (Max %s)

Add Boards: Aggiungi Board

Add Custom Page: Aggiungi Pagina Personalizzata

one: Aggiungi Bandierina (Max %s)

other: Aggiungi Bandierine (Max %s)

Add layer: Aggiungi layer

Add News: Aggiungi Notizia

Add Staff: Aggiungi Staff

one: Aggiunto %s ban

other: Aggiunti %s ban

Added custom page: Pagina personalizzata aggiunta

Added newspost: Notizia aggiunta

Added staff: Staff aggiunto

Admin: Amministratore

Airbrush: Aerografo

Allow Animated Image Files: Consenti file immagine animati

Allow Audio Files: Consenti file audio

Allow Custom Overboard: Consenti Indice personalizzato

Allow Image Files: Consenti file immagine

Allow Other Files: Consenti altri tipi di file

Allow Video Files: Consenti file video

Allowed Code Themes: Temi codice consentiti

Allowed Hosts: Host consentiti

Allowed hosts must not exceed 10000 characters: Gli host consentiti non devono superare i 10000 caratteri

Allowed Themes: Temi consentiti

alphanumeric only: solo caratteri alfanumerici

Always Reveal Spoiler Markdown: Mostra sempre il markdown spoiler

Always reveal text spoilers: Mostra sempre gli spoiler

Animated .gif Thumbnails: Anteprime .gif animate

Announcement: Annuncio

Anon Name: Nome anonimo

Anon name must be 50 characters or less: Il nome anonimo deve essere di 50 caratteri o meno

Another role already exists with the same permissions: "%s": Esiste già un altro ruolo con le stesse autorizzazioni: "%s"

Antispam FAQ: FAQ antispam

Any Content Same IP/ID: Qualsiasi contenuto con lo stesso IP/ID

Appeal: Appello

Appeal message must be %s characters or less: Il messaggio di appello deve contenere al massimo %s caratteri

Appealable?: Appellabile?

other: Appelli ai %s ban effettuati con successo

Appeals must include a message: Gli appelli devono includere un messaggio

Asset arbitrari che possono essere utilizzati per altri scopi, ad esempio CSS personalizzato

Sei sicuro? Modificare la tela cancellerà tutti gli strati e la cronologia e disabiliterà la registrazione della riproduzione.

Asset files max must be a number: Il massimo di file risorse deve essere un numero

Asset files size must be a number: La dimensione dei file risorse deve essere un numero

Asset files total must be a number: Il totale dei file risorse deve essere un numero

Assets Per Upload Max: Numero massimo di risorse per caricamento

At least the following file is not unique: %s: Almeno il seguente file non è univoco: %s

At least the following files are not unique: %s: Almeno i seguenti file non sono univoci: %s

Ban note must be %s characters or less: Nota del ban deve essere di %s caratteri o meno

Ban reason must be %s characters or less: Il motivo del ban deve essere di %s caratteri o meno

Banner files height must be a number > 0: L'altezza dei file banner deve essere un numero > 0

Banner files max must be a number: Il massimo di file banner deve essere un numero

Banner files size must be a number: La dimensione dei file banner deve essere un numero

Banner files total must be a number: Il totale dei file banner deve essere un numero

Banner files width must be a number > 0: La larghezza dei file banner deve essere un numero > 0

Banners Per Upload Max: Numero massimo di banner per caricamento

Block bypass expire after uses must be a number > 0: Il numero di usi dopo il quale il bypass del blocco scade deve essere un numero > 0

Block bypass expired or exceeded max uses: Il bypass del blocco è scaduto o ha superato il numero massimo di utilizzi

Board announcements must be 5000 characters or less: Gli annunci della board devono essere di 5000 caratteri o meno

Board default captcha mode must be a number from 0-2: La modalità captcha predefinita della board deve essere un numero compreso tra 0 e 2

Board default file r9k mode must be a number from 0-2: La modalità file r9k predefinita della board deve essere un numero compreso tra 0 e 2

Board default lock mode must be a number from 0-2: La modalità di blocco predefinita della board deve essere un numero compreso tra 0 e 2

Board default message r9k mode must be a number from 0-2: La modalità messaggio r9k predefinita della board deve essere un numero compreso tra 0 e 2

Board default pph trigger action must be a number from 0-4: L'azione trigger predefinita ppo della board deve essere un numero compreso tra 0 e 4

Board default pph trigger must be a number: Il trigger ppo predefinito della board deve essere un numero

Board default tph trigger action must be a number from 0-4: L'azione trigger predefinita tph della board deve essere un numero compreso tra 0 e 4

Board default tph trigger must be a number: Il trigger tph predefinito della board deve essere un numero

Board defaults bump limit must be within global limits: Il limite di bump predefinito della board deve essere all'interno dei limiti globali

Board defaults captcha reset must be a number from 0-2: Il ripristino captcha predefinito della board deve essere un numero compreso tra 0 e 2

Board defaults filter ban duration must be a number: La durata del ban predefinita del filtro della board deve essere un numero

Board defaults filter mode must be a number from 0-2: La modalità filtro predefinita della board deve essere un numero compreso tra 0 e 2

Board defaults lock reset must be a number from 0-2: Il ripristino blocco predefinito della board deve essere un numero compreso tra 0 e 2

Board defaults max files must be within global limits: Il numero massimo di file predefinito della board deve essere all'interno dei limiti globali

La lunghezza massima del messaggio di risposta predefinita della board deve essere all'interno dei limiti globali

La lunghezza massima del messaggio del thread predefinita della board deve essere all'interno dei limiti globali

Board defaults min reply message length must be a number: La lunghezza minima predefinita dei messaggi di risposta deve essere un numero

Board defaults min thread message length must be a number: La lunghezza minima predefinita dei messaggi di thread deve essere un numero

Board defaults reply limit must be within global limits: Il limite predefinito di risposte deve essere entro i limiti globali

Board defaults reply message length min must be less than max: La lunghezza minima predefinita del messaggio di risposta deve essere inferiore alla massima

Board defaults thread limit must be within global limits: Il limite predefinito del thread deve essere entro i limiti globali

Board defaults thread message length min must be less than max: La lunghezza minima predefinita del messaggio di thread deve essere inferiore alla massima

Board description must be %s characters or less: La descrizione della board deve essere di %s caratteri o meno

Board name must be 1-%s characters: Il nome della board deve avere da 1 a %s caratteri

Bump Limit must be %s-%s: Il limite di bump deve essere tra %s e %s

Saltare i limiti di velocità per ottenere nuovi captcha, modificare i post, modificare le impostazioni della board, ecc.

Saltare il controllo anti-spam di base contro i post troppo frequenti e simili.

Can only create %s pages per board: È possibile creare solo %s pagine per board

Cannot transfer to account that does not exist: Impossibile trasferire su un account che non esiste

Captcha options distortion must be a number from 0-50: L'opzione di distorsione del Captcha deve essere un numero compreso tra 0 e 50

Captcha options distorts min must be less than max: La distorsione minima del Captcha deve essere inferiore alla massima

Captcha options generate limit must be a number > 0: Il limite di generazione del Captcha deve essere un numero maggiore di 0

La forza dell'effetto bordo della griglia del Captcha deve essere un numero compreso tra 0 e 50

Captcha options grid image size must be a number from 50-500: La dimensione dell'immagine della griglia del Captcha deve essere un numero compreso tra 50 e 500

La forza dell'effetto rumore della griglia del Captcha deve essere un numero compreso tra 0 e 10

Captcha options grid size must be a number from 2-6: La dimensione della griglia del Captcha deve essere un numero compreso tra 2 e 6

Captcha options icon y offset must be a number from 0-50: L'offset y dell'icona del Captcha deve essere un numero compreso tra 0 e 50

Captcha options max distorts must be a number from 0-10: Il massimo di distorsioni del Captcha deve essere un numero compreso tra 0 e 10

Captcha options min distorts must be a number from 0-10: Il minimo di distorsioni del Captcha deve essere un numero compreso tra 0 e 10

La forza dell'effetto di rumore del testo delle opzioni Captcha deve essere un numero compreso tra 0 e 10

La forza dell'effetto di pittura del testo delle opzioni Captcha deve essere un numero compreso tra 0 e 10

La forza dell'effetto onda del testo delle opzioni Captcha deve essere un numero compreso tra 0 e 10

Click here if you are not redirected automatically.: Clicca qui se non vieni reindirizzato automaticamente.

Code Highlight Language Detect Threshold: Soglia di rilevamento della lingua per evidenziatura del codice

Code Highlighting Auto-Detect Languages: Rilevamento automatico delle lingue per evidenziatura del codice

Completed block bypass, you may go back and make your post.: Bypass del blocco completato, puoi tornare indietro e fare il tuo post.

Country code header length must not exceed 100 characters: La lunghezza dell'intestazione del codice paese non deve superare i 100 caratteri

Custom css filters must not exceed 10000 characters: I filtri CSS personalizzati non devono superare i 10000 caratteri

Custom css max must be a number: La lunghezza massima del CSS personalizzato deve essere un numero

Custom CSS must be %s characters or less: Il CSS personalizzato deve essere di %s caratteri o meno

La modalità rigida CSS personalizzata è abilitata e non consente il seguente: "%s"

Custom Pages Max Characters: Numero massimo di caratteri per le pagine personalizzate

Custom pages max length must be a number: La lunghezza massima delle pagine personalizzate deve essere un numero

Custom pages max must be a number: Il numero massimo di pagine personalizzate deve essere un numero

Default volume must be a number from 0-100: Il volume predefinito deve essere un numero compreso tra 0 e 100

Description: Descrizione

Description must be %s characters or less: La descrizione deve essere di %s caratteri o meno

Destination for move does not exist: La destinazione per il movimento non esiste

La destinazione per il movimento non esiste o non hai il permesso

Disable anonymizer file posting: Disattiva la pubblicazione di file anonymizer

Disable Anonymizer File Posting: Disattiva La Pubblicazione Di File Anonymizer

Disable board custom CSS: Disattiva il CSS personalizzato della board

Do NOT import untrusted settings data!: NON importare dati di impostazioni non affidabili!

Early 404 fraction must be a number: La frazione di 404 anticipato deve essere un numero

Edit account permissions for: Modifica le autorizzazioni dell'account per

Edit board permissions for "%s": Modifica le autorizzazioni della board per "%s"

L'abilitazione di 2FA invaliderà tutte le sessioni esistenti e dovrai effettuare nuovamente il login.

Exceeded max asset uploads in one request of %s: È stato superato il numero massimo di caricamenti di asset in una sola richiesta di %s

Exceeded max banner uploads in one request of %s: È stato superato il numero massimo di caricamenti di banner in una sola richiesta di %s

Exceeded max flag uploads in one request of %s: È stato superato il numero massimo di caricamenti di bandiere in una sola richiesta di %s

Export does not include post password or (You)'s: L'esportazione non include la password del post o di (Tu)

Extra mime types must be like type/subtype: I tipi mime aggiuntivi devono essere in formato tipo/subtipo

Filter mode must be a number from 0-2: La modalità filtro deve essere un numero compreso tra 0 e 2

Filter text cannot exceed 50000 characters: Il testo del filtro non può superare i 50000 caratteri

Filters length must be 20000 characters or less: La lunghezza dei filtri deve essere di 20000 caratteri o meno

Flag files max must be a number: Il numero massimo di bandiere deve essere un numero

Flag files size must be a number: La dimensione dei bandiere deve essere un numero

Flag files total must be a number: Il totale dei bandiere deve essere un numero

Flags Per Upload Max: Numero massimo di bandiere per caricamento

Bandiere che possono essere applicate ai post se le bandiere personalizzate sono abilitate nelle impostazioni della board

Force 3:1 Banner Aspect Ratio: Forza il rapporto d'aspetto del banner a 3:1

Frontend Script Defaults: Impostazioni predefinite degli script Frontend

Controllo totale della board, equivalente al BO. Può eliminare e/o trasferire la board. Può essere concesso solo da qualcun altro con il permesso di "Board Owner". Usare con cautela!

Permesso generale dello staff della board. Accesso all'indice dei mod, al catalogo, ai post recenti e alle segnalazioni. Abilità di inviare azioni da mod. Ignora i ban specifici della board e i filtri dei post.

Permesso globale generale dello staff. Accesso ai post recenti e alle segnalazioni. Abilità di inviare azioni globali.

Global announcement must not exceed 10000 characters: L'annuncio globale non deve superare i 10000 caratteri

Global bump limit min must be less than max: Il limite minimo di bump globale deve essere inferiore al massimo

Global bump limit minimum must be a number: Il limite minimo di bump globale deve essere un numero

Global limit ban reason field length must be a number: La lunghezza del campo motivo del ban globale deve essere un numero

Global limit board description field length must be a number: La lunghezza del campo descrizione della board globale deve essere un numero

Global limit board name field length must be a number: La lunghezza del campo nome della board globale deve essere un numero

Global limit board uri field length must be a number: La lunghezza del campo URI della board globale deve essere un numero

Global limit email field length must be a number: La lunghezza del campo email globale deve essere un numero

Global limit log message field length must be a number: La lunghezza del campo messaggio di log globale deve essere un numero

Global limit message field length must be a number: La lunghezza del campo messaggio globale deve essere un numero

Global limit name field length must be a number: La lunghezza del campo nome globale deve essere un numero

Global limit postpassword field length must be a number >=20: La lunghezza del campo postpassword globale deve essere un numero >=20

Global limit report reason field length must be a number: La lunghezza del campo motivo della segnalazione globale deve essere un numero

Global limit subject field length must be a number: La lunghezza del campo oggetto globale deve essere un numero

Global reply limit maximum must be a number: Il limite massimo di risposta globale deve essere un numero

Global reply limit min must be less than max: Il limite minimo di risposta globale deve essere inferiore al massimo

Global reply limit minimum must be a number: Il limite minimo di risposta globale deve essere un numero

Global thread limit maximum must be a number: Il limite massimo di thread globale deve essere un numero

Global thread limit min must be less than max: Il limite minimo di thread globale deve essere inferiore al massimo

Global thread limit minimum must be a number: Il limite minimo di thread globale deve essere un numero

global word filter auto ban: Ban automatico del filtro globale delle parole

Il subset della lingua delle opzioni di evidenziazione non deve superare i 10000 caratteri

Highlight options threshold must be a number: La soglia delle opzioni di evidenziazione deve essere un numero

Immagini scelte casualmente e visualizzate in cima alla maggior parte delle pagine della board

Inactive account action must be a number from 0-2: L'azione dell'account inattivo deve essere un numero da 0 a 2

Formato URL dei link di archivio non valido, deve essere un link contenente %s dove il parametro url appartiene.

Formato URL dei link di Ethereum non valido, deve essere un link contenente %s dove il parametro url appartiene.

Invalid ban upgrade option: Opzione di aggiornamento di ban non valida

Invalid block bypass expire after time: Tempo di scadenza del bypass del blocco non valido

Invalid board default code theme: Tema predefinito del codice della board non valido

Invalid board defaults OP thread age delete protection: Protezione dell'eliminazione dell'età predefinita del thread OP non valida

Invalid board defaults OP thread reply count delete protection: Protezione dell'eliminazione del conteggio delle risposte predefinite del thread OP non valida

File "%s" non valido. Le dimensioni massime del banner sono %sx%s e devono avere un rapporto di aspetto 3:1.

Invalid file "%s". Max banner dimensions are %sx%s.: File "%s" non valido. Le dimensioni massime del banner sono %sx%s.

Invalid file type for %s. Mimetype %s not allowed.: Tipo di file non valido per %s. Mimetype %s non consentito.

Invalid filter auto ban duration: Durata del ban automatico da filtro non valida

Invalid flood time any content same ip: Tempo di flood non valido per qualsiasi contenuto con lo stesso IP

Invalid flood time same contenet any ip: Tempo di flood non valido per lo stesso contenuto con qualsiasi IP

Invalid flood time same content same ip: Tempo di flood non valido per lo stesso contenuto con lo stesso IP

Invalid hot threads max age: Età massima di thread popolari non valida

Invalid number of reports checked: Numero di segnalazioni controllate non valido

Invalid OP thread age delete protection: Protezione eliminazione thread OP in base all'età non valida

Invalid OP thread reply count delete protection: Protezione eliminazione thread OP in base al numero di risposte non valida

Intestazione "Referer" non valida o mancante. Stai inviando dalla URL corretta?

Invalid overboard catalog limit: Limite del catalogo dell'indice non valido

Invalid post move destination: Destinazione non valida per lo spostamento del post

Formato URL non valido per la ricerca di immagini invertita, deve essere un link contenente %s dove appartiene il parametro URL.

Invalid selected posts or destination thread: Post selezionati o thread di destinazione non validi

IP header length must not exceed 100 characters: La lunghezza dell'intestazione IP non deve superare i 100 caratteri

Max files must be 0-%s: Il numero massimo di file deve essere compreso tra 0 e %s

Max files per post on this board is %s: Il numero massimo di file per post su questa board è %s

Max files per request is %s: Il numero massimo di file per richiesta è %s

Max recent news must be a number: Il numero massimo di notizie recenti deve essere un numero

Max reply message length must be 0-%s: La lunghezza massima del messaggio di risposta deve essere compresa tra 0 e %s

La lunghezza massima del messaggio di risposta deve essere compresa tra 0 e %s e non inferiore a "Lunghezza minima messaggio di risposta" (attualmente %s)

Max thread message length must be 0-%s: La lunghezza massima del messaggio del thread deve essere compresa tra 0 e %s

La lunghezza massima del messaggio del thread deve essere compresa tra 0 e %s e non inferiore a "Lunghezza minima messaggio del thread" (attualmente %s)

Message: Messaggio

Message must be %s characters or less: Il messaggio deve essere di %s caratteri o meno

Message must be 10000 characters or less: Il messaggio deve essere di 10000 caratteri o meno

I messaggi devono essere univoci in questo thread. Il tuo messaggio non è univoco.

I messaggi devono essere univoci su questa board. Il tuo messaggio non è univoco.

Meta site name must not exceed 100 characters: Il nome del sito meta non deve superare i 100 caratteri

Meta url must not exceed 100 characters: L'URL meta non deve superare i 100 caratteri

Mime type "%s" invalid for file "%s": Tipo Mime "%s" non valido per il file "%s"

Mime type mismatch for file "%s": Tipo Mime non corrispondente per il file "%s"

Min and max reply message lengths must not violate eachother: La lunghezza minima e massima dei messaggi di risposta non devono violarsi reciprocamente

Min and max thread message lengths must not violate eachother: La lunghezza minima e massima dei messaggi di thread non devono violarsi reciprocamente

Min Reply Message Length: Lunghezza minima del messaggio di risposta

Min reply message length must be 0-%s: La lunghezza minima del messaggio di risposta deve essere compresa tra 0 e %s

La lunghezza minima del messaggio di risposta deve essere compresa tra 0 e %s e non superare "Max Reply Message Length" (attualmente %s)

Min Thread Message Length: Lunghezza minima del messaggio di thread

Min thread message length must be 0-%s: La lunghezza minima del messaggio di thread deve essere compresa tra 0 e %s

La lunghezza minima del messaggio di thread deve essere compresa tra 0 e %s e non superare "Max Thread Message Length" (attualmente %s)

Missing new owner username: Nome utente del nuovo proprietario mancante

Modlog message must be %s characters or less: Il messaggio Modlog deve contenere al massimo %s caratteri

Multi input anon limit must be a number: Il limite multi input anon deve essere un numero

Multi input staff limit must be a number: Il limite multi input Staff deve essere un numero

Must check parent post if checking reports for report action: Devi controllare il post genitore se controlli i report per l'azione di report

Must input destinaton thread number or board to move posts: Devi inserire il numero del thread di destinazione o la board per spostare i post

Must select a report action if checked reports: Devi selezionare un'azione di report se hai controllato i report

Must select at least one asset to delete: Devi selezionare almeno un asset da eliminare

Must select at least one ban to appeal: Devi selezionare almeno un ban per fare appello

Must select at least one banner to delete: Devi selezionare almeno un banner da eliminare

Must select at least one custom page to delete: Devi selezionare almeno una pagina personalizzata da eliminare

Must select at least one flag to delete: Devi selezionare almeno una bandiera da eliminare

Must select at least one newspost to delete: Devi selezionare almeno un newspost da eliminare

Must select at least one session to delete: Devi selezionare almeno una sessione da eliminare

Must select at least one staff to delete: Devi selezionare almeno uno staff da eliminare

Must select only 1 post for edit action: Devi selezionare solo 1 post per l'azione di modifica

Must select post and reports to ban reporter: Devi selezionare post e report per vietare al reporter

Name must be %s characters or less: Il nome deve contenere al massimo %s caratteri

New owner must be different from current owner: Il nuovo proprietario deve essere diverso dall'attuale proprietario

New owner username must be 50 characters or less: L'username del nuovo proprietario deve essere di 50 caratteri o meno

New owner username must contain a-z 0-9 only: L'username del nuovo proprietario può contenere solo a-z 0-9

New password and password confirmation must match: La nuova password e la conferma password devono corrispondere

New password confirmation must be 100 characters or less: La conferma della nuova password deve essere di 100 caratteri o meno

New pasword must be 100 characters or less: La nuova password deve essere di 100 caratteri o meno

No camera? Use this secret in your authenticator app instead: Non hai una fotocamera? Utilizza questo segreto sulla tua app autenticatore

No threads selected to Bumplock: Nessun thread selezionato per il Bumplock

No threads selected to make Cyclical: Nessun thread selezionato per renderlo ciclico

No threads selected to Sticky: Nessun thread selezionato per la messa in evidenza

No video/audio files in this thread.: Nessun file video/audio in questo thread.

Nota: Impostare i permessi di gestione della board a livello di account o ruolo li concederà globalmente, cioè per tutte le bacheche.
Per rendere qualcuno un proprietario/staff normale della board, trasferiscigli la board o concedigli i permessi appropriati nell'interfaccia di modifica dei permessi dello staff della board.

OP Reply Count Delete Protection: Protezione contro l'eliminazione del conteggio delle risposte dell'OP

OP Thread Age Delete Protection: Protezione contro l'eliminazione dell'età del thread dell'OP

Overboard Catalog Thread Limit: Limite di thread del catalogo dell'indice

Overboard Reverse Image Search: Ricerca inversa dell'immagine dell'Indice

Password and password confirmation must match: La password e la conferma della password devono coincidere

Password confirmation must be 100 characters or less: La conferma della password deve essere di 100 caratteri o meno

Password did not match any selected posts: La password non corrisponde a nessun post selezionato

Password must be %s characters or less: La password deve essere di %s caratteri o meno

Password must be 1-100 characters: La password deve essere di 1-100 caratteri

Password must be 50 characters or less: La password deve essere di 50 caratteri o meno

Please complete a block bypass to continue: Si prega di completare un bypass del blocco per continuare

Please enable JavaScript to solve the captcha.: Si prega di abilitare JavaScript per risolvere il captcha.

Please wait before generating another 2FA QR code.: Si prega di attendere prima di generare un altro codice QR 2FA.

Si prega di attendere prima di effettuare un altro post o un post simile a quello di un altro utente

Post files max must be a number: Il massimo numero di file del post deve essere un numero

Post files size must be a number: La dimensione dei file del post deve essere un numero

Posting files through anonymizers has been disabled globally: La pubblicazione di file attraverso anonimizzatori è stata disabilitata globalmente

La pubblicazione di file attraverso anonimizzatori è stata disabilitata in questa board

Posts must include a message or file: I post devono includere un messaggio o un file

Preview replies must be a number: Le anteprime delle risposte devono essere un numero

Prune ips must be a number of days: I giorni di eliminazione degli IP devono essere un numero

Prune modlogs must be a number of days: I giorni di eliminazione dei modlog devono essere un numero

Quote limit must be a number: Il limite di citazione deve essere un numero

Rate limit cost board settings must be a number from 1-100: Il costo del limite di velocità delle impostazioni della board deve essere un numero compreso tra 1 e 100

Rate limit cost captcha must be a number from 1-100: Il costo del limite di velocità del captcha deve essere un numero compreso tra 1 e 100

Rate limit cost edit post must be a number from 1-100: Il costo del limite di velocità per la modifica di un post deve essere un numero compreso tra 1 e 100

Recently bumped threads from multiple boards: Ultime discussioni bumpate in diverse board

Replies must include a message: Le risposte devono includere un messaggio

Reply Limit must be %s-%s: Il limite di risposte deve essere tra %s e %s

Reply messages must be %s-%s characters: I messaggi di risposta devono essere di %s-%s caratteri

Report must be %s characters or less: Il report deve essere di %s caratteri o meno

Reports against or by ip %s: Segnalazioni contro o fatte dall'indirizzo IP %s

Reports must have a reason: Le segnalazioni devono avere una motivazione

Resign from the accounts page instead: Dimettersi dalla pagina degli account al posto di qui

Resigned from owner position on /%s/: Dimesso dalla posizione di proprietario su /%s/

Resigned from staff position on /%s/: Dimesso dalla posizione di staff su /%s/

Reverse Image Search Links URL: URL dei link di ricerca immagini inverse

Right click to replace with the current color: Clicca col tasto destro del mouse per sostituire con il colore corrente

Scan the QR Code in an authenticator app, and submit the code: Scansiona il codice QR nell'applicazione di autenticazione e invia il codice

one: Imposta livello di attaccamento per %s thread a %s

other: Imposta livello di attaccamento per %s threads a %s

Space file name replacement must be 1 character: La sostituzione degli spazi nel nome del file deve essere di 1 carattere

Sticky preview replies must be a number: L'anteprima delle risposte in rilievo deve essere un numero

Subject: Oggetto

Subject must be %s characters or less: L'oggetto deve essere di %s caratteri o meno

Tags length must be 2000 characters or less: La lunghezza dei tag deve essere di 2000 caratteri o meno

Tegaki height must be a number: L'altezza del Tegaki deve essere un numero

Tegaki width must be a number: La larghezza del Tegaki deve essere un numero

Template Generation Lock Time: Tempo di blocco della generazione del Template

Test first in top-right settings if you have javascript enabled: Testa prima nelle impostazioni in alto a destra se hai il javascript abilitato

Text: Testo

Il server che funge da gateway o proxy non ha ricevuto una risposta in tempo dal server upstream.

Il server che funge da gateway o proxy ha ricevuto una risposta non valida dal server upstream.

Il server ha riscontrato un errore e non è stato in grado di soddisfare la tua richiesta.

Il server non è riuscito a elaborare "%s". Possibile file non supportato o danneggiato.

Il server al momento non è in grado di gestire la richiesta a causa di un sovraccarico temporaneo o di manutenzione programmata.

Attualmente ci sono %s board pubbliche, %s in totale. A livello del sito, sono stati effettuati %s post nell'ultimo giorno, %s nell'ultima ora, %s in totale.

Attualmente ci sono %s siti e %s board nella webring conosciuta. In tutte le board della webring, sono stati effettuati %s post nell'ultima ora, %s in totale.

Thread messages must be %s-%s characters: I messaggi della discussione devono avere %s-%s caratteri

Thread reached reply limit: La discussione ha raggiunto il limite di risposte

Threads Limit must be %s-%s: Il limite delle discussioni deve essere %s-%s

Threads must include a message: Le discussioni devono includere un messaggio

Threads must include a subject: Le discussioni devono includere un oggetto

Thumb extension must be like .xxx: L'estensione della miniatura deve essere come .xxx

Thumbnail extension must be at least 1 character: L'estensione della miniatura deve essere di almeno 1 carattere

Title: Titolo

Title must be 50 characters or less: Il titolo deve essere lungo al massimo 50 caratteri

one: Bumplock attivato/disattivato per %s discussione

other: Bumplock attivato/disattivato per %s discussioni

one: Modalità ciclica attivata/disattivata per %s discussione

other: Modalità ciclica attivata/disattivata per %s discussioni

one: Blocco attivato/disattivato per %s discussione

other: Blocco attivato/disattivato per %s discussioni

Too many files. Max files per post is %s: Troppi file. Il massimo di file per post è %s

Too many files. Max files per post on this board is %s: Troppi file. Il massimo di file per post su questa board è %s

Total number of banners would exceed global limit of %s: Il numero totale di banner supererebbe il limite globale di %s

Total number of flags would exceed global limit of %s: Il numero totale di bandiere supererebbe il limite globale di %s

Two factor authentication enabled successfully: Autenticazione a due fattori attivata con successo

Two Factor Authentication Setup: Impostazione dell'autenticazione a due fattori

Unknown Types Pass Validation: I tipi sconosciuti superano la convalida

Uploaded files must be unique in this thread.: I file caricati devono essere unici in questa discussione.

Uploaded files must be unique on this board.: I file caricati devono essere unici in questa board.

URI does not match current board: L'URI non corrisponde alla board attuale

URI must be %s characters or less: L'URI deve contenere %s caratteri o meno

URI must contain a-z 0-9 only: L'URI deve contenere solo caratteri a-z 0-9

User file spoiling is disabled on this board: Il nascondimento del nome del file dell'utente è disattivato su questa board

User File Unlinking: Disabilita l'unlinking dei file dell'utente

User file unlinking is disabled on this board: L'unlinking dei file dell'utente è disattivato su questa board

User is already board owner: L'utente è già il proprietario della board

User post deletion is disabled on this board: L'eliminazione dei post dell'utente è disattivata su questa board

USER WAS BANNED FOR THIS POST: L'UTENTE È STATO BANNATO PER QUESTO POST

Username must be 1-50 characters: Il nome utente deve contenere da 1 a 50 caratteri

Username must be 50 characters or less: Il nome utente deve contenere al massimo 50 caratteri

Username must contain a-z 0-9 only: Il nome utente deve contenere solo caratteri a-z 0-9

Video thumbnail percentage must be a number from 1-100: La percentuale di anteprima video deve essere un numero compreso tra 1 e 100

Webring blacklist must not exceed 10000 characters: La lista nera del Webring non deve superare i 10000 caratteri

Webring following list must not exceed 10000 characters: La lista di seguenti del Webring non deve superare i 10000 caratteri

Webring logos list must not exceed 10000 characters: La lista di loghi del Webring non deve superare i 10000 caratteri

Stai modificando le impostazioni troppo velocemente, attendi un minuto e riprova

Stai modificando i post troppo velocemente, attendi un minuto e riprova

You can't apply template permissions to a ROOT user.: Non puoi applicare le autorizzazioni del modello a un utente ROOT.

You can't delete the board owner: Non puoi eliminare il proprietario della board

You can't edit the permissions of the board owner: Non puoi modificare le autorizzazioni del proprietario della board

You can't edit your own permissions: Non puoi modificare le tue autorizzazioni

Non puoi eliminare il tuo account mentre sei un membro dello staff su una qualsiasi board

Your country "%s" is not allowed to post on this board: Il tuo paese "%s" non è autorizzato a postare su questa board

Your post was blocked by a word filter: Il tuo post è stato bloccato dal filtro delle parole proibite

La tua richiesta è stata bloccata perché il tuo indirizzo IP è presente in una lista nera.

Inserisci almeno un host consentito nel campo "Host consentiti" quando l'opzione "Controllo referer" è selezionata.