рдПрдЯрд▓рд╕рд┐рдпрди рдХрдВрдлреНрд▓реБрдПрдВрд╕ рдореЗрдВ рдмреНрд▓реВрдкреНрд░рд┐рдВрдЯ рд╕рдВрдХреЗрдд рд╡рд┐рдХрд╛рд╕

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

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

рдЪрд░рдг 1 - рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдирд╛

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдЯрд▓рд╕рд┐рдпрди рдПрд╕рдбреАрдХреЗ рд╕реЗ atlas-create-confluence-plugin рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдЪрд░рдг 2 - рдкреЛрдорд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдирд╛

рдЕрдм рдЖрдк рдЕрдкрдиреА рдкрд╕рдВрджреАрджрд╛ рдЖрдИрдбреАрдИ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреАрдУрдПрдо рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЙрдиреНрдлреНрд▓реБрдПрдВрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдорд╛рд╡реЗрди рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ)ред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рдореАрд▓ рдХреЗ рдкрддреНрдерд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдХрдВрдлреНрд▓реБрдПрдВрд╕ 5.1 ( 5.1-рдЖрд░рд╕реА 3 рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдЬ рдЙрдкрд▓рдмреНрдз рд╣реИ )ред
 <dependencies> <dependency> <groupId>com.atlassian.confluence</groupId> <artifactId>confluence</artifactId> <version>${confluence.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.atlassian.confluence.plugins</groupId> <artifactId>confluence-create-content-plugin</artifactId> <version>${create-content.version}</version> <scope>provided</scope> </dependency> </dependencies> <properties> <confluence.version>5.1-m1</confluence.version> <create-content.version>1.3.8</create-content.version> <confluence.data.version>5.1-m1</confluence.data.version> <amps.version>4.1.5</amps.version> </properties> 

рдЪрд░рдг 3 - рдкреНрд▓рдЧрдЗрди рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝рдирд╛

рдЗрд╕ рдЪрд░рдг рдореЗрдВ, Blueprints рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ atlassian-plugin.xml рдХреЗ рдкреНрд▓рдЧрдЗрди рдореЗрдВ atlassian-plugin.xml ред
 <web-item key="wiki-markup-blueprint-item" i18n-name-key="wiki.markup.blueprint.name" section="system.create.dialog/content"> <description key="wiki.markup.blueprint.description"/> <resource name="icon" type="download" location="images/stiltsoft.png"/> <param name="blueprintKey" value="wiki-markup-blueprint"/> </web-item> 

web-item рдореЙрдбреНрдпреВрд▓ Create Dialog рд╡рд┐рдВрдбреЛ рдореЗрдВ Wiki Markup рдореЗрдиреВ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ:


рдЕрдЧрд▓рд╛, blueprint рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
 <blueprint key="wiki-markup-blueprint" create-result="view" content-template-key="wiki-markup-blueprint-page" index-key="wiki-markup-blueprint-index"> <dialog-wizard key="blueprint-wizard"> <dialog-page id="insertMarkupForm" template-key="WikiMarkup.Blueprint.form" title-key="wiki.markup.blueprint.dialog.title" last="true"/> </dialog-wizard> </blueprint> 

blueprint рдореЙрдбреНрдпреВрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдореВрд▓реНрдп blueprint рд╣реИред рдЗрд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

blueprint рдореЙрдбреНрдпреВрд▓ рдХреЗ dialog-wizard рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдкрдХреЗ Blueprint рдкреНрд▓рдЧ-рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдордЧреНрд░реА рдмрдирд╛рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЬрд╛рдиреЗ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:

рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕реЛрдпрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдмрд╛рдж рдореЗрдВ web-resource рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд templates.soy рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИред рдпрд╣ рдлрд╝рд╛рдЗрд▓ рд╣реИ:
 {namespace WikiMarkup.Blueprint} /** * Wiki Markup form */ {template .form} <form id="wiki-markup-form" action="#" method="post" class="aui"> <div> {getText('wiki.markup.blueprint.dialog.form.label.page.title')} </div> <input id="page-title" type="text" name="title"> <div> {getText('wiki.markup.blueprint.dialog.form.label.markup')} </div> <textarea id="wiki-markup" name="wikiMarkup"></textarea> </form> {/template} 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:

content-template рдореЙрдбреНрдпреВрд▓ рдкреГрд╖реНрда рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреГрд╖реНрда рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 <content-template key="wiki-markup-blueprint-page" i18n-name-key="wiki.markup.blueprint.page.name"> <resource name="template" type="download" location="xml/content-template.xml"/> <context-provider class="com.stiltsoft.confluence.plugins.blueprint.markup.WikiMarkupProvider"/> </content-template> 

content-template рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдирд┐рдореНрди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ:

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ xml рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкреГрд╖реНрда рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЪрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдВрджрд░реНрдн рд╕реЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВред рдЬрд┐рд╕ рдкреНрд▓рдЧрдЗрди рдХреЛ рд╣рдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
 <at:var at:name="wikiInXhtml" at:rawXhtml='true'/> 

рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ рдЙрд╕ рдлреЙрд░реНрдо рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднрд░рддрд╛ рд╣реИ рдФрд░ "рд╕реАрдзреЗ рдмрд┐рд╕реНрддрд░ рдкрд░" context-provider рд╕рд╛рде рд╕реАрдзреЗ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо context-provider рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЗрдирдкреБрдЯ рдлреЙрд░реНрдо рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рд╡рд┐рдХреА рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдПрдХреНрд╕рдлреНрд▓реЗрдХ рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдХрдВрдлреНрд▓реБрдПрдВрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред context-provider 'рдПрдХ рдХреЛрдб рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 package com.stiltsoft.confluence.plugins.blueprint.markup; import com.atlassian.confluence.content.render.xhtml.DefaultConversionContext; import com.atlassian.confluence.content.render.xhtml.XhtmlException; import com.atlassian.confluence.renderer.PageContext; import com.atlassian.confluence.xhtml.api.EditorFormatService; import com.atlassian.plugin.PluginParseException; import com.atlassian.plugin.web.ContextProvider; import java.util.Map; public class WikiMarkupProvider implements ContextProvider { private EditorFormatService editorFormatService; public WikiMarkupProvider(EditorFormatService editorFormatService) { this.editorFormatService = editorFormatService; } @Override public void init(Map<String, String> params) throws PluginParseException { } @Override public Map<String, Object> getContextMap(Map<String, Object> ctx) { try { String wikiMarkup = (String) ctx.get("wikiMarkup"); String xhtml = editorFormatService.convertWikiToEdit(wikiMarkup, new DefaultConversionContext(new PageContext())); ctx.put("wikiInXhtml", xhtml); } catch (XhtmlException ignored) { } return ctx; } } 

рдФрд░ рдЕрдВрдд рдореЗрдВ, web-resource рдореЙрдбреНрдпреВрд▓ рдХреЛ atlassian-plugin.xml рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
 <web-resource key="blueprint-resources" name="Blueprint Resources"> <transformation extension="js"> <transformer key="jsI18n"/> </transformation> <transformation extension="soy"> <transformer key="soyTransformer"> <functions>com.atlassian.confluence.plugins.soy:soy-core-functions</functions> </transformer> </transformation> <resource type="download" name="wiki-markup.css" location="css/wiki-markup.css"/> <resource type="download" name="templates-soy.js" location="soy/templates.soy"/> <resource type="download" name="wiki-markup.js" location="js/wiki-markup.js"/> <dependency>com.atlassian.confluence.plugins.confluence-create-content-plugin:resources</dependency> <context>atl.general</context> <context>atl.admin</context> </web-resource> 

рдЖрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд╕рд╛рде рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ web-resource рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдиреЛрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЛ com.atlassian.confluence.plugins.confluence-create-content-plugin:resources рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ com.atlassian.confluence.plugins.confluence-create-content-plugin:resources ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, wiki-markup.js рдЕрдкрдирд╛ Blueprint рдкреНрд▓рдЧрдЗрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд░реНрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
 (function ($) { Confluence.Blueprint.setWizard('com.stiltsoft.confluence.plugins.wiki-markup-blueprint-plugin:wiki-markup-blueprint-item', function() { }); })(AJS.$); 

рдЪрд░рдг 4 - рд╡рд┐рдХреА рд▓реЗрдЖрдЙрдЯ рд╕реЗ рдкреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдЖрдк рдЗрд╕реЗ рдирд╣реАрдВ рдорд╛рдирддреЗ, рд▓реЗрдХрд┐рди рд╡рд┐рдХреА рдорд╛рд░реНрдХрдЕрдк рд╕реЗ рдкреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Blueprint рдкреНрд▓рдЧ-рдЗрди рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЕрдм рдЖрдк рдкреНрд▓рдЧрдЗрди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдкреНрд▓рдЧрдЗрди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


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


All Articles