рд╡реИрдХреНрдпреВрдо рдХреНрд▓реАрдирд░ рдпрд╛ рд╕реНрдорд╛рд░реНрдЯ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рдкрд╣рд┐рдпрд╛ рдХреЗ рдкреАрдЫреЗ

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

рдЯреНрд░реЗрдирд┐рдВрдЧ


рдпрд╣ рд╕рдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрд╕реЛрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореИрдВ XUL DOM рддрдХ рдкрд╣реБрдВрдЪ рдкрд╛рдКрдВрдЧрд╛ред рдореИрдВрдиреЗ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡рд┐рд╕реНрддрд╛рд░ рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдХреЗ рдирд┐рдЪрд▓реЗ рджрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рдПрдХ рдЖрдЗрдХрди рдЬреЛрдбрд╝рддрд╛ рд╣реИ

рдЫрд╡рд┐

рдЗрд╕ рдЖрдЗрдХрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рд╡рд┐рдВрдбреЛ рдЦреБрд▓реЗрдЧреА рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, CTRL + Enter рджрдмрд╛рдПрдВ (рдЯреЗрдХреНрд╕реНрдЯрдмреЙрдХреНрд╕ рддрддреНрд╡ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдЯреИрдВрдХ рдореЗрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП


рдЪреВрдВрдХрд┐ рд╕рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдлрд╛рдпрд░рдлреЙрдХреНрд╕ рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдереЛрдбрд╝рд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред HTML рдХреЗ рдЕрдиреБрд░реВрдк, "рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдЦрд┐рд▓рд╛рдбрд╝реА" рд╡рд┐рдВрдбреЛ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣реИрдВред рд╕рд╛рдордЧреНрд░реА (HTML DOM) рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛
var links = window.content. document .getElementsByTagName( 'a' );
// or just
var links = content. document .querySelectorAll( 'a' );
alert(links.length)


* This source code was highlighted with Source Code Highlighter .
var links = window.content. document .getElementsByTagName( 'a' );
// or just
var links = content. document .querySelectorAll( 'a' );
alert(links.length)


* This source code was highlighted with Source Code Highlighter .
var links = window.content. document .getElementsByTagName( 'a' );
// or just
var links = content. document .querySelectorAll( 'a' );
alert(links.length)


* This source code was highlighted with Source Code Highlighter .


рдПрдХ рдФрд░ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ HTML DOM рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдХреНрд╖рдг рдХреЛ рдХреИрд╕реЗ рдкрдХрдбрд╝рд╛ рдЬрд╛рдП, рд╕рд╛рде рд╣реА рдЯреИрдм рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЯреИрдмрдмреНрд░реЛрд╕рд░ рддрддреНрд╡ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ gBrowser рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдЖрдк рдЯреИрдм рдХреЛ рд╣реЗрд░рдлреЗрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг
// add new tab
var tab = gBrowser.addTab( 'http://habrahabr.ru' );
gBrowser.selectedTab = tab;

// get browser element for tab
var browser = gBrowser.getBrowserForTab(tab);

// add listeners on page load
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
// listener implementation
}, false );

// add listeners on HTML DOM loaded
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
if ( event .originalTarget instanceof HTMLDocument) {
var document = event .originalTarget;
// listener implementation
}
}, false );

* This source code was highlighted with Source Code Highlighter .
// add new tab
var tab = gBrowser.addTab( 'http://habrahabr.ru' );
gBrowser.selectedTab = tab;

// get browser element for tab
var browser = gBrowser.getBrowserForTab(tab);

// add listeners on page load
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
// listener implementation
}, false );

// add listeners on HTML DOM loaded
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
if ( event .originalTarget instanceof HTMLDocument) {
var document = event .originalTarget;
// listener implementation
}
}, false );

* This source code was highlighted with Source Code Highlighter .
// add new tab
var tab = gBrowser.addTab( 'http://habrahabr.ru' );
gBrowser.selectedTab = tab;

// get browser element for tab
var browser = gBrowser.getBrowserForTab(tab);

// add listeners on page load
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
// listener implementation
}, false );

// add listeners on HTML DOM loaded
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
if ( event .originalTarget instanceof HTMLDocument) {
var document = event .originalTarget;
// listener implementation
}
}, false );

