рдмреНрд▓реВрдо рдлрд╝рд┐рд▓реНрдЯрд░

рдлрд┐рд░ рд╕реЗ рдирдорд╕реНрдХрд╛рд░! рдЖрдЬ рдореИрдВ рдмреНрд▓реВрдо рдлрд┐рд▓реНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ - рдЗрд╕рдХреА рд╕рд╛рджрдЧреА рдореЗрдВ рд╢рд╛рдирджрд╛рд░ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдлрд┐рд▓реНрдЯрд░ рд╕рд┐рд░реНрдл рджреЛ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрднрд╛рд╡реНрдпрддрд╛ рд╕реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ: рд╕реЗрдЯ рдореЗрдВ рдПрдХ рддрддреНрд╡ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдХрд┐ рдХреНрдпрд╛ рддрддреНрд╡ рд╕реЗрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╕реЗрдЯ рд╕рдВрднрд╛рд╡рд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╢реНрди рдкрд░ рдЕрдВрддрд┐рдо рдСрдкрд░реЗрд╢рди "рдпрд╣ рддрддреНрд╡ рд╕реЗрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ?" рдПрдХ рдЙрддреНрддрд░ "рд╣рд╛рдВ / рдирд╣реАрдВ" рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ "рд╕рдВрднрд╡ / рдирд╣реАрдВ" рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрддрд╛ рд╣реИред





рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдпрд╣ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ?



рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╕рд░рд▓ рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ m



рдХреЗ рдмрд┐рдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдФрд░ k



рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреЛ 0



рд╕реЗ m - 1



рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ m - 1



рд╢реБрд░реВ m - 1



ред рдпрджрд┐ рдЖрдкрдХреЛ рд╕реЗрдЯ рдореЗрдВ рдПрдХ рддрддреНрд╡ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдорд╛рди рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд░рдгреА рдореЗрдВ рдмрд┐рдЯреНрд╕ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдиреЗ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛, рдмрд╕ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рджрд╕реНрдп рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рднреА рд╕рдВрдЧрдд рдмрд┐рдЯреНрд╕ рдПрдХ рдкрд░ рд╕реЗрдЯ рд╣реИрдВ - рдпрд╣ "рд╢рд╛рдпрдж" рдЬрд╡рд╛рдм рд╣реЛрдЧрд╛ред рдпрджрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд┐рдЯ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕ рддрддреНрд╡ рдХреЗ рд╕реЗрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ - рдЬрд╡рд╛рдм "рдирд╣реАрдВ" рд╣реИ, рддрддреНрд╡ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди



рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдХреЛрдб, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ Habr├й рдкрд░ рдпрд╣ рдХрдИ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдмрд┐рдЯрдореИрдк рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:



 function Bits() { var bits = []; function test(index) { return (bits[Math.floor(index / 32)] >>> (index % 32)) & 1; } function set(index) { bits[Math.floor(index / 32)] |= 1 << (index % 32); } return {test: test, set: set}; }
      
      





рд╣рдореЗрдВ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдПрдХ рдорд╛рдирдХреАрдХреГрдд рдкрд░рд┐рд╡рд╛рд░ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХрд┐ k



рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрдирд╛рдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╣реЛред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:



 function Hash() { var seed = Math.floor(Math.random() * 32) + 32; return function (string) { var result = 1; for (var i = 0; i < string.length; ++i) result = (seed * result + string.charCodeAt(i)) & 0xFFFFFFFF; return result; }; }
      
      





рдареАрдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмреНрд▓реВрдо рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реА:



 function Bloom(size, functions) { var bits = Bits(); function add(string) { for (var i = 0; i < functions.length; ++i) bits.set(functions[i](string) % size); } function test(string) { for (var i = 0; i < functions.length; ++i) if (!bits.test(functions[i](string) % size)) return false; return true; } return {add: add, test: test}; }
      
      





рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:



 var fruits = Bloom(64, [Hash(), Hash()]); fruits.add('apple'); fruits.add('orange'); alert(fruits.test('cabbage') ? ' .' : ' ,  100%.');
      
      





рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЗрд╖реНрдЯрддрдо рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред



рдЗрд╖реНрдЯрддрдо рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди



