From d5bd9fa54d31e85f8508be27981d15289cfad7a9 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Fri, 13 Mar 2020 10:56:03 +0400
Subject: [PATCH] View filter box, removing chats and chat types.

---
 .../Resources/icons/filters_type_archived.png | Bin 0 -> 528 bytes
 .../icons/filters_type_archived@2x.png        | Bin 0 -> 1052 bytes
 .../icons/filters_type_archived@3x.png        | Bin 0 -> 1576 bytes
 .../Resources/icons/filters_type_bots.png     | Bin 0 -> 503 bytes
 .../Resources/icons/filters_type_bots@2x.png  | Bin 0 -> 1077 bytes
 .../Resources/icons/filters_type_bots@3x.png  | Bin 0 -> 1712 bytes
 .../Resources/icons/filters_type_channels.png | Bin 0 -> 454 bytes
 .../icons/filters_type_channels@2x.png        | Bin 0 -> 913 bytes
 .../icons/filters_type_channels@3x.png        | Bin 0 -> 1402 bytes
 .../Resources/icons/filters_type_contacts.png | Bin 0 -> 372 bytes
 .../icons/filters_type_contacts@2x.png        | Bin 0 -> 699 bytes
 .../icons/filters_type_contacts@3x.png        | Bin 0 -> 1223 bytes
 .../Resources/icons/filters_type_groups.png   | Bin 0 -> 508 bytes
 .../icons/filters_type_groups@2x.png          | Bin 0 -> 984 bytes
 .../icons/filters_type_groups@3x.png          | Bin 0 -> 1712 bytes
 .../Resources/icons/filters_type_muted.png    | Bin 0 -> 576 bytes
 .../Resources/icons/filters_type_muted@2x.png | Bin 0 -> 1318 bytes
 .../Resources/icons/filters_type_muted@3x.png | Bin 0 -> 2101 bytes
 .../icons/filters_type_noncontacts.png        | Bin 0 -> 573 bytes
 .../icons/filters_type_noncontacts@2x.png     | Bin 0 -> 1252 bytes
 .../icons/filters_type_noncontacts@3x.png     | Bin 0 -> 1951 bytes
 .../Resources/icons/filters_type_read.png     | Bin 0 -> 672 bytes
 .../Resources/icons/filters_type_read@2x.png  | Bin 0 -> 1420 bytes
 .../Resources/icons/filters_type_read@3x.png  | Bin 0 -> 2180 bytes
 Telegram/Resources/langs/lang.strings         |  20 +-
 .../SourceFiles/boxes/manage_filters_box.cpp  | 510 ++++++++++++++++--
 .../SourceFiles/boxes/manage_filters_box.h    |   7 +-
 .../SourceFiles/data/data_chat_filters.cpp    |  16 +-
 Telegram/SourceFiles/data/data_chat_filters.h |  15 +-
 Telegram/SourceFiles/storage/localstorage.cpp |   8 -
 Telegram/SourceFiles/window/window.style      |  17 +
 .../SourceFiles/window/window_controller.cpp  |   5 +
 .../SourceFiles/window/window_controller.h    |   1 +
 .../window/window_filters_menu.cpp            |   6 +-
 34 files changed, 540 insertions(+), 65 deletions(-)
 create mode 100644 Telegram/Resources/icons/filters_type_archived.png
 create mode 100644 Telegram/Resources/icons/filters_type_archived@2x.png
 create mode 100644 Telegram/Resources/icons/filters_type_archived@3x.png
 create mode 100644 Telegram/Resources/icons/filters_type_bots.png
 create mode 100644 Telegram/Resources/icons/filters_type_bots@2x.png
 create mode 100644 Telegram/Resources/icons/filters_type_bots@3x.png
 create mode 100644 Telegram/Resources/icons/filters_type_channels.png
 create mode 100644 Telegram/Resources/icons/filters_type_channels@2x.png
 create mode 100644 Telegram/Resources/icons/filters_type_channels@3x.png
 create mode 100644 Telegram/Resources/icons/filters_type_contacts.png
 create mode 100644 Telegram/Resources/icons/filters_type_contacts@2x.png
 create mode 100644 Telegram/Resources/icons/filters_type_contacts@3x.png
 create mode 100644 Telegram/Resources/icons/filters_type_groups.png
 create mode 100644 Telegram/Resources/icons/filters_type_groups@2x.png
 create mode 100644 Telegram/Resources/icons/filters_type_groups@3x.png
 create mode 100644 Telegram/Resources/icons/filters_type_muted.png
 create mode 100644 Telegram/Resources/icons/filters_type_muted@2x.png
 create mode 100644 Telegram/Resources/icons/filters_type_muted@3x.png
 create mode 100644 Telegram/Resources/icons/filters_type_noncontacts.png
 create mode 100644 Telegram/Resources/icons/filters_type_noncontacts@2x.png
 create mode 100644 Telegram/Resources/icons/filters_type_noncontacts@3x.png
 create mode 100644 Telegram/Resources/icons/filters_type_read.png
 create mode 100644 Telegram/Resources/icons/filters_type_read@2x.png
 create mode 100644 Telegram/Resources/icons/filters_type_read@3x.png