* This source code was highlighted with Source Code Highlighter .


рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдм рдкреЗрдЬ рдХреЛ рдлрд╛рдЗрд▓ рдореЗрдВ рд╕реЗрд╡ рдХрд░рдирд╛ рд╕реАрдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
var tab = gBrowser.addTab( 'http://habrahabr.ru' );
gBrowser.selectedTab = tab;
var browser = gBrowser.getBrowserForTab(tab);
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
var document = event .originalTarget;
if ( document instanceof HTMLDocument && this .contentWindow. document == document ) {
var basename = document .location.href.replace(/\/+$/, '' ),
pos = basename.lastIndexOf( '/' );
if (pos != -1) {
basename = basename.substr(pos+1);
}

var file = Components.classes[ "@mozilla.org/file/local;1" ].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath( '/tmp/' +basename);
if (!file.exists()) {
var chosen = new AutoChosen(file, makeFileURI(file));
internalSave( document .location.href, document , null , null , document .contentType, false , null , chosen);
}
}
}, false )

* This source code was highlighted with Source Code Highlighter .
var tab = gBrowser.addTab( 'http://habrahabr.ru' );
gBrowser.selectedTab = tab;
var browser = gBrowser.getBrowserForTab(tab);
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
var document = event .originalTarget;
if ( document instanceof HTMLDocument && this .contentWindow. document == document ) {
var basename = document .location.href.replace(/\/+$/, '' ),
pos = basename.lastIndexOf( '/' );
if (pos != -1) {
basename = basename.substr(pos+1);
}

var file = Components.classes[ "@mozilla.org/file/local;1" ].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath( '/tmp/' +basename);
if (!file.exists()) {
var chosen = new AutoChosen(file, makeFileURI(file));
internalSave( document .location.href, document , null , null , document .contentType, false , null , chosen);
}
}
}, false )

* This source code was highlighted with Source Code Highlighter .
var tab = gBrowser.addTab( 'http://habrahabr.ru' );
gBrowser.selectedTab = tab;
var browser = gBrowser.getBrowserForTab(tab);
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
var document = event .originalTarget;
if ( document instanceof HTMLDocument && this .contentWindow. document == document ) {
var basename = document .location.href.replace(/\/+$/, '' ),
pos = basename.lastIndexOf( '/' );
if (pos != -1) {
basename = basename.substr(pos+1);
}

var file = Components.classes[ "@mozilla.org/file/local;1" ].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath( '/tmp/' +basename);
if (!file.exists()) {
var chosen = new AutoChosen(file, makeFileURI(file));
internalSave( document .location.href, document , null , null , document .contentType, false , null , chosen);
}
}
}, false )

* This source code was highlighted with Source Code Highlighter .


рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд┐рддрд┐ this.contentWindow.document == рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдкреГрд╖реНрда рдкрд░ iframe рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдкреГрд╖реНрда рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдПрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд╝реНрд░реЗрдо рд╕реЗ рдирд╣реАрдВред
рдЗрдВрдЯрд░рдирд▓рд╡реЗрд╡ рдлрдВрдХреНрд╢рди (рдлрд╛рдЗрд▓ рдХреЛ рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ) рдФрд░ рдСрдЯреЛрдЪреЗрди рдХреНрд▓рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдлрд╛рдЗрд▓ рдХреА рдкрд╕рдВрдж рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ), рдЖрдк рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдФрд░ рдЙрджрд╛рд╣рд░рдгред

рд╣рдо рдлрд╛рдпрд░рдлреЙрдХреНрд╕ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ


рд╣рдо рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдлрд╛рдпрд░рдлреЙрдХреНрд╕ рдХреЛ рд╣рдмрд░ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдирд╛ рд╕рд┐рдЦрд╛рдПрдЧреАред
var Crawler = {
habrahabr: function (username, password) {
this .username = username;
this .password = password;
},
onHTMLLoaded: function (browser, callback) {
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
var document = event .originalTarget;
if ( document instanceof HTMLDocument
&& this .contentWindow. document == document
) {
this .removeEventListener( 'DOMContentLoaded' , arguments.callee, false );
callback.call( this , event , document );
}
}, false );
return browser;
}
}