рдмреЗрд╢рдХ, рдореИрдВрдиреЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЗрд╖реНрдЯрддрдо рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛, рдореИрдВ рд╕рд┐рд░реНрдл рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рднреА, рддрд░реНрдХ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХреБрдЫ рдкреИрдЯрд░реНрди рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрдбрд╝реЗ рдмрд┐рдЯрдореИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдк рджреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд╣рд╛рдВ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╡рд┐рдкрд░реАрдд рднреА рд╕рд╣реА рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╕рд░рдгреА рдХреЛ рдУрд╡рд░рдкреЙрдк рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдЧрд▓рдд рдЙрддреНрддрд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╕рдВрднрд╡ рд╣реЛрдЧреАред " рдмрд┐рдЯреНрд╕ рдореЗрдВ рд╕рд░рдгреА рдХрд╛ рдЗрд╖реНрдЯрддрдо рдЖрдХрд╛рд░:

рдПрд░реЗ рдСрдкреНрдЯрд┐рдорд▓ рд╕рд╛рдЗрдЬрд╝ рдлреЙрд░реНрдореВрд▓рд╛

, рдЬрд╣рд╛рдВ n



рдлрд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рддрддреНрд╡реЛрдВ рдХреА рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╣реИ, p



рдПрдХ рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреА рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред



рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдбрд╝реА рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЫреЛрдЯреА рдирд╣реАрдВред рдЗрд╖реНрдЯрддрдо рд░рд╛рд╢рд┐:



рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЗрд╖реНрдЯрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╕реВрддреНрд░

рд╣рдо рдЕрд░реНрдЬрд┐рдд рдЬреНрдЮрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:



 function OptimalBloom(max_members, error_probability) { var size = -(max_members * Math.log(error_probability)) / (Math.LN2 * Math.LN2); var count = (size / max_members) * Math.LN2; size = Math.round(size); count = Math.round(count); var functions = []; for (var i = 0; i < count; ++i) functions[i] = Hash(); return Bloom(size, functions); }
      
      







рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдБ рдХрд░реЗрдВ?



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Googol рдбрд┐рд╕реНрдХ рдПрдХреНрд╕реЗрд╕ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ BigTable рдореЗрдВ рдмреНрд▓реВрдо рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд┐рдЧрдЯреЗрдмрд▓ рдПрдХ рдмрдбрд╝реА, рдмрд╣реБрдд рд╡рд┐рд░рд▓ рдмрд╣реБрдЖрдпрд╛рдореА рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪрд╛рдмрд┐рдпрд╛рдБ рд╢реВрдиреНрдп рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреА рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреЗрдЯрд╛ рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЫреЛрдЯреА рдмреНрд▓реЙрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдЕрдиреБрд░реЛрдз рдкрд░ рдкреВрдЫрддрд╛рдЫ рдХреА рдЬрд╛рддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред



рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреБрдЫ рд░реИрдо рдЦрд░реНрдЪ рдХрд░рдирд╛ рдФрд░ рдбрд┐рд╕реНрдХ рдЙрдкрдпреЛрдЧ рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░рдирд╛ рдлрд╛рдпрджреЗрдордВрдж рд╣реИред рдХрд╣реЛ, рд▓реЛрдб рдХреЛ 10 рдЧреБрдирд╛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ 5 рдмрд┐рдЯреНрд╕ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред 100 рдмрд╛рд░ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рддрд┐ рдХреБрдВрдЬреА 10 рдмрд┐рдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЕрдкрдиреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реЗрдВред



рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдЪрд╛рд░



рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЕрднреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЗрд╖реНрдЯрддрдо рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ рдХрдо рдХрд░рдХреЗ рдЖрдВрдХрд╛ рдЧрдпрд╛ рд╣реИ; рд╣рдо рдПрдХ рдЖрджреЗрд╢ рдпрд╛ рджреЛ рджреНрд╡рд╛рд░рд╛ рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреА рд╕реАрдорд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╕ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ - рд╢рд╛рдпрдж рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдФрд░ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреБрдЫ рдЕрджреНрд╡рд┐рддреАрдп рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╛ рдореИрдВрдиреЗ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдмрдирд╛рдИ рдереАред



рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╕ рд╣рд▓ рд╣реИ - рдмрд┐рдЯрдореИрдк рдХреЛ рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ - рдЬреЛрдбрд╝рддреЗ рд╕рдордп рд╡реЗрддрди рд╡реГрджреНрдзрд┐, рд╣рдЯрд╛рддреЗ рд╕рдордп рд╡реЗрддрди рд╡реГрджреНрдзрд┐ред рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред



рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдкрджрд╛рдиреБрдХреНрд░рдо рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдкрджрд╛рдиреБрдХреНрд░рдо рдЧрд╣рд░рд╛ рдмрдврд╝рддрд╛ рд╣реИред



рд╢рд╛рдпрдж рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдЕрд▓рд╡рд┐рджрд╛ред



All Articles