diff --git a/Telegram/Resources/icons/filters_type_archived.png b/Telegram/Resources/icons/filters_type_archived.png
new file mode 100644
index 0000000000000000000000000000000000000000..790d50335ecfb394b84a8e2c2aa962bbd4c80447
GIT binary patch
literal 528
zcmV+r0`L8aP)<h;3K|Lk000e1NJLTq001Na001Ni1^@s6;Q*MJ00004XF*Lt006O%
z3;baP0005UNkl<ZSPAWwJ<kC_5Xb-bM53WmD(Q4uiGoBFz5!aT-god7G#XJT6?&ys
zp_Zt;6R)w)j=0NhSi8qXM0S$R&F;+3{C0M4*8;$J`x^QC8j>4`0aERVsgS9Vssbvz
zIYYiyC?1caQmJ4x8euw}Vm6y$KA&T;SYWwaVzpXfy<TIp*<icfqF%2f8jY$L1iQt1
zT2DtVmqWMPMW@q2tJT8sc)YgL>GV(!1OjL@8b~A($Ye4Y3<g4CSw|bF-|r(9i(P~7
z_j_49VLTFvpx5hRI2<CCN(nYuM;nN?A`}YA;yfLvEewalPkn5oHV|W4J8Q?i`&t&I
zQp@lC_UUvQw0df!zbkK7Xfl~N3~t>Sd_keZp=|sNInr*oSu&ZtwqP*m%q86(Z#J8b
zKPfsnZa!)la&*i2d}ifxS(>C!D6qrf;GQD&eE{kmh%#L+7shYxyF~eXp7DE1fT7NV
z#Imv1fb5LbYSjsx&1Ttdx3f*c_hUemwN|S!g5mF%0O9WV4m2K*-SIu?G}m{aQmNz#
z!tGov7X1gJ6;fa?l_Fn{FiiU`<3Jygw{L2{DGiXSqNYNoLaGX=?B)!qD)bNWOsL-n
SFtK3(0000<MNUMnLSTX~!|Zne

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_archived@2x.png b/Telegram/Resources/icons/filters_type_archived@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..342c6cb553241caba7d775902402b2f9a936081b
GIT binary patch
literal 1052
zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!Ea{HEjtmSN`?>!lvNA9*U-ooy
z45?szJJZ_3*iqoPx?|v?4CM}vE*F6{thra*e1vt5TngK`Y1@XYZX3kb<h*^m<rC|z
zl?fax6j;{QW?%VP_U?0^&55&WGfy8h<UaoPZGCzA^YY^I-PMK+4#gR(92DXf#&rMZ
z&`?kl5t+c0#9^?>jbuuIc}3^Nqfg$x&7Co0Mni;7*jK^+<EL+}S-<}9vuDe0{P<(F
z$hZ3A;?=9U!^6Wr{`n)*-{1f7=~GtK%jeJY%gM<-dh|$X+m<aI{r6LaexLrqxF$+k
zQnK;y-`W>%-jv+BckkYzn>QtEYHJ<s=9izFqQ6(~%AZev|Nh;uaU<h1HH*LTF)<EW
zQ=5(-KfdaC)@6q&b=le4X`3VUBmDgQHtgIPd8Mt8>-e!_AKtz_yScckN-9L<q+Oi1
zxA(mT^XJVgNJwyy;bUBsoR-G6fB$~l>Xh48mz;Z~|MKO_Oyh0;Up{!iFzMuy;vK1z
z(uExhN=jHJPoC_zJ*7H3+xt?><>?w<ebgS`z37&HV%tZLF9P+Rv)7Am*}Ap!zUyqh
z`1tsRd-vX5wyIRN&_OM0O)q=k#AlI{Jku}n__8i(kYMVOsbYEi=8c2WM2+a|K*`L+
z<rf&=zI%7*_wQ;+b}ePyHzHOF``6E#e@&xcA#>K0#anL)#%F~{oj87+ea)IR47&VW
zm!CdOeV7{f@6{`=Gi7dpGjHB%*t*s9#fujjTKu1!O0wcID?k4H*|~V};?mnva&q79
zMjI`7wJq>cdrtdQhCs`;?|^}pU6zoM!67dv_s8eTopR18hw7x*J8X<!tInA<OG~C9
zw635)pm^sTeHo!znYE$WItoRH_VgRf^^4}8@ombx_wQF~&Q@aV*kf{gt%bSyai>?W
zUmxDR+ghwATG6QCgyJpUIrHbQ=UBOYyLf(HUd;Wq=O!|_$X&kQ+1lD_<Y8-T>soy~
zti)&O2}Y&k_4W0Im6bP(*X`ady?*`r+?gU*yHymfJOAo;i`O=GEa_fl=glm1KX8ep
z@!7J&9%)8g&$drqk@<0}#NU$~+N`O!tH1Romp;$b{P5>b%-6+%`OKR<x2e`>yj)zT
zp(^|6&6_o!AFaKfdHdU!N$RtgJ{H(DjopQLF{8QCq!Vrp1sqid4J+cge(v3Co1U2{
z&AaVu#!jbN_Ae2Y7d8HgDnAPJdKAA=<Dg=^h(NKsD9M=wszHGHh5V<GlYh3!`%VI8
OcLq;aKbLh*2~7ZQG3QtS

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_archived@3x.png b/Telegram/Resources/icons/filters_type_archived@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..f20b8b610b9c50d40e977325df4933a2b6188a65
GIT binary patch
literal 1576
zcmb`H`#aMM0LCXavaKg_nGMI~94l?1o!ncd*(%!}b1x;E+!u?;C5jHMhzE(oT#iy4
z%>9~p>^o$H6B08WVY&8{u!C@%-_9S<5AXZ_^7-w3pZ9?SjSN>rDuO^D`1x~0$Ngme
zCk4p9r}?_Q*$+8C0+j#))uchcGr%Aa_``W3!8uZ9g==wc%|@li@AOw2IVC7vj-UdC
z(ovm!lHfuGk?;j%H^k?6^QT;i*!nMl7!0xAK?Q?hS=$VepipR+N1G(C>GsQOW_eW8
zyxF;4l)EX-;M?xz&bLsOFHAxA*%n*ZRwt1|d$L&wLXnmoyny${OgT>P9LyWwDCrnv
z<5J-Iq`Ntn2aHWq5HieAiysK+`?}{Au5U=C$pr=4N(yqUJC2Ty%2N?OK6WW-Y1?XW
zirMO$7sbW4hv4vDE?2Xqtqo%$+}?h<ytI@F27}wDi@z#-z!>|nSd@ao!uvZ>k&y~U
z-q_o*vAva**zu8(S=7vdz5KKGdl?zZHBC)uVP9W3GA=Go@afYFhrbg(e0?%gS=YKF
zl{S@DR;mI3aDY}aaT13+Qn9zQGwS*j^Hl5f!otGp+M08=jl8^kZF4h%I`;ZChjzrd
ze{k?=fFqf7G$K;hd3szb5d3ziUo6hY7#glp?m>ve{<5-T`KF}^P0bX4zxr3n>*h(S
zYHAmno5|UYjixM}&VLpMoOwJRsSg?mSvi4ZzB5Z@h{a+{#PIO2FZ1-3!t`|A(RG&>
zb>-!KPFfT9WLGRIcs$wy2g9B*Ha0$d@xk}8_4NiCAvX4v`=v{7M`P&mzV6}S4Z(XP
zGC4dvu7Xn{KAxX0<$2n<+z<+d)+rL!QOb({Afu|PO3%tlbTLDFePd(8U<7C<|D^{M
zX*}o6reEOffIC8%D)ml!-2=OcIV^;U`uP9q4>>qFImyY*MGiL!haeM<Mzc6pM1(7s
z%gxyWU6)8C6w&4@nJ8et5-ct*I=Xi9T@}0+C2^|`USI-~dP|NStQ>nU@uJ$w`omGJ
z1Swr467lDodg|(M<yQ{+L(Ptn>>i~mXJuuP%440<RyUlb$gv_@_|NN<tM>NE@rtnx
zp@X<9^cwboB_#o`rL{Gqq@;ug^bQVY_w@AC*a=D>CCs<tsn&N;kcyE2`kyzFd4%4+
zzDzQiY{D|(y#?K*W)on0D9HQZkPsgim#i6fXjs_X^z<J!I7kr8%aUhA(nKc7m?7#)
z<CvkahtV@wsZ<KbJh-YQ`^>wQvh~~>q0`pUksT;-dCRV?t)2b+Irz5Q$BI+&x%KVl
zJHsbo2s|Dy?CvIs9QFq_H!wicwCZ>3k_q(4?!qr<K+LatdR_|)3*)oB*z*#}^A>#r
zEQU{YFHDRJKtik;rMH5D%6*O+Z!*2T0fAyrIreTt#qrMec_hSt)SodvH5IIg#$u_w
zsw$5#z_wgYH*e9t=*&ctj7Lu7*!XyW!Y`*zx$r70FIIO(XUc(4i?!qOu>hzp_d7Z!
zCMKLcBCsy&?)13DXWHjghi|dgzL~*f2LdCWIoF{92QT6Nu_V|*m4kd`Z@Rl>h<3FA
z+t+9`x+M4Eadma|vo5K3&<DkhQT}He7`vfs)=Y3bF+OTwv6WM-x&oGTb%BM4tdvxo
zta2HP6CdTQ9^<PUMEF9(ON~v5KY1D%8EJJiHj8!rAuGMhF&UzX`vup$#)pP<&fxKr
zzRT`=MK09ru3w?d84XB{m8E6EphGG>yi7lGK(_LI+YlW3yW|r^_B!4KdIqp1W4PKo
zkyKeK-W(o?LrEVaPQu!!nc7=u23wJDco?-y*YGE_cMc&{FOy=}u8<ow1kj2_f0FAI
zQOOJ7XhB#A6e$H{(!yozul;~vHZ-Y*Ay7D+*{9K+q@-^{IpOyM0Re1V-oO)I4_-{{
Q+rNI$c{>`BXX};lFTcv%j{pDw

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_bots.png b/Telegram/Resources/icons/filters_type_bots.png
new file mode 100644
index 0000000000000000000000000000000000000000..34d2ed00a682157eb7fc616c1e2b70883a965067
GIT binary patch
literal 503
zcmV<T0SNwyP)<h;3K|Lk000e1NJLTq001Na001Ni1^@s6;Q*MJ00004XF*Lt006O%
z3;baP00055Nkl<ZSPAV_F|NWe3{9(lflifB2h@cNaDYyTgRpev2Hb=rbb!JJH(+Du
z6de%w`$Z%wh{oyvDq@JGG->^w{p^|&DW!<l*I4{DN*+RjAnA>S4uuX$9gzHCh6d}<
zWHM3f^;%sn7j?Z}^}-p?;QNo^ufuyqQAEq-lA5NWE`tvkVEe>=VEx5_fJDZss-mJO
zC`l4Z)0F1(IUSEj<JQ<g1@Wt}ohi$*v-;I)rA47r;Pe#b-yxn4od~;>WV6|LV_#zV
z3*w>GNv6}O7PQ@N35iX>_Wf)&(^znf-)9%UL!3lm!A7Hz-cP5K-d&f&;h^1ygBUE{
zMX^3-1-eYWFxnhxJRUnaz~*^w@og^7!g2#l)OOI_Zbw;`bq0oSzuz0`Q!#=ViXH&o
z-Wx~N4*sT~Mejkv(>51pmx(jvA`jvFIzc~Dm33X)S9QPNRUG%L0UTI6j+C==IGOn5
zJD<;XP<;>Jyv7mkpOd=4i^alMhsA;8iuuOpF9>8LK-IU~%_e<4zz579#K=E;7V%N*
tH=!Sp76eI64jl>|k~$#y!wg9s`UL`=rZ?kkAaMWy002ovPDHLkV1jDd=7RtL

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_bots@2x.png b/Telegram/Resources/icons/filters_type_bots@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f37ff794076b3dba76f95df6c7732d0fae022cc
GIT binary patch
literal 1077
zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!Ea{HEjtmSN`?>!lvNA9*zwvZ&
z45?szJ7d3>iJ`!OVtM&RN@7Y?U9IIZ9Q#^0#Ig$icJe1Ark2|^t^LlRRFR|_aU<#n
z$E}FY`hc7xP9man^*8T0t(Km*Y4+^D4r&{6CY}6qQh)Q!H`AsBEzsBGW2%?=d+D#Q
z1B2j7g$5P@#|8m!Hco{m2E}PSLJlm9PCAk*4IE4@5k?*if-D>xQzkGdaR?-xRA6)w
zP&hKlk*Pz$p+mKq!=awja&|>gQP9=brCayxS)(<z>(I9oCp@0K|M)TR?%lg9PoMTK
zt*Kel*VnhmEZU$Y@lR&_jnK7WiS_mJ`}XZSu>C>A700_u$$!6v%FIdI%=!NP`+YH1
z$M){s%XmveLdbr>zkhWZ+i%MXpS#_-?LwO4f**`KAK2L19{l#r>_sidvSrH_tY6RH
z*4DNlZ1urcue4-jWDXoZe!O4i;<NP(E&VOAcJ}s(+1cD}?d>N${rvq8KYX|_S1C*U
z%Z`t!0(q;x&HMc44-Yptw~B<d^|kBQt<B2rOy;_=<0r$z+3K+$3TMuqeVRwTZR@se
z)6B%LUUb(<-}RZ{((_q;qWACI;hA^l-o1H@oc#<hx;go7J!MQ;|LyD7(k-0rzog~m
z+ow+#XBPU!we|I-^xszw2p8?z5~aKJ`{E_pnVFt<@7!?_zxMXgBzqg16?gB(ChvHA
zTHxD)gHHed{J9hH^ybaT!~JcOPi$QGJTd0(lkV>BPQ9>m=g#rO-VXDywrGyg?!6!O
zvZ%0dVjkO7e}8}8zgzUfZQ7iUxe3%>_mcKrBhAdr+$L`;=n%VS!@6X%b$Oo-9(252
zv*>l#@on=L=CVz5G~_zfXL4=(@9N69gOj(##?(Fjx99r<cOUC-TEG50Ha(Yq;m@Bv
z=Qqsj^}G}ueJ196tmof)b~kr-<J;SlrKF{sfB&w&ott!B?8Yz4TQ?UjnY)8&)9;PF
zznvFfY$)0}$44V~b#!e~5>r@M*n@B1zNugCw2i)Tc3J<LFSZ`{KZ(jtSQw$T&~t8A
z*nY!~g%3YTe}7&Yc|&fB`GNmy)f+lQ1stFWYzO1Z>v@lqV*RbS*DXo*xbA$&<D9@P
zk7v7H&p!Ee^If~;Ul#T5dvqiA<B?A?-`@n(%!!GO{hIVH&g{Z;f1k=@8{RsqtE*eh
zOXAwDFZRpW*!aV*U$3SzDmGtW|8>dxVChE5w%*>}2|KG_F5-8y$e7JP;U8a@LSc%~
zEf<Ry&Bc6c8Xg_^D0t)MO~yMu&iC?Gbemle`<y)0f&bqu_e1-4ZrFRYj@yLMWz7->
i5;6^HZc}3T%iMED_v6Q2fl6RGz~JfX=d#Wzp$PzSH2Ew5

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_bots@3x.png b/Telegram/Resources/icons/filters_type_bots@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..afc773a3c86e54081e136405509a34b1adcc8371
GIT binary patch
literal 1712
zcmd5-`!^E`93LxOk9p*k8%Yd#E=-KFv90A1x-+>m+f=w0CDtgJF?m~MYD$DWPF<mu
zSIQ%gSmJujEs<;^N$$mVwdU^b{sH%#`{Vtb^Z9<h=X}oj{_y#p^Zn)q2B0-mjZ^^u
zfClEMPq18L|DlSKyfV+=M&z<13hoaF0GgR<QqoQUKq(621OFjeVYO`3#xufjaB!L#
zxLz%N^}12l!Uk!6^6qb;R?t&?O(KcZ5c^WGhLx2S8%l-`h3Tm2=Sg#HS$p>_C6<3}
zd+wAt+Wu!-#qJFcQQ568ui8gFmM+gVx+RXjdX`vh%hfsm0nta7<$OF<8Ub>2BxfrE
zBZ+-`Ou;wNhQR%c07$z>uc0ACIcG?yJ<y%w=H+M4bW}pUQXrpCVL%+oAgyBV{sOvo
zVmcddLQ*ea1N#K)D*t_iHt+_*uhBO?Jp9ho>}=fB<YcIYg@rg6kB_aXtD8w^Y;5F-
zL{BIb%4r8Q8qFIRxI#I1ZhqK14rt<P#$lC|<SsAAB&4O;>)16p2-5K^$zL@kO20^@
zsSp^<W^QgyN2vQ`uOOrB>TRt<(ry$A)yL;YvOc6?z2c)YRh&D!gHN33mr6S$@C%Fd
zmb?Cf`E!a~E_W9U221c4!vJp?EzJmDi4Hj8cij}$k8*_g`ugI7s8lL%ak2K<9ut$W
z*49@2$sWJvrlzrSH>iut$<@_W{Z7P}<kM8@bP<h4V;UF@fBRTeo0XN-23!&deAGdp
zyvL87Be&0ga;UAXEjX+R&%8%Z=&?{eERED-zbRxg^92F{W5m|VN^AY1ZHSZj(osvZ
z<n*3RcV28D0gx||NEq-Gv^wDH*49`C&`zaJDtBG3J;W0TdBelU-V>4YB9W+{p>)fv
z`6wX)kogqUk-tz^XBiY8Zp=>b_V(`J_wg8?i&Q{FCnu+{i7VOJz)Zc}E;cqcZ^a*=
zA?BbS8xXPMQs&IeOcy!i!iAQ$_VyqIFiyn_>CDjdo1@^2c9x8cjA&QVyNU`6V<_n;
z^RZrKC<IdJ{1c595u<~@<R1{A%692hTxotd=*Q<gderygMP{&C^eJM5LG6PF4~`Y1
z(C8Adg6Ubh`<==oxe)|{xVEJgUTrUPn9e@ZD;A4c;3*#OfPY4i&@Qmf>5Jtb+uPf7
zlVWJ}q);{@>86>P9!KBs=<VtfWl`!A^|x9=u|-TKc8bm$!W13s!c}9sSh=b7>YFbi
zZpP0#JFS?X3JTO~pv7h5H`gxHbTlid_Z5wHjV!+#%@)aEi{1xub*2?V%STUZO$z0^
z5@wbW4|t`&YwC8NT;7zKA9i)cSq_%GzZc=|DGS|e>lnUvr-}m6)6=srF8j9Q2?2|(
zDdvw?si_{rnV+4nAU&#N_{!t%{RZxcl%wkDU&CqjbV^c^H1E6DsNU#_H_wMUey-;l
zr_Ms%C?CmppK~}9IL~H@C5><Bo9CNt?--I+F}GoG701F1CP4xny4DRE8XD|5opD>u
zvpgR7%i3BbCLv~Qr=-#%0Q9cAn>{*uyt%E-s-vUBCn)F|x9!lK{M~Bprc2}F*I(0c
z&p39|-xp~_`Dv}tWh!Vf@>7vL1~az#zA8VrlPR3?;W&X+X6r4D;YsX^0ZOO>(|<b)
z8mWvPr-8Yu`x^tq_aP!Uc8PjKQ5j5|)Tud%HPB;pBBqqF;aamfDP8{1t>bIAQ)kqU
z^bZicswdQn)7<#mVVY7xm99~1S$TPwP$*2`_o^R)!8iifdD5|_8IY6}J?^b4yG=*#
zS0%2jtbp;}g*{c;{npy$=qnTCn3$OQz@$QM)WqkBeNqnS%7VnPBm?or#L&<Swg!kJ
zeXWXi-Q%UYj~pKlGIk!jH*Q2WHX&MDTi4%JupQGi+k>4+PDd8dPmJ~VBcrP|-l8rT
zNtLq6<NM%9J$BBfSRCf*>8URrG4Uw4T3WhWZwcMMvBBAHQu3Q6LEBnd&X7up$=|Z|
z**L4SG76xdV)(+5nocjhlx23EUfE5w&-fqr3!1p#UpXFN1X%up02pL|&qD+;<8Ox3
BE<FGM

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_channels.png b/Telegram/Resources/icons/filters_type_channels.png
new file mode 100644
index 0000000000000000000000000000000000000000..e43f400120f77a879dd012d9e4eb922bef651225
GIT binary patch
literal 454
zcmV;%0XhDOP)<h;3K|Lk000e1NJLTq001Na001Ni1^@s6;Q*MJ00004XF*Lt006O%
z3;baP0004fNkl<ZSPAV_L8^l=5RD(*cjLMX@fcpg!*~FD0k?u{FX2)O1+hZ$3Wd6N
zr$up^1Qn&W8L7W?k%5qwdCYrxP9_Q=1nByi`1=_py$~r#^hKmY(jk!pqP*-O>5#|)
zQU2e0NY`}|1Od6-Zp3w6k&aoOJ+7NAP1C?}94N~YhPdDFYwB+&h8--5qCv-OUvX%h
zAj2>qj$^2*3fi`PT3MEH7rL&S2^s!uF6ekX4z*wIjPzAt1t~p{ZttUM8ltM|TacnC
zOwl5S<uHN1Wg;;cG7JVSi1rPp-p3fUpfpWCCc_p$%?Q&p;dDCj+qKlVd7kq+=ks|f
zjpCq!c>}HibFA<CBWaQ(KpS?fvD@vy^E{~Qdc?3%(UW0z+#H$~v@B~RyI!x0B>Vjy
z!Z73$`*1icVx~1Gzt;<5j?g!Xi(2_CV1%s~#7<+|HWWnxm&;}L$tEYokUwG2gOL(_
wCD7OYD{3f-6eMz5IwTzuIUvf*9uhh900^lm16mxMzyJUM07*qoM6N<$f<Y9)-T(jq

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_channels@2x.png b/Telegram/Resources/icons/filters_type_channels@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..cf380475086ec00dbae5abf2464ca481b4aa172c
GIT binary patch
literal 913
zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!Ea{HEjtmSN`?>!lvNA9*dw9Ay
zhEy=Vo$2q*<S210+%{$U0=~K~n;)WI)EcJ?*!<)@)ExWfLF5Y!EtlA)b#g6zvR|Ye
zAH?oW;rPk!DYAOIWTtp=^!&RrN7t4o6qe7cOuzsA`DU}X6(+vQg$0`x9&CN_{GC1%
z4@X2JqoINW!-+QvY%ClMGi8r7Ffb}?Zk7;GU`QzwU}j=zIK!9Z(7-U^rXvrB0E3Zr
z2O}esLmE4ZrZ3@)Z{NMkN>5LZT72<BTwL6ipp{F0{;dmm_daE3;fqzua{a-ZZ!S4H
z?fmoWf$h}~TAUPDg{|(6>3LnY`>#DCD-+|c9Xl3$|6b1AcJ-vxytcPx0R|FF{FWyl
zJ$&W=dxoo7rot_$vg;T{dfiqAt-NsgvT*P5<lFAsZ!ZneO8qm<XZht+8=qO)40Gqt
zpDk2=>Eo|oSqw!&>c{hJ7c5?^yxjD!MV$T@_d?I*a?4)@|MdFx<cZ6ZZ{@SxrzqvF
zTyrw??ZJZwPkpYmF*2Qa=grEE_H*UZ?UR0bJZ+dGmNIo-+=|OTzgVoUocm3?{>U7)
z4R0Sy3jAo3xUh`zYn5$*clpUvvR^)Yc%a9m5dE~F>!{L>rN2|2p8o8#a6`)4?xhzq
zQl5mYzg~FY4oBntj?j{IHHRXbjvqf>QeN)<x2|5Vwnpp!#<M9#ZWB9Qn(p1ZSMcCE
zhigF3Z}0u*<JUaB^ZM(g8sDs|n{MiyH2fsMZ5zxt(W6C9UViPN{a@EFocEP^l4tky
zHzqQC`$ZSW$Hc|WTA(AQ^-y)PXV%uJsu?eX|FE`x);X8`xXQR8MakUUeA%Lu<8R-t
zeS7H0Io73@Gbg?86}x@)>eRQDISm(|-;!Anp|dUG@|!3f-Y+RR_3z%l57wJL`)%Hd
z@9x*HU*EEQd%AU<HsjkjZ!RPl7&u0inmgIm@o|-zg#EPgP|3QfHn}rQZ@TZU8(S~b
z*v(&gKM&~7_PY!BOFi#cvE#7UV}5>q&xT*mly=TlzPt6+o$RjowGZyAi1M|+{P%C(
zlco<pf6nyt_unqcr&*t<*6?@bwu|=_%qJx~Jcv$qz@7N;q*#Uv>KhN-OaELUe-fC-
O7(8A5T-G@yGywow<f*0r

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_channels@3x.png b/Telegram/Resources/icons/filters_type_channels@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e8d01368cce006e7934a98718479bc44ef20d98
GIT binary patch
literal 1402
zcmc(fjXTo`0LNEPFDzP!=IzK3Mq9VE2y1JMV#jDXJ({1@OvqzGd6}169(D9Gbc-yR
z)hRDw8&2zFu^zVEdAZz%&g`(!%jI#)4CnrdyYKUSzn|}4@VOpNB$$G2z#tIFG$a^L
z+GO&-HQKScw`gbNo7k3s4a0&!t+#d=fbAgA_Cq0fY}A!4@2ll-e~O(H^Onj5AA{KP
zE1W~vUc2%O9<$hNep`p&t~cDp>J_oK2){Ri^!mhJcx$a6_nl8iOHvR@_ePwa@Fth3
z%hP7gP5V8cTjmbkN1+mMcxN@_x^dxQSKs|h4qKr8i%|stvebGDjbZk`(zfeicu96n
zPGU+*8JEkQ|NNQVFO@cQc8)({<yVgpG+(TthtcTo*VgiY%H0r1AQoFlJcnGEV|gJE
z``X*v$pQC7VMJo@GY7iwdOCygYJ8k?<?7W#*3=G0R@P3*Whh^<sMVUI(df*n=t~>x
z>%{=mmQ0}_L?V%=X<FN_sp8_lNi7gt8yj;9g+k12l~Y0USpxoDU~+O27dt%R8e4pA
z-P?161hcodk4Q;rTKMj?F433dXfi01)vvEJFQ%qG)@rq%<PB#X9UL44-QA}o5{dIp
zOEb~Ok00w5>D3e3^pO|u-o{1dWMpKh42FsKmIER~e}8d<zp^y#!|k51WxcT3yH_1t
zb_9)fM<9me#`}bgHw2B1jlo}OPM!Z<Ues(fLW|DKJW|8uk^%#-*<QLiU^C4?hbl+(
zFJEFQGKSiX7pgE>n4gbhxgRA7t;vy*7Ixs$3i^VCJ@&&<pe#UU?4tgQRUkT5cYsj7
zwXzpUbCn>W{iPsOR|yh2TiP=-!)q^neZi^Lt9LXVU;o9Jj!FiA{Y;@7R>8fjo}Fdq
zLW1~wK37?Az&_--L9ahqQ&Uqv1<JV>fWd@~Vf_3!zjZayyPZA4l}hF4@GwrN({a-_
zKWa=Y5S)*h>#Y0pbjLQ!#4|6_tav<Ld_n@j4}+1ev`zVTSM@*AK7I1!hJdH=^zble
z^iX5nZZ-w21t2zxmbw6oV5(B1(Kx|iCn_o{eYlwM@p0%u-arE-CZ;N7ZDnO8K0Y4z
zTrBPb?)W^7Xc-!OiIN$`<>gI=4$#8n=)-r@+dLm1U}2agS=_oe4T_jmq_H=x>cN9s
z_Xro<+}+bEhBz9n_C|Jg_Ky!A7OJlU6P6h(DwUI#iOAY9^{lTiP=9Q=eJi^Jz%1L@
z*@Y)1!G%KMohrHwys5dle?X;K??kwe%33av$>ijNte>kBXf$?R$a3ChRC>L>gCSun
z&P7LaDn#b$d4vIv-)&+7z5Oj>;G47M;0U6`0tSPr78gAyYM<v@jEs!nm|s_qW}5$D
zmMa;xwok%mF&HZAU>~!w_Mc|FJwN4f{AxcDrd#!<=seCvSj=aAVyHm0@qr3(%>B`5
z-I?yh*r`3`RbltR?#Stbfb!xU%KcXcI&LYhhnyprIT`oBzkZv?Qq<+h$nx8W055{Q
zR4V0)>>aIgO(K8sfW!MnM=LtTV$=NPmY~$Z!9kqA&}dK8kbs`!;5zN(a=buZ3oE3q
lQmhIAS@O02OeQjuRS0GKEI89`wR=;hppZZ!z8M!+^bfpAdQ$)Z

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_contacts.png b/Telegram/Resources/icons/filters_type_contacts.png
new file mode 100644
index 0000000000000000000000000000000000000000..1cfb2a57518a49122229b5b16b35ddef4f0299e6
GIT binary patch
literal 372
zcmV-)0gL{LP)<h;3K|Lk000e1NJLTq001Na001Ni1^@s6;Q*MJ00004XF*Lt006O%
z3;baP0003iNkl<ZSPAV_-3f#+436hL=$ns@;0%tSd%1(I;=4G46NnqAPrXD$p@?lF
z2R*KVVB7rk^Gl)u04P*v<mC*K9f${Hs)%REGh|}GWcNMvUkoKl0!`DvIF6gvbq#d(
zROnyE)-ViJ-}g!vIwPAT=N`icLxE*k>R66F*`$EPQ<h~J-gzx|w(E%VR19bshBJ${
zy0dAnms=6N&h-$!n!<@vIAsc_Y*U=F?Tl<v4fa5MxFO;m`WF1RG;tiqkmotjM5SrE
zrJ1G)sG+;AgL$5%sd@D-ibAz*tJZZrzB~GYY~(|}h>ENB0aaD$cN_N<!vV!=YAQn%
zMXXXR%K}thTVXY|q%XKJEQV~~@`)ddp(hvF#(F>|raVKQArk{8yYHc&W9S17nuYLC
SAj7x-0000<MNUMnLSTZ`&!2t(

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_contacts@2x.png b/Telegram/Resources/icons/filters_type_contacts@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c81c14ea88ba5cb172f80797e8bb5c9057401d6
GIT binary patch
literal 699
zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!Ea{HEjtmSN`?>!lvNA9*6?wWi
zhEy=VooU#2$Uwk#?$t03K1bJsiVh|wGMrrJ9R2y#8`@^IF|joDF*j(OtP=1P6sc=6
zl3Vh3+9H<v+rsvBZ#Z4f?YtqcW64ri^eXbNii5)eE*2Mu28IbQ6_}V<8hqFV1r!)k
ztU4MP7!@u%vaoP4%;Zy2a9}u5BEZPV<gl!ngF}G9NEV`HK|cGH43j$*Hf68B-ip<m
zeq8Z-koqlik)OAZKY8)B>f_6juFqW=myW&qH?Q#RgFElP+n8nU-D21#A~&JF<eruK
z($9MY)IH^u)mz!0T%WGP{3G($A8Cg=!8V6Yyi5977idIw{IQIfcz0FY`srQed*gh|
zOrJSE$Tnguv5+~CyZ6-ZzyG!xIrMTaxS11HmG$}Oo|5^itXSgz>^Lia;*9Fg<V73~
zA48cLK4l+KcAlmZ@JVL>Uwgit)2t4^v5YPA`Ltk_*m;4+Gu|XAs)dE}Ffplcaxna2
ztuojdwtDINs88$4cHeC}S|@&jC1CZ{qPc#@OLxa!&)Xim`KHf96?5$gea9Ey&N0i|
z7_sAN(aUYObCuX_mq*X)UsWXQ8VL03<Ci5;^Uptjqc7QN?;S7cd~A~8)_3N{>-eUq
zoJcU}DBm5M$l)q|YKBpnko(6q%pUt5o=gcU*(bk!vc##pON=H`y>|0TZuT917;xFs
zs^L$*UF!3nh1H!)zjmzLoAu-7uWG*VKgr94dODR3tYXX98r68=>d9FfugGnDwJhIy
t(yZp3<)N`9OiVhQ#Kk4H=x4Yf-`cuzN4&z$IACgI@O1TaS?83{1ONkrB3%Fg

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_contacts@3x.png b/Telegram/Resources/icons/filters_type_contacts@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3ac2f12a2609356cf61050b4109bbc14bf19008
GIT binary patch
literal 1223
zcmeAS@N?(olHy`uVBq!ia0vp^IUvlz1|<8_!p{OJmUKs7M+SzC{oH>NS%KU-PZ!6K
z3dXmy?e$FpMUI`{=kaH4hK35)!o>@O*19?F-}{5XuJePahlrEvM2{7kFFH5^F9awm
z{<~9tF719w^VZ@sbMJnB^ZQOp(%E^{?~3Q&m#cn$PNT!agU?KW{a?e2C1*A<v#@;&
zR4`y-E@tr2)9yKNK!#!RX)a|01NH+?HXY*NIm2kMa}6z|&0JecOG`aBMoj7L<+Zf7
zp4{Hvere(QuXFY-H#~dki@kwjztchiF>&$3Z{OywxN72-yp{h|&FNi+iK?Q)X6EME
zg}*-S`*v~PfeRlRwr<_p+T7f%Z*Xbejr;fcXEBRN$!)lL_3D<KRmaw@StAf(Yq#<7
z<HrvlKVGcWu_Zr)?`$al*@?#wtlDtDCO@=!#ZIN!GpqMGMHYNITz`4#&%1Z$ZrQ%w
zUGVpxKRUIwwV%Fx5mAk|o#YVP?(6UG-n{ggR>j%QD+?NU`S{$voAuAR=o+Td!gTHS
z?Px{YbEj>Jjs<?J71K!g{{8#?^Gb(r+7zWt2;QtMvf=gX*RzB-u|1i1dDTIo^Px)N
zozu>D>xNCgZ*6V8&ClK?TW^W#-~B6})NP#3Ba+MWuEfQ}SZ&7qqC$N^9;x!z2OBcK
zeyo#F*z*5lpYfGVb}QH9&(7mIfByXGJ9p;v^!A=SaKJ(H-Lq$Ietv!_)z#74wrx`g
zZ<()tN92H=|Eihw?YCZLqzPm`cT32eTO{P3;ODSpsv`#b`YV^?>r=jb`EugJhYdWu
zyi@!B{i}QV?wy$Jdf)jQ>uYMJJTc7Oxo3}#?DOZ(mww(ab-__xBVqC4#YV=)%9AHg
zHZn9+R904=^rmb^j*ncW_TR%tE?%4{BPVz2-Me*j=FOW`WMXA;Yi)mu(#2w5U*FcJ
zPoEYP76!ikc<9V?)9rl=lb;&4pRjy9droLVdU|?9L<GmlZ9!=g*I14pKfZKhsPnbT
zCs*!^Z@78$W<hCb>Q~FEJy`*|mNVz6uIEpXm6c7bt+n0tF;aMy+SO+qF^?O!ZrReZ
zckkXc_nuvg-@4LG{el#KPG+X2`Q~KRuwIt1xKOpzuOjw6o91p>#qjJ=-HqF~XRFi~
z3EBVI_WgT#W^V4E)YaSxo{>LPLl>T@nizM{^p^KKRkzKX>^fr@s%vZ4p3gDvdE~m7
zJ0Uwe`_rdSlMbG%*}cl_>WhUtfAD=yVCiBL7i~+L#y*$jS!0tUbED*$PXb;EavBmQ
j0y7Tk@Gl(1!hcxRGC3OOX+?blmP`zuu6{1-oD!M<B7`la

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_groups.png b/Telegram/Resources/icons/filters_type_groups.png
new file mode 100644
index 0000000000000000000000000000000000000000..c66addebf32d10ee2586aeaa1c674a9d941cd68c
GIT binary patch
literal 508
zcmV<Y0R#StP)<h;3K|Lk000e1NJLTq001Na001Ni1^@s6;Q*MJ00004XF*Lt006O%
z3;baP0005ANkl<ZSPAV`F{;8q5FNj@rCJJ>9>B&%@B$W=f{kae^cJ2%ixdG{L2Pmb
zMG!2kgaidebbj9AhL{h|u3E@v2iBRLdColFE{QoJ;&^?H{d^6RI}t}nIuWOkQ%F)k
zs=GV%{}syT^E4a|X}jI3g&4U{8s25bYcLpa){wL5Az;nPpwViz%JNY;J)~SNv+w&H
zhN1G<>zbjrBZNU&LrxEyOePQI@pzonG)C}tgr?K!!$541(?ha^(_}S9@OFf1wHohs
zyMz>C<n)l`a+%Z+V6SV2-i{EO7K=sh_xoxgP7msKyL`Ld6e)P@({(A%-2t)toYm`f
zYBU<OSS%<A0;|SWgsRmlwcBlKHk(wbRMeo&W<#^tj6Bby^?I#xrBaEm*DLM!dy1v9
zA_TA~X`xWy(P)$$g*uPS2aX3AU^|@-pU-DLolZQT&pCd0s$({pWkd+i6;lHigFzx~
zQ512n*Asud5uwZFlJ5O91{Q=`t=1nLNTK#@8U6h@9*-byWQW5+;c$muF{?}c$^hH%
y7%61i^c}n-B&p{VatcWbNOgCIoI;WUQvDY-h>Er1SxHd<0000<MNUMnLSTY{$>KTy

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_groups@2x.png b/Telegram/Resources/icons/filters_type_groups@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..114156e547ff75bb975e716bbc744f601c7ba27b
GIT binary patch
literal 984
zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!Ea{HEjtmSN`?>!lvNA9*_j|fH
zhEy=Vow?ha*-_w_dQ#@X-Xuk#jRGzcM4~dKg1vW%Y}@uv`<hmmS(4zzYp2**ws?97
zwuG=v3Hivm=+Q3WJrlh1-tT@=_VJ*OOu6;_GjHCV_sla_>+pE#J*)9R!$G}g`Ake4
zQ<@lr92yuVENx;DP+&+|sldp>!4RqC!NADmFpZ0_RGsjG7(Msr&!2z!@#DsxA2W0J
z@BO&Hc21nLvvXE{zW+?A>^G0A<Z7RlbGNH+-Mu?I>GGz{{`0vDWS@&&xO8dKuRnis
z8VzhW@c;hj<dMht^mC=~WIgNOvlz~vKfk)UnK^Xz)mh^9o6kPUzxYn<!ri;E;vAD3
zYn#QkZQHgiE<S$up&Q4d0(x9$M?2)_=f`pzOWxRCoH%*%<X2Ch9u>KC<;HU3b4mAg
z7wiz-vUziI%VW+r$$}mF(?9nnEeyC&+<&d9MqErRp+H1_hRTtH?moXG-yW~+wzapf
zZcW;=x&LkD_NSY<m*^H|Un>0OxHRY_$1&lqqe<Co7JN*;b%(iY^W?ryvRn4<{kxs9
zvfi=wU68oAxYzunv!>g1Yi_Hoy72e@{-aG|cUQlSf8Siyn)vDe%DE+vs-1qR>2@4Q
zm~e4hZc0jv(M+DRXU|^z^2MZZe)Qst3$nI)JuRB)=jS)8_IC2|v(I@h967?0x;Zi`
zHg@ULr>RmhJo2v|KW;vE?%azPFFN@6`90;mYO}r7CYzX<xplfU$;rvh`gQs8<nzZv
z)xYR2Vt?x?FE1Y+9UcAZ@87$(mwl;u9&zsA&OIN~)6+wj27P?GYwzCB-@kun)z-%P
z`uc9I*(>4w{T@RL?<~LNp?l-L>ni!R7Z>{FpSgH3aH;*IV^gkQzn+zxeE8e?$z=>@
z&zxzQx2tzG6Vv=BmfP7g3kwBZG)jw$7k?>_(>~Vy_H!Qlg^wQ%=Tz+Ho3p#NaQX7(
z2BP&o;bCDlg>NmZDz-6u?4S5x$?wt!ciwW}x^t&z%BxqePKjTir~GR3*7??L?d@M@
z<VB^w13J%xd1=r}kGe#^YYeTtpMq~4aQO4|==l$Ot76ZcvnYA?Y;VAnvdT)yqq<kz
z`=l0DbgT&#ka&Ln6cfjvmn;()m{=NgL{%CX7!|x(ITaijP6RnJaR@MM3L#pG(INh-
Xmccyh4XI~=S(U-l)z4*}Q$iB}o`1!!

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_groups@3x.png b/Telegram/Resources/icons/filters_type_groups@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..fcaffe853fceb48b581b6904ce80f7bf5d66baf3
GIT binary patch
literal 1712
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
RJ=?4xfQQQwOr29$#y`BtDVqQQ

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_muted.png b/Telegram/Resources/icons/filters_type_muted.png
new file mode 100644
index 0000000000000000000000000000000000000000..92e3b1adc70b7559fb98d11171307b0e7050f54e
GIT binary patch
literal 576
zcmV-G0>Ax<P)<h;3K|Lk000e1NJLTq001Na001Ni1^@s6;Q*MJ00004XF*Lt006O%
z3;baP0005^Nkl<ZSPAWxy{-XK5XaXoRT`DV0}vGrg-9eqh(w~05aKH#Aqs_PcmVI=
z8N7tjJ5XtSe+~bM-EghD$93%`*-4I-o!K)#|Cu?<BuNsT*4x<E+mM_=3?QwF7z!B*
zX(^!P|NI{EdcBgv;n4b_Px*0D3$O8bOv~kxLZOiAGk(9H>h-#+PcV--3^ptli*z^~
zXti2VBoetwTq>1lx7!iS>2zNC1Yz*ZV?c<{=kv7R?-?o<i*e#kr^6ufhsWd54+v1%
zY?h(c>opAq1DQj)>J9{`bUMu?LJ7Z{E<l+~hK9o-jYcC@2vDh1N)<{Mpy_m~2!S3#
zF99l<Ox{500;JHKzo1m*a+#qLi3Dx8Tb@9;{{;w%0ad9~7%Co*(`K{bd);pL^-~6b
zdseH}7$6#rG89T$C=`AJC4LTJ#DB6zqrm{-aF|c?%aWqk1eb6i^?E(!B)$jMY&JPD
zUM-8og3DK}Rz+bDCk}*Iv)N1*i$z)OcKe2{)oL+7Fc_rye9nHkqyqUK15(>Cm&@^l
zU6Q$6E`|yO0yLY=*yZ#2M3j0S2$1L-IWe+djy*v7{XW@jHvNDA1&GOH!hK`6+eMPA
z#r%yzaw)A=E4kfnwM0VqOy`YGm-n#G|4;pD9Sw!F6gCtx6w*>a%YOu?(!>=}(J%!7
O0000<MNUMnLSTY6Ed4P6

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_muted@2x.png b/Telegram/Resources/icons/filters_type_muted@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..1dd51e26ca14bbec1a864b48acdee59f205f6ccc
GIT binary patch
literal 1318
zcma)+e^Al~0L4L32sN-2O`XB|MuK^jS(zgOCKIC>qTaRTu8>oldW4vyphjY)S;;uF
z+>o@$R18zJrR&P&k4t1YoQG&?8EURZnjj{Y&HmpX`{TWL@9zEi?o+~uiSmH^!9gI9
zM>H*xxt6rgg1N4Ff<+Ux77z~kTQUgLT;}$H<+4`Cqa(@jIbciWv*10kUY$#mrO>T`
zQ?g?+;F?nT@WFIJ3BQynqcc~X=K>!tLzPoKDuR@T+YuBEYmWk!-Z)aKbjv9Nx@P_U
zl--*}!~0iS>=PQ}T%%@K=LcoGmzQnl!rr%Uy4E!Z0nksp0ra|JG^zMDG@1kfQ??(V
zIeiI3CjCv`fFz5Nbc9R{b1FJ2ltLnr=<Y!YfGz}KDgptpCj{2aLumW^*;cDHBQH-*
zrBXd#o8m6*|B-dWY-Th1jYd>=cXv*H$eA-|iZ5NV39G1r5{U$^kjv}x<coIu-tL~B
z+>8vNFamvadsbE!(${zP-RLJL29@eUAQB@y;vWl6pT-c0im<SQ2REzL>Y-$PM@`My
zM2@HLVnosb*i|YGfk4P>L?V$?Dy_z|>iqrvJx*jw-oE8_C6=C@UGhP|Jc5FQB`YhU
z^@FRcL;#C@?OnLKT96|WnP(cRHoL(v-abBE<KtCnDh-i9C{ikcZNP;tutXw}Cq7>`
zh>=Vd3o|w`!56TVbUIyPFvN1l8m(q92AH0Jak<>^l|_!%wxLsx{G{{#RF~o!onGIv
zu)wb+@%zf>Eosl{--U>gV*Zh?Lv;Gc;$mA>j_;{uwr?|!RFc?u|9-`}^XEGRUjzoG
z%#x3yP^jyCo~FJYhYASzCqQGqhSA{<6$l$uDtZ?GL;6ebWoVn-Z)9YImz%qMau9mA
zi71(en#<c79&0pa<6-wj--WhetyWuDTI%*|di?KYV5Q%by0`A!zOwIWm6esef`Yf)
zlB^HIAWFI?GdX!H6t`uIvtF+sqc{@8QYYe5<IoUK%8ZMfwAqHd2AiCVyc7yWwOV~e
zQZADv(XPH2tEs_o74{wYx{w*^H|&SFfq?<W@#6!VZph{CQBhH2duKD({xC)$pBPFv
zIU|`lxw&U+Yq1HtIF}JEP$)D2(80^g%XwA^r3HcZW~QeHa|pGOJNMiSNr`130TGx2
zYierx(`f7^Kbi8wj<mXb;yQwYKr&yF<4*QnmZH^@DH44JUH4b3!=IrEO5FwQ5@WGg
z!sPs9fDSJZ2>8+@HXFS0(`XXPC8P*&Wkg0obUIzCWxoEhR45dN(+mc~z4rD#3ukRm
z2)Ifc5@|G8H?ApnEZ^1DHT>)GY=^@UPSet9CX?w!E!!)D%bl627v|kWxjo(36A=+1
z$0#&LrKB&<Qt&=BGe5uTmlCNhmhoHf1^bdS<+iG!!M#0AzpxaOoxKN&BM<_NM&pC}
zoKABAv2*7!HiDFTI40)Gkt0?Xi*>J~LreZyE)UyneA9fA-i{}^Cue5<G(9sDI{k-=
zY&VD(Yy)sO+@#fBOdlN_l&L<BoF9(A>IVNo!s%aF2z}+5_UhK1<?3qmti^J!q5?H<
zwQ3GUHTOE;aec8}He0K<C*jRpY2Ntr(ri1V$Q1&Cbec@p-PQ*_y3VjZ2@jqb^+6VP
z4jXcAg@=YZIbe40>VP?)Sp0W7m<fNe68C<by#e{ojYj$(Y_R<oR$e}4d<@%%vZsC~
OA}E>~6RD=0DEt?gRbE^G

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_muted@3x.png b/Telegram/Resources/icons/filters_type_muted@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f0f81dbb4e36ed1580fcb9f10f1134d49996e96
GIT binary patch
literal 2101
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

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_noncontacts.png b/Telegram/Resources/icons/filters_type_noncontacts.png
new file mode 100644
index 0000000000000000000000000000000000000000..213633ac0ba338618801089897a2c0a455aa2701
GIT binary patch
literal 573
zcmV-D0>b@?P)<h;3K|Lk000e1NJLTq001Na001Ni1^@s6;Q*MJ00004XF*Lt006O%
z3;baP0005>Nkl<ZSPAWxu?oU45Qbwx2X`k2aq<a#5C_4<HxTI)I64Rl_8mHj;?l+0
z!NC_0tPkL(PHM}UKeUTYlW0Xc^dPj&UGBbIl1odBG2$&ZV&#S;0x5uWD^g^r$dE1r
zI{jCBs9Y|yZnw)^*JX#pf!%I5(eREw=wS1$pfDP@PNzf1<B@a%8`ys0JF+!{u`G)w
zlZlQap~o1E{Q%4i=o^@r4r6}`gw&_WZnvY+Xheg-fE>r6%jF_9{b2dj8RDBWb<fP_
z^Tf>S^*Wu;=L8h?6nq(EN)5zMOu{)jp3f&$t5p$TI2_Vuv!O<#A->1sv2+Z4Wd`EM
zSnB+Gz0!0#6^$QzVbkyTML^rOrDNbLGZ3#WQs?iTr_+gQwVDX%dEUEPe8X2}pm_Gu
z2vH}p)oQgwFl_ELfv>*+0Rn+~y&i>On8rf@&kSU;WbJla1oC}96$T2ECDYzz`~99z
zN-fLfl5rT;Y&MmKCcd;l>-Ab01j^NF#duL<kH<r4YvKzIl<TT0j97;I{Z5riMflim
zx9F0}&k7@eRaXb1FBS`$&1Mt?ffNRvKf5~O4Cd-`1yt^SKjKUw^||;#i-GXOM#n{o
zy9u=g6&MZg=!4GiW=|ZbQWS_k@*&zf^l!`pNSE;<Lq&#k8PMrpVI5iU7?JS900000
LNkvXXu0mjfbm0WS

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_noncontacts@2x.png b/Telegram/Resources/icons/filters_type_noncontacts@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1f7695b67c5230298febe9ab8fccec2f3e29622
GIT binary patch
literal 1252
zcmV<A1RMK_P)<h;3K|Lk000e1NJLTq002k;002k`1^@s6RqeA!00004XF*Lt006O%
z3;baP000D=Nkl<ZcmeI2J4-Av6vwmc6?|f6A&P~s#!j#ntZWo5{Q_2Eqm_lAqKycG
zA3ziYwX(3a5=2BBwXhHc@qre;3T-qu|BEwhW@hi%JZ9Z{Ie}p(Ig^t!zno-plFbMq
zq`EleA&|{e&c)vZ7!ctK42S^{1PC#E5Cb9z5MuTq21F1b#Oy%~h#)|S*@GAmL4Xjm
z2QeUm03l`%A^`m&<f(~UT3W=wz<}uL>JkkN4dI0bZ*OnI>*(l6Y;SLii;IiYY@rlm
z!>lM*eSN*0o}QK`CnwT0p$_UoN3rbvZYO;>H8nMIYHCWpy}g-oi9HV;&;^}E0+lYH
zp`jspe}5l)QP%?Kgzh3hN(WFTlljxrUteFYEb`WeZg>;gN)eQQK$Vr1a&vPt?~C~s
zpe?kS5+uKX(3{1C6Tn8BDS47#Kydk=N@zO;FY*Tnlcvj@^YHK>)w)OC+}v2{LE9-z
z+<pMzvupFUIy*a){r&y2uC7k&eatC6Jw0-7Z_mgfVT0!-fFD3MLu-D1UY3=WX<(9u
z$mr;(5hTw;%^eU{x2B80-Q8W8&1OkB0Wgz^AGUa0ak~SWnVB)_VLaT?(V@X9FE5v4
zV`Fk{ZB0&2PRgpPDox(n+G^AW!jb^4<F7lQ)6-KU<DZ_MV#Y5nE^0cKmzT9?@Ci5Z
zQp9eKV1oK?fK*hjy;vccgM$O9B6#h(zP{F~0($fX4-XHuXQ&Kpi|R1VJMRZ!%fd8u
zcXtc*Dc7#X#zsxe)zy`jN2a#6Hdgkx0vp?+`kVn_KPQc}zP_%hZE9)~?d|Pa8I|#2
zn=>G6cKJ?f{t;0?YT_1Z9x`gmmu*ht^!)ssnhK2MOG`^Jdj<ywtyb2sO%Zjy+!UC6
zStwGgtE;hqv$wZbetdjTRTJf~?Y{wpI4l}&^!4@0_xJb2moKF7_4U;mkn<db4R#-C
zYimoqyu5^}+S=O0#>R%IsHh0bOmFV)?o6x1o-Y|d`}_NvaT600#-DXffy(&kypjR*
z`1q*3pNizQyiLXjAm?*2oLdbK58K$U)tQ~0731UMVOeu?b9iri1KWHgr-{ra)F@<v
z_3@04Py>LS0HMCkL0}ZX=jW%~+1ZgRD=RV@mqni~BwsSYDga??!8NJ4DeS1~>S}p>
zeC(vMq_#V3Hq3J0UY)y#Z~~7W85zla#OU7VhMDtMOudj$i#)Nguz*{uq&CN5ahBRw
zw$g=4umv{xO0nKkijB)`H|+!0n46mm_oq8MJEdCW1tO#0lHIfiRM%sl=jUg6d3h-@
zVcVpVKK2Q`&gOK(21ZgH&!-u|C^8>T0gR+yK6)--e&Rnb6aWdH1ebR?icT6vxn<Ce
zHqcg*H+w4cJH(<!VdAzqlFkK@bPt^=oWm!9P8Se>VF`eq_Obg29nj_Z{5=UwP?kQR
zz^kz0#wn~#?1nl&@h46k6M$6FlZv$eiN68=7@(r}h-HIbVlm6M|A}f0i0CE;#DE9_
zgqS^u0TBcUF?$dLA_x#-_8<mC5Fo_tK@5l>K#19c7!W~#5VHpnfPMoWW2IRG=8UNT
O0000<MNUMnLSTY~-$v~K

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_noncontacts@3x.png b/Telegram/Resources/icons/filters_type_noncontacts@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..f5a58c2693a711478fc616b384a1dd93ba44c12f
GIT binary patch
literal 1951
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
BtKI+r

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_read.png b/Telegram/Resources/icons/filters_type_read.png
new file mode 100644
index 0000000000000000000000000000000000000000..689da4ca766231dd4f6c30bf3caef608c9abf0cc
GIT binary patch
literal 672
zcmV;R0$=@!P)<h;3K|Lk000e1NJLTq001Na001Ni1^@s6;Q*MJ00004XF*Lt006O%
z3;baP00074Nkl<ZSPAWxP3tjH6u|F1Jv*ULC}GD!Stzy^7M5(}Lr7WJ_yEe6uv22M
zl#MKu6;VpWN?t+=Svk*~+ut<vXXai#v#^+{Y3`iY-<*5znJW-NK)k=^`tvm;KOhDW
zYetL;85LqxfTjPsHT0K7tfmizLL{5bl0+gw{C+>N*=*!^Jd)LFMLL}hsn_ddGMT8k
zYs#@xbKfqP3!2R)JRT3wx=@dHX#YukB;|I9#bU78Y_vFDbZC!$ALQW!3I>C4I2>LQ
z@(9om{W+o7K!PAZzu)J{t!jh*7>5Ij4U|r&RTI5aEEWq0hr{sOFO^E^1Jr0V-sOEO
zo6Tn6@px$BXf&#@!8p29Xt`V}0;|1Dr&Dmd-83n#ne}?DFvU2!0Nw9*Mc_)M0=Zlc
zZnv8xACJf2bUJB5u}8h#jTlE4pxtgKCB}i+2x;JWJPw!31%|^RI2;Zt!?m;D?-lmX
z7i<B#0Cl_FXH5F+^?G17n`v-dCt{bT<47c;*%~m8E<lAsK>>s>xQ(q=tCRr2PN&n0
zom`O5=Oud$F!r{`YP_3<!C(MBpAVABB%IG@dG41nPM7=x{tF15Gnvdwl1~KauK^*~
zu`Bcp^m{Gw0u_rzc|z8h56EOP!S#COWuSKW55sQ#{2<OJA5ghmmSC{|RI61OjYg78
zJ`m4AP%4$cVzGP*1Huor_)xzBfdFZ@+hjhUlUA!mYPA~KZnxAyJns;%*GuenI}vvo
zJ)nsTSUng+!v(~Mp{x4q&eR4FYkrLi85LqxfTjPsHS`Y<2n$XcvByUM0000<MNUMn
GLSTYWtSh7d

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_read@2x.png b/Telegram/Resources/icons/filters_type_read@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..f874a3c28454b62b657c522afcf6e6e788a9da90
GIT binary patch
literal 1420
zcmV;71#|j|P)<h;3K|Lk000e1NJLTq002k;002k`1^@s6RqeA!00004XF*Lt006O%
z3;baP000F;Nkl<ZcmeI2ODKIo9LMK+<&nISR|us%HWp$*5sJdXMoIE08y1wZuu*oh
zvLY#>NEFGtM2g75v)CvluY@FTe*gL1{^xd&<IbFW@0{CR%+zVlJ-?aXe1D(&JCB)j
zOoR}in=Cd6c-S~D5C1110dZ160+N6@1UP1yK@t#$0LLsdNCM&z;Fx6wNkAL|9J9<I
z35Y|0W0n~t0dWX$%rb){APxbJS!NIikQc{ps5w17os^W6kgTjM5)~CiA|fJ4WMrgy
z%<JoGa&vP-uCA`g_VzYeSXdxOM@NS0vE>|>TwS)s#l=ByZ!cV2T!6g=`(WSL*jSh8
zMQAP=EIvLS`uqFg{r%luE}Hh}1AU=S7w9)0P<?$pyu7?<0(JHP`b6IbLoyCfKtKQt
z4-Y%bf!iO)z_APhWegyHe}CB8+TsQ$ssWCLV;TTSJRmPGFPNX77Ztm1KR70iEf|t`
zK!byWx`Ptk5XW|FKt)AGqGPt(A8HT?Nn8ebdwavl$%)+oiSB?JP>Uc);sCX@w1|#X
z<FBWu2ZDoxAt50F*4EZEcI5zSaXUZ<2M3BiL+bYSc2&?xNl7-xK`m|tC^a?JrdSb%
z*49={z;xcmbe)otqUqxRG%=@GXJ;o<tfR)CpC4#yYSIL1GMQj#Xo%?+H8}v}cONl;
zrl+TwVjVFeoW{n+-+}?*^!4>|U7{wp0kpfj%N1--gYWNesH>~f1nA-60eYXaP?OsL
zqH8zI_&+{AU|?VXy1TpK_V$+9_Ur2ls;jFt!FhUm!pO)7v#+(0t|@7JH~>t{DfagE
zX01)LUsY9Q5gQW|WAl0G^YarbD=RH+m4I*xF+M)7@yj~!`ueKzqxiF<76a(~{G6o~
z0s{k8V(|`ie0;3xgIQKlQK4#wf#5^m)YO!!t)3reXJ;B;c7Rd(iUGu%xtErfDg#>T
z@bGZh-`_XKii==nWn~td5{QqF56sNW=;5Jhv%bEr@u&E;qZR{bY-~&;(E7mL-5q3P
zWM~A3g@wW9<|fd!X^qX-*Vn04fzi=XjZZtkD1F5Ms;Q~5=JDtL{rx>;W@ah_GiyIT
zKUiK~{?m`%gSEA_%rSJr5(6kSG!*de!z+)EkC2_6%@mHSgR85nJXcIRp0YtfLCkSn
z3J3>VTwG*|R*X+iPmq(7^QU;cm~U)sC`}!%@w%lG0I!{x3_>yV{g&>4o}Zr~KR;h3
z4*zky9*HQqxw$IePQVfe2t`azPU?;i-%2z$Hv^uYd3kxTx3{OeFRP)Ti?ae)ETF{1
zM0j|3VCgs1hNmxmOREGYq81AXv#7YZ7;rA->Vh|k^73*KP^^832ZWG}TK-@`Z)j++
z4ot|tVPAL9+d1XrnnIUFNLyPQp|gBL1{6Y?DpUDcT3TZL*}`l%V=pKuP>uati<7_A
zfjQ~SEHpVe8E~=7=rT7q2RP{!p_$=BJRo~+^^QQK-wJV`#u)+I3sfwi!ootEG2{Cx
zoYm70r=X*w19o<HbY&W5Bd!j1b#?tY;S~r&1JCr|Ijx*8At52;@bHk(1u=^=db=kp
zD=UPq1d@q~2|{nh78~wFM@N&iv@~;#`}n09U2`^nU4~zo;YL9cx(cc4=c*q<Kf%L0
z30?Fue=c`=dP?Ym7@3`&H3w@epv%ikf}6V*p&8_^K{}($u;(CWM7dL635fG=NI()0
zhXBVcGe`pB5a5_)21!610vxl<API;=fMb>!Bmr><aLh7;Bp?m}j#*}q1jHf0G0P0%
a0Qv_qWVihE7)s6n0000<MNUMnLSTZA?}e!V

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/filters_type_read@3x.png b/Telegram/Resources/icons/filters_type_read@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2a8feea1010a3a69f5d0db8a70c9f326874a668
GIT binary patch
literal 2180
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

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings
index f3f815b62..7984173cc 100644
--- a/Telegram/Resources/langs/lang.strings
+++ b/Telegram/Resources/langs/lang.strings
@@ -2240,14 +2240,18 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 "lng_filters_recommended" = "Recommended";
 "lng_filters_recommended_add" = "Add";
 "lng_filters_restore" = "Undo";
-"lng_filters_new" = "New folder";
+"lng_filters_new" = "New Folder";
+"lng_filters_edit" = "Edit Folder";
 "lng_filters_new_name" = "Folder name";
 "lng_filters_add_chats" = "Add chats";
-"lng_filters_include" = "Include";
+"lng_filters_include" = "Included Chats";
 "lng_filters_include_about" = "Choose chats and types of chats that will appear in this folder.";
-"lng_filters_exclude" = "Exclude";
+"lng_filters_exclude" = "Excluded Chats";
 "lng_filters_exclude_about" = "Choose chats and types of chats that will never appear in this folder.";
+"lng_filters_create_button" = "Create";
 "lng_filters_add_title" = "Add Chats";
+"lng_filters_include_title" = "Include Chats";
+"lng_filters_exclude_title" = "Exclude Chats";
 "lng_filters_edit_types" = "Chat types";
 "lng_filters_edit_chats" = "Chats";
 "lng_filters_include_contacts" = "Contacts";
@@ -2260,6 +2264,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 "lng_filters_exclude_archived" = "Archived";
 "lng_filters_add" = "Done";
 "lng_filters_limit" = "Sorry, you have reached folders limit.";
+"lng_filters_empty" = "Please choose at least one chat for this folder.";
+"lng_filters_default" = "Please change at least one rule for this folder.";
+"lng_filters_type_contacts" = "Contacts";
+"lng_filters_type_non_contacts" = "Non-Contacts";
+"lng_filters_type_groups" = "Groups";
+"lng_filters_type_channels" = "Channels";
+"lng_filters_type_bots" = "Bots";
+"lng_filters_type_no_archived" = "No Archived";
+"lng_filters_type_no_muted" = "No Muted";
+"lng_filters_type_no_read" = "No Read";
 
 // Wnd specific
 
diff --git a/Telegram/SourceFiles/boxes/manage_filters_box.cpp b/Telegram/SourceFiles/boxes/manage_filters_box.cpp
index b0726e85e..3f194157d 100644
--- a/Telegram/SourceFiles/boxes/manage_filters_box.cpp
+++ b/Telegram/SourceFiles/boxes/manage_filters_box.cpp
@@ -10,14 +10,18 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "data/data_session.h"
 #include "data/data_chat_filters.h"
 #include "data/data_folder.h"
+#include "data/data_peer.h"
+#include "history/history.h"
 #include "main/main_session.h"
 #include "window/window_session_controller.h"
 #include "window/window_controller.h"
 #include "ui/layers/generic_box.h"
 #include "ui/widgets/labels.h"
 #include "ui/widgets/buttons.h"
+#include "ui/widgets/input_fields.h"
 #include "ui/text/text_utilities.h"
 #include "ui/wrap/slide_wrap.h"
+#include "ui/painter.h"
 #include "settings/settings_common.h"
 #include "lang/lang_keys.h"
 #include "apiwrap.h"
@@ -25,11 +29,72 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "styles/style_layers.h"
 #include "styles/style_boxes.h"
 #include "styles/style_chat_helpers.h"
+#include "styles/style_window.h"
 
 namespace {
 
 constexpr auto kRefreshSuggestedTimeout = 7200 * crl::time(1000);
 constexpr auto kFiltersLimit = 10;
+constexpr auto kMaxFilterTitleLength = 20;
+
+using namespace Settings;
+
+using Flag = Data::ChatFilter::Flag;
+using Flags = Data::ChatFilter::Flags;
+using ExceptionPeersRef = const base::flat_set<not_null<History*>> &;
+using ExceptionPeersGetter = ExceptionPeersRef(Data::ChatFilter::*)() const;
+
+constexpr auto kAllTypes = {
+	Flag::Contacts,
+	Flag::NonContacts,
+	Flag::Groups,
+	Flag::Channels,
+	Flag::Bots,
+	Flag::NoMuted,
+	Flag::NoArchived,
+	Flag::NoRead
+};
+
+class FilterChatsPreview final : public Ui::RpWidget {
+public:
+	FilterChatsPreview(
+		not_null<QWidget*> parent,
+		Flags flags,
+		const base::flat_set<not_null<History*>> &peers);
+
+	[[nodiscard]] rpl::producer<Flag> flagRemoved() const;
+	[[nodiscard]] rpl::producer<not_null<History*>> peerRemoved() const;
+
+	int resizeGetHeight(int newWidth) override;
+
+private:
+	using Button = base::unique_qptr<Ui::IconButton>;
+	struct FlagButton {
+		Flag flag = Flag();
+		Button button;
+	};
+	struct PeerButton {
+		not_null<History*> history;
+		Button button;
+	};
+
+	void paintEvent(QPaintEvent *e) override;
+
+	void setup(
+		Flags flags,
+		const base::flat_set<not_null<History*>> &peers);
+	void refresh();
+	void removeFlag(Flag flag);
+	void removePeer(not_null<History*> history);
+	void paintFlagIcon(QPainter &p, int left, int top, Flag flag) const;
+
+	std::vector<FlagButton> _removeFlag;
+	std::vector<PeerButton> _removePeer;
+
+	rpl::event_stream<Flag> _flagRemoved;
+	rpl::event_stream<not_null<History*>> _peerRemoved;
+
+};
 
 class FilterRowButton final : public Ui::RippleButton {
 public:
@@ -43,6 +108,7 @@ public:
 		const QString &description);
 
 	void setRemoved(bool removed);
+	void updateData(const Data::ChatFilter &filter);
 
 	[[nodiscard]] rpl::producer<> removeRequests() const;
 	[[nodiscard]] rpl::producer<> restoreRequests() const;
@@ -57,6 +123,7 @@ private:
 
 	FilterRowButton(
 		not_null<QWidget*> parent,
+		Main::Session *session,
 		const Data::ChatFilter &filter,
 		const QString &description,
 		State state);
@@ -67,6 +134,8 @@ private:
 	void setState(State state, bool force = false);
 	void updateButtonsVisibility();
 
+	Main::Session *_session = nullptr;
+
 	Ui::IconButton _remove;
 	Ui::RoundButton _restore;
 	Ui::RoundButton _add;
@@ -101,10 +170,16 @@ private:
 
 [[nodiscard]] int ComputeCount(
 		not_null<Main::Session*> session,
-		const Data::ChatFilter &filter) {
+		const Data::ChatFilter &filter,
+		bool check = false) {
 	const auto &list = session->data().chatsFilters().list();
 	const auto id = filter.id();
-	if (ranges::contains(list, id, &Data::ChatFilter::id)) {
+	const auto i = ranges::find(list, id, &Data::ChatFilter::id);
+	if (i != end(list)
+		&& (!check
+			|| (i->flags() == filter.flags()
+				&& i->always() == filter.always()
+				&& i->never() == filter.never()))) {
 		const auto chats = session->data().chatsFilters().chatsList(id);
 		return chats->indexed()->size();
 	}
@@ -113,19 +188,188 @@ private:
 
 [[nodiscard]] QString ComputeCountString(
 		not_null<Main::Session*> session,
-		const Data::ChatFilter &filter) {
-	const auto count = ComputeCount(session, filter);
+		const Data::ChatFilter &filter,
+		bool check = false) {
+	const auto count = ComputeCount(session, filter, check);
 	return count
 		? tr::lng_filters_chats_count(tr::now, lt_count_short, count)
 		: tr::lng_filters_no_chats(tr::now);
 }
 
+FilterChatsPreview::FilterChatsPreview(
+	not_null<QWidget*> parent,
+	Flags flags,
+	const base::flat_set<not_null<History*>> &peers)
+: RpWidget(parent) {
+	setup(flags, peers);
+}
+
+void FilterChatsPreview::setup(
+		Flags flags,
+		const base::flat_set<not_null<History*>> &peers) {
+	const auto makeButton = [&](Fn<void()> handler) {
+		auto result = base::make_unique_q<Ui::IconButton>(
+			this,
+			st::windowFilterSmallRemove);
+		result->setClickedCallback(std::move(handler));
+		return result;
+	};
+	for (const auto flag : kAllTypes) {
+		if (flags & flag) {
+			_removeFlag.push_back({
+				flag,
+				makeButton([=] { removeFlag(flag); }) });
+		}
+	}
+	for (const auto history : peers) {
+		_removePeer.push_back({
+			history,
+			makeButton([=] { removePeer(history); }) });
+	}
+	refresh();
+}
+
+void FilterChatsPreview::refresh() {
+	resizeToWidth(width());
+}
+
+int FilterChatsPreview::resizeGetHeight(int newWidth) {
+	const auto right = st::windowFilterSmallRemoveRight;
+	const auto add = (st::windowFilterSmallItem.height
+		- st::windowFilterSmallRemove.height) / 2;
+	auto top = 0;
+	const auto moveNextButton = [&](not_null<Ui::IconButton*> button) {
+		button->moveToRight(right, top + add, newWidth);
+		top += st::windowFilterSmallItem.height;
+	};
+	for (const auto &[flag, button] : _removeFlag) {
+		moveNextButton(button.get());
+	}
+	for (const auto &[history, button] : _removePeer) {
+		moveNextButton(button.get());
+	}
+	return top;
+}
+
+[[nodiscard]] QString TypeName(Flag flag) {
+	switch (flag) {
+	case Flag::Contacts: return tr::lng_filters_type_contacts(tr::now);
+	case Flag::NonContacts:
+		return tr::lng_filters_type_non_contacts(tr::now);
+	case Flag::Groups: return tr::lng_filters_type_groups(tr::now);
+	case Flag::Channels: return tr::lng_filters_type_channels(tr::now);
+	case Flag::Bots: return tr::lng_filters_type_bots(tr::now);
+	case Flag::NoMuted: return tr::lng_filters_type_no_muted(tr::now);
+	case Flag::NoArchived: return tr::lng_filters_type_no_archived(tr::now);
+	case Flag::NoRead: return tr::lng_filters_type_no_read(tr::now);
+	}
+	Unexpected("Flag in TypeName.");
+}
+
+void FilterChatsPreview::paintEvent(QPaintEvent *e) {
+	auto p = Painter(this);
+	auto top = 0;
+	const auto &st = st::windowFilterSmallItem;
+	const auto iconLeft = st.photoPosition.x();
+	const auto iconTop = st.photoPosition.y();
+	const auto nameLeft = st.namePosition.x();
+	p.setFont(st::windowFilterSmallItem.nameStyle.font);
+	const auto nameTop = st.namePosition.y();
+	for (const auto &[flag, button] : _removeFlag) {
+		paintFlagIcon(p, iconLeft, top + iconTop, flag);
+
+		p.setPen(st::contactsNameFg);
+		p.drawTextLeft(nameLeft, top + nameTop, width(), TypeName(flag));
+		top += st.height;
+	}
+	for (const auto &[history, button] : _removePeer) {
+		history->peer->paintUserpicLeft(
+			p,
+			iconLeft,
+			top + iconTop,
+			width(),
+			st.photoSize);
+		history->peer->nameText().drawLeftElided(
+			p,
+			nameLeft,
+			top + nameTop,
+			button->x() - nameLeft,
+			width());
+		top += st.height;
+	}
+}
+
+void FilterChatsPreview::paintFlagIcon(
+		QPainter &p,
+		int left,
+		int top,
+		Flag flag) const {
+	const auto &color = [&]() -> const style::color& {
+		switch (flag) {
+		case Flag::Contacts: return st::historyPeer4UserpicBg;
+		case Flag::NonContacts: return st::historyPeer7UserpicBg;
+		case Flag::Groups: return st::historyPeer2UserpicBg;
+		case Flag::Channels: return st::historyPeer1UserpicBg;
+		case Flag::Bots: return st::historyPeer6UserpicBg;
+		case Flag::NoMuted: return st::historyPeer6UserpicBg;
+		case Flag::NoArchived: return st::historyPeer4UserpicBg;
+		case Flag::NoRead: return st::historyPeer7UserpicBg;
+		}
+		Unexpected("Flag in color paintFlagIcon.");
+	}();
+	const auto &icon = [&]() -> const style::icon& {
+		switch (flag) {
+		case Flag::Contacts: return st::windowFilterTypeContacts;
+		case Flag::NonContacts: return st::windowFilterTypeNonContacts;
+		case Flag::Groups: return st::windowFilterTypeGroups;
+		case Flag::Channels: return st::windowFilterTypeChannels;
+		case Flag::Bots: return st::windowFilterTypeBots;
+		case Flag::NoMuted: return st::windowFilterTypeNoMuted;
+		case Flag::NoArchived: return st::windowFilterTypeNoArchived;
+		case Flag::NoRead: return st::windowFilterTypeNoRead;
+		}
+		Unexpected("Flag in icon paintFlagIcon.");
+	}();
+	const auto size = st::windowFilterSmallItem.photoSize;
+	const auto rect = QRect(left, top, size, size);
+	auto hq = PainterHighQualityEnabler(p);
+	p.setBrush(color->b);
+	p.setPen(Qt::NoPen);
+	p.drawEllipse(rect);
+	icon.paintInCenter(p, rect);
+}
+
+void FilterChatsPreview::removeFlag(Flag flag) {
+	const auto i = ranges::find(_removeFlag, flag, &FlagButton::flag);
+	Assert(i != end(_removeFlag));
+	_removeFlag.erase(i);
+	refresh();
+	_flagRemoved.fire_copy(flag);
+}
+
+void FilterChatsPreview::removePeer(not_null<History*> history) {
+	const auto i = ranges::find(_removePeer, history, &PeerButton::history);
+	Assert(i != end(_removePeer));
+	_removePeer.erase(i);
+	refresh();
+	_peerRemoved.fire_copy(history);
+}
+
+rpl::producer<Flag> FilterChatsPreview::flagRemoved() const {
+	return _flagRemoved.events();
+}
+
+rpl::producer<not_null<History*>> FilterChatsPreview::peerRemoved() const {
+	return _peerRemoved.events();
+}
+
 FilterRowButton::FilterRowButton(
 	not_null<QWidget*> parent,
 	not_null<Main::Session*> session,
 	const Data::ChatFilter &filter)
 : FilterRowButton(
 	parent,
+	session,
 	filter,
 	ComputeCountString(session, filter),
 	State::Normal) {
@@ -135,15 +379,17 @@ FilterRowButton::FilterRowButton(
 	not_null<QWidget*> parent,
 	const Data::ChatFilter &filter,
 	const QString &description)
-: FilterRowButton(parent, filter, description, State::Suggested) {
+: FilterRowButton(parent, nullptr, filter, description, State::Suggested) {
 }
 
 FilterRowButton::FilterRowButton(
 	not_null<QWidget*> parent,
+	Main::Session *session,
 	const Data::ChatFilter &filter,
 	const QString &status,
 	State state)
 : RippleButton(parent, st::defaultRippleAnimation)
+, _session(session)
 , _remove(this, st::filtersRemove)
 , _restore(this, tr::lng_filters_restore(), st::stickersUndoRemove)
 , _add(this, tr::lng_filters_recommended_add(), st::stickersTrendingAdd)
@@ -155,6 +401,14 @@ void FilterRowButton::setRemoved(bool removed) {
 	setState(removed ? State::Removed : State::Normal);
 }
 
+void FilterRowButton::updateData(const Data::ChatFilter &filter) {
+	Expects(_session != nullptr);
+
+	_title.setText(st::contactsNameStyle, filter.title());
+	_status = ComputeCountString(_session, filter, true);
+	update();
+}
+
 void FilterRowButton::setState(State state, bool force) {
 	if (!force && _state == state) {
 		return;
@@ -292,13 +546,15 @@ void ManageFiltersPrepare::showBox() {
 }
 
 void ManageFiltersPrepare::showBoxWithSuggested() {
-	_window->window().show(Box(CreateBox, _window, _suggested));
+	_window->window().show(Box(SetupBox, _window, _suggested));
 }
 
-void ManageFiltersPrepare::CreateBox(
+void ManageFiltersPrepare::SetupBox(
 		not_null<Ui::GenericBox*> box,
 		not_null<Window::SessionController*> window,
 		const std::vector<Suggested> &suggestions) {
+	box->setTitle(tr::lng_filters_title());
+
 	struct FilterRow {
 		not_null<FilterRowButton*> button;
 		Data::ChatFilter filter;
@@ -306,11 +562,9 @@ void ManageFiltersPrepare::CreateBox(
 		bool added = false;
 	};
 
-	box->setTitle(tr::lng_filters_title());
-
 	const auto session = &window->session();
 	const auto content = box->verticalLayout();
-	Settings::AddSubsectionTitle(content, tr::lng_filters_subtitle());
+	AddSubsectionTitle(content, tr::lng_filters_subtitle());
 
 	const auto rows = box->lifetime().make_state<std::vector<FilterRow>>();
 	const auto find = [=](not_null<FilterRowButton*> button) {
@@ -319,8 +573,14 @@ void ManageFiltersPrepare::CreateBox(
 		return &*i;
 	};
 	const auto countNonRemoved = [=] {
+	};
+	const auto showLimitReached = [=] {
 		const auto removed = ranges::count_if(*rows, &FilterRow::removed);
-		return rows->size() - removed;
+		if (rows->size() < kFiltersLimit + removed) {
+			return false;
+		}
+		window->window().showToast(tr::lng_filters_limit(tr::now));
+		return true;
 	};
 	const auto wrap = content->add(object_ptr<Ui::VerticalLayout>(content));
 	const auto addFilter = [=](const Data::ChatFilter &filter) {
@@ -333,11 +593,27 @@ void ManageFiltersPrepare::CreateBox(
 		}, button->lifetime());
 		button->restoreRequests(
 		) | rpl::start_with_next([=] {
-			if (countNonRemoved() < kFiltersLimit) {
-				button->setRemoved(false);
-				find(button)->removed = false;
+			if (showLimitReached()) {
+				return;
 			}
+			button->setRemoved(false);
+			find(button)->removed = false;
 		}, button->lifetime());
+		button->setClickedCallback([=] {
+			const auto found = find(button);
+			if (found->removed) {
+				return;
+			}
+			const auto doneCallback = [=](const Data::ChatFilter &result) {
+				find(button)->filter = result;
+				button->updateData(result);
+			};
+			window->window().show(Box(
+				EditBox,
+				window,
+				found->filter,
+				crl::guard(button, doneCallback)));
+		});
 		rows->push_back({ button, filter });
 	};
 	const auto &list = session->data().chatsFilters().list();
@@ -345,11 +621,24 @@ void ManageFiltersPrepare::CreateBox(
 		addFilter(filter);
 	}
 
-	Settings::AddButton(
+	AddButton(
 		content,
 		tr::lng_filters_create() | Ui::Text::ToUpper(),
-		st::settingsUpdate);
-	Settings::AddSkip(content);
+		st::settingsUpdate
+	)->setClickedCallback([=] {
+		if (showLimitReached()) {
+			return;
+		}
+		const auto doneCallback = [=](const Data::ChatFilter &result) {
+			addFilter(result);
+		};
+		window->window().show(Box(
+			EditBox,
+			window,
+			Data::ChatFilter(),
+			crl::guard(box, doneCallback)));
+	});
+	AddSkip(content);
 	const auto emptyAbout = content->add(
 		object_ptr<Ui::SlideWrap<Ui::FlatLabel>>(
 			content,
@@ -365,24 +654,15 @@ void ManageFiltersPrepare::CreateBox(
 			object_ptr<Ui::VerticalLayout>(content))
 	)->setDuration(0);
 	const auto aboutRows = nonEmptyAbout->entity();
-	Settings::AddDividerText(aboutRows, tr::lng_filters_about());
-	Settings::AddSkip(aboutRows);
-	Settings::AddSubsectionTitle(aboutRows, tr::lng_filters_recommended());
+	AddDividerText(aboutRows, tr::lng_filters_about());
+	AddSkip(aboutRows);
+	AddSubsectionTitle(aboutRows, tr::lng_filters_recommended());
 
+	const auto changed = box->lifetime().make_state<bool>();
 	const auto suggested = box->lifetime().make_state<rpl::variable<int>>();
 	for (const auto &suggestion : suggestions) {
-		const auto filter = suggestion.filter;
-		const auto already = [&] {
-			for (const auto &entry : list) {
-				if (entry.flags() == filter.flags()
-					&& entry.always() == filter.always()
-					&& entry.never() == filter.never()) {
-					return true;
-				}
-			}
-			return false;
-		}();
-		if (already) {
+		const auto &filter = suggestion.filter;
+		if (ranges::contains(list, filter)) {
 			continue;
 		}
 		*suggested = suggested->current() + 1;
@@ -392,6 +672,9 @@ void ManageFiltersPrepare::CreateBox(
 			suggestion.description));
 		button->addRequests(
 		) | rpl::start_with_next([=] {
+			if (showLimitReached()) {
+				return;
+			}
 			addFilter(filter);
 			*suggested = suggested->current() - 1;
 			delete button;
@@ -427,15 +710,19 @@ void ManageFiltersPrepare::CreateBox(
 	const auto save = [=] {
 		auto ids = prepareGoodIdsForNewFilters();
 
-		auto requests = std::deque<MTPmessages_UpdateDialogFilter>();
+		using Requests = std::vector<MTPmessages_UpdateDialogFilter>;
+		auto addRequests = Requests(), removeRequests = Requests();
 		auto &realFilters = session->data().chatsFilters();
 		const auto &list = realFilters.list();
 		auto order = QVector<MTPint>();
 		for (const auto &row : *rows) {
 			const auto id = row.filter.id();
 			const auto removed = row.removed;
-			if (removed
-				&& !ranges::contains(list, id, &Data::ChatFilter::id)) {
+			const auto i = ranges::find(list, id, &Data::ChatFilter::id);
+			if (removed && i == end(list)) {
+				continue;
+			} else if (!removed && i != end(list) && *i == row.filter) {
+				order.push_back(MTP_int(id));
 				continue;
 			}
 			const auto newId = ids.take(id).value_or(id);
@@ -447,9 +734,9 @@ void ManageFiltersPrepare::CreateBox(
 				MTP_int(newId),
 				tl);
 			if (removed) {
-				requests.push_front(request);
+				removeRequests.push_back(request);
 			} else {
-				requests.push_back(request);
+				addRequests.push_back(request);
 				order.push_back(MTP_int(newId));
 			}
 			realFilters.apply(MTP_updateDialogFilter(
@@ -460,12 +747,13 @@ void ManageFiltersPrepare::CreateBox(
 				tl));
 		}
 		auto previousId = mtpRequestId(0);
+		auto &&requests = ranges::view::concat(removeRequests, addRequests);
 		for (auto &request : requests) {
 			previousId = session->api().request(
 				std::move(request)
 			).afterRequest(previousId).send();
 		}
-		if (!order.isEmpty()) {
+		if (!order.isEmpty() && !addRequests.empty()) {
 			realFilters.apply(
 				MTP_updateDialogFilterOrder(MTP_vector(order)));
 			session->api().request(MTPmessages_UpdateDialogFiltersOrder(
@@ -474,6 +762,148 @@ void ManageFiltersPrepare::CreateBox(
 		}
 		box->closeBox();
 	};
-	box->addButton(tr::lng_settings_save(), save);
-	box->addButton(tr::lng_cancel(), [=] { box->closeBox(); });
+	box->boxClosing() | rpl::start_with_next(save, box->lifetime());
+	box->addButton(tr::lng_about_done(), [=] { box->closeBox(); });
 }
+
+void SetupChatsPreview(
+		not_null<Ui::VerticalLayout*> content,
+		not_null<Data::ChatFilter*> data,
+		Flags flags,
+		ExceptionPeersGetter peers) {
+	const auto preview = content->add(object_ptr<FilterChatsPreview>(
+		content,
+		data->flags() & flags,
+		(data->*peers)()));
+
+	preview->flagRemoved(
+	) | rpl::start_with_next([=](Flag flag) {
+		*data = Data::ChatFilter(
+			data->id(),
+			data->title(),
+			(data->flags() & ~flag),
+			data->always(),
+			data->never());
+	}, preview->lifetime());
+
+	preview->peerRemoved(
+	) | rpl::start_with_next([=](not_null<History*> history) {
+		auto always = data->always();
+		auto never = data->never();
+		always.remove(history);
+		never.remove(history);
+		*data = Data::ChatFilter(
+			data->id(),
+			data->title(),
+			data->flags(),
+			std::move(always),
+			std::move(never));
+	}, preview->lifetime());
+}
+
+void ManageFiltersPrepare::EditBox(
+		not_null<Ui::GenericBox*> box,
+		not_null<Window::SessionController*> window,
+		const Data::ChatFilter &filter,
+		Fn<void(const Data::ChatFilter &)> doneCallback) {
+	const auto creating = filter.title().isEmpty();
+	box->setTitle(creating ? tr::lng_filters_new() : tr::lng_filters_edit());
+
+	const auto content = box->verticalLayout();
+	const auto name = content->add(
+		object_ptr<Ui::InputField>(
+			box,
+			st::defaultInputField,
+			tr::lng_filters_new_name(),
+			filter.title()),
+		st::markdownLinkFieldPadding);
+	name->setMaxLength(kMaxFilterTitleLength);
+
+	const auto data = box->lifetime().make_state<Data::ChatFilter>(filter);
+
+	constexpr auto kTypes = Flag::Contacts
+		| Flag::NonContacts
+		| Flag::Groups
+		| Flag::Channels
+		| Flag::Bots;
+	constexpr auto kExcludeTypes = Flag::NoMuted
+		| Flag::NoArchived
+		| Flag::NoRead;
+
+	box->setFocusCallback([=] {
+		name->setFocusFast();
+	});
+
+	AddSkip(content);
+	AddDivider(content);
+	AddSkip(content);
+	AddSubsectionTitle(content, tr::lng_filters_include());
+
+	SetupChatsPreview(
+		content,
+		data,
+		kTypes,
+		&Data::ChatFilter::always);
+
+	AddButton(
+		content,
+		tr::lng_filters_add_chats() | Ui::Text::ToUpper(),
+		st::settingsUpdate
+	)->setClickedCallback([=] {
+	});
+
+	AddSkip(content);
+	AddDividerText(content, tr::lng_filters_include_about());
+	AddSkip(content);
+
+	AddSubsectionTitle(content, tr::lng_filters_exclude());
+
+	SetupChatsPreview(
+		content,
+		data,
+		kExcludeTypes,
+		&Data::ChatFilter::never);
+
+	AddButton(
+		content,
+		tr::lng_filters_add_chats() | Ui::Text::ToUpper(),
+		st::settingsUpdate
+	)->setClickedCallback([=] {
+	});
+	AddSkip(content);
+	content->add(
+		object_ptr<Ui::FlatLabel>(
+			content,
+			tr::lng_filters_exclude_about(),
+			st::boxDividerLabel),
+		st::settingsDividerLabelPadding);
+
+	const auto save = [=] {
+		const auto title = name->getLastText().trimmed();
+		if (title.isEmpty()) {
+			name->showError();
+			return;
+		} else if (!(data->flags() & kTypes) && data->always().empty()) {
+			window->window().showToast(tr::lng_filters_empty(tr::now));
+			return;
+		} else if ((data->flags() == (kTypes | Flag::NoArchived))
+			&& data->always().empty()
+			&& data->never().empty()) {
+			window->window().showToast(tr::lng_filters_default(tr::now));
+			return;
+		}
+		const auto result = Data::ChatFilter(
+			data->id(),
+			title,
+			data->flags(),
+			data->always(),
+			data->never());
+		box->closeBox();
+
+		doneCallback(result);
+	};
+	box->addButton(
+		creating ? tr::lng_filters_create_button() : tr::lng_settings_save(),
+		save);
+	box->addButton(tr::lng_cancel(), [=] { box->closeBox(); });
+}
\ No newline at end of file
diff --git a/Telegram/SourceFiles/boxes/manage_filters_box.h b/Telegram/SourceFiles/boxes/manage_filters_box.h
index 1b4bd94e5..9900927e5 100644
--- a/Telegram/SourceFiles/boxes/manage_filters_box.h
+++ b/Telegram/SourceFiles/boxes/manage_filters_box.h
@@ -34,10 +34,15 @@ private:
 	};
 
 	void showBoxWithSuggested();
-	static void CreateBox(
+	static void SetupBox(
 		not_null<Ui::GenericBox*> box,
 		not_null<Window::SessionController*> window,
 		const std::vector<Suggested> &suggested);
+	static void EditBox(
+		not_null<Ui::GenericBox*> box,
+		not_null<Window::SessionController*> window,
+		const Data::ChatFilter &filter,
+		Fn<void(const Data::ChatFilter &)> doneCallback);
 
 	const not_null<Window::SessionController*> _window;
 	const not_null<ApiWrap*> _api;
diff --git a/Telegram/SourceFiles/data/data_chat_filters.cpp b/Telegram/SourceFiles/data/data_chat_filters.cpp
index 7dfe88416..c015de468 100644
--- a/Telegram/SourceFiles/data/data_chat_filters.cpp
+++ b/Telegram/SourceFiles/data/data_chat_filters.cpp
@@ -40,11 +40,11 @@ ChatFilter ChatFilter::FromTL(
 		const auto flags = (data.is_contacts() ? Flag::Contacts : Flag(0))
 			| (data.is_non_contacts() ? Flag::NonContacts : Flag(0))
 			| (data.is_groups() ? Flag::Groups : Flag(0))
-			| (data.is_broadcasts() ? Flag::Broadcasts : Flag(0))
+			| (data.is_broadcasts() ? Flag::Channels : Flag(0))
 			| (data.is_bots() ? Flag::Bots : Flag(0))
 			| (data.is_exclude_muted() ? Flag::NoMuted : Flag(0))
 			| (data.is_exclude_read() ? Flag::NoRead : Flag(0))
-			| (data.is_exclude_archived() ? Flag::NoArchive : Flag(0));
+			| (data.is_exclude_archived() ? Flag::NoArchived : Flag(0));
 		auto &&to_histories = ranges::view::transform([&](
 				const MTPInputPeer &data) {
 			const auto peer = data.match([&](const MTPDinputPeerUser &data) {
@@ -87,11 +87,11 @@ MTPDialogFilter ChatFilter::tl() const {
 		| ((_flags & Flag::Contacts) ? TLFlag::f_contacts : TLFlag(0))
 		| ((_flags & Flag::NonContacts) ? TLFlag::f_non_contacts : TLFlag(0))
 		| ((_flags & Flag::Groups) ? TLFlag::f_groups : TLFlag(0))
-		| ((_flags & Flag::Broadcasts) ? TLFlag::f_broadcasts : TLFlag(0))
+		| ((_flags & Flag::Channels) ? TLFlag::f_broadcasts : TLFlag(0))
 		| ((_flags & Flag::Bots) ? TLFlag::f_bots : TLFlag(0))
 		| ((_flags & Flag::NoMuted) ? TLFlag::f_exclude_muted : TLFlag(0))
 		| ((_flags & Flag::NoRead) ? TLFlag::f_exclude_read : TLFlag(0))
-		| ((_flags & Flag::NoArchive)
+		| ((_flags & Flag::NoArchived)
 			? TLFlag::f_exclude_archived
 			: TLFlag(0));
 	auto always = QVector<MTPInputPeer>();
@@ -147,7 +147,7 @@ bool ChatFilter::contains(not_null<History*> history) const {
 			return Flag::Groups;
 		} else if (const auto channel = peer->asChannel()) {
 			if (channel->isBroadcast()) {
-				return Flag::Broadcasts;
+				return Flag::Channels;
 			} else {
 				return Flag::Groups;
 			}
@@ -162,7 +162,7 @@ bool ChatFilter::contains(not_null<History*> history) const {
 		|| ((_flags & flag)
 			&& (!(_flags & Flag::NoMuted) || !history->mute())
 			&& (!(_flags & Flag::NoRead) || history->unreadCountForBadge())
-			&& (!(_flags & Flag::NoArchive)
+			&& (!(_flags & Flag::NoArchived)
 				|| (history->folderKnown() && !history->folder())))
 		|| _always.contains(history);
 }
@@ -172,9 +172,9 @@ ChatFilters::ChatFilters(not_null<Session*> owner) : _owner(owner) {
 	//const auto all = Flag::Contacts
 	//	| Flag::NonContacts
 	//	| Flag::Groups
-	//	| Flag::Broadcasts
+	//	| Flag::Channels
 	//	| Flag::Bots
-	//	| Flag::NoArchive;
+	//	| Flag::NoArchived;
 	//_list.push_back(
 	//	ChatFilter(1, "Unmuted", all | Flag::NoMuted, {}, {}));
 	//_list.push_back(
diff --git a/Telegram/SourceFiles/data/data_chat_filters.h b/Telegram/SourceFiles/data/data_chat_filters.h
index ca9735200..7e6b2775d 100644
--- a/Telegram/SourceFiles/data/data_chat_filters.h
+++ b/Telegram/SourceFiles/data/data_chat_filters.h
@@ -25,11 +25,11 @@ public:
 		Contacts    = 0x01,
 		NonContacts = 0x02,
 		Groups      = 0x04,
-		Broadcasts  = 0x08,
+		Channels    = 0x08,
 		Bots        = 0x10,
 		NoMuted     = 0x20,
 		NoRead      = 0x40,
-		NoArchive   = 0x80,
+		NoArchived  = 0x80,
 	};
 	friend constexpr inline bool is_flag_type(Flag) { return true; };
 	using Flags = base::flags<Flag>;
@@ -64,6 +64,17 @@ private:
 
 };
 
+inline bool operator==(const ChatFilter &a, const ChatFilter &b) {
+	return (a.title() == b.title())
+		&& (a.flags() == b.flags())
+		&& (a.always() == b.always())
+		&& (a.never() == b.never());
+}
+
+inline bool operator!=(const ChatFilter &a, const ChatFilter &b) {
+	return !(a == b);
+}
+
 class ChatFilters final {
 public:
 	explicit ChatFilters(not_null<Session*> owner);
diff --git a/Telegram/SourceFiles/storage/localstorage.cpp b/Telegram/SourceFiles/storage/localstorage.cpp
index 26ef1bf9f..7fb7c92e1 100644
--- a/Telegram/SourceFiles/storage/localstorage.cpp
+++ b/Telegram/SourceFiles/storage/localstorage.cpp
@@ -1173,14 +1173,6 @@ bool _readSetting(quint32 blockId, QDataStream &stream, int version, ReadSetting
 		if (!_checkStreamStatus(stream)) return false;
 
 		Global::SetDialogsFiltersEnabled(enabled == 1);
-		auto mode = FilterId(0);
-		if (enabled) {
-			mode = FilterId(modeInt);
-			if (mode == 1) { // #TODO filters
-
-			}
-		}
-		Global::SetDialogsFilterId(mode);
 	} break;
 
 	case dbiModerateMode: {
diff --git a/Telegram/SourceFiles/window/window.style b/Telegram/SourceFiles/window/window.style
index bbbd6c1fd..aaabe5800 100644
--- a/Telegram/SourceFiles/window/window.style
+++ b/Telegram/SourceFiles/window/window.style
@@ -299,6 +299,23 @@ windowFiltersCustom: SideBarButton(windowFiltersButton) {
 windowFiltersSetup: SideBarButton(windowFiltersButton) {
 	icon: icon {{ "filters_setup", sideBarIconFg }};
 }
+windowFilterSmallItem: PeerListItem(defaultPeerListItem) {
+	height: 44px;
+	photoPosition: point(15px, 5px);
+	namePosition: point(62px, 14px);
+	photoSize: 34px;
+}
+windowFilterSmallRemove: IconButton(notifyClose) {
+}
+windowFilterSmallRemoveRight: 10px;
+windowFilterTypeContacts: icon {{ "filters_type_contacts", historyPeerUserpicFg }};
+windowFilterTypeNonContacts: icon {{ "filters_type_noncontacts", historyPeerUserpicFg }};
+windowFilterTypeGroups: icon {{ "filters_type_groups", historyPeerUserpicFg }};
+windowFilterTypeChannels: icon {{ "filters_type_channels", historyPeerUserpicFg }};
+windowFilterTypeBots: icon {{ "filters_type_bots", historyPeerUserpicFg }};
+windowFilterTypeNoMuted: icon {{ "filters_type_muted", historyPeerUserpicFg }};
+windowFilterTypeNoArchived: icon {{ "filters_type_archived", historyPeerUserpicFg }};
+windowFilterTypeNoRead: icon {{ "filters_type_read", historyPeerUserpicFg }};
 
 // Mac specific
 
diff --git a/Telegram/SourceFiles/window/window_controller.cpp b/Telegram/SourceFiles/window/window_controller.cpp
index 766d25a2f..b754c9a2f 100644
--- a/Telegram/SourceFiles/window/window_controller.cpp
+++ b/Telegram/SourceFiles/window/window_controller.cpp
@@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "main/main_account.h"
 #include "ui/layers/box_content.h"
 #include "ui/layers/layer_widget.h"
+#include "ui/toast/toast.h"
 #include "window/window_session_controller.h"
 #include "window/themes/window_theme.h"
 #include "window/themes/window_theme_editor.h"
@@ -80,6 +81,10 @@ void Controller::showSettings() {
 	_widget.showSettings();
 }
 
+void Controller::showToast(const QString &text) {
+	Ui::Toast::Show(_widget.bodyWidget(), text);
+}
+
 void Controller::showBox(
 		object_ptr<Ui::BoxContent> content,
 		Ui::LayerOptions options,
diff --git a/Telegram/SourceFiles/window/window_controller.h b/Telegram/SourceFiles/window/window_controller.h
index 289d6d390..75953a07c 100644
--- a/Telegram/SourceFiles/window/window_controller.h
+++ b/Telegram/SourceFiles/window/window_controller.h
@@ -52,6 +52,7 @@ public:
 		showBox(std::move(content), options, animated);
 		return result;
 	}
+	void showToast(const QString &text);
 
 	void showRightColumn(object_ptr<TWidget> widget);
 	void sideBarChanged();
diff --git a/Telegram/SourceFiles/window/window_filters_menu.cpp b/Telegram/SourceFiles/window/window_filters_menu.cpp
index 844bb2604..7e9bd6141 100644
--- a/Telegram/SourceFiles/window/window_filters_menu.cpp
+++ b/Telegram/SourceFiles/window/window_filters_menu.cpp
@@ -37,11 +37,11 @@ enum class Type {
 	const auto all = Flag::Contacts
 		| Flag::NonContacts
 		| Flag::Groups
-		| Flag::Broadcasts
+		| Flag::Channels
 		| Flag::Bots;
 	const auto removed = Flag::NoRead | Flag::NoMuted;
 	const auto people = Flag::Contacts | Flag::NonContacts;
-	const auto allNoArchive = all | Flag::NoArchive;
+	const auto allNoArchive = all | Flag::NoArchived;
 	if (!filter.always().empty()
 		|| !filter.never().empty()
 		|| !(filter.flags() & all)) {
@@ -52,7 +52,7 @@ enum class Type {
 		return Type::People;
 	} else if ((filter.flags() & all) == Flag::Groups) {
 		return Type::Groups;
-	} else if ((filter.flags() & all) == Flag::Broadcasts) {
+	} else if ((filter.flags() & all) == Flag::Channels) {
 		return Type::Channels;
 	} else if ((filter.flags() & all) == Flag::Bots) {
 		return Type::Bots;