Crawler.habrahabr.prototype = {
url: 'http://habrahabr.ru/' ,
openAndSignIn: function (inNewTab) {
var tab = gBrowser.selectedTab, browser = null ;
if (inNewTab) {
tab = gBrowser.addTab( this .url);
} else {
content. document .location = this .url;
}
browser = gBrowser.getBrowserForTab(tab);
var that = this ;
Crawler.onHTMLLoaded(browser, function ( event , document ){
document .location = document .querySelector( 'dl.panel-personal a' ).href;
Crawler.onHTMLLoaded( this , function ( event , document ){
var user = document .getElementById( 'reg-f-username' );
user.value = that.username;
document .getElementById( 'reg-f-password' ).value = that.password;
user.form.querySelector( 'input[type="submit"]' ).click();
});
});
}
};
var cr = new Crawler.habrahabr( 'serjoga' , '***' );
cr.openAndSignIn( true );


* This source code was highlighted with Source Code Highlighter .
var Crawler = {
habrahabr: function (username, password) {
this .username = username;
this .password = password;
},
onHTMLLoaded: function (browser, callback) {
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
var document = event .originalTarget;
if ( document instanceof HTMLDocument
&& this .contentWindow. document == document
) {
this .removeEventListener( 'DOMContentLoaded' , arguments.callee, false );
callback.call( this , event , document );
}
}, false );
return browser;
}
}

Crawler.habrahabr.prototype = {
url: 'http://habrahabr.ru/' ,
openAndSignIn: function (inNewTab) {
var tab = gBrowser.selectedTab, browser = null ;
if (inNewTab) {
tab = gBrowser.addTab( this .url);
} else {
content. document .location = this .url;
}
browser = gBrowser.getBrowserForTab(tab);
var that = this ;
Crawler.onHTMLLoaded(browser, function ( event , document ){
document .location = document .querySelector( 'dl.panel-personal a' ).href;
Crawler.onHTMLLoaded( this , function ( event , document ){
var user = document .getElementById( 'reg-f-username' );
user.value = that.username;
document .getElementById( 'reg-f-password' ).value = that.password;
user.form.querySelector( 'input[type="submit"]' ).click();
});
});
}
};
var cr = new Crawler.habrahabr( 'serjoga' , '***' );
cr.openAndSignIn( true );


* This source code was highlighted with Source Code Highlighter .
var Crawler = {
habrahabr: function (username, password) {
this .username = username;
this .password = password;
},
onHTMLLoaded: function (browser, callback) {
browser.addEventListener( 'DOMContentLoaded' , function ( event ){
var document = event .originalTarget;
if ( document instanceof HTMLDocument
&& this .contentWindow. document == document
) {
this .removeEventListener( 'DOMContentLoaded' , arguments.callee, false );
callback.call( this , event , document );
}
}, false );
return browser;
}
}

Crawler.habrahabr.prototype = {
url: 'http://habrahabr.ru/' ,
openAndSignIn: function (inNewTab) {
var tab = gBrowser.selectedTab, browser = null ;
if (inNewTab) {
tab = gBrowser.addTab( this .url);
} else {
content. document .location = this .url;
}
browser = gBrowser.getBrowserForTab(tab);
var that = this ;
Crawler.onHTMLLoaded(browser, function ( event , document ){
document .location = document .querySelector( 'dl.panel-personal a' ).href;
Crawler.onHTMLLoaded( this , function ( event , document ){
var user = document .getElementById( 'reg-f-username' );
user.value = that.username;
document .getElementById( 'reg-f-password' ).value = that.password;
user.form.querySelector( 'input[type="submit"]' ).click();
});
});
}
};
var cr = new Crawler.habrahabr( 'serjoga' , '***' );
cr.openAndSignIn( true );


* This source code was highlighted with Source Code Highlighter .


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

рдкреБрдирд╢реНрдЪ: рдореИрдВ рдЕрдХреНрд╕рд░ рдмрдЧреНрд╕ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рдкреНрд▓реЗрдмреИрдХ рдХреЛ рдмрд╣реБрдд рд╣реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдФрд░ рдердХрд╛рдК рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рдЖрдкрдХреЛ рдмрдЯрди рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдФрд░ 10 рдкреГрд╖реНрдареЛрдВ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ 2 рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ рднреАред

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


All Articles