Module:User:Benwing2/bg-verb/full

local export = {}

local iut = require("Module:User:Benwing2/inflection utilities")

--[=[

Authorship: Ben Wing

]=]

-- Person/number suffixes for non-gendered slot prefixes. local pers_num_suffixes = {"1sg", "2sg", "3sg", "1pl", "2pl", "3pl"}

-- Person/number/gender suffixes for gendered slot prefixes. local gendered_pers_num_suffixes = { "m_1sg", "f_1sg", "n_1sg", "m_2sg", "f_2sg", "n_2sg", "m_3sg", "f_3sg", "n_3sg", "1pl", "2pl", "3pl" }

-- Non-gendered slot prefixes. local pers_num_prefixes = { -- indicative "fut_pos", "fut_neg", "futip_pos", "futip_neg", "ren_fut_neg", "dub_fut_neg", "conc_fut_neg", }

-- Gendered slot prefixes. local gendered_pers_num_prefixes = { -- indicative "prespf", "pastpf", "futpf_pos", "futpf_neg", "futpfip_pos", "futpfip_neg", "ren_pres", "ren_aor", "ren_fut_pos", "ren_prespf", "ren_futpf_pos", "ren_futpf_neg", "dub_pres", "dub_aor", "dub_fut_pos", "dub_futpf_pos", "dub_futpf_neg", -- no dub_prespf "conc_pres", "conc_aor", "conc_fut_pos", "conc_prespf", "conc_futpf_pos", "conc_futpf_neg", "cond", }

export.verb_compound_slots = {}

for _, non_gendered_prefix in ipairs(pers_num_prefixes) do	for _, suffix in ipairs(pers_num_suffixes) do table.insert(export.verb_compound_slots, non_gendered_prefix .. "_" .. suffix) end end for _, gendered_prefix in ipairs(gendered_pers_num_prefixes) do	for _, suffix in ipairs(gendered_pers_num_suffixes) do table.insert(export.verb_compound_slots, gendered_prefix .. "_" .. suffix) end end

local function concat(prefix, suffix) if not prefix then return suffix elseif not suffix then return prefix else return prefix .. " " .. suffix end end

local function concn(a, b, c, d)	local vals = {} if a then table.insert(vals, a)	end if b then table.insert(vals, b)	end if c then table.insert(vals, c)	end if d then table.insert(vals, d)	end return table.concat(vals, " ") end

local function concat_tables(prefixes, suffixes, combine) combine = combine or concat if type(prefixes) == "string" and type(suffixes) == "string" then error("Either prefixes or suffixes should be a table") end local len if type(prefixes) == "table" and type(suffixes) == "table" then len = #prefixes if len ~= #suffixes then error("Length of prefixes is " .. len .. " but length of suffixes is " .. #suffixes ..				", they should be equal") end elseif type(prefixes) == "table" then len = #prefixes else len = #suffixes end local retval = {} for i=1,len do		local prefix = type(prefixes) == "table" and prefixes[i] or prefixes local suffix = type(suffixes) == "table" and suffixes[i] or suffixes if (type(prefix) == "table" and not prefix.form) or			(type(suffix) == "table" and not suffix.form) then table.insert(retval, concat_tables(prefix, suffix)) else table.insert(retval, combine(prefix, suffix)) end end return retval end

local function gender_cross_person(fn) local retval = {} for person=1,3 do		for gender=1,3 do			table.insert(retval, fn(gender, person, (person - 1) * 3 + gender)) end end for person=4,6 do		table.insert(retval, fn(4, person, person + 6)) end return retval end

local sam_pres = {"съм", "си", "е", "сме", "сте", "са"} local sam_pres_no3 = {"съм", "си", false, "сме", "сте", false} local sam_impf = {"бях", {"бе", "бе́ше"}, {"бе", "бе́ше"}, "бя́хме", "бя́хте", "бя́ха"} local sam_paip = {"бил", "била́", "било́", "били́"} local shta_impf = {"щях", "ще́ше", "ще́ше", "щя́хме", "щя́хте", "щя́ха"} local shta_paip = {"щял", "щя́ла", "щя́ло", "ще́ли"} -- local bada_pres = {"бъ́да", "бъ́деш", "бъ́де", "бъ́дем", "бъ́дете", "бъ́дат"} local bada_aor1 = {"бих", "би", "би", "би́хме", "би́хте", "би́ха"}

function export.conjugate_all_compound(base) local forms = base.forms

local function addpref(dest_slot, pref, source_slot) if type(pref) ~= "table" then pref = {pref} end for _, p in ipairs(pref) do			iut.insert_forms(forms, dest_slot,				iut.map_forms(forms[source_slot], function(form) return concat(p, "" .. form .. "") end)			) end end

local function addsuf(dest_slot, suf, source_slot) if type(suf) ~= "table" then suf = {suf} end for _, s in ipairs(suf) do			iut.insert_forms(forms, dest_slot,				iut.map_forms(forms[source_slot], function(form) return concat("" .. form .. "", s) end)			) end end

