рдлреНрд▓реБрдПрдВрдУрдкреЗрдирдПрдХреНрд╕рдПрдордПрд▓ - рдлреЙрдХреНрд╕рдмреА

рдлрд╝реЙрдХреНрд╕рдмреА рдУрдкрдирдПрдХреНрд╕рдПрдордПрд▓ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╡рд░реНрдб рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рдЯреЗрдореНрдкреНрд▓реЗрдЯ рджреНрд╡рд╛рд░рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдиреЗ рдФрд░ рдореМрдЬреВрджрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЗрд╕рдХреЗ рд╕рд╛рде, рдЖрдк COM + рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдпрд╛ рдУрдкрдирдПрдХреНрд╕рдПрдордПрд▓ рдПрд╕рдбреАрдХреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдУрдкрдирдПрдХреНрд╕рдПрдордПрд▓ рдкреЗрдбрд╝ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рд░реВрдк рдореЗрдВ рдореЗрдЯрд╛-рддрддреНрд╡реЛрдВ рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╢реНрд░реЗрдгреА рдореЗрдВ: рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдмрдирд╛рдирд╛, рдЯреЗрдмрд▓ рдмрдирд╛рдирд╛, рд╕реВрдЪреА рдмрдирд╛рдирд╛ рдФрд░ рднрд░рдирд╛, рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛, рдкреНрд░рд╛рд░реВрдкрдг рдХрд░рдирд╛ рдЖрджрд┐ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА OpenXML SDK рдХреЗ рдКрдкрд░ рдПрдХ рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡рд░рдг рд╣реИ ред

рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд╛рдн



рд╣рдо рд╕реНрд╡рдпрдВ рджреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг Eskat0n рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╡рд░реНрдб-рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреИрджрд╛ рд╣реБрдЖ рдерд╛, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рднреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
  1. рд╕рд░реНрд╡рд░ рдкрд░ рдЬрд╣рд╛рдВ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓ рд░рд╣рд╛ рд╣реИ, Microsoft Office рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
  2. рдЕрдЯрдХ рд╢рдмреНрдж рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ
  3. COM + рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
  4. рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдб рдбреНрд░рд╛рдЗрд╡ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд╕рдм рдХреБрдЫ рд░реИрдо рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ
  5. рд╡рд░реНрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдПрдкреАрдЖрдИ
  6. рдЖрдкрдХреЗ рдореЗрдЯрд▓рдВрдЧреЗрдЬ рдорд╛рд░реНрдХрдЕрдк рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛


рд╕реНрдерд╛рдкрдирд╛



рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг NuGet рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рд▓рд╛рдЗрд╕реЗрдВрд╕



рд╕реЛрд░реНрд╕ рдХреЛрдб .NET 4.0 / C # рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдПрд▓рдЬреАрдкреАрдПрд▓ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд IndyCode рджреНрд╡рд╛рд░рд╛ Google рдХреЛрдб: рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдУрдкрдирдПрдХреНрд╕рдПрдордПрд▓ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

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



рдиреАрдЪреЗ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЖрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг # 1 - рд╣реИрд▓реЛ рд╢рдмреНрдж!



private static void Main()
{
using ( var docxDocument = new DocxDocument(SimpleTemplate.EmptyWordFile))
{
var builder = new DocxDocumentBuilder(docxDocument);

builder
.Tag(SimpleTemplate.ContentTagName,
x => x.Center.Paragraph(z => z.Bold.Text( "Hello Word!" )));

File .WriteAllBytes( string .Format( @"D:\Word.docx" ), docxDocument.ToArray());
}
}

* This source code was highlighted with Source Code Highlighter .




SimpleTemplate.EmptyWordFile рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ рдЬреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╣реА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣реЗрдбрд░, рд╕рд╛рдордЧреНрд░реА рдФрд░ рдкрд╛рдж рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдЯреИрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдФрд░ рд╕рд░рд▓ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рд╣реИред

File.WriteAllBytes рдХреЗ рдмрдЬрд╛рдп, рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдХреЛ FileResult рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддреБрд░рдВрдд рдЙрддреНрдкрдиреНрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗред

рдЕрдиреБрд▓рдЧреНрдирдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП:


рдЙрджрд╛рд╣рд░рдг рд╕рдВрдЦреНрдпрд╛ 2 рдПрдХ рдЕрдиреБрдмрдВрдз рдмрдирд╛рдПрдБ



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

