рдореЗрд░реА рдПрдХ Playframework-e рд╡реЗрдм рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдПрдХ рджрд┐рди рдЗрд╕рдиреЗ рдПрдХ рдЦреЛрдЬ рдХреАред рдореИрдВрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рддреБрд░рдВрдд рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд░реИрдВрдХ рдФрд░ рдЕрдиреНрдп "рд╕реНрдорд╛рд░реНрдЯ" рд╕рд░реНрдЪ рдЧреБрдбрд┐рдпреЛрдВ рдХреЛ рд░реИрдВрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рдореЗрд░реА рдмрд╛рдЗрдХ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рдордп рдпрд╛ рдЗрдЪреНрдЫрд╛ рдирд╣реАрдВ рдереАред
рдЬрд╛рд╡рд╛ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рдж рд╕реЗ - рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓реНрдпреВрд╕рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд▓реБрднрд╛рд╡рдирд╛ рдерд╛ред
Google рдореЗрдВ, рдореБрдЭреЗ рддреБрд░рдВрдд Playframework рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрднреБрдд рдореЙрдбреНрдпреВрд▓ рдорд┐рд▓рд╛ рдЬрд┐рд╕реЗ
Search рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ
рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рд╕рд░реНрдЪ рдореЙрдбреНрдпреВрд▓ рднреА рдорд┐рд▓рд╛, рдЬреЛ Lucene рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕рд░реНрд╡рд░ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдзреНрд╡рдЬрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдЗрд╕рдХреА рд╕рд░рд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг рд╕рд░реНрдЪ рдореЙрдбреНрдпреВрд▓ рдкрд╕рдВрдж рдЖрдпрд╛ - рдЗрд╕рдореЗрдВ рд╕рднреА "рдШрдВрдЯрд┐рдпрд╛рдБ рдФрд░ рд╕реАрдЯреА" рд╕рдореНтАНрдорд┐рд▓рд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд╕рд╛рде, рдкреНрд▓реЗ-рдИ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА,
рдкреНрд▓реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рд╕рд░реНрдЪ рдХрдорд╛рдВрдб рдиреЗ рдПрдХ рдзрдорд╛рдХреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдмрд╛рд╣рд░ рдкрдВрдк рдХрд┐рдпрд╛ред
Application.conf рдореЗрдВ mod.search = $ {play.path} /modules/search-2.0 рдЬреЛрдбрд╝рдХрд░ред рдореИрдВ рдкрд╣рд▓реЗ рд╣реА рдЖрд╡реЗрджрди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред
рд▓рдШреБ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ
рдПрдВрдЯреНрд░реА рдПрдВрдЯрд┐рдЯреА рдореЗрдВ рдЬреЛрдбрд╝рд╛, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ,
@ рдЗрдВрдбреЗрдХреНрд╕ рдПрдиреЛрдЯреЗрд╢рди рдФрд░
рдбрд┐рдлреЙрд▓реНрдЯ рдлрд╝реАрд▓реНрдб
@ рдлреАрд▓ рдПрдиреЛрдЯреЗрд╢рди рдХреА рдЦреЛрдЬ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред
рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓рд┐рдЦрдХрд░:
public static void search(String phrase, int page) { int pageSize = PAGE_SIZE; Query query = Search.search("description:" + phrase, Entry.class); List<Entry> entries = query.page(page*pageSize, pageSize).fetch(); long totalCount = query.count(); render(entries, totalCount, page, pageSize, phrase); }
рдореИрдВ рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рдерд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╢реБрд░реВ рд╣реЛ рдЧрдИрдВ ...
рдЦреЛрдЬ рдиреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЕрд░реНрдерд╛рдд,
рдЧрд┐рдирддреА () рд╡рд┐рдзрд┐
0 рд╡рд╛рдкрд╕ рдЖ рдЧрдИ, рдФрд░
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдЦрд╛рд▓реА рдереАред рдореИрдВрдиреЗ рд░реВрд╕реА рдФрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рджреЛрдиреЛрдВ рдореЗрдВ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░
Search.rebuildAllIndexes () рдХрд╣рд╛, рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рд╛ред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдкреНрд▓реЗ-рдИ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рд╕реНрд░реЛрдд рдХреЗ рд╕рд╛рде рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрдХреНрд╖рдкрд╛рддреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЫреЛрдЯреА рдбреАрдмрдЧ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐
рд╡рд┐рд╡рд░рдг рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдереЛрдбрд╝рд╛ рдЧрд╣рд░реЗ рдЪрдврд╝ рдЧрдпрд╛ рдФрд░ рджреЗрдЦрд╛ рдХрд┐
@Field рдПрдиреЛрдЯреЗрд╢рди рдХреА
рддрд▓рд╛рд╢ рдореЗрдВ, рдЗрдХрд╛рдИ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ
object.getClass () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
ред getFields () , рд▓реЗрдХрд┐рди рдмрдВрдж рдХрд░реЛ, рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реАрд▓реНрдб рд▓реМрдЯрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд╕рд╛рд░ рдореЗрдВ, рдлрд╝реАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдХреА рд╕рдВрд░рдХреНрд╖рд┐рдд рдкрд╣реБрдВрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдореЙрдбреНрдпреВрд▓ рд▓реЗрдЦрдХ рдХреЛ
getDeclaredFields () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣рд╛рдВ рдореИрдВ рдПрдХ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХрд░реВрдВрдЧрд╛: рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЗрд╕рдореЗрдВ рдХреЛрдб рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдП, рдХрдо рд╕реЗ рдХрдо рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ "рдХреЙрдореНрдмреИрдЯ" рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд▓реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рд╕рд░реНрдЪ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЦреЛ рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рдХреЛ рд░реАрд╕реИрдореНрдмрд▓реНрдб рдореЙрдбреНрдпреВрд▓ рдкрд░ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдПрдХ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рд▓рд┐рдЦрдирд╛ рдпрд╛ рдПрдХ рдкреИрдЪ рдкреЗрд╢ рдХрд░рдирд╛ рдПрдХ рддреНрд╡рд░рд┐рдд рдЙрдкрдХреНрд░рдо рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАредрд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░,
рд╡рд┐рд╡рд░рдг рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕ рдмрдЧ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рддрдп рд╣реЛрдиреЗ рддрдХ рдЯреВрдбреВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░, рд▓реЛ рдФрд░ рдирд┐рд╣рд╛рд░рдирд╛, рдЦреЛрдЬ рдЕрд░реНрдЬрд┐рдд рдХреА рд╣реИ!
рдЕрдЧрд▓реА рд╕рдорд╕реНрдпрд╛, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдерд╛, рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдпреВрдирд┐рдЯ рдХреЗ рд╕рд╛рде CRUD рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рд╕реНрд╡рдд: рдЕрджреНрдпрддрди (рдФрд░ рдирдП рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдирд╛) - рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд░рд┐рдХреЙрд░реНрдб рдкрд╣рд▓реЗ рдкреНрд░реА-рдореЙрдбрд░реЗрд╢рди рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рдЦреЛрдЬ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП "рдЕрди-рдореЙрдбрд░реЗрдЯ" рд░рд┐рдХреЙрд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдореЙрдбрд░реЗрд╢рди рдХреЗ рдмрд╛рдж рдЦреБрдж
Search.index (рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдореНрдореАрдж рдереА рдХрд┐ рдореБрдЭреЗ рд╕реВрддреНрд░реЛрдВ рдореЗрдВ рдХреБрдЫ рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдореЗрдВ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛: рдХреНрдпрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореИрдВ SearchPlugin рдХреЛрдб рдореЗрдВ
рдЗрд╕ рдкрд░ рдЖрдпрд╛:
@Override public void onEvent(String message, Object context) { if (!message.startsWith("JPASupport")) return; if (message.equals("JPASupport.objectPersisted") || message.equals("JPASupport.objectUpdated")) { Search.index (context); } else if (message.equals("JPASupport.objectDeleted")) { Search.unIndex(context); } }
рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреИрдЪ рднреЗрдЬрдиреЗ рдФрд░ рдХрд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рддрд╛рдХрд┐ рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рддреЗрдЬреА рд╕реЗ рдЬрд╛рд░реА рд╣реЛ, рд▓реЗрдХрд┐рди рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛: рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рдЕрднреА рднреА рдПрдХ рдореЙрдбреНрдпреВрд▓ рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрдЧрд╛, рдЬреЛ рдореИрдВрдиреЗ рд▓рд┐рдмрд░ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рд▓рд╛ рд╣реИред
рдХреЛрдб рдореЗрдВ рдЦреБрджрд╛рдИ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдЖрд╡реЗрджрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
Search.init(); FileExtractor.init();
рдФрд░ рдЬрдм рддреБрдо рд░реБрдХ рдЬрд╛рдУ:
try { Search.shutdown(); } catch (Exception e) { throw new UnexpectedException (e); }
рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ
@ OnApplicationStart / Stop annotations рдХреЗ рд╕рд╛рде
рдЬреЙрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛ рдХрджрдо рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд▓рдЧрдЗрди рдерд╛ред Playframework, play.plugins
рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╛рд╕рдкрд╛рде рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдвреВрдВрдврддрд╛
рд╣реИ ,
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ , рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде, рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╣рдЯрд╛ рджреА рдЧрдИ рдереА, рдФрд░ рд╕рдм рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рдФрд░ рдореБрдбрд╝ рдЧрдпрд╛ред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордп рдмрдЪрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдкреНрд▓реЗрдлреНрд░реЙрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдкреБрдирд╢реНрдЪ: рдЪреВрдБрдХрд┐ рдореБрдЭреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд╛рдо рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрдирд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрдЧ рдХреЛ рд╕рд╣реА рдХрд░рдХреЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ред :)