-- Add non-gendered PREFIXTEXT to the forms in the non-gendered source slot row identified by	-- SOURCE_SLOT_PREFIX and store the results in the (non-gendered) destination slot row identified -- by DEST_SLOT_PREFIX. A "non-gendered slot row" is a row of slots that differ in person and -- number, with no gender differences. For example, the present indicative (slot prefix "pres") -- is a non-gendered slot row. "Non-gendered PREFIXTEXT" can be either a string (the same for all	-- slots) or a 6-element table corresponding to 1sg, 2sg, 3sg, 1pl, 2pl, 3pl respectively, where -- each element of the table is either a string or a table of alternants, each of which is a	-- string. A case where PREFIXTEXT should be a string is the negative future-in-the-past -- indicative, which prefixes "ня́маше да" to the present indicative. A case where PREFIXTEXT -- should be a table is the positive future-in-the-past indicative, which prefixes the imperfect -- of ща + "да" to the present indicative. local function ngen_prefix_to_ngen(dest_slot_prefix, prefixtext, source_slot_prefix) local x1sg, x2sg, x3sg, x1pl, x2pl, x3pl if type(prefixtext) == "string" then x1sg, x2sg, x3sg, x1pl, x2pl, x3pl = prefixtext, prefixtext, prefixtext, prefixtext, prefixtext, prefixtext else x1sg, x2sg, x3sg, x1pl, x2pl, x3pl = unpack(prefixtext) end addpref(dest_slot_prefix .. "_1sg", x1sg, source_slot_prefix .. "_1sg") addpref(dest_slot_prefix .. "_2sg", x2sg, source_slot_prefix .. "_2sg") addpref(dest_slot_prefix .. "_3sg", x3sg, source_slot_prefix .. "_3sg") addpref(dest_slot_prefix .. "_1pl", x1pl, source_slot_prefix .. "_1pl") addpref(dest_slot_prefix .. "_2pl", x2pl, source_slot_prefix .. "_2pl") addpref(dest_slot_prefix .. "_3pl", x3pl, source_slot_prefix .. "_3pl") end