private static void Main()
{
string customerName = " .." ;
string orderNumber = "4" ;
string itemName1 = "" ;
string itemSumm1 = "5 000" ;
string itemName2 = " " ;
string itemSumm2 = "6 342" ;
string summ = "11 342" ;

using ( var docxDocument = new DocxDocument(SimpleTemplate.EmptyWordFile))
{
var builder = new DocxDocumentBuilder(docxDocument);

builder
.Tag(SimpleTemplate.ContentTagName,
x => x
.Center.Paragraph(z => z.Bold.Text( string .Format( " тДЦ{0}" , orderNumber)))
.Right.Paragraph( string .Format( " {0} ." , DateTime .Now.ToString( "dd MMMM yyyy" )))
.Left.Paragraph( string .Format( ", {0}, :" , customerName))
.Table(t => t.Column( "" , 70).Column( ", ." , 30),
r => r.Row(itemName1, itemSumm1)
.Row(itemName2, itemSumm2)
.Row(w => w.Right.Bold.Text( ":" ), w=>w.Center.Bold.Underlined.Text(summ))
));

File .WriteAllBytes( string .Format( @"D:\Word.docx" ), docxDocument.ToArray());
}
}


* This source code was highlighted with Source Code Highlighter .




рдЙрджрд╛рд╣рд░рдг рд╕рдВрдЦреНрдпрд╛ 3 - рдирд┐рд░реНрдорд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛


рдкрд░рд┐рджреГрд╢реНрдп:
  1. рд╣рдо рдХреЗред рдЗрд╡рд╛рдиреЛрд╡ рджреНрд╡рд╛рд░рд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдмрдирд╛рддреЗ рд╣реИрдВ
  2. рд╣рдо рдЕрдиреБрдореЛрджрди рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рднреЗрдЬрддреЗ рд╣реИрдВ
  3. рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЙрдирдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдкреЗрдЯреНрд░реЛрд╡ рдП.рдЖрдИ рдХреЛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
  4. рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛ рдХреЛ рдмрджрд▓реЗрдВ


private static void Main()
{
using ( var docxDocument = new DocxDocument(SimpleTemplate.EmptyWordFile))
{
var builder = new DocxDocumentBuilder(docxDocument);

builder
.Tag(SimpleTemplate.ContentTagName,
x => x.Left.Paragraph( " ..." )
.Right.Paragraph(z => z.Placeholder( "SIGNER_NAME" , " .." )));

File .WriteAllBytes( string .Format( @"D:\Word.docx" ), docxDocument.ToArray());
}

using ( var docxDocument = new DocxDocument( File .ReadAllBytes( @"D:\Word.docx" )))
{
var builder = new DocxDocumentBuilder(docxDocument);

builder
.Placeholder( "SIGNER_NAME" , x => x.Text( " .." ));

File .WriteAllBytes( string .Format( @"D:\Word.docx" ), docxDocument.ToArray());
}
}


* This source code was highlighted with Source Code Highlighter .




рдЙрджрд╛рд╣рд░рдг рд╕рдВрдЦреНрдпрд╛ 4 - рдЦрд░реЛрдВрдЪ рд╕реЗ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдмрдирд╛рдирд╛



private static void Main()
{
using ( var docxDocument = new DocxDocument())
{
docxDocument.AddOpenCloseTag( "CONTENT" );

var builder = new DocxDocumentBuilder(docxDocument);

builder
.Tag( "CONTENT" , x => x.Left.Paragraph( " ..." ));

File .WriteAllBytes( string .Format( @"D:\Word.docx" ), docxDocument.ToArray());
}
}


* This source code was highlighted with Source Code Highlighter .




рдЙрджрд╛рд╣рд░рдг рд╕рдВрдЦреНрдпрд╛ 5 - рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг


рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдиреЗ рдХрд╛рдлреА рдХреБрдЫ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦреЗ рд╣реИрдВ, рдЬрд┐рдирдХреА рдорджрдж рд╕реЗ рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк Google рдХреЛрдб рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ : рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣-рдУрдкрдирдПрдХреНрд╕рдПрдордПрд▓ ред

рдмрди



рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдЬрд╝реИрддрд╕реЗрд╡ рдиреЗ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдпрд╛ рдФрд░ рдкрд╛рда рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдпрд╛:

builder.Tag( "CONTENT" , x => x.Paragraph( " " .Bold() + " " .Italic() + " " .Underlined() + "" ));

* This source code was highlighted with Source Code Highlighter .


рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмреЛрд▓реНрдб рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛



рдпрджрд┐ рдЖрдк рд╣рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдВ рддреЛ рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреА рд╣реИред




рд╕рдВрджрд░реНрдн

DotNetConf рд╕рдореНрдореЗрд▓рди рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдФрд░ рд╕реНрд▓рд╛рдЗрдб : рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ OpenXml рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП OpenSource рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдШреЛрд╖рдгрд╛

Source: https://habr.com/ru/post/In125903/


All Articles