-- Add non-gendered PREFIXTEXT to the forms in the gendered source slot row identified by	-- SOURCE_SLOT_PREFIX and store the results in the (gendered) destination slot row identified -- by DEST_SLOT_PREFIX. See ngen_prefix_to_ngen for definition of "slot row" and -- "non-gendered PREFIXTEXT". Here, the gendered source slot row is assumed to differ only -- in gender and number, not in person (i.e. it's a participle), while the gendered destination -- slot row differs in person, gender and number. local function ngen_prefix_to_gen(dest_slot_prefix, prefixtext, source_slot_prefix) local x1sg, x2sg, x3sg, x1pl, x2pl, x3pl = unpack(prefixtext) addpref(dest_slot_prefix .. "_m_1sg", x1sg, source_slot_prefix .. "_m_sg") addpref(dest_slot_prefix .. "_f_1sg", x1sg, source_slot_prefix .. "_f_sg") addpref(dest_slot_prefix .. "_n_1sg", x1sg, source_slot_prefix .. "_n_sg") addpref(dest_slot_prefix .. "_m_2sg", x2sg, source_slot_prefix .. "_m_sg") addpref(dest_slot_prefix .. "_f_2sg", x2sg, source_slot_prefix .. "_f_sg") addpref(dest_slot_prefix .. "_n_2sg", x2sg, source_slot_prefix .. "_n_sg") addpref(dest_slot_prefix .. "_m_3sg", x3sg, source_slot_prefix .. "_m_sg") addpref(dest_slot_prefix .. "_f_3sg", x3sg, source_slot_prefix .. "_f_sg") addpref(dest_slot_prefix .. "_n_3sg", x3sg, source_slot_prefix .. "_n_sg") addpref(dest_slot_prefix .. "_1pl", x1pl, source_slot_prefix .. "_pl") addpref(dest_slot_prefix .. "_2pl", x2pl, source_slot_prefix .. "_pl") addpref(dest_slot_prefix .. "_3pl", x3pl, source_slot_prefix .. "_pl") end

-- Identical to ngen_prefix_to_gen but adds suffix text (possibly differing by person/number) -- to a gendered source slot row instead of adding prefix text. local function ngen_suffix_to_gen(dest_slot_prefix, source_slot_prefix, suffixtext) local x1sg, x2sg, x3sg, x1pl, x2pl, x3pl = unpack(suffixtext) addsuf(dest_slot_prefix .. "_m_1sg", x1sg, source_slot_prefix .. "_m_sg") addsuf(dest_slot_prefix .. "_f_1sg", x1sg, source_slot_prefix .. "_f_sg") addsuf(dest_slot_prefix .. "_n_1sg", x1sg, source_slot_prefix .. "_n_sg") addsuf(dest_slot_prefix .. "_m_2sg", x2sg, source_slot_prefix .. "_m_sg") addsuf(dest_slot_prefix .. "_f_2sg", x2sg, source_slot_prefix .. "_f_sg") addsuf(dest_slot_prefix .. "_n_2sg", x2sg, source_slot_prefix .. "_n_sg") addsuf(dest_slot_prefix .. "_m_3sg", x3sg, source_slot_prefix .. "_m_sg") addsuf(dest_slot_prefix .. "_f_3sg", x3sg, source_slot_prefix .. "_f_sg") addsuf(dest_slot_prefix .. "_n_3sg", x3sg, source_slot_prefix .. "_n_sg") addsuf(dest_slot_prefix .. "_1pl", x1pl, source_slot_prefix .. "_pl") addsuf(dest_slot_prefix .. "_2pl", x2pl, source_slot_prefix .. "_pl") addsuf(dest_slot_prefix .. "_3pl", x3pl, source_slot_prefix .. "_pl") end

-- Add gendered PREFIXTEXT to the forms in the non-gendered source slot row identified by	-- SOURCE_SLOT_PREFIX and store the results in the (gendered) destination slot row identified -- by DEST_SLOT_PREFIX. See ngen_prefix_to_ngen for definition of "slot row". Here, -- "gendered PREFIXTEXT" is a 12-element table corresponding to m_1sg, f_1sg, n_1sg, -- m_2sg, f_2sg, n_2sg, m_3sg, f_3sg, n_3sg, 1pl, 2pl, 3pl respectively, where each element -- of the table is either a string or a table of alternants, each of which is a string. local function gen_prefix_to_ngen(dest_slot_prefix, prefixtext, source_slot_prefix) local m_1sg, f_1sg, n_1sg, m_2sg, f_2sg, n_2sg, m_3sg, f_3sg, n_3sg, x1pl, x2pl, x3pl = unpack(prefixtext) addpref(dest_slot_prefix .. "_m_1sg", m_1sg, source_slot_prefix .. "_1sg") addpref(dest_slot_prefix .. "_f_1sg", f_1sg, source_slot_prefix .. "_1sg") addpref(dest_slot_prefix .. "_n_1sg", n_1sg, source_slot_prefix .. "_1sg") addpref(dest_slot_prefix .. "_m_2sg", m_2sg, source_slot_prefix .. "_2sg") addpref(dest_slot_prefix .. "_f_2sg", f_2sg, source_slot_prefix .. "_2sg") addpref(dest_slot_prefix .. "_n_2sg", n_2sg, source_slot_prefix .. "_2sg") addpref(dest_slot_prefix .. "_m_3sg", m_3sg, source_slot_prefix .. "_3sg") addpref(dest_slot_prefix .. "_f_3sg", f_3sg, source_slot_prefix .. "_3sg") addpref(dest_slot_prefix .. "_n_3sg", n_3sg, source_slot_prefix .. "_3sg") addpref(dest_slot_prefix .. "_1pl", x1pl, source_slot_prefix .. "_1pl") addpref(dest_slot_prefix .. "_2pl", x2pl, source_slot_prefix .. "_2pl") addpref(dest_slot_prefix .. "_3pl", x3pl, source_slot_prefix .. "_3pl") end

-- Add gendered PREFIXTEXT to the forms in the gendered source slot row identified by	-- SOURCE_SLOT_PREFIX and store the results in the (gendered) destination slot row identified -- by DEST_SLOT_PREFIX. See ngen_prefix_to_ngen for definition of "slot row", -- gen_prefix_to_ngen for the definition of "gendered PREFIXTEXT" and ngen_prefix_to_gen -- for the definition of "gendered source slot row". local function gen_prefix_to_gen(dest_slot_prefix, prefixtext, source_slot_prefix) local m_1sg, f_1sg, n_1sg, m_2sg, f_2sg, n_2sg, m_3sg, f_3sg, n_3sg, x1pl, x2pl, x3pl = unpack(prefixtext) addpref(dest_slot_prefix .. "_m_1sg", m_1sg, source_slot_prefix .. "_m_sg") addpref(dest_slot_prefix .. "_f_1sg", f_1sg, source_slot_prefix .. "_f_sg") addpref(dest_slot_prefix .. "_n_1sg", n_1sg, source_slot_prefix .. "_n_sg") addpref(dest_slot_prefix .. "_m_2sg", m_2sg, source_slot_prefix .. "_m_sg") addpref(dest_slot_prefix .. "_f_2sg", f_2sg, source_slot_prefix .. "_f_sg") addpref(dest_slot_prefix .. "_n_2sg", n_2sg, source_slot_prefix .. "_n_sg") addpref(dest_slot_prefix .. "_m_3sg", m_3sg, source_slot_prefix .. "_m_sg") addpref(dest_slot_prefix .. "_f_3sg", f_3sg, source_slot_prefix .. "_f_sg") addpref(dest_slot_prefix .. "_n_3sg", n_3sg, source_slot_prefix .. "_n_sg") addpref(dest_slot_prefix .. "_1pl", x1pl, source_slot_prefix .. "_pl") addpref(dest_slot_prefix .. "_2pl", x2pl, source_slot_prefix .. "_pl") addpref(dest_slot_prefix .. "_3pl", x3pl, source_slot_prefix .. "_pl") end

-- indicative local futip_prefixtext = concat_tables(shta_impf, "да") ngen_prefix_to_ngen("fut_pos", "ще", "pres") ngen_prefix_to_ngen("fut_neg", "ня́ма да", "pres") ngen_prefix_to_ngen("futip_pos", futip_prefixtext, "pres") ngen_prefix_to_ngen("futip_neg", "ня́маше да", "pres") ngen_suffix_to_gen("prespf", "paap_ind", sam_pres) ngen_prefix_to_gen("pastpf", sam_impf, "paap_ind") ngen_prefix_to_gen("futpf_pos", concat_tables("ще", sam_pres), "paap_ind") ngen_prefix_to_gen("futpf_neg", concat_tables("няма да", sam_pres), "paap_ind") ngen_prefix_to_gen("futpfip_pos", concat_tables(futip_prefixtext, sam_pres), "paap_ind") ngen_prefix_to_gen("futpfip_neg", concat_tables("ня́маше да", sam_pres), "paap_ind")

-- renarrative ngen_suffix_to_gen("ren_pres", "paip", sam_pres_no3) ngen_suffix_to_gen("ren_aor", "paap_ind", sam_pres_no3) local ren_fut_pos = gender_cross_person(		function(gender, person) return concn(shta_paip[gender], sam_pres_no3[person], "да") end	) gen_prefix_to_ngen("ren_fut_pos", ren_fut_pos, "pres") ngen_prefix_to_ngen("ren_fut_neg", "ня́мало да", "pres") local ren_prespf = gender_cross_person(		function(gender, person) return concat(sam_paip[gender], sam_pres_no3[person]) end	) gen_prefix_to_gen("ren_prespf", ren_prespf, "paap_ind") local ren_futpf_pos = gender_cross_person(		function(gender, person, index) return concat(ren_fut_pos[index], sam_pres[person]) end	) gen_prefix_to_gen("ren_futpf_pos", ren_futpf_pos, "paap_ind") ngen_prefix_to_gen("ren_futpf_neg", concat_tables("ня́мало да", sam_pres), "paap_ind")

-- dubitative gen_prefix_to_gen("dub_pres", ren_prespf, "paip") gen_prefix_to_gen("dub_aor", ren_prespf, "paap_ind") local dub_fut_pos = gender_cross_person(		function(gender, person) return concn(shta_paip[gender], sam_pres_no3[person], sam_paip[gender], "да") end	) gen_prefix_to_ngen("dub_fut_pos", dub_fut_pos, "pres") ngen_prefix_to_ngen("dub_fut_neg", "ня́мало било́ да", "pres") -- no dubitative present and past perfect local dub_futpf_pos = gender_cross_person(		function(gender, person, index) return concat(dub_fut_pos[index], sam_pres[person]) end	) gen_prefix_to_gen("dub_futpf_pos", dub_futpf_pos, "paap_ind") ngen_prefix_to_gen("dub_futpf_neg", concat_tables("ня́мало било́ да", sam_pres), "paap_ind")

-- conclusive ngen_suffix_to_gen("conc_pres", "paip", sam_pres) ngen_suffix_to_gen("conc_aor", "paap_ind", sam_pres) local conc_fut_pos = gender_cross_person(		function(gender, person) return concn(shta_paip[gender], sam_pres[person], "да") end	) gen_prefix_to_ngen("conc_fut_pos", conc_fut_pos, "pres") ngen_prefix_to_ngen("conc_fut_neg", "ня́мало е да", "pres") local conc_prespf = gender_cross_person(		function(gender, person) return concat(sam_paip[gender], sam_pres[person]) end	) gen_prefix_to_gen("conc_prespf", conc_prespf, "paap_ind") local conc_futpf_pos = gender_cross_person(		function(gender, person, index) return concat(conc_fut_pos[index], sam_pres[person]) end	) gen_prefix_to_gen("conc_futpf_pos", conc_futpf_pos, "paap_ind") ngen_prefix_to_gen("conc_futpf_neg", concat_tables("ня́мало е да", sam_pres), "paap_ind")

-- conditional ngen_prefix_to_gen("cond", bada_aor1, "paap_ind") end

export.table_spec_compound_full = [=[ ! rowspan="2" style="background:#c0cfe4" | future ! colspan="2" style="background:#c0cfe4" | pos. ! colspan="2" style="background:#c0cfe4" | neg. ! rowspan= "2" style="background:#c0cfe4" | future in the past ! colspan="2" style="background:#c0cfe4" | pos. ! colspan="2" style="background:#c0cfe4" | neg. ! rowspan="3" style="background:#c0cfe4" | present perfect ! colspan="2" style="background:#c0cfe4" | masc. ! colspan="2" style="background:#c0cfe4" | fem. ! colspan="2" style="background:#c0cfe4" | neut. ! rowspan="3" style="background:#c0cfe4" | past perfect ! colspan="2" style="background:#c0cfe4" | masc. ! colspan="2" style="background:#c0cfe4" | fem. ! colspan="2" style="background:#c0cfe4" | neut. ! rowspan="6" style="background:#c0cfe4" | future perfect ! rowspan="3" style="background:#c0cfe4" | pos. ! style="background:#c0cfe4" | masc. ! style="background:#c0cfe4" | fem. ! style="background:#c0cfe4" | neut. ! rowspan="3" style="background:#c0cfe4" | neg. ! style="background:#c0cfe4" | masc. ! style="background:#c0cfe4" | fem. ! style="background:#c0cfe4" | neut. ! rowspan="6" style="background:#c0cfe4" | future perfect in the past ! rowspan="3" style="background:#c0cfe4" | pos. ! style="background:#c0cfe4" | masc. ! style="background:#c0cfe4" | fem. ! style="background:#c0cfe4" | neut. ! rowspan="3" style="background:#c0cfe4" | neg. ! style="background:#c0cfe4" | masc. ! style="background:#c0cfe4" | fem. ! style="background:#c0cfe4" | neut. ! style="background:#c0e4c0" colspan="3" | renarrative ! style="background:#c0e4c0" | аз ! style="background:#c0e4c0" | ти ! style="background:#c0e4c0" | той/тя/то ! style="background:#c0e4c0" | ние ! style="background:#c0e4c0" | вие ! style="background:#c0e4c0" | те ! rowspan="3" style="background:#c0e4c0" | present and imperfect ! colspan="2" style="background:#c0e4c0" | masc. ! colspan="2" style="background:#c0e4c0" | fem. ! colspan="2" style="background:#c0e4c0" | neut. ! rowspan="3" style="background:#c0e4c0" | aorist ! colspan="2" style="background:#c0e4c0" | masc. ! colspan="2" style="background:#c0e4c0" | fem. ! colspan="2" style="background:#c0e4c0" | neut. ! rowspan="4" style="background:#c0e4c0" | future and future in the past ! rowspan="3" style="background:#c0e4c0" | pos. ! style="background:#c0e4c0" | masc. ! style="background:#c0e4c0" | fem. ! style="background:#c0e4c0" | neut. ! colspan="2" style="background:#c0e4c0" | neg. ! rowspan="3" style="background:#c0e4c0" | present and past perfect ! colspan="2" style="background:#c0e4c0" | masc. ! colspan="2" style="background:#c0e4c0" | fem. ! colspan="2" style="background:#c0e4c0" | neut. ! rowspan="6" style="background:#c0e4c0" | future perfect and future perfect in the past ! rowspan="3" style="background:#c0e4c0" | pos. ! style="background:#c0e4c0" | masc. ! style="background:#c0e4c0" | fem. ! style="background:#c0e4c0" | neut. ! rowspan="3" style="background:#c0e4c0" | neg. ! style="background:#c0e4c0" | masc. ! style="background:#c0e4c0" | fem. ! style="background:#c0e4c0" | neut. ! style="background:#f0e68c" colspan="3" | dubitative ! style="background:#f0e68c" | аз ! style="background:#f0e68c" | ти ! style="background:#f0e68c" | той/тя/то ! style="background:#f0e68c" | ние ! style="background:#f0e68c" | вие ! style="background:#f0e68c" | те ! rowspan="3" style="background:#f0e68c" | present and imperfect ! colspan="2" style="background:#f0e68c" | masc. ! colspan="2" style="background:#f0e68c" | fem. ! colspan="2" style="background:#f0e68c" | neut. ! rowspan="3" style="background:#f0e68c" | aorist ! colspan="2" style="background:#f0e68c" | masc. ! colspan="2" style="background:#f0e68c" | fem. ! colspan="2" style="background:#f0e68c" | neut. ! rowspan="4" style="background:#f0e68c" | future and future in the past ! rowspan="3" style="background:#f0e68c" | pos. ! style="background:#f0e68c" | masc. ! style="background:#f0e68c" | fem. ! style="background:#f0e68c" | neut. ! colspan="2" style="background:#f0e68c" | neg. ! colspan="3" style="background:#f0e68c" | present and past perfect ! rowspan="6" style="background:#f0e68c" | future perfect and future perfect in the past ! rowspan="3" style="background:#f0e68c" | pos. ! style="background:#f0e68c" | masc. ! style="background:#f0e68c" | fem. ! style="background:#f0e68c" | neut. ! rowspan="3" style="background:#f0e68c" | neg. ! style="background:#f0e68c" | masc. ! style="background:#f0e68c" | fem. ! style="background:#f0e68c" | neut. ! style="background:#9be1ff" colspan="3" | conclusive ! style="background:#9be1ff" | аз ! style="background:#9be1ff" | ти ! style="background:#9be1ff" | той/тя/то ! style="background:#9be1ff" | ние ! style="background:#9be1ff" | вие ! style="background:#9be1ff" | те ! rowspan="3" style="background:#9be1ff" | present and imperfect ! colspan="2" style="background:#9be1ff" | masc. ! colspan="2" style="background:#9be1ff" | fem. ! colspan="2" style="background:#9be1ff" | neut. ! rowspan="3" style="background:#9be1ff" | aorist ! colspan="2" style="background:#9be1ff" | masc. ! colspan="2" style="background:#9be1ff" | fem. ! colspan="2" style="background:#9be1ff" | neut. ! rowspan="4" style="background:#9be1ff" | future and future in the past ! rowspan="3" style="background:#9be1ff" | pos. ! style="background:#9be1ff" | masc. ! style="background:#9be1ff" | fem. ! style="background:#9be1ff" | neut. ! colspan="2" style="background:#9be1ff" | neg. ! rowspan="3" style="background:#9be1ff" | present and past perfect ! colspan="2" style="background:#9be1ff" | masc. ! colspan="2" style="background:#9be1ff" | fem. ! colspan="2" style="background:#9be1ff" | neut. ! rowspan="6" style="background:#9be1ff" | future perfect and future perfect in the past ! rowspan="3" style="background:#9be1ff" | pos. ! style="background:#9be1ff" | masc. ! style="background:#9be1ff" | fem. ! style="background:#9be1ff" | neut. ! rowspan="3" style="background:#9be1ff" | neg. ! style="background:#9be1ff" | masc. ! style="background:#9be1ff" | fem. ! style="background:#9be1ff" | neut. ! colspan="3" style="background:#f2b6c3" | conditional ! style="background:#f2b6c3" | аз ! style="background:#f2b6c3" | ти ! style="background:#f2b6c3" | той/тя/то ! style="background:#f2b6c3" | ние ! style="background:#f2b6c3" | вие ! style="background:#f2b6c3" | те ! colspan="3" style="background:#f2b6c3" | masculine ! colspan="3" style="background:#f2b6c3" | feminine ! colspan="3" style="background:#f2b6c3" | neuter ]=]
 * {fut_pos_1sg}
 * {fut_pos_2sg}
 * {fut_pos_3sg}
 * {fut_pos_1pl}
 * {fut_pos_2pl}
 * {fut_pos_3pl}
 * {fut_neg_1sg}
 * {fut_neg_2sg}
 * {fut_neg_3sg}
 * {fut_neg_1pl}
 * {fut_neg_2pl}
 * {fut_neg_3pl}
 * {futip_pos_1sg}
 * {futip_pos_2sg}
 * {futip_pos_3sg}
 * {futip_pos_1pl}
 * {futip_pos_2pl}
 * {futip_pos_3pl}
 * {futip_neg_1sg}
 * {futip_neg_2sg}
 * {futip_neg_3sg}
 * {futip_neg_1pl}
 * {futip_neg_2pl}
 * {futip_neg_3pl}
 * {prespf_m_1sg}
 * {prespf_m_2sg}
 * {prespf_m_3sg}
 * rowspan="3"| {prespf_1pl}
 * rowspan="3"| {prespf_2pl}
 * rowspan="3"| {prespf_3pl}
 * {prespf_f_1sg}
 * {prespf_f_2sg}
 * {prespf_f_3sg}
 * {prespf_n_1sg}
 * {prespf_n_2sg}
 * {prespf_n_3sg}
 * {pastpf_m_1sg}
 * {pastpf_m_2sg}
 * {pastpf_m_3sg}
 * rowspan="3"| {pastpf_1pl}
 * rowspan="3"| {pastpf_2pl}
 * rowspan="3"| {pastpf_3pl}
 * {pastpf_f_1sg}
 * {pastpf_f_2sg}
 * {pastpf_f_3sg}
 * {pastpf_n_1sg}
 * {pastpf_n_2sg}
 * {pastpf_n_3sg}
 * {futpf_pos_m_1sg}
 * {futpf_pos_m_2sg}
 * {futpf_pos_m_3sg}
 * rowspan="3"| {futpf_pos_1pl}
 * rowspan="3"| {futpf_pos_2pl}
 * rowspan="3"| {futpf_pos_3pl}
 * {futpf_pos_f_1sg}
 * {futpf_pos_f_2sg}
 * {futpf_pos_f_3sg}
 * {futpf_pos_n_1sg}
 * {futpf_pos_n_2sg}
 * {futpf_pos_n_3sg}
 * {futpf_neg_m_1sg}
 * {futpf_neg_m_2sg}
 * {futpf_neg_m_3sg}
 * rowspan="3"| {futpf_neg_1pl}
 * rowspan="3"| {futpf_neg_2pl}
 * rowspan="3"| {futpf_neg_3pl}
 * {futpf_neg_f_1sg}
 * {futpf_neg_f_2sg}
 * {futpf_neg_f_3sg}
 * {futpf_neg_n_1sg}
 * {futpf_neg_n_2sg}
 * {futpf_neg_n_3sg}
 * {futpfip_pos_m_1sg}
 * {futpfip_pos_m_2sg}
 * {futpfip_pos_m_3sg}
 * rowspan="3"| {futpfip_pos_1pl}
 * rowspan="3"| {futpfip_pos_2pl}
 * rowspan="3"| {futpfip_pos_3pl}
 * {futpfip_pos_f_1sg}
 * {futpfip_pos_f_2sg}
 * {futpfip_pos_f_3sg}
 * {futpfip_pos_n_1sg}
 * {futpfip_pos_n_2sg}
 * {futpfip_pos_n_3sg}
 * {futpfip_neg_m_1sg}
 * {futpfip_neg_m_2sg}
 * {futpfip_neg_m_3sg}
 * rowspan="3"| {futpfip_neg_1pl}
 * rowspan="3"| {futpfip_neg_2pl}
 * rowspan="3"| {futpfip_neg_3pl}
 * {futpfip_neg_f_1sg}
 * {futpfip_neg_f_2sg}
 * {futpfip_neg_f_3sg}
 * {futpfip_neg_n_1sg}
 * {futpfip_neg_n_2sg}
 * {futpfip_neg_n_3sg}
 * {ren_pres_m_1sg}
 * {ren_pres_m_2sg}
 * {ren_pres_m_3sg}
 * rowspan="3"| {ren_pres_1pl}
 * rowspan="3"| {ren_pres_2pl}
 * rowspan="3"| {ren_pres_3pl}
 * {ren_pres_f_1sg}
 * {ren_pres_f_2sg}
 * {ren_pres_f_3sg}
 * {ren_pres_n_1sg}
 * {ren_pres_n_2sg}
 * {ren_pres_n_3sg}
 * {ren_aor_m_1sg}
 * {ren_aor_m_2sg}
 * {ren_aor_m_3sg}
 * rowspan="3"| {ren_aor_1pl}
 * rowspan="3"| {ren_aor_2pl}
 * rowspan="3"| {ren_aor_3pl}
 * {ren_aor_f_1sg}
 * {ren_aor_f_2sg}
 * {ren_aor_f_3sg}
 * {ren_aor_n_1sg}
 * {ren_aor_n_2sg}
 * {ren_aor_n_3sg}
 * {ren_fut_pos_m_1sg}
 * {ren_fut_pos_m_2sg}
 * {ren_fut_pos_m_3sg}
 * rowspan="3"| {ren_fut_pos_1pl}
 * rowspan="3"| {ren_fut_pos_2pl}
 * rowspan="3"| {ren_fut_pos_3pl}
 * {ren_fut_pos_f_1sg}
 * {ren_fut_pos_f_2sg}
 * {ren_fut_pos_f_3sg}
 * {ren_fut_pos_n_1sg}
 * {ren_fut_pos_n_2sg}
 * {ren_fut_pos_n_3sg}
 * {ren_fut_neg_1sg}
 * {ren_fut_neg_2sg}
 * {ren_fut_neg_3sg}
 * {ren_fut_neg_1pl}
 * {ren_fut_neg_2pl}
 * {ren_fut_neg_3pl}
 * {ren_prespf_m_1sg}
 * {ren_prespf_m_2sg}
 * {ren_prespf_m_3sg}
 * rowspan="3"| {ren_prespf_1pl}
 * rowspan="3"| {ren_prespf_2pl}
 * rowspan="3"| {ren_prespf_3pl}
 * {ren_prespf_f_1sg}
 * {ren_prespf_f_2sg}
 * {ren_prespf_f_3sg}
 * {ren_prespf_n_1sg}
 * {ren_prespf_n_2sg}
 * {ren_prespf_n_3sg}
 * {ren_futpf_pos_m_1sg}
 * {ren_futpf_pos_m_2sg}
 * {ren_futpf_pos_m_3sg}
 * rowspan="3"| {ren_futpf_pos_1pl}
 * rowspan="3"| {ren_futpf_pos_2pl}
 * rowspan="3"| {ren_futpf_pos_3pl}
 * {ren_futpf_pos_f_1sg}
 * {ren_futpf_pos_f_2sg}
 * {ren_futpf_pos_f_3sg}
 * {ren_futpf_pos_n_1sg}
 * {ren_futpf_pos_n_2sg}
 * {ren_futpf_pos_n_3sg}
 * {ren_futpf_neg_m_1sg}
 * {ren_futpf_neg_m_2sg}
 * {ren_futpf_neg_m_3sg}
 * rowspan="3"| {ren_futpf_neg_1pl}
 * rowspan="3"| {ren_futpf_neg_2pl}
 * rowspan="3"| {ren_futpf_neg_3pl}
 * {ren_futpf_neg_f_1sg}
 * {ren_futpf_neg_f_2sg}
 * {ren_futpf_neg_f_3sg}
 * {ren_futpf_neg_n_1sg}
 * {ren_futpf_neg_n_2sg}
 * {ren_futpf_neg_n_3sg}
 * {dub_pres_m_1sg}
 * {dub_pres_m_2sg}
 * {dub_pres_m_3sg}
 * rowspan="3"| {dub_pres_1pl}
 * rowspan="3"| {dub_pres_2pl}
 * rowspan="3"| {dub_pres_3pl}
 * {dub_pres_f_1sg}
 * {dub_pres_f_2sg}
 * {dub_pres_f_3sg}
 * {dub_pres_n_1sg}
 * {dub_pres_n_2sg}
 * {dub_pres_n_3sg}
 * {dub_aor_m_1sg}
 * {dub_aor_m_2sg}
 * {dub_aor_m_3sg}
 * rowspan="3"| {dub_aor_1pl}
 * rowspan="3"| {dub_aor_2pl}
 * rowspan="3"| {dub_aor_3pl}
 * {dub_aor_f_1sg}
 * {dub_aor_f_2sg}
 * {dub_aor_f_3sg}
 * {dub_aor_n_1sg}
 * {dub_aor_n_2sg}
 * {dub_aor_n_3sg}
 * {dub_fut_pos_m_1sg}
 * {dub_fut_pos_m_2sg}
 * {dub_fut_pos_m_3sg}
 * rowspan="3"| {dub_fut_pos_1pl}
 * rowspan="3"| {dub_fut_pos_2pl}
 * rowspan="3"| {dub_fut_pos_3pl}
 * {dub_fut_pos_f_1sg}
 * {dub_fut_pos_f_2sg}
 * {dub_fut_pos_f_3sg}
 * {dub_fut_pos_n_1sg}
 * {dub_fut_pos_n_2sg}
 * {dub_fut_pos_n_3sg}
 * {dub_fut_neg_1sg}
 * {dub_fut_neg_2sg}
 * {dub_fut_neg_3sg}
 * {dub_fut_neg_1pl}
 * {dub_fut_neg_2pl}
 * {dub_fut_neg_3pl}
 * colspan="6" | none
 * {dub_futpf_pos_m_1sg}
 * {dub_futpf_pos_m_2sg}
 * {dub_futpf_pos_m_3sg}
 * rowspan="3"| {dub_futpf_pos_1pl}
 * rowspan="3"| {dub_futpf_pos_2pl}
 * rowspan="3"| {dub_futpf_pos_3pl}
 * {dub_futpf_pos_f_1sg}
 * {dub_futpf_pos_f_2sg}
 * {dub_futpf_pos_f_3sg}
 * {dub_futpf_pos_n_1sg}
 * {dub_futpf_pos_n_2sg}
 * {dub_futpf_pos_n_3sg}
 * {dub_futpf_neg_m_1sg}
 * {dub_futpf_neg_m_2sg}
 * {dub_futpf_neg_m_3sg}
 * rowspan="3"| {dub_futpf_neg_1pl}
 * rowspan="3"| {dub_futpf_neg_2pl}
 * rowspan="3"| {dub_futpf_neg_3pl}
 * {dub_futpf_neg_f_1sg}
 * {dub_futpf_neg_f_2sg}
 * {dub_futpf_neg_f_3sg}
 * {dub_futpf_neg_n_1sg}
 * {dub_futpf_neg_n_2sg}
 * {dub_futpf_neg_n_3sg}
 * {conc_pres_m_1sg}
 * {conc_pres_m_2sg}
 * {conc_pres_m_3sg}
 * rowspan="3"| {conc_pres_1pl}
 * rowspan="3"| {conc_pres_2pl}
 * rowspan="3"| {conc_pres_3pl}
 * {conc_pres_f_1sg}
 * {conc_pres_f_2sg}
 * {conc_pres_f_3sg}
 * {conc_pres_n_1sg}
 * {conc_pres_n_2sg}
 * {conc_pres_n_3sg}
 * {conc_aor_m_1sg}
 * {conc_aor_m_2sg}
 * {conc_aor_m_3sg}
 * rowspan="3"| {conc_aor_1pl}
 * rowspan="3"| {conc_aor_2pl}
 * rowspan="3"| {conc_aor_3pl}
 * {conc_aor_f_1sg}
 * {conc_aor_f_2sg}
 * {conc_aor_f_3sg}
 * {conc_aor_n_1sg}
 * {conc_aor_n_2sg}
 * {conc_aor_n_3sg}
 * {conc_fut_pos_m_1sg}
 * {conc_fut_pos_m_2sg}
 * {conc_fut_pos_m_3sg}
 * rowspan="3"| {conc_fut_pos_1pl}
 * rowspan="3"| {conc_fut_pos_2pl}
 * rowspan="3"| {conc_fut_pos_3pl}
 * {conc_fut_pos_f_1sg}
 * {conc_fut_pos_f_2sg}
 * {conc_fut_pos_f_3sg}
 * {conc_fut_pos_n_1sg}
 * {conc_fut_pos_n_2sg}
 * {conc_fut_pos_n_3sg}
 * {conc_fut_neg_1sg}
 * {conc_fut_neg_2sg}
 * {conc_fut_neg_3sg}
 * {conc_fut_neg_1pl}
 * {conc_fut_neg_2pl}
 * {conc_fut_neg_3pl}
 * {conc_prespf_m_1sg}
 * {conc_prespf_m_2sg}
 * {conc_prespf_m_3sg}
 * rowspan="3"| {conc_prespf_1pl}
 * rowspan="3"| {conc_prespf_2pl}
 * rowspan="3"| {conc_prespf_3pl}
 * {conc_prespf_f_1sg}
 * {conc_prespf_f_2sg}
 * {conc_prespf_f_3sg}
 * {conc_prespf_n_1sg}
 * {conc_prespf_n_2sg}
 * {conc_prespf_n_3sg}
 * {conc_futpf_pos_m_1sg}
 * {conc_futpf_pos_m_2sg}
 * {conc_futpf_pos_m_3sg}
 * rowspan="3"| {conc_futpf_pos_1pl}
 * rowspan="3"| {conc_futpf_pos_2pl}
 * rowspan="3"| {conc_futpf_pos_3pl}
 * {conc_futpf_pos_f_1sg}
 * {conc_futpf_pos_f_2sg}
 * {conc_futpf_pos_f_3sg}
 * {conc_futpf_pos_n_1sg}
 * {conc_futpf_pos_n_2sg}
 * {conc_futpf_pos_n_3sg}
 * {conc_futpf_neg_m_1sg}
 * {conc_futpf_neg_m_2sg}
 * {conc_futpf_neg_m_3sg}
 * rowspan="3"| {conc_futpf_neg_1pl}
 * rowspan="3"| {conc_futpf_neg_2pl}
 * rowspan="3"| {conc_futpf_neg_3pl}
 * {conc_futpf_neg_f_1sg}
 * {conc_futpf_neg_f_2sg}
 * {conc_futpf_neg_f_3sg}
 * {conc_futpf_neg_n_1sg}
 * {conc_futpf_neg_n_2sg}
 * {conc_futpf_neg_n_3sg}
 * {cond_m_1sg}
 * {cond_m_2sg}
 * {cond_m_3sg}
 * rowspan="3"| {cond_1pl}
 * rowspan="3"| {cond_2pl}
 * rowspan="3"| {cond_3pl}
 * {cond_f_1sg}
 * {cond_f_2sg}
 * {cond_f_3sg}
 * {cond_n_1sg}
 * {cond_n_2sg}
 * {cond_n_3sg}

return export