diff --git a/docs/en_US/editgrid.rst b/docs/en_US/editgrid.rst
index 1cb23cf..b8b58e5 100644
--- a/docs/en_US/editgrid.rst
+++ b/docs/en_US/editgrid.rst
@@ -46,16 +46,19 @@ Hover over an icon to display a tooltip that describes the icon's functionality.
 |                      |                                                                                                   |             |
 |                      |  Use options on the *Filter* menu to quick-sort or quick-filter the data set:                     |             |
 |                      |                                                                                                   |             |
-|                      |    * Filter: This option opens a dialog that allows you to define a filter.  A filter is a        |             |
+|                      |    * SQL Filter: This option opens a dialog that allows you to define a filter.  A filter is a    |             |
 |                      |      condition that is supplied to an arbitrary WHERE clause that restricts the result set.       |             |
 |                      |                                                                                                   |             |
-|                      |    * Remove Filter: This option removes all selection / exclusion filter conditions.              |             |
+|                      |    * Data Sorting: This option allows user to sort their data as per respective columns order     |             |
+|                      |      using data sorting dialog.                                                                   |             |
 |                      |                                                                                                   |             |
 |                      |    * By Selection: This option refreshes the data set and displays only those rows whose          |             |
 |                      |      column value matches the value in the cell currently selected.                               |             |
 |                      |                                                                                                   |             |
 |                      |    * Exclude Selection: This option refreshes the data set and excludes those rows whose          |             |
 |                      |      column value matches the value in the cell currently selected.                               |             |
+|                      |                                                                                                   |             |
+|                      |    * Remove Filter: This option removes any existing filter conditions.                           |             |
 +----------------------+---------------------------------------------------------------------------------------------------+-------------+
 | *No limit*           | Use the *No limit* drop-down listbox to specify how many rows to display in the output panel.     |             |
 |                      | Select from: *No limit* (the default), *1000 rows*, *500 rows*, or *100 rows*.                    |             |
@@ -95,6 +98,20 @@ To delete a row, press the *Delete* toolbar button.  A popup will open, asking y
 
 To commit the changes to the server, select the *Save* toolbar button.  Modifications to a row are written to the server automatically when you select a different row.
 
+**The Data Sorting dialog**
+
+.. image:: images/editgrid_data_sorting_dialog.png
+    :alt: Edit grid data sorting dialog
+
+Provide information about the data sorting in the edit grid window:
+
+To add new column for data sorting, click on the [+] icon.
 
+* Use the drop-down *Column* to select the column you want to sort.
+* Use the drop-down *Order* to select the sort order for the column.
 
+To discard newly added or an existing row(s) from the grid, click the trash icon.
 
+* Click the *Help* button (?) to access online help.
+* Click the *Ok* button to save work.
+* Click the *Close* button to discard current changes and close the dialog.
\ No newline at end of file
diff --git a/docs/en_US/images/editgrid_data_sorting_dialog.png b/docs/en_US/images/editgrid_data_sorting_dialog.png
new file mode 100644
index 0000000000000000000000000000000000000000..4db53dbe0fc6be9b3e2168646b2add7f0f4f8701
GIT binary patch
literal 42262
zcmZ^~19WBEwk{l1Y}<BHu`9N1R&3k0Qx#QIv2AC?tk|~gmwnECduQMG|EsmMwle2H
z#~2-7?<-thRtydr8yW}*2u?y=SP=*a1ONmCTnh>Q@uauB#TW<(7TsJ(NM1rnh)~|a
z_Pe>22@sHYcycO)a^es=V4sF6h%`w6EI()s>`=wxfRGT+Du^^l-VhQDjk~63LsK59
zJE9_DVGd+avzjK-uf0QEUPA)|hD~{m6!@muc7oe>{0BqlO7s1=?_T=jI4qC_J#IAz
zh6)6soHAuN44iR6{_kq>SRjx=0W?H^qEIbD_^{|`kazX9Rll_=?fS(1C)3V%O%}Ho
z5PBeS+8tP3V0MHnA|N~73Ux(Dpd8R8nL><+-52zl6fkHoKk<}WfuSddarv6S9txru
zI8I0)=H%XZNT6RM*R>H%AZelWAt!`eP$F^cLU+60?cL%`;s86lGJ$2H!B)waI{4kb
zJENFGLz|GI>YV5zL=aFgea#s^-uIne&J$8;@XmU{R4r0SX=VAobJ%h_{uUX=vJi`j
zV9qrnv=r<h+@X5e^`el%PT|;DAEDFl<ph-mlJD9E6A=t?3}-Ij3<nlE>5Hc{%;CqT
zqlJ~j+=3mdYsz^sL+T{t@JXwE*i;bW#E5jr3w1a8%}9#NtZjafvsD&kTp)WR9nVOG
z&5Y+D_D$AnC+<CPi`M0)DpnYqV%`e;(fT(jsqA6k;SL&XEKKdb11h!?;WNf}vLGs>
zYE++Zl7Fh$@cAj#i-ET<MZ$%CGBve;Y=;<*^fgxty)B6P*qCKFWL3X@5xMNG)(N)r
zr`iYhOd1OhQ#k^xg~J%3BrVzD3Inr2g3uBMvw}*4E($EHE&qXer_vGxf)Muuy6|6(
zGvOfCm?93CaFd693+jXTLSpY9p~^=YaK}KRx;q1JOsyG-ip04=wZo&0aNpm4N%?RS
zItz8*#T&Y<ZqeJ092owskI@iv%0n0eqhvf-1tiF~(L0iqhs+5XAE^SxIB1y=x#4Ov
zZ5LXEghUEN4pk%MO%5$Z+(&*KWZNHhAQ(299#r%m_IU$czMcj@>{;Mdo_oCS)(`It
zL=4&Qxx2bq@c16OfP}hZY&Z6G=+>KmfQWlF<cuqy*hrY)v+o!{dvd-P2H{KMd(($*
z1W|pxKy^awf@%pudjd8WRc`>;;i*B+qEzj%v$cn|=46buTL9#A=KwaZ*FE-Osp2Tt
z*eQ1=D3fd<?^rIS!{y^t2BH1*jQMD^`|1gL9USa#fCS#W)qMEY7}3_PgWM0(>E20!
zvUVpaAHHv=f!OU(0Y$m4Tm7!wywe2ks)nynR?M&4yn+Ch_rqSnYUx5u1EJv{r`P~*
z^XG>IM<N6#^;2g2GVXys7+6vmxTp_I35urwMIF?li@XZ$1kAGwcoHloKxqTF36`tN
z*$$&3+U5e}#@|&R=o=!kpb%yly<t!qNkbUQmj45Bw>T<tXg={_7!VSXqA^<yVzB^q
zJhm~6V(d!<?l)N?jCk1{wkyQLZ@MJe@~{QDnnl1C{xKrFlRzxUG6EENAS?uQqEb^P
zW~`c_XQDV$N(Ux4T+~8(zg{uBl$prCM=cuQW8y@1PghAx2aNR(S5ue4FGtpQxq71|
z8niEnWrTgTL$`sLH^s~fbG-EOqVGVh>~`IXe!zO6enUL(?L;;M^A4cvjzp9dCxV2W
zfielA?s4fc=+S7(Yk@is6DCeHlW+?4{F<C5lOdulxgxM4#v^e;%13^eC{C)AKsOYM
zDzp^`En$-HoWGinl25P5eh8|OY$fbM92z$>NbCUB9MKl(m9Zk?BZ@DtpvI(jsTi)X
zSv;z&QBfmPAhH`F**FX&5@;xKnL{dHLj^-Qo7A3Eo8+0qUQ$v*UXoRUq8wautx~FT
zU#ctbUGx-RB2k}HQ=C|&c*J}Je<X2aeT0J@{r%f@VZju%`H0zV-Ao-s9fA}1Y8Jli
z{?z`I<ze&<{gV_c8mnVHP(77JzlDkg#B4>;ZAod7R#ELN=aJ*A<!o%xy7KwFz8Qx_
zpV^K%?d(E<y~1`gxx|d%SM|g~jgn@S>$*K7@Bv1XDlF{*!2z}b4bet)g%L#>Z5pjo
zLCaXxR@Ll=-wly233srknx{rf%;W=g`XOH(e~kQqNMldS7R8E!#_T7kH~zDxpp&<D
z95r`2zj>T=d@|EqaV?QrfK!&9*Q(ekao>SoVVcMO&9-Gtw7u4&J+EHWGj=bAp1@oG
z2G3i0U6fzeH|0(BmF?9BR47m$w7Q!sa0a|RL|VwV*Q$3m1OVq5g(=!0DwsDbN)h#@
zZ(a+c-dtuehozcb-C>_r{l_iRzV*^Cyg(vXB7BH1@%cBZ62gr1%<S*--`?Lvzi*Fy
zPiIYAWm03hXPjWxv-DYeX%8+Csp%(<B#+!r;Y!&|=}&=6xi2$Q^-+CPbyl4(3!lTE
z<DA1O<F=B=QA?*y*G#8rC@N1cpL7Yd-pB00oM6gjayGJAQaA-Ui8#SN!C(4%ns*{~
zl76BW!-|v6=CZqRZPdxt#I?g^<=AvwbcngBzO}IRurxFfeyn`#H1=Z;cZ+ADdGRqh
zvK(gJByWUHE#%m3UZkSDLT_bdmDI*_)njFBWoC80b^T`YD(qJM$i6#q1M7fu;<{*G
zjDfvUuo6_)*L~T2-|hU$hi}{g*LS7CKGs{>i-S+g%eaGf-D!QSgPGrmKSnQeoy1qk
zH|yQy-4u8ZcoDc2R2Q5JOcDeEqQlg)dcR5z+~8Zzx7}~2-9Nj-yIH#t1f>PRh~S94
zb1HIb1?57JdWd^fLsntgA@@V(L+?eJ#74t8P$Z(GV#~t4P)$(C!Y#03V`4EoEneEq
zuFVvjlwiZ4Vl~hl`RAC~`0pB_`k<;&EGT%Q9i!6mT=}w)_*s3_URr~?f_9-?QOc1E
z!pkKrBoY&j64xjo$kfP36bF8fN;GGbq*6;;%aRn36<Et1XJhi%kM*5NR3r|QucldX
zx)1C`D&73vk>zAlv8FaX>UI+JaCoY?naIGD#Vh0|;W6?SB}g698S(DE-Y?&~z3_fW
zelh*Q_apho#23B*m4GbT&a#p+T_P=Y60c;uly<6TZ&~T_n2hd~ofU8Qowl1c5@H#J
zn1fN4Uh}WNog=LKO$;?U)ZTu+@JZwwdjcymHvejthrxGV%2%Dv&PRy!inNI2la~AG
zV;3?2I~CRNgY9eTsFy0P;>!rF7rLwJvDNk>%y<3_6h_k#ZDX5(l{xp{*OL3r69}1|
zj=(10#sk)+a3!gw*65{m7ZfezxjJty<#PC0lcq*UP1rHq8J6lW^=P$MI{Ms)TFCT9
z+;>x{aj8qF`51QT+iz;OCuaE(=ts2YI##S72hjS^a?#jTpUPJ>iWM}pAKhjjRH92Y
zN=MW>b-p@}^;4&o$XHTY7Fe3hD$I@@kIt2=-#3$&?s-`2pLX0n9jBK0cKSEwSmwPC
zw5P+esaQSLX*4~~rA*RAJEJ?RXoYJ<Ht?;c)SbRC;CKG9onO|iejS0If?phO$}~M%
zJwA3lJl9<FV-v^maFJVDt)?)OyVh-O*Scf6S2=-rE_i-_V11p(fgnbx!@uEZx{rIz
zxedh%9l?no_z~?bqajnX_h)aM1W8O&t4$03{rmfJOx}Q)Wvn@YmQRL5+s(s9_!i15
zML&h79F#1tP3Drvz0>far73xaIX{m3T~BkIW8nlu2ETpxe$P~-E=H{ORns4*#Zw2P
zbj#(<bsb;+m9x1uxBgd2$52x-sr{z$Z5<z-!U}L5URS!8rQPGHd2U<MwI*lBX_-a3
zwetN&N88R8B`4F3vlq`G&)xgkb2Z*cU-^56W8c%n=Ajr~SdWD}%D1UizzTpN3zg?_
zMdvB$uI}i^RPEEg>_qHc(2dgz(`D=##uf%>yNR#GOY>X7?1+%><NNGf>h%1p<dwz6
z?KFFftxKD;`|=XO^81F)TC4y4E`byO$;-jz<xAm?+ywY<Uvlq?H^bM0UCW($&p`LU
zK*N}zJPv66s@xwxfZEo8f#}e(@HTj31l86$QNJjxVWEM&g(thRh}eVbhw=l3Ujv5)
zm?lM6{S^A$qxX2p-A(Xoe4NC&2-TR2o61pPlP=`K!0sX%7$_eds6!ka0)h<|-e(cK
ze+_)YxZ`S#f<f4AVBLzLFy@T?YZt=qI`~(stbKP%t&c<j%1&Iv5eNvK?5{sy2}RP2
zk38awxw5*Gx{NfJk*zhofw8Tj3B8-O-N$GkARafakFVAyP6mW-)>bx-TyDI?{~5vc
z@%^vI48(;08RBHgORO#<Pbg&TU_!`B&qB{g%m+<KNXX-0{GCftSoD9UfBeTwZ06)-
z$Hl<l>gr1G`jy_+!IXiClarHyk(q&+neJl*ouj*rlYtwZjU&l_7x};I2%9(>Ihfly
zncLbB{<W@wp{=tMFER078~y$HFP$cC=Kt(u<M=;peK5%I*Bb^VdPau-uW3%^-~WH6
z{q^R*)BeNPf4AfLYcVc)b2k$!4PkR@6C1}5()c*o8F~J*&HwY}A3{IPRR3ot6ALr*
z=c%7weVY0gDO_?6<|ZFf`b!pkOgs$#&$Is-&%^MSpgsxizgqdv(+{=qLGv*DtztfC
z{O>z5KtKXO62jk<-GEQpA@o&eU*F%y*E|uCAxR7Z2|bH`ZS=I4m}%9=G%PJGS!>l>
zEO(Z>EWEvP9h;SF*2lEm>j$0?(Ub}Jk;b*7JhZRx4@Ji^37|vnINrEtJ+FA4VO8Rc
zd-G>Mb7rH&B_`G)NCN|VG#Z0N`5`fah;~6@0+Z;2wV?ZZ%fdZB;hs3RH`r7*nrHvt
zH~$^>YXlJz3f}6-vWj*9dBC;33AmLS2N4|=$oF<7X@>1zYejW22?}60{Wc(I5dq(v
zgQ-QrMh<JQBV^ZzA&XK|`9tErmG(%B_1Ct4&+|7*0U~3#W5H;D+fqk2g4(9+$p1<A
zzs4{i{`$4^jwdPmy+OnhKbH$sqv9tK+)7f@qA_O*O>kdrP_;V&J5deX=aqqxA(6iv
z^|ip8iMZc|uvkoiC%eWui62}2X&+k+Pw%_@w)8zT`d_l31P))?YIkZc;5tKZLokR|
zRolF%ZEX+_#r{LKTe_L5a|?{R1RMsl;wlh$qNY%YZLzhWL+|<ZZ)tw8Wftxye1s3Z
z9bR3JiK-X95XaR*TsJZC>o*Z%fiuxV83(STlu&#Xf&YujpTpbLzG|@^zJF2CAs}D_
z*Gd&NAywXYvBP{~X(nJNjtK&?OhH6)cP8Rw$H|;q8mEmJn0ieTFX(@AZfM_hbVIwO
zcfi<LS7|yXRek<16#`I!!<CyA2MuWrqP+bN5?2vcTMCFd2Him$n>%k&=UZKNjjji9
zqx64#neA2=fN}836X45mCI_#lja{aVVXbA5w)K%nd^kE7dr=W?hBVQ_Oc^Jehwqqe
zTv6*pZ?slwkN$3Fc3T}$i{82L+>mV2{D~jCI>e&F*h_(y{}7Nd+lX*<+?@K8asz0D
z=C~>0{%{u#9^S>|VBt5MWk&iy#x$b0wd84eZ81<M-0b>Ku2)&}^j&rAx(t{QTI$Ms
zn!wCLJ6v?E6EI_E9Ml>xQ{HRt?nTl5;uGZl>ycwW>ISiSLJlA-D=}mQFuaX`N7gr~
zbZYVhBHsM>k>Z+J)9@|1D{B8R!l)QH`>odKu~$XjhTi{Ph5wvMF>2sLT#*9t?VVPR
zC(My#!N1OAyHj-B!flZ4HJ_QUK4Cp(`A8P!Tn9L`Rc0x(vg%oiOjv29qq8!rT>?Ih
zwQc6u^2WQjuk+j_^;$xfW&N(YVRclGo0|oykC!C7+Jdf&axi+*?8a>JW15zBU^Np_
zg^_Na)5=Wo=ow2{3{=->CUQnM=7gigi*Wr{uw!BJ&eaY)uX&<b-p)4QPTW~Mz-^ci
zX0VHa2pyk>mY?&N<RWVxd*9nq##s`kvec)-yWlHFS%v6UE~A8A!s={H^r-ntydXI4
zVY}rMZCFT{o8Wd!o>+o2?d0w3m*YFGv)TRZiH6Tw%SVbMsLE9|yUO&6+La`VKZaU+
ztyk-5YH7iKe0-FJq|p->hg4KjLPAI18<y7q9>qXcK0hkb#}A*Ln>&QM-m^A0?@TRp
z&s4EU>(i|LV_}ag7~ERX0=zyN1#q4TWu*acs?G&xm>BO?sVwhbDAK2hBPsGT!J;pu
z2?#3E(hthE2)%nfFWFqE$pc$|r^MLa7Nj&Y$$<Ms=FXtk!QrOx&A(_j_(Hg5Jh^I3
zxfP*Oj|pT3aJ!i`F{5G%)am90kFVVU)0-!hVMbTEeq2|4v<~nQ=P1npPoaUST@jZ2
zL6MQ2T@#CtnH6jUh1B#K?X2Fd0_w|2iZ(-WCuC#5>BC4fUu>R9(EVb<BX^mj;zHQz
zNvvlg(ZzlI^{Xe-tF~0T9!xg-a>L)o44A}D7%6V<F<~<ndjRDZ9jhvUG|17>(f;YM
zkliFaDyq-2vOT1%jP}p$WpSt8Rb^hi^DuQeX=#=3(z?$(&(d9G?PIlSq>(GJmbTbt
zNgZn^Y~|Q`5NZq4%@KZRb>LUKUGqRBNtm-;hKhlp1^LlM9T|dPMCp9>-ywZ35nQl2
zBfTXxT++u#fsV2VvCSimAPly`0)m(pN7z+OP3XMtHss~C$disgTq#$vcC^Z3f-W3=
z-0A2Buw*gMsmdL4+uB;-HHxRiWy1TXSCEZEA&6qn(9<pN4288R`-{g*jRp~a@t4oa
z_9?nyR2$$Nk~90?vRB!{p{`=c;q3&S)u_!Ak?>$<m#qh?eJ=+rtq|*cIe~!|Wtv!)
zS3Dk$$zyy=8nIQoX6nYgnq)|FKcRu?=D5?@(zun_QM;BheD+$vbNy^lyEcgltC!|T
zyRmU_B1h<3VHrAKYHBfUS6k3nSy|~cGt=j%URr%$r_~)M;#68nN+Qm%RuPeqHfs)^
zD|A{{?ss;K_vfnliF|)?Es@7))ECx8np1ULc3OJh-IcUA?Pt)w>?9~~*ebG(>%~Rx
z2CKN8wE3s;<WiJZ#hd-&SgET;ZRBqR+lQ0xyJx^X<YFe}hHE9@BA{W%*xGxi1>j)7
z^<TWLA`*zChO~IlYSyB#^LO^lmc|TP(4sh=?})p;wIwgxjg`Y7@-X4wIw<E{;K>;1
zNcwKtuNqyPAA&M9xiZtu11~7bhxoSDW8at4cJ1`p@!Xt3QPLKRx|_hsVlIKQ*55AZ
zsP?xADM;n$x-AzEGL&>B5>x;tY5AZb3ws|{cwR22HwUG|yIWRx(-=tuFF@n;w8JUX
z@77b#1hGUe7(!ipXH8*65%!ccJcmn>B<`a!MN}RJgdC9u`7;DwpB&n&*gyGCTpTbS
zOB+GK0LMy78l(J3c=B*<D5K<d_nGfJR|h16LqpxJozFVbX^h>;e6DBOJQrP{<6PdS
z_4B#5>m6sf=PPq;Ib&N3N=w~!8w2@42C#H>4g?Q}04*kOD_hvJ<e=g}#fz)RV>{$v
zdp*tMd21R$bu+|}dzk@i4E#_8wH+eT1yjEAQd<Eg@8A(?%gl>R<`Q-gb=~n8!+bK)
z%|BD^m+3VY+E=5J8FAR~ExaV8w2;TH$*p`@9K<O1Z-!v_T1la^CiR$d2GZLM2~-L1
zPPZJ!q+%qgxlLKBn+ENP7p<ifzYgBys!D!=U`b42#>H<8FRCaXUUB%Mp2eHdZ6f&P
zUSao%1QABQF3_yQLtmU(r9KtRv$bdrZk2EIZ^Z^`Xz>XkA9w6tRfqkab)Ty#7cUez
zOV9Ev`RRc_Q6SIX)EQ%$)cz@+*`OpMM51mC;q|=R7^2AT3q;@xqp4`>X;$F5UvZ?j
z5Eg48*82{18q4<vNiBC+>HBJ#m_G1&zaE=Rqh>gjD{?R&OSC`TLc~Tsr}1-H(Kfxm
zTCJ(i2&=pn&4~fBkmidwbX>aHPM`gKlij|$*Z$YY3oIQ3beqC-XG6>@Usg0w$}F*0
z=LVWR00v&HNNMBtjVHRHz6(pP#%SaDJLdb+upXwT#btE-(8Ior5@VAsw0iipUJ3`k
z#C)*lfs)sBTQrBKm)^_6R(#XT4)BB75c<nHMLJXLEw9g|07aB(<w6Jwz9uDv5s%}L
zzP8J-fcDpV0&@Q51r4WfmKQX&>>Drps=4eUt{|&?eC?K8&{C!Gw}9B<I7_=_s&;Kp
zORAmSGFqvs>F3A>{UxKwoC~yTU&is~l&EvOSYypBvZ(d6^uSslR-7MsC{<76U*(4h
zfG`wx2moOiM0IRZmRijJL}Xo4vI0Ho3{VSKR}LSvji&h@S9Y#F66!sU(M+{_y0U+p
zNGF`1;~TLkgYpi9Kp2?J5z0i=?eyXGxlUhi%8iJOTrG^Dl5<mkNcBq4QZjArx0ec@
zSvpPdvQn7wQ;!&1&;E+&ZJrsO3n>!@B_^VRcMm}vL98r6jC9#8jsVw}Fzk_$h#KBp
zcqb-mQFg7TieE^C^*ef0C*i(NT(fM#-G$Sq(H&tNe;G!I>X)fBPLu-ZG~<RVL5`kB
z#>n$fN#?km8`zgae!j)9N}0phwbgAVF6tnp0}y!`wFv&UW^_;vBO8L8dqeJ7xMrTH
zSlFHbuJX52sWnr?38kN{^aNC->Rl3E1vlQRlDV<<v_m%BDg4ObB1RtHX?uhY3#DNm
z5ueyXoA?P+``11@GiBsB_1mC|zasyo!Xi`xuM1!nD7j^>xmr^>)6H4?T}#WWBZbi|
zBofh$y>#1w_t*7zgU72~N-8S*kC03uPjoW`$HvY*No|OG-rKxitF^y+$AI>WC5wm+
z99`kB<8Rqn5*5SF+>)2=;pPt`t`sz2HMKqHQ>=np>L8l%NYPxWS}WbmY>N7PZsUX$
zx~#jlfHUYM1##DFcixBWNvAVZ(Y%M=HtUC3?I%1_z_uDjtiXF#_`~&~HzM{P3}yKs
z>LKc3ywi4^mM|XO>Q9y;^#Kd%=nkb5Q9B1+v{<P*4{N2H@Ig_c(N#T3=TQP7@Gqkz
zokj(eno+)2s_@?@6L@3Z2FdO-q8A3`T~Eq`)2kyAK`0oVbhNg<wI-g9eU2T0fF}e`
zf=v=BlWBrKgx0&cxjBBW_Sn`mxRfGpT`F(ArjtxE<-KALFxct~9}gzx;#xAHp{90t
zc9M2yv9IL4t=DMr>`@?El7uO_d>f}8T~Y}aD>Tg`pzFJuX?OO)?_hHFLmBY(G>1~G
zaEE$*zhI)qR1gf9c|2pgQ|;(l(A_m$$z*1pd3@EiKYu>3KOJd$PEH>C;q{j3$G@Z$
zsHj;~OLh5v*@Hf+S-pxETZlPcFj1pe*$25(9qs6%VyNGU`NRjo&A(M2g+{@7oLJXU
zWrMuSENA&MV~Hb_o@h5JYx7nk^fhsO_8cU$_gyEUA1g{b=Ku?NYsB&Da%r^wVGZ=_
z$G(<~@jdFqD+!-+%@{V2EJjsaqsMz{V=Y}>e0+}sBIzt1EN+(*yOhn3B$pfm8cJCs
za+yRq{aOJlIXQXUkjHY4HYg;dr3fuTIS0{UiNdnxs;;qvO)G|%sW=QCVX~4v`3y>f
z7n!k5@26#_Azoh9@1cYx5?1i_^d%Ivj0Fg&DT4(e7zbO;i2KQYfnqgLVjmv`wpAK0
zE}bO@mRFZ&=g5KC8So|^S!s6FGLFGoEaJ0p7;r<%Jb7BpMi|e7n0PKaoS8%4vZO>k
z|A-}UZ8v7S?(kRno;Vw_Izc^mNncm5xhw6HtsRcSC^D;6-E|PcWaYtG)Ox6?oQK!G
zEZLJ#wuW*ht(j0)-5GeBriN*2VHDuqJZ){oAw7Ce`>QTvjNV6G(P2!n$VS0dciPv9
zM(fY6xEPEyX1C&3ocT<l9DpoUJ0L%wl;`E5_hD(iV~@5W(}e8KbR(Hc>Snq?YE`%m
zjYgG&V5f;Ao2J|=CY4rWE9P|zqqFN^Do;nN-SKsVd(vgOk7@Q7h2hsjl$XrfSW9ZH
zoYA-IP0bZ%N1C1lq06nZXv}GLGz{jtblsY&VHx72lx5wU5pR!0+0it`trfzv4hx<X
z>$Pb11DA`jVo=U*n<SdX1dvp&+01P!b<-aO=R&A?dV`(n4DUD86y2}h?tB(*m*ie;
z@Tt;gu>{(Txl|+4(A&rB%Rz})&kO7OBC6XQEn008vzL42!@WZQ)2$RKF$4BI6`rd-
zYFD2)VdiI~1<Dj1t^Bz9$|+w_m`LqucK9o)l<eEZsNIu->q4N_tY=hyvOK6VJ*L>t
z2*QRLF=1qxHhR*U*R{;Pto`F|>UPU<rK5c)nf|h6Juf1JIbFY`Zo3C7X;d<5^40*3
zt<$n@9W<U&mO*a_=Sa=GYHBf>Z8<u?8P)rh6Ut_B&XDIRWChR6KG_opcy}jtyS~1)
zxk-#}z<vt{gaaw|(g%jx)bJ>dMcAQcRhs@-d+ebv&~qRsBBC+CfTH7l!D|$A8T1l$
zM2hXS+u8}Rkfs)}*}kQty)#es%j8=Mx2@jOouvMVih-LU<=fSpXxXYpjF0(LoQYb>
zRxoF){dxpQRIZ6?MNcYUC-PUd^S-2S#pAiHT$Qk$k1Pm6=FJtxoUxs|j>~ZcY5m;a
zc!N~eak6wm&K<jBrDfq)6y;-rt(H-2D|_x%lf|Q9`(U!I1Q77GhWbSfHB{Lv&hGaT
zP8U?QqvhC6y3afLmL9Rz--i{g_B%WxHcsj=wfVg%WpP$v_+Lp=H;=I4=F6MJQ~Ez!
zLSp~EK4H`LWE>H3##@XpR$BdLmd|AC-yf0Xe(-#WP@Li!uU?@>-RI!u#!>n$ZSU?Z
ztEE)hU+rWEOIJE_Sab36K39d$`Nggfxx9&_DPpzH?a5mna@dQPo*dQIih6)#1m?g}
zAkxu^F`-D^b-IK*fM%mWp3#<mF936*(#2q|D|u%C0Ja?ye1r3S)VKg2bxBU%iaI*?
zIb@!f?ooRn46!pS^ElVA>3h|Qx@aoqM9pr^uRDw9!+Ot)cZQ{1OZxtHZR`X2O>!ik
zck32E#$w(Ykde63g8XC~FULSFs~~R1xSVZWufwnG_I4~2ozC>f1(O7WcOr^u_xZ8c
zD5Ws*{Jsz&q@j+;21$+pH-{;B+LhBt!^^=%rizsW2OraAP|&8j`eh^APk0RnGZf1_
zbq%D{zC_qSU!MTYI#v5c56r^=dx!tW5pCYKuEu4r%zJcAK2N5&Ty2%J#VF5xgm%}2
z6^8LO>u*a+LZ$d~zppr@h*u(3JiDd-gG?4J)6fuEDCv<bTvBE-kx@0F?M5UVQj~zM
zaP<8~N9<PT3~U%%qMDbAYz0aQFSQ6yOm96-J$Y-Uofo@Q(Fr2k>Q=&m4ubA-gjjpa
zdHM;r0(KpL-G%KKrhri`*T1P4k7tz*tNb;~GjLc9=aw_x{s&plu}0MrTex@1?oxex
zk6z06`tbMG*Y@TM03!50Li5Tk#fXDF`fK+7sylfECIe^4+hUE)IelsO*RSkTa@-4a
z$~_jJp~8(Y(hc+6z34;}bp<M2_g%F8y<gkV^S?O;oSmIz1REaRpP%VhcMDRElDcja
z8pz^iroC+HYhXPAXk>YE*?jb+?>^_+?{e>4ulJU%GF$2t;;<gX>gxzeq_l@FJvZ)!
zM=!E*0u@dHPuJVXxh%tMWEgM(>pxuuO~s4m9(Jv{hHQm4=j!alrG`-Y$6|}E^a%KE
zQ!6vGVSLw}1lNC9q#sdjT5`~h&9_$}cWx;z8a)>h^6^3AG@iOhnet1OKD-|+5z#a~
zEw;&xEgP(VLR&6WkR~+;Sd#=<;b7gRkTm5K%7)yKv!J(Al9O-05S;{DUzfGf)i2lX
zl+czl<kYByT4gHgK$OhTsF^&p+SGmTysA?!%oet`uu1Q?pZU>nNd|J3i|m8YqT?G|
z9dpU0^VLiS+z98|6b^j)R5&tL{7*XL8#3Rr!QVJ6E)iJ1c@rPD%N)e7{1}>d@YJt@
zB78MZclJa}r1BsBMGpB_&CwadAugWl6n(>9ZbuA}`*E%g-Vl$B(hIz5;n78(-L;42
z(npr9RNP0Cj?r^Y9;4+q9k26blu++!sF?PQMhatZM(Qo(##D+mJw`i#mt(n){WlmK
zn&_8dG>;mZC+394W_vR>do)Lf*6oyMCYNyQf)QLj46Tn<s?l(CanJlfeROjk8E)i@
zo!NBSoOR$Z&+3SG*k@5j`PpeAgVgK{d~r~yQv_F}j2gJuaj;sd0&mu0BiaB$-vVV7
ztw628l)_}73bQw%sD+;`a8f@`5~&R~-fH?nnb~Z~zrtM$O*8Vzs)Yvm{kA4kZ0krM
z2o5+xYzb2(spvpA_-3Q1k$#*MTdhrH%#?B<dxbKfYY<vG{>tf>#&K5><oyqm9~a##
z+^?@h_{1w>aj}3%9A+()kq`SG*3U!I=hsfQT;ll-fOa0rH`4z4x-){SosA{jsHJb1
zZtnidV{^Ag?h}KU{`67;hO9(kAo1^N=Wqfh-1WIBiQ@4?DWy3>$2S5!PxAAN`JU;l
zxe~ZE;C8Hf+UdQ)md7<}>s&T}>;0n!aA5)x9nkb6<;9@`^dz3p27UJ)sM-AhagHjQ
z{*>keWmnfr<cNV<40RI4+a`99p_yVesrxt5PGSd(6vq*hJDmz{Bl#k0Kbq#mVy(B*
zxztz^p6-2+T1?ew{hw;X-^qo)Q7}+y&-WWxx?nmwTA5K^NL4%IFETNZFrtv<106ua
z<T0_yBQ~%96e>QZnuP-uFgjPElf}QyHYf_n%El~nO-7K@p_xAaz3_j|Q&+WsfRv$U
z@z6d;Sa(|H?7~-U*S_T?npg3+n<sbD#;K+6pCw>-04aYyY`BukaVI^bd-~jTa#@|>
zbw&bkKq&ugn;AhMNCldgwLw1$8obq%yJgnR8V@T8v2^h#w-T?Yu#Oa*8`)8KEdL~*
z0;$B4q%pIWPy=CMkbQl958uz~9am3CGJid3sHuh4)G#ZnsQeJ%n`TI>pZI*z!UYmJ
zQuL!DBZa)YUJOc}N=rrO49BGZAoy=>873tqr3t(p(TC1j{lkVoNr>MT0rx!!l!zQA
z`+Ylyq2_Wp+~rddU+MXiz5dXr)kS|<qS$SzL+0k?;X#FqPP{*;i{|lpfGi$ASFh+D
zr+*6Bqq@4Gz$6KW#{^0PDV@I<oETg_VPj)M2iMg8tB^EV55+N3Eo`WU9x4;h`5@H&
zIqr`Vm?xXuQJr!|dhqCowKV^np8FvkEP+Ymx}F}}wzK~uI6tHd5<BTgqemsr#Iu(t
ztMpGU^5abW5&@C1kI~{;>XDVR^GIAw5_!H^_0@wZ#J|%K)AWSr1}dHW7sE1OOQbRP
z6al<QM|ieMFz^Q7>CUQM*L6wzC~$i;%gp|DuZ)5PK0*-+uaC^E%5GDzOuHF*cXwA@
zMn=TNg-tXD_t21xCi|mwVXJU=cY5B`xIVJ)Tj4tTKEqw{^0rSI8}qu)|88&nG8OCd
z$9Q#)N$P(QPX<zc#hG%Ev@kk0)_(~gh)tB^TP&w$*Y5&qJkO1!4-l?RNLAaM(hg(E
z+7DNg8$GIhybR1N-Clcq+xK{Wy>}PXC|zS^VWEs9`%L%;{45UwQIG3s*x1m3KCkE7
zjxrF5!C<4Qa2^0d-^F0__@zg%Hv=+7JXv11!>d^<!Tn$|CoD435pJ>Fvk|5ABVSdo
zHVlp|=P@2c{5Y;nZCq*rF8#x3luJrGw9~vEH+K6aZ*6Tn#^1jiuC_Q+Qd9R_Z1!e~
zuXlKJH`uHmp)+H#n8_<G^C0=iL#K3qRzVkJ+=o;zKQffdIW1cQKn$L&*D&!h9WJp!
z87UKWj>iW^PQuKLtm$rZce1G7>C=wVvea?-J3Zs}qhyVBy+0vlXUC}PdCHn!Sjes5
zy=>jMIpO>EmA>slu<c<h((Szcp3(V885JFUOKbfJeIS+~_W8|)fIOQ8i=piTgzsSk
zR63mvZeGU~Z_RBRPTcDKdHp?PICb)_Y_P)r?q3!`9}He#<JZ;#H#<K+0Y#Qu?lsdK
zAJk?*Kmd7TaMOdE@FcO<^J(Mul4WH-g71Tn>yh{U>i(TXm8h_={zwX)+hIX!h5$Vc
zjZik9H{%C7I>@>`tELxRHvNHF%c}dnTmsUVO(IanYS?@qHbZ5N&j+ueoHTxlMPY81
z4PKUYc66+1#D1i10ZMYbv*AXSuXpDET=l<f9K7f+6+Qs9upkQ=SwS%m)Iz##2Ue<%
z3s#Hkc?=n9y@U4yfd6e1?1&=U3#9$%=;-2RMvgm&+VUF9G-ETU8ajbHxU4%%ud467
z%Al9gc8!N3h-@&~I65U*L&AArV1UcM;#@*Pf|8D|zxBN1xNLB#utD<^uJ%{q)S7J4
zV#HoR-_Ox8&RO*g*@O231eSe~{lJ8wR*sG=)O<f|bR;s70j<LGMK1z(H#K``U0vO8
z3D05LZ>QlJ;Rek{gR6pDTKj9B=k4RsLbt!2<s1Vv_lF$HpL{;_vt7}8)<f|A0ANtB
zPX_$UrhK>q82`Wsqj32Ge^Bt22~Nj7eP|uL9b4Lw$^^k?i3d>;k>>MMJs(cdSp3t5
z*L7o}JMstjXR;{XPJNBvfLNSZTb*mVbGw=Sk1_!w9@=V>8bk`6)?QF`3{`%{v=9RC
z%@<eb%Ga}BpW)k&vbjGfB1h4?e_uggsaGI@`wkLD`Bw9ORv=h0`eIzNI?ASTf3kkc
z7uV4=riYW-iHuvf+oRd>Sas_-zZ8)L{-G9aEwy8pu{0*od2P>V$6|R{6OmtWmLUmC
z)gSpLLzt1RpuW9*b?JL?VV1+&$eK^My++38g!V5Q=00fHUFeLntY`*@E+-$U;=4^?
z<o!U9r#`T`)Z4#u*fYcrIMXJAgJ`NmMDXJi7azZ=mw#;(6LF)FVG{4No2+IxOjWos
z`gNl3C#xl+_mfkG)3k)Fo8>Y}2eoj{3h4lv?PCy%tX<-T&s}XcYcj(~!%^M8?7lvj
zrVydu+=4f9Mg+mh<6DDMZYQ^}j5XY_<cRiLRTU#;LeTKVM4mWm4fJu^OIWgTzY4x@
zcL`4ov?t10Qe{cWut<^o;?&gCS<|?ZZsxH@?QL;>8h|S+E$yJA6hC=h(VJeVmR+L`
zO-LhK_s3Yxg4$=3=Wi6}$CBS!_^p%<kVU8h9ASx@auR8M!Zhu}5PRqTHn?W*{RE?L
z+u13viX{pC_&e2Caq%bE0a+!zH#sS(TkC4!k%9)@?0s<5-RA`M!(u-mnbmX5aU$nt
zQQp$@T3d8}SbQj*ckiV;;kt(8m(E6~imQk7`-b%M`}Z?zPwNYQF~H}H<u5IzK-Nj%
zdVZ-BwK`*vyM7((ER9LIbKdi*B>3O=`2`A>MKjp<`!d^SC&&l_U<O73M60>_&K(&&
zei*h-fzIUYN2=&|>QKsoPUP`6w6<TpAa<PiFX!zKmBwMSvmIPLQwf1G2=SIzo%hKX
zaiBxi<v&Z~UJpxR78VrX!OSl_eQM1BCYh83K?Z2<6SK2pXliJz%iyy2T+;%|jm;N7
zk)aP30}KM}-(lCMt7avb^}pL0TJV9_v7KaI+3Z(>dj8!n(!%w@o6ajk*OTpM<2EVW
z)n|_az5K7(@8AfG%S3Rk<9i3T4qnOa`e)a&ae=J=D_m9r4;i4#qaWN}^}mj22Q^4$
zfz&cx%q)-`>iq2aZV#4cCpEfi<!4z5V2~psB8J83XE#=LidrKixO|x1>8FtPhxH8H
z7uRl8WwlvgX2SGH5zmUiOrw7htO^pn^p%Gg3?q81uNkEl5f}A9mHRHL$(pW4XKSH!
zXLk|DZYVI4iINwje#N|HfyC(FT{fYCemC}J_HbD~c1T%;roH_Xx99Tp*64trUKC`y
zQfd(xd;5lVqF{y}Ey11h`Szg|L7AUIzYj&xgLG@}$_{9n&p1+iCrP45=NntP+ghTH
zNiX>oYwvB1XHgVR7KI~?!=6+9uh`wcSKLptPW5Nf5~>Zp_H!Ou<Gb{on#Tgmr9s<;
zYVyA%6bXiko%_|v{Fx45p=w(9tN(0K_FtE=LR8?b*Q1`Cm3_M9n(JG-i!^TI@7)x@
zXJvIk;`;doSwpUun7@@<7Idk+F+K^@vAqMAy!Q~H0Q9;H^!|0Y;3<GV8Za_=8v|r}
zg?d5bke%%I!7`PWfUJsunG3#S(dH)qeEOyH)!s{9_}>x7hCE{2p!F}tJ#74k(*w+?
z6THZxDnbl%!_GG}<!;T4=9&gz7<SZ6JsKJfNgytk`0+|d@|aish2NjK?%E_FoDZw7
z_q3lcQXfs5Mi`=6rSzh5Ecn?@nppMj>Z6jzMt6sV#X>+ptM31@06Z$F<Uo->j=V_6
zR-nP3(aasj-HRD{W+r3NvgDh8E8xp6#=V?(YumGA{r4fN%k-;LW)-S}gM#TA<YN+-
zloipJXS~ggdC*1fp5}PExnrd=i8v@b0mj7E^KW-%U7&FM*hCfsK+PDi#gtHK*O6Pi
zK%Bpnb`!5R<L6#bAD!vc8vB#o1%k}kQ|I~EjfvX<N?FyEOb*jG*{YpQ_>vf+*7nS{
zDHuNFN}crD$?#sQsNdzEI;9vFusN{I??||nP;q)nG4tT3Cy$fWWxo*cbt#yMLo`gx
z!B@}pJImIJ3V4If%?~8Ln{V$tjrlo4wXj8{C^1<Z&R78pl#ym316gev6t5IO9%R5i
zwpVx;Bjln<tE<}rssiUpmCrTdzofRA<DQyESHOs$i5_gpjB+tv;)SX_OOyn0M*(&}
zk8EE;L{Yw%dm2L?J|$Sg8*NqF0n%{PxkSj9oia;8%?ugX(`-SE;P$G7|AwXSLq^~}
zDP|^Y1ql+HV7WeZY_yN_SH$$6Q}s--aaiQ7-9|zv@HX(gLPJUl=I-w9cG-_Hl_!Rf
z;XJ1yOZw54BwQ<8^Lz#s^Qty;M3PA!V}eHin*)214mwtrAWED|2?7Elr=<ivk_~mE
zo3nXvQ6~_B{xrDQ=-IG)z_mL67cy0jKWaF#+6ke_Z{fVgrK~5a%i`^X_<GG(VSbu4
z;~aRSf^V|==KQ|iZUDF3vN<kQIlo!jNzijy8!x5wUE)m?^OAJU4y2}-;A@$8bAnof
zsWYw>A5pG~G&an~*zti^nkyz^>L5<9Q{`$_tH619?^H8o?%QnK@$f-!az&o2M*sB8
zVm@};>?0+DKWt+g%FW2>M~zFnw_5v0&wE>%+JX%;*o*WGWx`y?MaE=3xmQB!s*o^6
zTb$H--fEt1P};nPr46O+XC76$)kf&^VzYTK)ItE>hNErxp7cMw*mAy}n0pmV{^y;I
zNEH2{thZ9U+TRRbw&p{KiI`E>y}wiSG*5srZ+;3IDV+*bi?p!m`j7#Z^A-PzoTY!V
zKow><K=+ta&Dm=tB$F0#b36a!NExKcP3B<Yf<+0<&#S9J=e}1arlG;lgD5akez(DN
zoCokZSB_tZl<)R!uMiJx7UeP*K;t75M2P#$DWpl1(a{&8X#(5?&7>Ja#K50N&v-hD
z;`SxbN(s*hkdRJ-(!tiOpzRBHC=tZ~!P5vLxqm3GlpDcx$d;eYp+-`-wqp*8^gp^^
zxWDPD&il#1SQe!0Lii1ZZ$?ubTdk98?Sk#C)M)-mt-*~LyJ<o+u7QP;Z%#y&XW2`t
z!c`e>5I4!n#)|CJV@K+I*avy>oT85!46{NGr`F+zq+Vc~=hs*p%7b{$8h0Q|+CMQ^
zFVWy0nJ`@Us9u$Pz7gwxcc-d~^d2rQ67|K8+<O$Pt8T$>bzc+DQX1cmq&}J=A%<N3
z<5JH+4rVlHU!lgQa&4y@i`XDW?9TK&mH6mLbL{O8*$ZmV^QCI3HG2MFe;=;*^0j5N
z7-5bm8rlQ6S^1bMfD5m`<9bm-!W@l0Eh$>>oE|W*_W+xi(6cfFJ`en<2d9M=cmf(1
zSDFqTJL1<bLSZp6ZhY_OI}u@Fu%4ct433K8;+)7}IdK}$WYNL`Srot@tMQ-eTI(CM
z(UlWJ-Mg`LVx6OuZ7-+xn7o8=6!2kUnSJ;uw@J0g6M5>b=YKjd6OckzcUj$>?o`Vb
zl!CKR1DK*tyzYyfU{A63xn3_#ADe7VfNQAQdISS59=?Fa$0Pb*{q&$6T?}-cI~4^c
zSOiR2yjDg+<Z#DYFKEPQ@vlXp&S885riCl|5x=Z)ez7C|@)Y$Z9s@7Jq(l0>lB$a$
zJ)%0N1m7ru*dA~LEWS~ltQBcLv0}}9U9-#gvLv~+C;cS%e$u3z!OQ~Z+$LU0Ki=DG
z>AEc(G4O+owTbjAyf059#H&F-b!|R&<y7X*^2}3?m?A2D`Xo%^GsULwN@I1?fQBC#
z%e<mjj5s9VYoRGgI6oWoh~?$laHgBHBNX<7)ZzR1sOb9{6QxOdc4jAB?bWasKO$I)
zbqV=)vC})p{R3=Uts#W!j#_S*b*qIw^3#17V4ZI*Xj?JwqW2q>dQ~%~Dco_$K^Wqw
zhMFID>PZhMZ70FV1WifbI{#vT;MHKRUB_kqT3V+)g6y!Y;CD$>HjJe0Hw`VObXXf6
z`Y(WMh)IA{<5uOh%P(68jt*`fIHOvW$H1^2o=)7#+HAGX2H+Xd`vHyZTE>IdXi8J9
zUEQt8lGl{KeYAgth~JWkT-yD#Ek{tU+j4`odc6f&Zf<Us!>%NN_#=Nl?|7zfM-EuE
z+!>6Qr9Cg`h#x-~{bRnRo-1vA&51bqL^We&g*azR-&-=)%G4wWoj{4Wi_t@JRv$e#
z(##$Oc<4SX$}M0E2)N%-XunJZ>}_R_Kws{`8QBdi@D=@ffJ1;AxCwuqye=Sncmrs~
zIbIvzoZ^Sp9C7W3c@L*?jlTDKh85mEgyYBx#O|1>?J1{l+UT=qJWhJu=!5QR%8#~?
z7l?5mTQ@$4Q!pD*!BfB<hl}|<(|@0Iz0b0wASR-QWkt1}82~d>?nKSF0dS5}m%<<l
ze@m5%Jnp0?2&t6A*;zp%y&6xOL}<^}@zd+*{L+~H2b4dZX^!)UTJ1Pu%a5DWA3@vC
z<fV`qUS8y@w)ch_HdK2v{rSG?kg6&3MxrhtKAyWAr2Rp83Er`=c_JBe>j2gB?h-B8
zu8p-J8Ed{w;%kHn+P+L%t349%DTq7yhwQJUXzN@?kR=w!m)R@P<I`RPgZL*>1UyU(
zsrFzf7pIOP+ma1Z81zXQzhe#~EoB*mV*jWsPY&bu9<zD~xWabaqe#m|cC*gJ_Nu(}
z&gMmFX0ay&DBy>>HkSFje)P`hWUpzotm>?IPT)kr$PT(NL7II0sBE{Cz?QED_F8R!
zGj|A-(MX-zCcPGJ+ek=ZX3=-Cg7p)Yf_n&-uahrwRLn$7>GKz!Aw}PuU%ZGyE^XHV
z*w6B`nd#UaNhRUtUY41>rkeaMgtvCUV^3>xk{W>NDSIfU<jM7oJpS?O&cUnI{{1_j
z!~0B<t}G`1^CtG_!**fQ;fnOi{c57!Y?9TBqd5_uX2(Ysv%B5E&PEhT#K+g_*y6az
z;kb%V5%tb)i8uZ{Q^?^fjVyXE(FegzeYtj<m%;cp)LVN|n98<&m>n|^r3Ai}n&`3h
z+m+2wQj!Bb<<E9&osT3Y|I+}p_Wh)THfu9Ca{{rv#*|<BIDSA{n7p>f#IxI3BA(lO
z42u2mpl*|eH2a^AO5?0NuIyodnwJuU!DEOQZ0D)a{D7S8j|kf=Hq6e9^w8r8{1C)D
zHEZ|ul+#1dgv)~x!I#XG#gW5CFF+^8#u#gGSi&+`Fu60cq}fu3Ki~34_dS0tkgrw~
zXzI+?^UHuCkLRI2MU>uyF&@3U4Os_2%a?oYuTbl}_Z%ya-zp}`1FRD<Zy!%DCi=e)
zIb?gjbZ!5ctayDg8eLWiP<ms-nPE1(xIfSE`>4aO^Rgmzz8T|uUuVHb3BBu5af)74
z(%9ElFfM;v+`hh8c;ZdFUbRmXu=l#OACi@q8uab+A!dU$f^Y`dw8)dLKgGN)**`zP
zmJQQ<neJh7?X`(8(nqbt;#)cL8n*O8KwTjI2L%;KB^40*K`d`}wfX^yMSnDCo-9;@
zejt^iUS2#lEr;Z$#?c?3<T~2o*0qL~B5P(MmmF>_uSE)N$*r=xsoYU$guS;pE1b*R
zJU~}ZmP}RRJzgNymO^ABj8CEh!y(%3JO=7)ss%Qzy%hj@<J=x9c=euF<ng{&Jx($I
z%B)XDBWWowj1g5!aSM3PSh;=4pnJGoPLGq^TxR$>1l9R9#I=yMmRraxsEG^w*7!%A
zGDMY^jPkRU7L@T=d%#wMrx#dOX5*JmPhT3@-;n41Pa}t4y~o1a?N`Iw4>XbXhSMh5
zyKhDGh7YB@*vf0Kc9Yk9_kSx?ygEDIiWeMo*ys~aBj+(Wy3@b0IC2l%hV{XeLRW>N
z?DK4DN`ccH3NodnC_$-;c&3TFMs;98sW&$xHnugQ<tg=C5P!K*mHm!0%^r-t%H?%G
z%Ze$Yx79f@)a!24U`Snl`syjn#5mZE_PZk9;ZW%?&t$o(z6v^a3U60U1P%52+rw>7
zrt-9BwT)Ih3cvxX_?Km<@O=havzwK92X0<9n`<lzKtdrWY|nX;b&)=Kgh24v(bZ@;
zOuDSY9eM4|3C8BljHZ&8F$x7U)t12|#rq7m{@Z-tKj7S?3KUBTvX8Qwn$ZWm-1PqT
zyt>n>QTu%}KT)<P3hS%g2L!7yZ(qaD8srs|$-xJPovYMeO<znNby)q}LKplH1yY$1
zaL%7?12}ns_Dh^~(tZuwHo9YML83G<A?Gf%Y}P)Zt?1j+DM(Ag^e^n-1#ZXsNt@l#
z;yGNBfu?G}-7xiKv!ZZsd)OS*Z0ht>S5K?$3p;No$R@3tJNW&%?9@?Ycw=BkEq7!I
zDqD|;cU<z_VuqoU5td#y8=|Sqs7vLwd3^hOFK&?H<yqbqo@6RWCG6umdXj3M7B0me
zllinBa&VTS1v01_#Xyq>nf$yw%YXu-q_hPHwrL;H&r?bLb{wjZdOfP3TVr|Sqf*_U
zL6~&D7A<<Hwe%sS0=V06{mgPu$tK2bMJRy7Iu^i){m;bxBW$`wb0?V1Lz$sv)JW2~
zS}lIbwum26^q7(=ZG6-e5vNMiXTUEVDK=<1R-p;GRu5UAc5itrj2u*QSnb<SQ@K}8
zuMva09J2atx1BT>wGo=qIsLDp7_mKMO5hvgrWl)4ni(^>2Wov@Yq4OJ<rU1IqdZbz
znZdj+I}i<^oAw$-DIq1f<fNuk@Bx98?CKcvo-9LRsrLuv=#iz(Mp-lfGAFV)vU=p)
zX%G9E4%khksBc7Ze8%K$M=mi7b&gJ5n=0eafN8kcF#t`Zd31jLf=IT0P#~ZZe=q2A
z+qS%~5nt<@|B!^EFF!!z_bu)lL#^uu!`Ev@DsK3D9X=2Wr63vYD!5%(yuw|uuQu)@
z8jP9dYICD*qK5ibtI(R3yYQLAjq4rlXq~TiIOBW5-Tc0esPr7w{BOMcsVV#Il$6DS
z?|N+`lrTxbEvl%FHDP?Ww>cGK$dm5<9e159mb@LWK+6l<2^NVq7^9x5su`{7=0i+v
zxwq;#x`EcSv|&iZq>8~gLGF!?%v$Ww`b<h@^@0w?WyM0SPttiQNSqwSmFh^GW}NhN
zm7)_#s9d=aTd%}(V`)81Q+(A~GiHk_+c#pwFdd3tMwZIW2w~^r)4J}Mnx!_@R@CO#
zBr|uO*I)hYmZROh$R4k_{L5d5m)$bdGt6Rs(@4U8wN%_J3$Pe{8UguvsJ8K@<gp!c
z9Shi{xasbNaUrf(%ec<DW6gJb|ApgeOz=0T*QFrZ6>by`4-I=bw6vu8QN!8jLy_y-
z=nl*ztk_5Kz*D-4Ro!%Pn%3G6H*y(ZP41C<jmRNG(NIVmDEiXxWxS4>oz^1(2%Tzq
zSi8dGu+~P$Z}OlO{rLGfs|y2(X8z<n2ZG6swTh%vR1X@;^u_B81c#*++{n+-A*aU7
zMS|=-RKxC+gx_tfU~IN3S=aloH+xWS-{(Y~3JY8@NmvH0w_aD6^JhHD%n;S!C3`ed
zZ~Mw7TnxxaGzaxmLuTo2g5R9R;4u_7dkJEDrC=Izec7SCWW`(Gf>mTNNK?+R<-U$z
z-j7%I&K4qUR;GEY>&bts&I)2~G1l%cf;~3-mU4dDS;+|xgSBgL)ur6V=o?u{e`oy^
z=7dpffRe{&WjffRt{J`0Xwe@L{Uwcs1+-G{|FHMgO>r&X_i%7X0>Of72*EA5Tks&k
z-3buf-9m6p2=49<gG;bMf;+?DJ`C>qo5;Q2&+`(Vs{0RB6rAop-TQR!z4ltWodlLN
zQ$pfU@{JG7`H%ZP4-<S%52vXhifS>?3R4-C?aeb1tojHcvtHIcU~DpGSY=)|%-_vr
zul^*(t3a9-K7Q|m#i@Ju(aiLuY@pc{u9Yi8LJMf&?k3~WBRSwh%WkkF)KrK&MxE<7
z`tH4S_N}x&?}O94(&f-W{U-khS%x}(4Vv%VhPs)E8Y5i6PH{5Y9fJRZCF{lbPew<9
zFSMf1gMJVf5pEc>*{_J;=ZgVl<>ZKIR<0Fd%Z>ztE?Dxbt1!HsGk89>oMGxmO>OXp
z$@j{au5k%_cO|dM;mnuN+P`dC%jj)kJsOU;{Sc+oAvANHO<!<;(JZ2S-iMsV3*a{J
zu_rR<byl2{V54q`Gz=G(NJtVh03pv5I^l|0kIZ2I+>raMjk6OxS^qgCjrz)O$eZB=
z2?@ES>Z8LM)y%bLvBThH$2@UWa~X0&YvTl(!}U)EKIX|@g@n0C?`w92{@gM1kR;O5
zoh1iuDv7(Dwe{n4r;wI0XKfJ^E+oFanbiaQ#8vLZsGiL;tM(1k<#2b1Tf*9hU<3ZR
zhq-O`r9;a|%wq`6wlRjrBC(i*fWP|1a%&^JU$#!)*|87UR5DC2sK4bdY?EL_8lUg-
zm^^L&-BDkw@!iFBKC_S>`e~@mtN90`dFHfQ<5Zl{$40t%UtaV%b<KlUUPT>Giwk{=
zbX_E86_{~uuYiU5B-Gkg7S-xx_`Wf>b>)yklLMZH&G_mVGsaah78;USoJm5wgCI38
z)+#sbXcN__Q^NRHX$c3=vfHNlR30rB0+XA<nkOT@w`EVjJ6)9BjsKUl&4OUZa?Tl$
zc)fldn_i!^CLt$#Tlj=<ZbyB5p3bm482xsm_G@yoj9j+rXh0m}yz*Xs-NcCDPF;ST
z^Bd)<58S+PjM)o;p9^DGdt_-d>b|9ZTdL2|#%5|b$pvfw*g;ur@UOrtERZmU7mp~8
zR0GLX1v4X*6b5YT3-Bbb(WBZaNx!Uag&U{5imX5tB&e}5R)3Xa@k1|FBizr1-l4tX
zWJPbVrelelOsnoHL1oH!kf--k%p#s<*`zCsqtC$nJlC_ApF8qp6ScdMPIBswy2OvR
zl$lMtb2*X2DGS^WtfTYF`)_{cSKaS*b2Uj-)gk@lPEtRqy`^ckcS=1SV)c_k@+m?1
zDi>iXn5@rBJFhh{dq~^sc%z@_X!KR}>D(mBo0eG1TCSJZh}@I|o8m*(cBUDJlg;U3
zLzf@>Q1$yY`?5E(gZP<$hW4QXTD}Xl`RVJ0Is<ZvLAX=~8+`yv%LBFj)AN1tkFp%<
zPVj3X{0yuK6%0C-`3a$iBarWkv(b*lMl-2D4%aehW-)DhCSLF+$Kg9^6$<pS@0zrw
z+LBX8eNs<2z|}|50$J@2zJ+KM=6tqg+U@Wnr*gN32h(`6>Yv#vWO*|bqLyBJ5LOO#
z_`Q8u%Kg%Cu8o~7;Mq5eb74LF|M7okDJiD4WYEXhoyiaQDp4j{+??>%w-5!mpB`E^
zxalsx1g{;_JVwpR-kK<i&_)+lxNmJw66DMjS`wKRxyeRkVsGj+*t)EN1ep%sJCqSo
zR}9krd_~uet1@SBCQTuSs&-0ES$OE#WAF|}v3kmzFN8aCjH|u~UG&CR@h%z5#x*)I
zi!X}G{>)hDt}B;a@IGa#K*n{cW*GYic0qV9BX@u=BYQX!mz^A4c_FbX@{6<VqVJum
zx2g>ZQcKcblSbc~HVtpFF>RO0IGyN3=M$)+)K#Y3>+Pu@gF+6hz33(KnS&P?hAwjY
zgz~t_OlH$l2OJMHbWoK2KLv?W*MD$=p4q&FRK~_`d4T6p>gCJ^4ZPwOhDo)@6{6{v
z!atMg7?Asu07_$hc4Q=r8FRn*;CX4S49&$@d_42*R6S|=R*}A^k-SiNCu=6a{rS8U
zeXy9EpRdAk`$TFY(EP$=e`Eb<2l71Ta*yxK>|Iopb>SPb=<KSDZgNg?J?=h<&c^E>
zibu3G+fkv<EghR2;^+R4_A*9|Ds3e#_YU!(7i?Z=B9i&MSzFmesqE%^>{PI$$3US<
ztBE#dURfD#jKDRcP!Z|p93Ne#<ls>%1(MQh?2l7l3@~%`8>S>aF_=?dT+nsUjNuag
z;Medl3sc7ys1%``v_;dTMiczh&+=N!kea6+#BlnI@G9S<Eox!ROl5#?sr5P3Zs}pm
z<^!+3(|3c2z@5pC^d;WG?J!SUuKca->%`r9oo)KpDSmnnHY$W`B|arOX6`_jpAC<v
zfW4M)R}3B=0?Z||EnLGfazclB?n1S00`!Eow#OB+=7Ji8&HByA+MhkeUNEzE(L6b{
zUyW<8Yn1cnRxf?^KY3=oP!ZJiraihl17NSQcc%S2V4u@wi}ZrTW#x<4DzD*)cV?Qd
zCY!EC@5HR5ceW$lfxS*as~FnR{G;1*hhm<_gLWE|1$<L?jqP#*oQezU@*7sZ?_ZSz
zf}C2t6&T4^8c(2=`lKpgrugjpVUS-IfYwiL?NVg>2v@^TZhLp`VFBD~(=K$RM;tX^
z<#pQ1SH^W+xaHC6)F$u%q=tz_AIZTquZnBpEQ)P?p{CS+QA18c3mMZEY+OeB<8}X%
z<zUBW-ON#yh(L87Vl95TNaYdsJGQCHZP{w!SB`!~raU0@{10;^3lYq<92IY!*y(CJ
zCSNo@#)hsV%vhkrXu;ng97<f`RX9FSXO}BLUI0+^q+f?p-^mk1g#Wvj>m~Zv1=z`>
z8B%+)<!GYA4^lh5$hdHjTv{5lU&irF{+7%qu9L(g#N#zIjtoC?zxm`kRVVXB>@)^p
zAAU^hKeYh<%~Svd;F>x=u~mz_Q=UHn<F7_qmhS>|`8Fk6M$t?L)<&v`Yk$tD+Isv8
z#QlD<Gn;Y+r@sbq=nV1<!Tu=abr8Q4hF>)^EU~s>^uNht7=wf#PRrM4R|!?Wa(~7f
zpq|!Hz&P~($!o$gyPx1m0VFN<=I@TwO7C)S=rz~>hqr2oxF9bwqi;DeA`MHuV)yV9
z=1_#P?di_dj#yv~jVbrFQ;YHyi!k*4$^S(Y!n?-sd}Pjd=|OcSf|LI_luJOmfJW^q
zO=2}3idIb-`bpQJTxHE%$wAJdG%j6PpGKtS)t~oUL8Uaj45iu-(`1kA#Cqqy{u$3^
zXv5faqJUH$iU-s-pbCB_c(+!jAG$IzD9>>3QYEpc!kYN8V*A_AvaWw((||Xy5m<;B
z5ySjtcbKMPSL1`)r2p;m@Fx7LrGN_`fDQ>mo~{;D|86foD&3fO#$ThGqH%ZpN8@#w
z&=rI@HC97EhLtbYxhe)qWn%s(Th@ss-g$r}1v}z`2?D5M{Cn7fERmRiY}vZj?-3+X
zlwq2uy(!0TCpk#$53@l2Jts!;nsi(sjvDi`1l9}{?HG=5lT%?lo8RX{K!qHvF}=$L
zozW-}E7X2c?gm>H1-S`}@#-l`2S%fezL_4`PS>$k$aQGHGUGs{BHFrU0t=SyUw&UR
zGhB<5GuX;bkQ=_7lHxk4oh3`9pwva0q_i5lR~xRyrPPo-%ZpJ8&sY%!qOwdK$*+3>
zS5hzjCxWoY#jNt``C$LGEKG8xl!_wIMhd-NA7X=r83UuS22}d{Kd?b&EB+e2g)m$g
z;o+{>tz0#Glz)s!2on%_0@c|Co+wuQdMix#-m!d>DrTk;VVX7W?!4Qh9ep2`?H_<;
z`<pS~<`Fq;-(r`^g)?V4)V7@_awP20IVGXz31wX@QNq88=KnIPaIlBiRUA6R184Zb
zfvHn5kzlRLK$SIz@Y|7yOp{7iAm$J67DC^Ggp%f5cIy|anWVofF?dfS76o8UT-90Y
z(*fn9eMU0B<p5}M)y%%2h>JBa$u!{*D06)=!>w%vq=OSu80|DD4c8h=buA(0h1g>&
z#F9|{hCDo)H^J+NIP71^$Q2xj{fC2Iy1Pv?@0XO>5#<S*1mk;sy&*guBxXH@P_cQ6
z5ZU^Df;-Tw!7(urOOw7JU!<-+*JA;zoPDdhV5!~JT$h(Rx5%8pAF*77Wd_V@ehY0o
zDc@wV(S0#7{h){7dNibm<7I4kNuV8rprjA-zvQtMYRX2<<;B=TOM9Hlw~6wY7^at!
zQG~oU-kRR;Z7uD~@{<%`ew+;HFD|l5`MK<!=1g-Uzh2Teo-lZRGG{(Z4SOqyz8Ay;
z1+^dDSYJZ$Abs)KY#J}(@%X9%E!0Y7(BVg>up|P0ZP<60<ZAr$M%Hjpc<)Y*n@V=y
zyDt<1uThP>p_`XJB-d>L%M41ldTSmTMNx*ln~bU1eOTR4%y#EV+UY%!pCrTP@#jDH
z$v!xC$VROQ_4;oJ_SehAke7livX2)`f0G>o0NAm;jbFNWB7(o*R}usn`F!h8>d7yB
z-gTx0aoCkBWn+HZA7w}M*mdn(9&MtAgu;R0GD6xNWk7;JZ6A+q+;#QT&6bGh_A>%}
zdeTf%p}@GnhqyZk51A|`H)~9eu_Y>_9iv8qxtyd3j8F<%4#2XYf<qrX9sK05eMNRP
zPMy0b!Vg2-)U6kwU!X<%xVYcdO^iI4f=@pzm(}n+4?}keJoSG1iHXJon~6#mJ!)+V
z%`kk~a|!XnvGc`-KQ!Ny`IhPjasLl*a!AGMHnw(INX<`<luC^;v9{FZ>-ShVYhqx-
zN?<&KMMm^$J74_J5tm%}C$`Y-ymyGkdTN5M3A0AeL91ZK)|>swUwfiGEh?fDqqfGh
zKTQYcPqcL#Br|uralG%U)7grjo+}W8Pz+KR$#qVLjwWLOhTh%;CA>?+>zeUhL8QnM
z$ovtGFOe>Eqe}yG#bb+B03?T>HfH)-iIl~)6nRg}jP<&Cw<L~Q26u*A=}7RcsAG9&
zMz-hZkbJO*inqhma3^3%9MmKpKnDWV7&3fDFQtFN5~0csztP=(h!xxVvDsVstBh-;
z4GKYe#Cy8;ak=8hOJ?0{IR@Nc99fsNRKxt*T8R7%QVx;LMioAYI~};(;~aw+fa|$P
zyp3l~(**GZ!LP$1Qg#AZ#BK@3gKf3PU25H|4~_53`UilGKfsnQ7<~zM$^yddD1{h`
zK>Hb$q12x6sOv^Ze!RQ69AU=e4eNWJ3L3mhZ~&S(J0>CC=dN$`tsG8*zC2D0eUga0
z0gK4b6Q+Mn<=7ke6mRZC$siq|nc>}v^M(^+>s<hEQd9nym>OCM*V(m<R%Mvb|7+uS
z6Nut6_zUEX+1lB$)|I;!bKi@dV14lV@klGldp~!!jK>+&G>$TqoG$Sy%E~0g!>*#J
z%cepLFIvYCns+OQ8qd3qNpJ#bqi1ayx|a0~qWsF4d)f-kjryhnlG+^kkuTqOcK&?r
z-E52BCoDj|Zebt$qjOYfyuep`%Ouc0Y~5s?Pn!h;2TpJTBw-LtxI4a+ju)|ZLUgy;
zhE6aqNb&*qr>80nLnRs9)&%WwLusF}{l{0X$C65_>QTODVJ-KAVW>}2VwSzDrmtyB
zcWbnJq=G5pV~|^bQWgsUoTcXMv-e@5<%~pXUgJ#6B!n^_yw4qG;%of*p6@4z>aZv}
z2YO)GVWT-8^8|25WuB(F*=B}u2z5DczyIk9(|u_kc%RzxJi5cc{BB5Ucq|s){vs;|
zj$|q9AP-=c^asFaHN%N}^)+XV>V1t!PL;LSuC!1+Lb(?b>h(ODgkIg$1=#)^TDg2j
zg#Q+s%HetdK}ky`Mvz3D6Q-)(rO@>@7FL~}F`10UexB7C@1>32G31i#KX_qxCQ8;*
z&7C;2>nRjP4DKL42#@LMu=PQaVdNI1#7?Y=B+^d0v?pO<EU||^%c&NL%Vl!0fxmI8
zhcUiH7|{CRtK)04ZwrC1k`h+#zR6nWOl#oCZh+K#Mb&(5POtk9QB2;ZvFf)qVOn;0
zy|_PcC-=KQG~Q-++uiW>w$1hPZ5K`I<!aKLnuK-<TL+a<x{xg9H-mG<GdR6^xz28;
zK|Gi3$#YF1fqav~%UVIc!al^pp4Jt$S!df(aA?^@Tj=7JtL7fkE$e#E8=-=&oPN2r
zRqyvQBL$j0Ek0-cJ~%tGUttzy-kw3_^RPrLU(gJX@6Mu`M5U&Xf9>W*Gt7@bew~|>
z;*s<;oWTKn&;Hf(7UXWY#FfTRm-^X_-1lyW<oWe5%GEJdZF>K7Qft%!j$5RRTbKLs
zLVADesn3~NhT`nL2uri=A|D+B^-E`Qlaj2J_RZra={6|S-A(*70T#}FpS|1IQZol!
z3$^R+kX^bR100PR^_Nng&y)Pi%OeyWd|J}Tt}(75_+|40TC|)=-*Ll%_?r%f6{4PR
zV|s)8?;GjpCW5|Q7Taijub(9~qApv=SJS!Rsn!)S((gI>F0}IgFz>t42CjNe8h1SA
z67B0EV#Oa5X<{W-0Dg`q`BB^NPPbmuwDpzf@&3sd^1Mdm8MAM67~meC^V_h_?(6G5
zRk!V)be14is6A4WM3LR-X&G*jJ?d;0<OxuOW(?Aa2_ZRS0$X36upba^KZSq=F+hh&
z!O#x=m-n8p8-2o~Ka|rryl0p>>@nDacA`CR+wIdLMkU4fa%xcMhB1OftkC*xUPXMI
z;RMMo<~DE4q2>+2{}dJYmKpvED<AFE%?R3SSx;-=?u<g2<Wa2dYg|1sW*mb^`PCMj
z{dnUowlM3a58k3pT=aTefeG7Bz8@*91FqFIm7yP9O7{z<H<L$kKnF6}UVs5i=_q=T
zMy^%CA2KlpAsnBA{YrLk<AgbSLTMsdt;c#n@GxV$%oTlGO$8>UbG(wH2`!Q}Axbqz
zvlgw|Br9e&n}!qbw`;9(hlJwKCPqblrf;I`L?gAaut~niHkWKV<v0rgWdwIsN@xq?
zQ?Ae394uUJVFLA}(dv72f&ebe*lDT^ghT9+=mZv>%sQUC{V8kRY%~w=*V~dNQT-&L
z&#v7Si_M>w_aN0@h2D-FkV<8)u<mc=c564AyLYK=BXMBNef=Pmx$XgCu<skQt%z(Z
zX}sPU)+-sLCX1WSi$-WOPd>ij-a1MjS?4R>6*$cLqkY1lghPr$UF~V<g=tsk={o0r
z5c1^DBDc0wC&eZ2e)^yp=*7Gf!f^x7pxv9$wNOBQY@3$H8oeEJI}P#<4*TASN|PW=
zTa<H5nPkK!&RYdFdH1xr#bGV;TgHO?<0(vT4J?^|B7c`#<h$~d(M>=pPCAL><3iGo
z(wq(zjAMFH2n$t2L=cLMO>A=&k54nLJ4f5Oo+f6#9g{!Ml+i#DjE5`>;z1f-t`B%L
zHChacye9?|$9UIbr#_>%-$nCDuRM9xq;0Pz*ejs^bk)B-GO!(aH(RT?@v_x-gmW#G
z=F$z=rewE-dVs#suGkLoTO#nz-z~Mv<k$L~R6HPC{=Qu=)32H2ucdP!)^VH>NFFzt
zk29xn8xg-jhX(lhn!_(?H6lsG*Y|HBZch>p%FAH+??f)1jr~M7BB@=YjW$@;i*kt+
zU~AOC)^BkpSTbnBF^~FbpVORh%7E<fYT0VYZOw}2MbECu&C2!ROcRX{c)g2&llEnd
zPgMrarMLQ4U-t2s^PH?;35*vkRKk+U`A|xsB>$|B=jPd?w{1o3Q-glOQI+UXXO>FA
zRmxO{bz$Ld99XhO&HQ<9{bYzoNEKt@6F*-sQVm2j$*jB2$*%~R)}T@OSBA%U?}?|M
z3AgXKH!ORp5)8)LD39nrh-f8y)W&Y>Dq)ffDw_^9=lsxL(71&Uyb5~s^Np@#UKZM%
zU^C!t4+;Ni{X2rO4@I4F^e6gBW8L9tg!F(-7QSAq;&7fUp86?nXkO*eCs>$y?%)lM
z*WMhr!u6Kqm#RpqCEX|k12#PKs6&W85enz1m=S&M?#P9=0^6I8rf<(U(0h9$Q};77
zvUptAY21+C2DkQgOA-h9ae)rjeo2pxg`YrtZ&7JO?+9+N3?91Zb(<Jps2~?mFpE8=
z!N+RoMsaH#boIlrH9nN1C$+U>nv*4N-9^qG(gVTIPR0UF99^AR^^<F{hPXFOsLT7b
zBCWhP+2xMg&XEX`$hxP`FIGtvYKY&-Iok*_k%GI9`qrRx+Nx1ajO-CHsN!_CuoS-F
z#7=5!NE}qzLhA#?EzrZH$m~nR(HBfN1zU$G{z74zmFXk2b(A`Q>e#T!L$i0D%8mvD
zQShJhgz|M(DDDSuSwMvP>i8o!ena$r^bZn9S7YUuxU^-x_`^4|@*BpIskEPkt+^E9
zC%8>smyi0Hm95D~>N`AyazwXKYBpNNJUe&Q{Rj^zwwBzzerVx^afY}H&=0oywuqu5
zYG?6Q3}EypvFP|m&r9|OdlmRo^<pEK2T2~_k50_B9~V!@&OUj`FnDMvmpbxR!bHVJ
zPw?a2svzU0Joi^_(<LDPchgCFBT8}OK!;h0`Ns1O;;NE5GKbb{kWGuY1$0APT4YGt
zZab@8jbYj25%ucO=t+<rZh2RVb7JATb9ZczSaw7ot!&Uj&tXKJ7>-X2%F%}`^;(r1
zRS!a_*qfDuvtE!WR%sEANmE<Gt(>NY!It7mkI223?$6YKoS7Hf=n}z(@onFQ#@~h%
zRh$bH&hbmRu#RHPB*TJwX8?P;%|u&33lm`gRf0d5Dtb<CvLM)!0G3118%0V<%&u18
z=T*O$aDVr>N-spMlF^FSN2gW*%Y*F@RZE)W_vsNmRpz;RX}>wT>YTY^WMRD|gVh?g
zo;K9&!{)8c?JpS#CQ;!&UUc^zE%@5qC;UP1Chow`>k8o$qK3LR4ByS7smS;!sCmeN
z<qMf9=a9YLf=}MOGVIxJ#Nv4p@CjoLOv~)$*m+Ji?12C2YRhNOz2MDfR!dBEe-H4p
zGa{)U#P7399i88EM;_}QaPVXhzi;Kv;-)c&kT;$@Ux^Zr(^hTg&WedR4m0k3s+LSb
z&Po|jDsimBOmTldGVb%v%&bb@XYS)Q+``E?q8aRK4CodUS&!?ZybmQGt!7C2Fk2TR
z{*^d}V`R6bui-vQg{UFtTHH_Bv60w~b3SH%JjNuqPn0@7?md3Q*~TdF<2<3WEjIeI
zUAk4>van@diV`6h#F6R$OScQKL0k|O32cO)IAm#B_q0mjps>oi7%sg4Q+$`}YLIk`
z?t2~clzLNxBfKwELLQ-c&?4h?czjCcI`q`87EC}w|0{95!isHSS$0~fzdjMrM~ChZ
zKisFc@U<iMZuAnPNcYjn=I*qAu22|`u;hPoX@7tYkzcsh5K#Q-?GT_8a2y{K+vVfc
zv36E`xUjt1rS;`6!olN-HYd2Y)8;zkNM+B1Djgvk=PJ3E#Pg9V{JKB!fZzN5IGYC}
zrEU+f`vgvTqOcvM_O7pRupQyzuf$d_8fHt)i_{Gm!~tAbsB1l$uh9AwF#BP6S!Cqr
z0IUGp1fOTNF*bYO->~P8iPEwOjGfD620}h#{-7%*odVl@3Nibm2>Asq!OXJN%9!ab
ztT;cMpq^}ANjw+S;!^`mDGGgw|9M$2E$C>>aD)TeN|+fw<O7i~c)kc8k6yU`3+`C|
z0(Yt%NXzjhvuaWM-9#Bi)Y-k4yAN%kRUhhy*EBnp;y)91pQD(YXS-FB*>W;7>4DgE
z0O}oR_H0`KyHRmTNl%)1NQ%{8Rjj=#&M&yg=eq1zawQh~%G>)&lt(;|t3n83IRj7!
ze{|Sa%X%tKXwFI@!aUZVZ`Ec3y*(?oHSl1po*c9>u-a$*L(Jy+h6<Z!>1LuCJSuxr
zELcNFmXp!-3WET!OrLRPZzEWu?)u%dTO-8Ui3*DN=OGL3fau6mQr-qIIsgX-OY&GF
zVw~A6x|OZVTQ+RYm1<XDhA<RQ>ie9ZpTGI`0^hy#w-CWT3DqL<1;zz9<qmi^qk5RR
ze1KI>`Ozb?b6jG@a6PaPi+`aMBVs+8E31CnD^Ooci!gy%FFZW_DGsna$o%>@ASs0g
z2VR8fXW6{3?0*R*9ojj$1zMy?sPX4gED`xcvf9?gbxH;3VbRP^d}87{tjd>&x;h?A
zJQ_AOHU_wuJ^8~)@5Fka1=DJ#a@jbV+)ov&q$^z<z};E_+!hb8ZmCRfqdKcavjo@0
zy*zzYLrq3MRhbT8o0^-O^v6;{cT4|~p-Axr#KvMiC*_-}S5`z*<XJ_OzZNnqg_1dl
z2)K@+lCUE#unW}{o|2}-&SpFXc}6qB%bt+OF-XAFiHmM_9k<5+Ea-d8qdwQD^BP2}
z{Y0*d3+}_b2H5lr56rny+3#Z=J+w8rdRwprQ0bF+k>X&sot26X)Z)4Wp}*k_7+&lP
zzck0(z-zZ?Ctumx3IkiwnP8Z5v;sVolzd?UBz~Zt4L2n0L3+Au4*Fx2{|Js&q$%vB
zd#k@VII%5Gw09$|m6qMwpO5dc{jVO%LO4MDRkWa0^_SzNHm?sVD(l(=1O%Zlomm4k
zv+#cSGQGG)U=^erd7J2yW%6)s4f+c`%fm0-i(Te!4e)P4X9aVweR4g>Hf`uKHG+S6
zsP<=AJg?X0h~LvQFgU=3rA9CotF(ebaE|=qeF)6YM5FPw?6hQQ-pZM~U21I&4o0S#
z67;Lv0zzB<NJU6Mh^@DQZZRi^(12)<YwbATkkv2Li=+*aPme_I%b+p|Az@gI&<!f6
z!43$M7JfN8vS-w7#1wwK9zDJQ+3`QCDI3h7ZW2Uo3y^&l_%od!KUXqJOj%hu?xhy+
z{9BOWOqrJZLDRPVvd?AHbYiO$NTu?h<+q{AVr$5s`le(<XCQUyVd5()3g-%4n8syR
z*z^SA9<SAo3UwcVTfiHKWP+X)R8;HFE}w6L8y%=lPEHm*(9qDB!@uD%SN{s4Z&AIc
z*TqlO-C!L2v3OLy23ykh)AU0Mdiud~)5L^?;L?ibL9{Ix4g6;^JBoRx50|N02Ac`8
z?@=Im<7w-UVh;qJQ$2+F-NMXhSiw53Fq8D{$09kS71O4rWh4uE!GF|13sNigVJm_4
z2g&9c4wvca{BAk0oaRAT&VgQUZ|~Lpp<j&GK@-Y$rk_wrY3VP`FfY~U#y}kS-V~-C
zZoFLbI)<sN=fObL*<VF94IWMs8zB`fi*5Uc=O72z4$=O8MVgSjH36n3m|1zX%4;!3
zad+U>(H%yU5$bz?)5H`1tCFNsDJ>&oPZFES5lo1^o?=zu@Jf4|t{x@QP2uCm0w*v`
z_3dKjVJ2HOJ3Y+{sbieS-e2Nn&iyM1?WCm6y8WzP|IHz<$w6$rI)jVe8k9|vs#ZBT
zIywscC7it}rAdA}<!+P0>r{Z#SM&7p01WEY7#SFFxMWVxN*WTrogZDC9OJZ_X}nFn
z82Vgx8|n5!;QPIjPeNp8^}7{m0&?xOc^F$d$O|F%UD3o#4c!1VoHr}O+{-;$=IKEi
z20kzG4ZPVD_;z3Sz+}4`&o)m-CS7&Dx#?S4{;rgw>o`CyEhFO~VX@-15`dER16ni0
z>=bDC{{8z&k+}p<#=kl^m<Wkml0~}}mE7kFYi)f!oj_d%d#Gkcf!E{d8-=8~gIf_R
z?ag|VAD@w=6%~P#io#I+!gSY^7Ve_RoSawYRlAdoW8b$5pOf%Z6}t<bd+!w&E>6r~
zkLrJe1bx#8X;}VM=$MBU?r{01hM-X0)F6xEtPPz8@#O$^)@wiGYoc2}n0~s^q-Jj~
ze`?%d!Sl}L671Gua6zwlfMWuT?(GS~fn5&(lYv*XU1(pT%Hwzc&Fqi}!LI|Oq}0_D
zYHJ4b6<D-%>lJ|*W)n#)r4@H!<bHP!X&zh2v9t+Zy$khLsU-=RzDGY$jwj?;vSAmI
zSa!H&PP8WQA2fDr#jAZh)sQ+gk$<@mjJ0Eo*gkk{<X7|}jOPLwP4S6WCei!WfW8jV
zh2^h#H^CUBdvD~6NaR~vHWPHxC}#ZKz%H}A$BfISl{Tcsqa&QZ_pX3IoH6&(W4*Pr
zG^Y_!*!qJ7MK0lNtd_G~rH&3*QeLq8J$PSkDC0DkDUEN~vkYt=_Tn4#1mWxNJZDf8
zIR4_)ee|Wir}ffQ`To<x$zb)b#HO~?FUz=?oq+9!mm2fgi!7O30qPSytuk?MnryB=
z)1i|KEedv>o;0TaL&pyJ?%$^yW;A>otCOC=xR-AOovaq;W%e=~D&%2f!*VRYf@!q%
zGB@93H?hhNy8S@H=ZUyTcUubcyIUtG;C0M%${m}O3Nvl{F7N}|{ySd|eRHH1^WxUZ
zz3>KBm8b{iaw>`*A>-S1PVhc}hKDRh-71A1Yd9O{{b$HhT%&(&mRTl<9B<?h8TfiU
zw$rztp2pygS5I8}0s6eb1~B12g8cJYZ+xwYm$n?t%ot5gO(W=sQ!0u!CqWmC3n{7<
z7P619t>HK>^A53X*Sz)9G`&Xh;Mu!24Jq?w;KecnzcFGo6THFnl|4mx$U73NF{N*u
z8V{XBp{<Iei9@Gy>Oyw*<E~zDZ`|BvJ}_|EE$z3<;xbq!)Vz6`BI3%k|GS=_y(ZcY
za?!EdT$NFU{;!34ztkpis)QR1oj1>P$(aLHN=q%c!L-wjXrCW!#y3O-1I`Yp<KD=d
z;ugf&!*tcnNjLf+!4LcKy9U8Fu#<j_58j~n%04TB6x*Rp%1qYps+&CP$*wl)#`Sil
zTPCb@K?Z+;0W>4)92ws&E8Q+-B^wQ27T>^;ZG`9k`F4mmtYCo2e2p2iV=yu&y5V2-
z#mW)RnC4;Bk94*J@*<QHDQ;at;|%W;8Sg`{Wv8yWN0P8LV%tVI;hXUo-MXhutCrug
zBI$<`S%3{4_cr)I&Fx4s!M<TLLP5{ES~1AdEAd!$e>H)}{eA1%25~UU;{^zS#gl+a
zGIG3XxX7nQ;uR?N_;3%VIJtpTwh(;1set>`=?`aHrF=zp?Mi29f9(eaqa~%QrEecU
zw$&fbb7PB%bzw`x!@*NBQX-=9VJdwP5rvzz)EOUl-R}d4-VnO%8+jtzBm590f2Sj2
zZH<(orwVw@Xe2{VX+=#br}oL<@a}QDyrEI8*vm@JQQ_tCr3by6*YaiBr4xOF@8#lY
z2KNKvl7<<3n=J@vX8{<Qa7q{iyDdZ8v1_->X|6{ym*^_X!`iWj>c}&sp1>hu@-)I9
zFNX!{47Myw+b-0}>~F(9N(YI)Zp!@tqy^XkGJ>91wGHi3#n*HGsxw;PTAR#}z+!Mf
z2Kp)YtD*+PxmqW+Yxtu<jZ4{Ni2Z)j6-odl8cE4zNIQM9W`nKXpr<_)k{|G8>I$c}
zP4o<q9%KX=7<SI$+V!%N8@=x{P@AXm^g_@ESSPoXncn~a(QUS;$_v<umZ#*PSd3Ja
z`GUAwBeLW{`DOA;ED_k4@1CA{kH$RWon6|!Yi++Lt+9FAb_s$2D(>&AjQlQ`^6t^A
z?L?R`LB^FJ>_?kwhKdCx(OZx?9IyUpd5<tEh5Z=P&F#b3a`>Fr7oSkT{-?*$7Z#%q
zp45!?!0tB_nZg8@P?3q{t2OSo&w7uINAoLjgh!d+Q7Qa8`*A`8t-Y6I3aH-ufj`>{
z;CGahKQe_~z7z(WYOF=*nJuu4Qu%itz2vc2<?+QCc!$$5Z|dojHLBxrEVK?f<C}BZ
zg*<nDEQ8%vhf2XJfK=0V3G|~`>%iKTB7ilN89@#Nop}rS{)F}S+%6yxFM6H(t9b9E
zj)!0-<oZf!I?56A_ava1dL1hIG2QzD7B1Y{tZ!F15iwCUR#rxGou0&i`dsH@qKE<c
z+ccL5nz$`uzn1#wHD*Tx$jj%heL1tF2XexlBdlE(*m;CYuz%Yv62o<6Z=E@Y-rdIn
zB3L_z%(j?p#NCRdrkukjJ>Upw?eb!9P?q~V1vb~q{#Vx-Qk~188LtE+4L6?l93tHN
z_z{%#h!U%_%{?^(*)Fwu*!Df`PKJ3xG;?O%Yp}tI7!o|4doJ#}8U@2g8t2219Z~P1
z2tx57uUPL8_wS9mLBz=C53I4dq<E`52ZU9%fi@EtYNhH;VYBN8=K&<FkXQb&N&CX2
zq^`cT1X(Xl>1&fn{xrNC`u?pz3~Xfxc5b^35rZXo00<Gwch7q(Jjh4od6NP^62m%w
z62OYI-zJoy&jhj$&#2$Fd#8v+M#Xx9h<y9NsuX5~6AkTL;}&iq@9<dg!TbHdS1L?D
z28+XM1g$G#HcX}&2}Ad%&oAzcD5Utyx~fU%M3xy*KL2QjnZ*<M2c+N=A>r>f_vE~s
zu)f+6F?t`5DT7Sp4qXQXb&yZaHSAEx?Cfs&V{f75j2Ys;)`LJF9yS5`Pzf6>p6~F2
z%jCh@7qMN{`IqH74P-}4y8Qh%AOQOL+#DI~pG6E2pB`}=BXZG)eCdS43>807a^u{w
zx5lYZOy_ec+N>4)WuL!{3ibo#edpUfr3BFs69(s^pcnaT))9aI^2>$;@CdZ)gvRQP
z{QmC=RCino60e>@i(ha4tGg!wRfwoSqk5Ej(LcZcG9X$Jo{Lb$@&9|w2n{p3`_qe0
zf&VtY^1&Y#7-i=C{!)Lp)rCz#5;9FTh5WnOUq3o?pRCSN2}w}>GhWm$)FM0>rGiE1
z|GtF36kJ!ely|t~zrCZ%`P-AIdnx^1%|C6$z<)7`xx$V5w|C5hC#yVV7g=2YH$*Zd
zR3O<g9nrtNQ!v7HIcP#fZT@*vI7ES`n9+i3DjfgzE}{wlWxZ-4aN*x6{cnQ)o1lNb
zjsGm@zfbJn&Evm4=)X<+@44~cDfZtn|BnmtpC9y}qxhdEP2vBaC;eZj@oy0I|Ib)V
z#P-$K*yv~s7~U8$_XivJ8%!=Sz!$3ynyvDnwAe3BOuXV=_O6A={N?oZGv;I&|1Snb
zjZ}qu)?Hp+{`S)p?R6J^I|c00IA(<HJ{0RV;PH!99`#kczfEG)cY3jf^t2@qme;R;
zs~C#pL-70&6*p#Rz2$Hrzbu+lQ={yMqN1#$!$4Y$F|Iagur2h@nPcCN$QU<AJNj;|
z%}HBT_B7GQGLwx$ie=$xNExZ5v*^~m<tK99Z#OOK>gqF_%hOJ2sUVkzq3#K1RJpg;
zOV=;3KXbeM*|a)C{E^ld(?~22rDY;~!BF_fm~fK8x12{?+xXJaOMv<YH>A1>dd<+<
z$bw3j9ac@xm=;rH7od>-YnQ7pJBP`2_2)MMxeQn!mc08p<LtRULruexE4sdNkE6$G
zK2C1#mg+GFX#iiZi{KS!7UJK~iYEzvd=^AEFeE<+aJv{pP;7r?rv{xAFur!*=o96)
zg*@_mIyRN@cvZY7)1WN3A-&O^5>He1|B~@+rp6{!Rro5)xlHGB>8jJ--f#XjuNNS)
z`ABRaQ$R~O#SKT0&!{C>je~=u(Lm%`AM|F|bnrXfTi1O}8;XuLfO;ml#chb|zPEq;
z`{AC6K?CdEy5YlKmEE7QVI=z_t)!*p?a#F-R<zu+S<<GyuH_8b_{2&wu9u%;zQB=I
z4sMp0{nRitoT*Qb15B{Oh-hz8v^cPwZ&Gpfxre+hX;d0CANfwgZbVoo(&Blj)1hBN
zoMO7@*1_O`^F~_C$<9GWMkB;tW3)QnxFc=GL;zO5H`&@!n;aBVxwO6`EEioGF>QC6
zFsz(qAlPU~;!{*psP#7zF-&?^*HE|-K%*|_Gw?cD*d$@U!sa`m4-bM)oDA1=+UR&L
z{-ZTnYH-kn&f{nxaWf?X->u$MR$S-Y&W|DY=`+*CG~S8k2JHpN-kFP-68?n$fknaa
zfJ?&3AVUSW@7=V<A$MJl4i7+I8<I{6!^k0m0DGb?<JHAISkdmyU~f&*f5&q5tS8-G
zewgV*Qmy<wiJ%;p)r%Tp<t)EPshf$#lyAWa>d73QWn_N&7}PdjyWrE+H4yA|RN|b=
z^cbkufpT#lDWKJhEd5c=nFzk#e6}sQ#UH|fim^U?@AHR)5Aa^PFciQBVxU9}Ff^Jv
z2*Hjn?;CGS%X<a{NBg7v{q9)zkr<yhK-@unfbX~)J7+b__?HcF6&;Wud;rs<RrA*Z
z*RN|cu9w*qw(k?W>n?ewCm7NA=|<IENfTE|rF6He>~de=A2j5vb;PsUZO^yO+y<@l
z-~t=K8su}iXYe6>9P1)e=7#m=Hvd@fcX(1F)dgpmNY8aD-?=aRfw9+v_gmbQ-S=B<
zy;IZDgO>TOf^w_tno64+l>me)1zE+;+GP6us}`o4IU$a`GX!zj5QLq;kwmYuSsN-c
z)0eC!>CH^}>}rk6)frpO4h{Ashm06GyQ^Hj<-!es^kHYCZgNIkV6DO2X(0MQV7Z*%
z-Vop43BdICHxqj1PlTF_nA)ZwGfbdpGf%CoR~c3SM1<eH9{*ewZJAJ=?|9>$jwN;~
z9TI$Kcw<nWx){yhHsZQ7qf!>J$(<Ouk1+&?*)PNgTlr{n|0?8AKV)SDP+zdw9Cgv<
z{ydcqz}jK5N<NKeJYCg%6qH|rf)fj7=@p^x{)3FdQ0{%iwY#s-!*(-CQbc+$orR5y
zi0JQBZxZApFb1SwwBS+c0qP8kFP-Y#E@1o0pa$78<1=7PyslnTIXlH|beg*F<$6?1
zUhPL_9+(}S7XVq#r)vNu@@R#qGq?MgYc@6wH?3xXXbjTPRkF+aZhr%E>HBoKyHy6{
zU0-W(SGA-uXG|Zlj@_XMo)xUp8(^OKpyScE>2!pD6P8u9r@U@lkB);?VtQB6dLj$M
ztb=vTDd2b?V&2ByR5AbEU7w2wj8N<}%dx92GbbG@IHfXXs8eP(nhyA;_Yrc%U8YmN
zwYy-b*-t3kn4-hspnx#yiSLU71Wd53Iw-M{>Bk|b%_#f__X)JEy}bQM7SBHWFfV8&
zrxxO)Te{MmZ)!w-i{@%83TF_j&5*awy0u(rk$Nf_<v7n{MmbL^lga<W3h8u~yk#(p
zKlWitAx7{fYut<H;DYoWiRL76w(upiW)h&u+J1il+B_LzNraV~Cag5qP{<V03qND*
zOto#6VQ#-Np06?rBz81fZ4tgzFenrT{%b9)-bfRV2j<OoKbqRh^}<h_^jLk5hs#g;
zPdx*k>n)sl=l~8DXbf(T*H8Qoyp}fiU36UKrZf0>-Nto2&YqbM7&IK%Ypm5?SH6um
zA+79f;#Dr#oQnZBtl(DKS(eERm0C?Rl;`_E$U20^bV}VWsb#zHHmnWQB@Kk}uyKeY
zQ{CFAbU62Ig^dgL%XLdhlbXhb7zwyJhxol*hxmb`@#*}op}ysnddHroS{H|WN-m(Z
zF0lb7dgq1#_mNFTkQrz@)<DINn169eiG_}v+j&_?{o^7txO~}Xiirdm#=lh5(Ll=O
zuFukY*%iUkpV)C{rUfhe{_CDW$E{@Z!Td!1y@H_HTf6q_f<;eAxorw|>F1!mhXf-?
z^<N*R6BXZH(0}Gx(lro1D?>S7BW_ZuL{3jUV!s%0?PpUbGDSR>CpfhHI4OAzSs>;5
zEV4B2Fp${}Wh<_*3Wq;g&Y))5FP^!wfZe3RGIU{(6lbqeCa9-Htyrde=$o-rrKh-K
zH960blOapoC!j#IdGxNlx30`(#8u!T1#;~y75kv*%y^-V8+$t_PZY_C$ZhAXv$r*z
z*z2}Leb}*%QQY{TQ*-)bS;p3(+5$BWs>3z(q2WP<xe<!uxWUvg5Zy2<CyU@D8{uS@
zk0k9TmL-%qb<d@46GwUpX3_C=>QLQ<wri-%c{!<=CqPPV4}&M}2c=m?!J~DR2cwWe
zV#{%VeNNZ3ItUHnvwoj#Sv{c7TqvLGWc~UrI9RQxZTC2OJ^seYD$zZo65Rn-+Gv1A
z_*&+=m&KQo{AMg9FDpwV!}rFL7gAPhdc4+K1FMQh`l(vy&CW}ig+<Qt+gdj(#x94)
zJk4jnJ)(eB22AtVGQUfvkWYqFe&B$uPpmZ&mU%3;jOF^_o(4YIUd@dZ8f4m9)XP@`
zCMTn_8M$yC8H=@*YRnzx^^9a1I|Z?|FFE;SzFuGox72DUsMZa!RHV?T^u=3xywY)<
z>F;<rR=akx`N}vRcbhRcPoZeg@Gd$<NT2!Y;?Ox%G6Yvsdh))J{2sVg4ju(G&a!W%
zxryhOz5}%FmXQ`WYY*tTm!x^GM=6&$T`#<S%q5RcJjdz6XoDvCwf?-`tTf$g^*E@f
zQs9+1@%4>S^|_Ywl;{e#I2@U2vo6;3O3*O_m5$0CsLl50*?}o|iE3bclxe$G=3zxa
zY6(xHZy18M_?uwi=5pk*3aZ1q&NbHx2=B{F$5H>1N*Av-pwQa=TzkC=0GhvT+Vyyq
z>9`ic5<h6SOnV+9^h$>R<NcF3pRo7r<&%OWZWYs&20!Zr7YaFAHk`9v>kS-wU)I3x
zbl`>Eo(3k0ii$dz7`^Dcu%g-A+=lQZ)fv6CY}q@v<w)r9*ZjxP*m$aGG2Xf1`}Ps6
zXo+v`{7tJaI_fgYNrj|eG9Ir#M%be@vVzt{m$@{G<vV%1E;W*{m-55qGIL^(lezQ=
zLS=K@wKX+J@#~1^@wT4J2~+}SBSIsCWs|y>i?o6{#i$N=g&?PxaJY1h(zJc9t)cqC
zsQvqHemWDjPWp*6pu!W}c@aNL_}vDwA7Pu0chORA6=D%TdoQtW+S0ZF4Tz$)^*PYu
z-FM1#`_U*~t0fj9rx~4c`8B5hQ~7eze61d<t8a6Co9~<qjm&x4dY<JlkxaroO2Eii
ziAn~wbH7Brt3TQ8ieJAo`h@NH{T>hc*VEBN8>yeM<r?0aPnk6-p|_v%#AoaK`k9zs
zGAvh|m@BD=<RLFy+<5Me8QQ>sg3an+xof>LvWrIfK!A-2WWj_ueI?k=0t~JH66^wU
zlbt=BYgP$y!)=OipHup#x^RToFuC;bVep;uqeBN~TX_~v=Gn!WNVmh??uciM4Ocj<
zU|7>J5Jtp{gR!V|+Rw}F24HtbY*quwoVw`;hZu77*O#7-9_i{z1}A#_lkJlHEMksX
z$C~6&ow$EK;!;*yolUpL6j_<W@9W&;eM7bF0?qlsEK%Ogf)_;>i_dj1W7JT-Ad?)6
z)@&nyCfa^rA+8spE7&6TaIo+U%&RQyvBKhb8)pUf6{_8!ZF21`J{ca>rzP%i>R7x@
z2^KB4Ye8=Kf@A_-&UAx*<>f7Z3ox#m0)Wzp?saRv)Y~>O5=VTjN>dq))qA|Kd%IUR
znP+-~#asn?gQu`<;F??-2_1D2a8<Y2#!-}BFNyy~V5#Z;{K*qMADMTes_ZjJ+S{Lu
z)V;=1)!SaP`}t%(>vQpxXo?bUluyz3l7Gqpi4t;4-oGD}qIOtBt6Asn_*#IY7(4Zy
zj@f<daZ~Z_Mbi4~hP-#ckOrB+psf({uLb$rJKsG`sH<H{BNy7_WMhQh?6FSAp)7ms
z3Fq(r%&*YUyf}y-Z*h~GHwuvn#K4))z1`v2v*7<B|I~STT|t{x`2((x^u)S-xA0kG
zni}4a!jlI5?bSm!Cy_3P8~t+S^PA$V_6mL5DdzhY=cFL?;?TfjpwLCNs9wqfjNbM)
zbxEbu8AJ?i`g!5D>>0g&n()4xx#2Fz&#%|VDzh?R1lsNC$jR4eUm|+An#eWS#TJw^
zI~iN;L8J|yz2r0QjL)~)<@4~YZ7a|ca$VZ}mYK*P-26Ct(nKym^DLSyKR<6nrQxnu
z-p}<ssIZ@AB$eTEVfN|+9G@gF-Due|bH_vK<mMeaem@Jj7Io(JIlUG~g)~w9B|FGC
zH=~xkk~HGH=<;h&S)#g^uFldDg`LmCspHuTzt_Dt^6j7oTVgxX)H&z~kUXw|rAg#l
zVOn;!dP7WLKA9pY8mjC)|MIQgD6!Q9#wfS?9X@_WoC-!<U&n*Qo^6|a_m$W{GOK>H
z_XZZB--(Q}YEE0T_Dq6Wsp;+G4ZaNcmLa*osLlEZ{Curt97zRadkbGW9eJ7C*SDeW
z?#y){l|$m9XdJ7<PxT|Cc3!rC#sUYThM;|ib<5pT%iCMK{#Q_R@^aC6&s^@ds~qdQ
z?bN)+g7JDCQ!B}IjaEqa0AsBO*%6HT&>mi2diRTb`NKWHSRjA>1K9@-h+xGevjee}
zb*3hAjp=PZVZW~?{@+L)9?zaqiCqlfzdk}zTSXA00D-G0UZBzNITrdVzYu60Hmx5X
zn1L=Oq@^gyFvIU@JnwN@s68_+@wm%4D*1Dd*ZY-OlVgvOXG;17<Kx}DEbnpA+X0z(
zn?KX_=r09Y)GNFnW!|3JlY+Dh3Xwhu#%V9H6T1z9Gx@ZHydPe9*nqj3pyQlxJH*VR
zsyb7knq@?ItNby&g8SDouwz^Gtce_~<P`%W3d-onN3|XoTbTuCICE=zd6Z`e*3NDT
z--TE|PH}z{fLhm2bSB}g;SA_n`Z?sQdY@ZWaPgD*=`PH)(s|(Py)O17U1If&-0)es
z_k3j#=RC#TKb0H(4It=c))I|PJ4?1i$k)U5xMyYB7QFs>JlE`JB;nhSd#dxr*H!W%
ziwYjgw;OqnH{2(CrIoT^#l!EseD{aAq)XL@=d<~M8fD4RWGXbMMf|gbA<J1ml@m@@
zyW4wlWe$(<pHuqBFwWNZ`o{;Q?ZV7Zo_urZ=GM7Hm77CJMJpfg&hF}XBe<q_E#sBV
zd-Qa4%wJ0@+ZWO!HFD9-D(CYi5zt!@^g0qvHtGI`XsEiK4@*E{!qSptt`v<qYTe7I
zGv3<44TyojG<v*!a<&wC+GdO{DUD8ji~7OM<W_|q$ajs=%!zDtsx%PSO0h1;<kr$5
zfQ@gyQcq*CRGfW}C?!vNb{wMH(m7wmE_k;x(R6YgF_ORuDc!gtCi_k(!TYuV2EuS)
zBS9+Qy_!s<zA|mUGx2vRZ_H`i&xO$G0fXIN*XKHdsA2}+-E;Xl&qja`_kGP1_rcA2
zeVOjx>UKQ^@k>4QwVJ$|<rUB5<O!(gQq#MlW&Es(I3W()d*;r2OKqN3AYA!m+HH+?
zCbP+crrCvh{J8}51(nv#6f5w(EA(XsV9j`7lET0n%E?SHyOXrd>1p#E1WcHhlD%D!
zO@06h%eE_^-6aw~$Z$POqBA#UTn{q5wS4fNuiH^gAL3nTSfh<ON4@MG5Q;E`Mdu`-
z!Cm14ROG9eVK?hjVjWt5PZTk?0_--dMW5R#<Blu@y)`~`Xa1SrJTn-f#OU?dd|YWZ
zrAfY5M(pg=;;T$SyNt9BQ_((~34@}NS$(DS%(?SC?KjmK7Eul|OtmuP+Nc1Wed`*y
z)VCw(++&=KuRy(T_lFLPRGPcxX}FtP-w9ogn<=+d>L)-nH%!7$^K^k09J?2Q?RI=Q
ztK{0R=R`W&^=8>+5$)DAn=U&IXNMMt5VTT_AtOG9ARBWak=@~5UX0>cL~Z$u3^u^P
zwJA~$z}T!5`qGHOIpJlxk~xmZPQwFCL@J-@cIyC1)(V;0U!a!YQ#*V`N~x4R+o;4d
zFeyW1T~@6#tgtkhZ*)GSTxA;OY+W>kb4s-61WkDn@sVuzK*NfqrrhA@haAV323VxM
zE(Uc0Y`R0uGH!cWnv7mbc&=jeQ&w3lp&eAW9h6u_Vb6|c{H%I?<_NBquq)likG9GG
z@nzP18&EF443Gt;%&FP}G+&%twqLeYMEITU&%`tgJ6oZ!e&_qcK>K~Hz_9lZhX&-!
ztX9af<WANB^x+0MCO!t=wwLDKyzJ#;7yE7q=CI?x<Qz0JAN|U%ke1J`gloYQ-er;c
zY@P2kpzkedI3s9pq0YQf>rE7Myo|&v$c0OPPmVw$KEt_bTP<)?PQtR<x~v4R*wTS=
z2puwZ9VcZe-M)M8w1ML$$P!T)Grqg(EFDC>D}-0-r<=K?9tB@KQ+4X@sRI<;R`zP)
zu%y|%6BZ&Fmdys5`?RP_rgh}l6C-V1lefL!-zlkl^cqO_eK$pH&2dB739y`uXl{}K
z-g4P3Q<@dNlp-f{o(VM-ZRdc@ttSgNiGS2}&#r^;tbrFwtzfSLsY2s-1%<GWdC%q0
ztmH3f=liUGw5clM*3WgV^Shr-pR>?yZj0iNe(QPWdB0G9&>aRX{ct%wzVK=o!jP{D
z6bG$EmW|*=-#W^=Ua+<>T|O4h+LLg0wZwz{YJZNNEndu-#JEg0Xf@W)T8G)OADTUC
zAlD8*c&!rtv)^cU)_i_ersWt)>||Xj1ve{}xhbZ@WwXq{{kV#r%+~bIoF`O2GcA$I
zuB`m)CJo8Kj6-sljiH%KLg9y>TXG3EZ?x|F-td0BL2R<^h1c>0SDJ!<I@t2hSLq0y
z?hb+P6ZMyiG{`N-i$RXgaUYvDg1t5~?7WpKn%%=%&$jTcXA@lqir3}xes~t;me<~u
zS~-8rv!Lb&)RmucYHW{)WLipveHODE&&Hj6SROUqLt7{<nIHPxvO2e9tsef0^it=e
zNi4rpvV6AdK8i3c3)n5Q?o*7dm|~IB56uvU*NRCr)1FI7Ba;l12^kC!mfNDK$N$&U
zmH0!Uwc#(Ng-c2`DMOoOvLrHY!=S7aQM$5kS&}i<F~bbz7LuhIMn;ygOJc?{V}?YD
zvb*+mB>Or>VkU%d?(MtZ`2)`Ro!|RA@B93o_j%5{<_J<8Twrt6pLOb-cSSad&vhny
zuqok&MnczYW`w>^KY>7P%mA81DlX{Rt&F+10wttzM{&W`{7&RIyw9DS?{b5sc2_nT
z?sEz8>S&g7KLlK@pGDhu4)WT7zGpq1248lX14t)r@5E%XH^%?C6%nGrSt$m-@biA|
zk`nKj|4?#7CLhu1y8Q`wi{l$VT)U<9j|P&Th7vD*#o)&VzoZgc1(ii&{XcjO_?Ll0
zdr2P98>V1RqKF_w3Y?a0?S)(}En!jgK)Kh0;P4=2hmOmPp(ss7MVn5~zQWo0KYYh`
z#%|e^K-<Afjl$^U<^~*Qm{RkzJ#M;j3QuH$R}whdbX&JK4$h4j=cKhCB(F^_@MxQo
z({{qosk!^j3ghoaZwqT&9{&t9I@Zn3Pr>Duly1ypl$1`}9bwe&xE(<<iaNfhX9Sk?
zQS4<9DWNK9N3FA%wd^kOnJ*BYJ;)wKZLi)DCC?%-DfQaqT#6-bJ+gd0UrV9s>D~F@
zuWvP15)hE%&aHxg=3$+!@)8^Wm}`hqVr-0f0dmcaTt0aU$Q!+20O9$y5W?kSfST@^
z_|wLVWrqOwDGwH1QwkYVG}rRcDu8B@%eyVj@kB$Qs()ms&;8=_Vf;^THEzoxJ$sYZ
z--L${;s@iJmA2k9o7)~{fI3Drp_@OZ3hc2YjVyE~8-`mp#1<)q@{5P!)HvC5YGv<l
z%ykG3*e!GZ`9qvg{A6>{>cm#e1NnVu`B9XPo7DMV;y~SJ0(ZH+U!Bnvf;U8H9cR4Q
zxsnXYS5{>TS7I-8EHnXSb+$NhK^SIehwfWxhXA@!70Mu~UCX-!8@kq=v|)!h`z$d*
zbu3D_HO+~irX9c-EFv#-Yx`*P?X2JJ%+j!Q#V%>P68b|cO460F-Ipikt$uK!IGUM%
zcVFLyhx0EGOl^jl8D!C>8uMvkjbKGqFsb8VuNxE+X#0eQ1LG|(yeU?Yk0o?F>}Z?`
z=#Gw|Q1nEINwTnw4vn_6XYLdDH<Mw$vuEgRy)NlJmx}(P`gcdbv1Thtbq=3(Yaw2u
zf<s}lN=}{XaBxO2L7Lv(Ye=8T47F2jqfT{Z*jQf6HFDA9B{p>6ix~ig_|dS4T}gcY
zez#I`JGr#^QPyV3Xa#Ie#fMcl2227bN6m@ubUm0#Q94sIN2h|qzToX-+}ZC#ojmrK
zrL8Oz<zw9e-lpGVp|CQG(&X~{<~`|~-xS<)GTS_+QrVTZ&=B9eehVyVj4;Y%Q>D$0
zzzOpWiN$^d+;RR0`nOpxwj15$dWKbDE{D|e^tb8|*zNL9nE2=(xFiqatKsPofRK#c
zJx=?VGFv@W_S^BG67`nxomH1%;^k!iC}!sy>b(ydq)`h7I%Z_BVK}#=tw8_%XX*9|
zj|SBB6=_bgAcPj#f%6V3Z~h~D$_0Im(K;}4zj`ea6fk{)TyVn)3ty6|HYzRCfd5hV
z0#5LY@IhL`>P{>;&oJR>tdrlsU}js9YutLZy$!RlUJz-bm`X6DWqPDRfZ<ow@5+sD
zv$oeq(Liy^-FKFnXVH5NI>s$upu|3fdV}+Igp2CtK*#P^fL8gPAC?xc8|1k^f6fuR
zeAn2E0T5CB5%h9GXjpikASVS1fk!?+X|@=3oh9~kJ+vU1v6+33TR)Mi1N*YwnY7kx
zj^2JWxWHPxPwh+ETPz6cD7Fahv;aZ<AJ^P;?C|BF@72m|<X+%Ybu}iC(PZ985Y-L+
z+ZofO0(YXMnjs&^+4>ha><_ZQQrmP^_p!ezCmD`Wzik38-MxPqVXg%VF(DaO?+zt@
zKLhqocm;6k(tRn{5*q+pqzAAeax`)y--CnnxP&%^e6~j{RsJm37`wD->r;*oenxXI
zoe0iFB_CCnw4*EoT1ZtYJZG`JA?_(E+S7I9=I>GmE~Nhoq*(Tc@QJEC{ae>0n`-M)
z-+1o}sXaKfbm}isULk>#5q3d4@yfju&p*rBrJ`hN<*eQ-@hC;aM<Yua+UxZUM)8b|
zgztRSq;1VsrY!5KV0D07k)xa5dlGYF!yS-dhs2%43_r4Kq7r%dgKp`CE*VSYPUHcO
zw(ryvB}sFW0S*9<w)uTvHLYuP7UMlWR>H$7$JpsACy0^_a`kBUR<1S~=Ja7gl~7CW
zsrN<{SX|b3B6hK;+ZB4(Y`+}`<d|iCVsY1t3p1Lr1$Y=l>s^vF3;0WJJy!}iLR)t1
z70U{oR<yEOk}#Wp5iqcy+@tVS=2|4=l7dki?K)8$GE-VDv$i(Y@+bT3KwRHSQe%D#
zQL<3Y2}vSXh}Cg#cl%&qrkbp%5MWIrLt3c`;;yD1_Ld~_t;>&<Eqxdx++-7N**F0X
z!$nl%&T#|Jaj(97OZ!*yED71i3u20XWG`{*MC3B>zPzZR&3*e61l)te`bl*k6Db}`
zp4q?xJ*ihqbU1};88-5um_C1x0^x2Nvn@M8F_XlOa2K^Z)??nlF!@iA-}3aOD@O;{
zx2h}~SVN)3xVgYb+Z~}+Jkkt2ycj-cK1<dw9V%ZS_9Pt;&oeZ^bMYhAZp^TC;z3K1
zkC>}3w187*kD5FKFS4ovYpG|Ibo#sI1<-i2tbt0Zh*I|l#EsFLew{}k$(jBAPd(<N
zj{@d9?ia?<%2uB0pC(fBX5_p@-AALL?s|%JkwA|Q)Z?Kru`&c@*$`+%eOy=UExgH1
z8+*lRI+L#xm+Y$}LDD;pS9<}?F5KQSSIs7utNyR`ascFv<BW~}RGg5Z1{XUXL)<WU
zJpEi58KMzhr^7tulfH34xu!XK%-m^m$Zex+Um<yJqoB0M((x}TpHW$<%27mw;?WW<
zbi2erjJAsP4?LXY@+s3CEt<mKq+?4aR5Kf@1_!a&9)Y5rb;kUrJL<SoX&fU-c6jB=
zaJhBWZ71(q?tFgBdg0iPsXLF6wF6%H78x$K0I^YF%fR=arIb1S&H#8Hj;MV}$?4$+
z8L!xqCvQm;1waS>ZR;2PDO^N7#MqO_hZVvDd!t2iUhR+1(31!CzCyj*j$RK&q%<iW
z@K|!dTk)Ock2{B9tXOhZydrPp&e@vPw(yCeO!~0wtsq61{KSyQ91T(}w4@vGk5Pet
z#OYK45;QlnCov?n7MLvMPjH-&3L6I7>*8*<xYq(3{4mNcnOv6!rS3ylYv{p6nb)i>
zE&HL8O*E4sI-D_-yrKx(wqFM1<W$$+7JN94y@a4@{eN>Cfi#V^jYy40eWh$fEQ7kL
zS|Li~<#kW>cf!y=mC-hSamuU-vyxulzt}wk!?UyOu=iS{#kv)NFCsfbkKw+SO<b+4
ztgJwDzO3-A9Ttp`7`T_0Jul$!#1JMP;X;aaOn)i&%Q0}8AwW`7%$}Z`Ykk+y)Y_2F
zXS-l0EyhP&wHC{uAL|qxOYSw*zOl-vLGB{w#G=1OK4sdIr<fZ#(fMEF)z%~Qkp0zl
zyyi1Df<nRtmRD4W%m+~?7DKzh+~KF3kuss0U<c+^A!W&>br8c^7e5E>wEb{CxEn*~
zqpku6Yu;#T*kSz33%|(jVBf<-2?D}R*S9)WE23yK1W4sbpr+UKGYe=-C!a_d4=3o0
zLbYq9qTVrT%x3W|Dei^sDA9qqB58?BIn{;6rCwHfR!n&KtV9cxJH)dlY~Aog?x+kf
zyprjQmfX+EPRdE^mvN(DUzA|-lHk3?pw=pC2p(Ztx)bnutPKSRK_WkW^k+qkox~fh
z;Yea#Mf-ofis(D%S|vfl6|RJzyTcmp2+QZFo&}Aji|XglQYj8aoY$bd=_dw8E%X=&
zJ59<@tG(ZJxhAk?(!N1@_Z$!t^AMeb*Bes4_(ooBuxOk}^MI8foLZAmTNhA`sxSzX
zTT<5+THk$jJ3W_=)1;ywL}%CcYPUqus}eO(cmCD3s7xMs3z<h6KJ_4{Fo&rq4>IcF
zit#w~8~{$2qv>7=a>y1J&8PEN%7>4m4}X?Lb<cn|JehHi8q<rPQ;p37mJ=7i;0im3
z<p`t4oh=zXb~Vl>c)Y1+k8s@df>tZ|Ry`z+ui0o6nPBv>^IX2J9NYW9n&^<_hXCUf
z2h|m4;eU1u8#ThZ1ab`0sm{T7-~oPUDQTk<{g9*W7AaCVj0(fHQTB+)$LkQ-%~s|7
zV^{d`k4XIUxO8uQ6<dH1{$2<v$rQ<Y-D6?{m_NCF`7$yT8&;bh`B9{}YkN=nJhw8R
TVxu_mAO3<FnCVk*IzRa@1dm;R

literal 0
HcmV?d00001

diff --git a/web/pgadmin/static/js/sqleditor/data_sorting.js b/web/pgadmin/static/js/sqleditor/data_sorting.js
new file mode 100644
index 0000000..2c3849c
--- /dev/null
+++ b/web/pgadmin/static/js/sqleditor/data_sorting.js
@@ -0,0 +1,339 @@
+define([
+  'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string',
+  'pgadmin.alertifyjs', 'sources/pgadmin', 'backbone',
+  'pgadmin.backgrid', 'pgadmin.backform', 'axios',
+  'sources/sqleditor/query_tool_actions',
+  //'pgadmin.browser.node.ui',
+], function(
+  gettext, url_for, $, _, S, Alertify, pgAdmin, Backbone,
+  Backgrid, Backform, axios, queryToolActions
+) {
+
+  let order_mapping = {
+    'asc': gettext('ASC'),
+    'desc': gettext('DESC'),
+  };
+
+  let dataSorting = {
+    'dialog': function(handler) {
+      let title = gettext('Data Sorting');
+      axios.get(
+        url_for('sqleditor.get_data_sorting', {
+          'trans_id': handler.transId,
+        }),
+        { headers: {'Cache-Control' : 'no-cache'} }
+      ).then(function (res) {
+        let response = res.data.data.result;
+        let FilterModel = pgAdmin.Browser.DataModel.extend({
+          idAttribute: 'name',
+          defaults: {
+            name: undefined,
+            order: 'asc',
+          },
+          schema: [{
+            id: 'name',
+            name: 'name',
+            label: gettext('Column'),
+            cell: 'select2',
+            editable: true,
+            cellHeaderClasses: 'width_percent_60',
+            headerCell: Backgrid.Extension.CustomHeaderCell,
+            disabled: false,
+            control: 'select2',
+            select2: {
+              allowClear: false,
+            },
+            options: function() {
+              return _.map(response.column_list, (obj) => {
+                return {
+                  value: obj,
+                  label: obj,
+                };
+              });
+            },
+          },
+          {
+            id: 'order',
+            name: 'order',
+            label: gettext('Order'),
+            control: 'select2',
+            cell: 'select2',
+            cellHeaderClasses: 'width_percent_40',
+            headerCell: Backgrid.Extension.CustomHeaderCell,
+            editable: true,
+            deps: ['type'],
+            select2: {
+              allowClear: false,
+            },
+            options: function() {
+              return _.map(order_mapping, (val, key) => {
+                return {
+                  value: key,
+                  label: val,
+                };
+              });
+            },
+          },
+          ],
+          validate: function() {
+            let msg = null;
+            this.errorModel.clear();
+            if (_.isUndefined(this.get('name')) ||
+              _.isNull(this.get('name')) ||
+              String(this.get('name')).replace(/^\s+|\s+$/g, '') == '') {
+              msg = gettext('Please select a column.');
+              this.errorModel.set('name', msg);
+              return msg;
+            } else if (_.isUndefined(this.get('order')) ||
+              _.isNull(this.get('order')) ||
+              String(this.get('order')).replace(/^\s+|\s+$/g, '') == '') {
+              msg = gettext('Please select the order.');
+              this.errorModel.set('order', msg);
+              return msg;
+            }
+            return null;
+          },
+        });
+
+        let DataSortingCollectionModel = pgAdmin.Browser.DataModel.extend({
+          idAttribute: 'data_sorting',
+          schema: [{
+            id: 'data_sorting',
+            name: 'data_sorting',
+            label: gettext('Please select column(s)'),
+            model: FilterModel,
+            editable: true,
+            type: 'collection',
+            mode: ['create'],
+            control: 'unique-col-collection',
+            uniqueCol: ['name'],
+            canAdd: true,
+            canEdit: false,
+            canDelete: true,
+            visible: true,
+            version_compatible: true,
+          }],
+          validate: function() {
+            return null;
+          },
+        });
+
+        // Check the alertify dialog already loaded then delete it to clear
+        // the cache
+        if (Alertify.dataSorting) {
+          delete Alertify.dataSorting;
+        }
+
+        // Create Dialog
+        Alertify.dialog('dataSorting', function factory() {
+          let $container = $('<div class=\'data_sorting_dialog\'></div>');
+          return {
+            main: function() {
+              this.set('title', gettext('Data Sorting'));
+            },
+            build: function() {
+              this.elements.content.appendChild($container.get(0));
+              Alertify.pgDialogBuild.apply(this);
+            },
+            setup: function() {
+              return {
+                buttons: [{
+                  text: '',
+                  key: 27,
+                  className: 'btn btn-default pull-left fa fa-lg fa-question',
+                  attrs: {
+                    name: 'dialog_help',
+                    type: 'button',
+                    label: gettext('Help'),
+                    url: url_for('help.static', {
+                      'filename': 'editgrid.html',
+                    }),
+                  },
+                }, {
+                  text: gettext('Ok'),
+                  key: 27,
+                  className: 'btn btn-primary fa fa-lg fa-save pg-alertify-button',
+                  'data-btn-name': 'ok',
+                }, {
+                  text: gettext('Cancel'),
+                  key: 27,
+                  className: 'btn btn-danger fa fa-lg fa-times pg-alertify-button',
+                  'data-btn-name': 'cancel',
+                }],
+                // Set options for dialog
+                options: {
+                  title: title,
+                  //disable both padding and overflow control.
+                  padding: !1,
+                  overflow: !1,
+                  model: 0,
+                  resizable: true,
+                  maximizable: true,
+                  pinnable: false,
+                  closableByDimmer: false,
+                  modal: false,
+                  autoReset: false,
+                },
+              };
+            },
+            hooks: {
+              // triggered when the dialog is closed
+              onclose: function() {
+                if (this.view) {
+                  this.dataSortingCollectionModel.stopSession();
+                  this.view.model.stopSession();
+                  this.view.remove({
+                    data: true,
+                    internal: true,
+                    silent: true,
+                  });
+                }
+              },
+            },
+            prepare: function() {
+              let self = this;
+              $container.html('');
+              // Disable Ok button
+              this.__internal.buttons[1].element.disabled = true;
+
+              // Status bar
+              this.statusBar = $('<div class=\'pg-prop-status-bar pg-el-xs-12 hide\'>' +
+                '  <div class=\'media error-in-footer bg-red-1 border-red-2 font-red-3 text-14\'>' +
+                '    <div class=\'media-body media-middle\'>' +
+                '      <div class=\'alert-icon error-icon\'>' +
+                '        <i class=\'fa fa-exclamation-triangle\' aria-hidden=\'true\'></i>' +
+                '      </div>' +
+                '      <div class=\'alert-text\'>' +
+                '      </div>' +
+                '    </div>' +
+                '  </div>' +
+                '</div>', {
+                  text: '',
+                }).appendTo($container);
+
+              // To show progress on filter Saving/Updating on AJAX
+              this.showFilterProgress = $(
+                '<div id="show_filter_progress" class="wcLoadingIconContainer busy-fetching hidden">' +
+                '<div class="wcLoadingBackground"></div>' +
+                '<span class="wcLoadingIcon fa fa-spinner fa-pulse"></span>' +
+                '<span class="busy-text wcLoadingLabel">' + gettext('Loading data...') + '</span>' +
+                '</div>').appendTo($container);
+
+              $(
+                self.showFilterProgress[0]
+              ).removeClass('hidden');
+
+              self.dataSortingCollectionModel = new DataSortingCollectionModel();
+
+              let fields = Backform.generateViewSchema(
+                  null, self.dataSortingCollectionModel, 'create', null, null, true
+              );
+
+              let view = this.view = new Backform.Dialog({
+                el: '<div></div>',
+                model: self.dataSortingCollectionModel,
+                schema: fields,
+              });
+
+              $(this.elements.body.childNodes[0]).addClass(
+                'alertify_tools_dialog_properties obj_properties'
+              );
+
+              $container.append(view.render().$el);
+
+              // Enable/disable save button and show/hide statusbar based on session
+              view.listenTo(view.model, 'pgadmin-session:start', function() {
+                view.listenTo(view.model, 'pgadmin-session:invalid', function(msg) {
+                  self.statusBar.removeClass('hide');
+                  $(self.statusBar.find('.alert-text')).html(msg);
+                  // Disable Okay button
+                  self.__internal.buttons[1].element.disabled = true;
+                });
+
+                view.listenTo(view.model, 'pgadmin-session:valid', function() {
+                  self.statusBar.addClass('hide');
+                  $(self.statusBar.find('.alert-text')).html('');
+                  // Enable Okay button
+                  self.__internal.buttons[1].element.disabled = false;
+                });
+              });
+
+              view.listenTo(view.model, 'pgadmin-session:stop', function() {
+                view.stopListening(view.model, 'pgadmin-session:invalid');
+                view.stopListening(view.model, 'pgadmin-session:valid');
+              });
+
+              // Starts monitoring changes to model
+              view.model.startNewSession();
+
+              // Set  data in collection
+              let viewModel = view.model.get('data_sorting');
+              viewModel.add(response['data_sorting']);
+
+              // Hide Progress ...
+              $(
+                self.showFilterProgress[0]
+              ).addClass('hidden');
+
+            },
+            // Callback functions when click on the buttons of the Alertify dialogs
+            callback: function(e) {
+              if (e.button.element.name == 'dialog_help') {
+                e.cancel = true;
+                pgAdmin.Browser.showHelp(e.button.element.name, e.button.element.getAttribute('url'),
+                  null, null, e.button.element.getAttribute('label'));
+                return;
+              }
+              let self = this;
+
+              if (e.button['data-btn-name'] === 'ok') {
+                e.cancel = true; // Do not close dialog
+
+                let dataSortingCollectionModel = this.dataSortingCollectionModel.toJSON();
+
+                // Show Progress ...
+                $(
+                  self.showFilterProgress[0]
+                ).removeClass('hidden');
+
+                axios.put(
+                  url_for('sqleditor.set_data_sorting', {
+                    'trans_id': handler.transId,
+                  }),
+                  dataSortingCollectionModel
+                ).then(function () {
+                  // Hide Progress ...
+                  $(
+                    self.showFilterProgress[0]
+                  ).addClass('hidden');
+                  setTimeout(
+                    function() {
+                      self.close(); // Close the dialog now
+                      Alertify.success(gettext('Filter updated successfully'));
+                      queryToolActions.executeQuery(handler);
+                    }, 10
+                  );
+
+                }).catch(function (error) {
+                  // Hide Progress ...
+                  $(
+                    self.showFilterProgress[0]
+                  ).addClass('hidden');
+
+                  setTimeout(
+                    function() {
+                      Alertify.error(error);
+                    }, 10
+                  );
+                });
+              }
+            },
+          };
+        });
+
+        Alertify.dataSorting(title).resizeTo('65%', '60%');
+      });
+    },
+  };
+  return dataSorting;
+});
diff --git a/web/pgadmin/tools/datagrid/templates/datagrid/index.html b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
index 2f3bb05..1ad1c9a 100644
--- a/web/pgadmin/tools/datagrid/templates/datagrid/index.html
+++ b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
@@ -194,10 +194,11 @@
                 </button>
                 <ul class="dropdown-menu dropdown-menu-right">
                     <li>
-                        <a id="btn-filter-menu" href="#" tabindex="0">{{ _('Filter') }}</a>
-                        <a id="btn-remove-filter" href="#" tabindex="0">{{ _('Remove Filter') }}</a>
+                        <a id="btn-filter-menu" href="#" tabindex="0">{{ _('SQL Filter') }}</a>
+                        <a id="btn-data-sorting" href="#" tabindex="0">{{ _('Data Sorting') }}</a>
                         <a id="btn-include-filter" href="#" tabindex="0">{{ _('By Selection') }}</a>
                         <a id="btn-exclude-filter" href="#" tabindex="0">{{ _('Exclude Selection') }}</a>
+                        <a id="btn-remove-filter" href="#" tabindex="0">{{ _('Remove Filter') }}</a>
                     </li>
                 </ul>
             </div>
diff --git a/web/pgadmin/tools/sqleditor/__init__.py b/web/pgadmin/tools/sqleditor/__init__.py
index 6f5d5b7..ed609d2 100644
--- a/web/pgadmin/tools/sqleditor/__init__.py
+++ b/web/pgadmin/tools/sqleditor/__init__.py
@@ -40,6 +40,7 @@ from pgadmin.tools.sqleditor.utils.query_tool_preferences import \
     RegisterQueryToolPreferences
 from pgadmin.tools.sqleditor.utils.query_tool_fs_utils import \
     read_file_generator
+from pgadmin.tools.sqleditor.utils.data_sorting import DataSorting
 
 MODULE_NAME = 'sqleditor'
 
@@ -106,7 +107,9 @@ class SqlEditorModule(PgAdminModule):
             'sqleditor.load_file',
             'sqleditor.save_file',
             'sqleditor.query_tool_download',
-            'sqleditor.connection_status'
+            'sqleditor.connection_status',
+            'sqleditor.get_data_sorting',
+            'sqleditor.set_data_sorting'
         ]
 
     def register_preferences(self):
@@ -1561,3 +1564,37 @@ def query_tool_status(trans_id):
         return internal_server_error(
             errormsg=gettext("Transaction status check failed.")
         )
+
+
+@blueprint.route(
+    '/data_sorting/<int:trans_id>',
+    methods=["GET"], endpoint='get_data_sorting'
+)
+@login_required
+def get_data_sorting(trans_id):
+    """
+    This method is used to get all the columns for data sorting dialog.
+
+    Args:
+        trans_id: unique transaction id
+    """
+    return DataSorting.get(*check_transaction_status(trans_id))
+
+
+@blueprint.route(
+    '/data_sorting/<int:trans_id>',
+    methods=["PUT"], endpoint='set_data_sorting'
+)
+@login_required
+def set_data_sorting(trans_id):
+    """
+    This method is used to update the columns for data sorting dialog.
+
+    Args:
+        trans_id: unique transaction id
+    """
+    return DataSorting.save(
+        *check_transaction_status(trans_id),
+        request=request,
+        trans_id=trans_id
+    )
diff --git a/web/pgadmin/tools/sqleditor/command.py b/web/pgadmin/tools/sqleditor/command.py
index 8cc96e0..993b0d9 100644
--- a/web/pgadmin/tools/sqleditor/command.py
+++ b/web/pgadmin/tools/sqleditor/command.py
@@ -141,6 +141,10 @@ class SQLFilter(object):
       - This method removes the filter applied.
     * validate_filter(row_filter)
       - This method validates the given filter.
+    * get_data_sorting()
+      - This method returns columns for data sorting
+    * set_data_sorting()
+      - This method saves columns for data sorting
     """
 
     def __init__(self, **kwargs):
@@ -160,8 +164,8 @@ class SQLFilter(object):
         self.sid = kwargs['sid']
         self.did = kwargs['did']
         self.obj_id = kwargs['obj_id']
-        self.__row_filter = kwargs['sql_filter'] if 'sql_filter' in kwargs \
-            else None
+        self.__row_filter = kwargs.get('sql_filter', None)
+        self.__dara_sorting = kwargs.get('data_sorting', None)
 
         manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(self.sid)
         conn = manager.connection(did=self.did)
@@ -210,20 +214,41 @@ class SQLFilter(object):
 
         return status, msg
 
+    def get_data_sorting(self):
+        """
+        This function returns the filter.
+        """
+        if self.__dara_sorting and len(self.__dara_sorting) > 0:
+            return self.__dara_sorting
+        return None
+
+    def set_data_sorting(self, data_filter):
+        """
+        This function validates the filter and set the
+        given filter to member variable.
+        """
+        self.__dara_sorting = data_filter['data_sorting']
+
     def is_filter_applied(self):
         """
         This function returns True if filter is applied else False.
         """
+        is_filter_applied = True
         if self.__row_filter is None or self.__row_filter == '':
-            return False
+            is_filter_applied = False
 
-        return True
+        if not is_filter_applied:
+            if self.__dara_sorting and len(self.__dara_sorting) > 0:
+                is_filter_applied = True
+
+        return is_filter_applied
 
     def remove_filter(self):
         """
         This function remove the filter by setting value to None.
         """
         self.__row_filter = None
+        self.__dara_sorting = None
 
     def append_filter(self, row_filter):
         """
@@ -325,13 +350,58 @@ class GridCommand(BaseCommand, SQLFilter, FetchedRowTracker):
         self.cmd_type = kwargs['cmd_type'] if 'cmd_type' in kwargs else None
         self.limit = -1
 
-        if self.cmd_type == VIEW_FIRST_100_ROWS or \
-                self.cmd_type == VIEW_LAST_100_ROWS:
+        if self.cmd_type in (VIEW_FIRST_100_ROWS, VIEW_LAST_100_ROWS):
             self.limit = 100
 
     def get_primary_keys(self, *args, **kwargs):
         return None, None
 
+    def get_all_columns_with_order(self, default_conn):
+        """
+        Responsible for fetching columns from given object
+
+        Args:
+            default_conn: Connection object
+
+        Returns:
+            all_sorted_columns: Columns which are already sorted which will
+                         be used to populate the Grid in the dialog
+            all_columns: List of all the column for given object which will
+                         be used to fill columns options
+        """
+        driver = get_driver(PG_DEFAULT_DRIVER)
+        if default_conn is None:
+            manager = driver.connection_manager(self.sid)
+            conn = manager.connection(did=self.did, conn_id=self.conn_id)
+        else:
+            conn = default_conn
+
+        all_sorted_columns = []
+        data_sorting = self.get_data_sorting()
+        all_columns = []
+        if conn.connected():
+            # Fetch the rest of the column names
+            query = render_template(
+                "/".join([self.sql_path, 'get_columns.sql']),
+                obj_id=self.obj_id
+            )
+            status, result = conn.execute_dict(query)
+            if not status:
+                raise Exception(result)
+
+            for row in result['rows']:
+                all_columns.append(row['attname'])
+        else:
+            raise Exception(
+                gettext('Not connected to server or connection with the '
+                        'server has been closed.')
+            )
+        # If user has custom data sorting then pass as it as it is
+        if data_sorting and len(data_sorting) > 0:
+            all_sorted_columns = data_sorting
+
+        return all_sorted_columns, all_columns
+
     def save(self, changed_data, default_conn=None):
         return forbidden(
             errmsg=gettext("Data cannot be saved for the current object.")
@@ -351,6 +421,17 @@ class GridCommand(BaseCommand, SQLFilter, FetchedRowTracker):
         """
         self.limit = limit
 
+    def get_pk_order(self):
+        """
+        This function gets the order required for primary keys
+        """
+        if self.cmd_type in (VIEW_FIRST_100_ROWS, VIEW_ALL_ROWS):
+            return 'asc'
+        elif self.cmd_type == VIEW_LAST_100_ROWS:
+            return 'desc'
+        else:
+            return None
+
 
 class TableCommand(GridCommand):
     """
@@ -385,6 +466,7 @@ class TableCommand(GridCommand):
         has_oids = self.has_oids(default_conn)
 
         sql_filter = self.get_filter()
+        data_sorting = self.get_data_sorting()
 
         if sql_filter is None:
             sql = render_template(
@@ -392,7 +474,8 @@ class TableCommand(GridCommand):
                 object_name=self.object_name,
                 nsp_name=self.nsp_name, pk_names=pk_names,
                 cmd_type=self.cmd_type, limit=self.limit,
-                primary_keys=primary_keys, has_oids=has_oids
+                primary_keys=primary_keys, has_oids=has_oids,
+                data_sorting=data_sorting
             )
         else:
             sql = render_template(
@@ -401,7 +484,7 @@ class TableCommand(GridCommand):
                 nsp_name=self.nsp_name, pk_names=pk_names,
                 cmd_type=self.cmd_type, sql_filter=sql_filter,
                 limit=self.limit, primary_keys=primary_keys,
-                has_oids=has_oids
+                has_oids=has_oids, data_sorting=data_sorting
             )
 
         return sql
@@ -447,6 +530,73 @@ class TableCommand(GridCommand):
 
         return pk_names, primary_keys
 
+    def get_all_columns_with_order(self, default_conn=None):
+        """
+        It is overridden method specially for Table because we all have to
+        fetch primary keys and rest of the columns both.
+
+        Args:
+            default_conn: Connection object
+
+        Returns:
+            all_sorted_columns: Sorted columns for the Grid
+            all_columns: List of columns for the select2 options
+        """
+        driver = get_driver(PG_DEFAULT_DRIVER)
+        if default_conn is None:
+            manager = driver.connection_manager(self.sid)
+            conn = manager.connection(did=self.did, conn_id=self.conn_id)
+        else:
+            conn = default_conn
+
+        all_sorted_columns = []
+        data_sorting = self.get_data_sorting()
+        all_columns = []
+        if conn.connected():
+
+            # Fetch the primary key column names
+            query = render_template(
+                "/".join([self.sql_path, 'primary_keys.sql']),
+                obj_id=self.obj_id
+            )
+
+            status, result = conn.execute_dict(query)
+            if not status:
+                raise Exception(result)
+
+            for row in result['rows']:
+                all_columns.append(row['attname'])
+                all_sorted_columns.append(
+                    {
+                        'name': row['attname'],
+                        'order': self.get_pk_order()
+                    }
+                )
+
+            # Fetch the rest of the column names
+            query = render_template(
+                "/".join([self.sql_path, 'get_columns.sql']),
+                obj_id=self.obj_id
+            )
+            status, result = conn.execute_dict(query)
+            if not status:
+                raise Exception(result)
+
+            for row in result['rows']:
+                # Only append if not already present in the list
+                if row['attname'] not in all_columns:
+                    all_columns.append(row['attname'])
+        else:
+            raise Exception(
+                gettext('Not connected to server or connection with the '
+                        'server has been closed.')
+            )
+        # If user has custom data sorting then pass as it as it is
+        if data_sorting and len(data_sorting) > 0:
+            all_sorted_columns = data_sorting
+
+        return all_sorted_columns, all_columns
+
     def can_edit(self):
         return True
 
@@ -771,20 +921,22 @@ class ViewCommand(GridCommand):
         to fetch the data for the specified view
         """
         sql_filter = self.get_filter()
+        data_sorting = self.get_data_sorting()
 
         if sql_filter is None:
             sql = render_template(
                 "/".join([self.sql_path, 'objectquery.sql']),
                 object_name=self.object_name,
                 nsp_name=self.nsp_name, cmd_type=self.cmd_type,
-                limit=self.limit
+                limit=self.limit, data_sorting=data_sorting
             )
         else:
             sql = render_template(
                 "/".join([self.sql_path, 'objectquery.sql']),
                 object_name=self.object_name,
                 nsp_name=self.nsp_name, cmd_type=self.cmd_type,
-                sql_filter=sql_filter, limit=self.limit
+                sql_filter=sql_filter, limit=self.limit,
+                data_sorting=data_sorting
             )
 
         return sql
@@ -832,20 +984,22 @@ class ForeignTableCommand(GridCommand):
         to fetch the data for the specified foreign table
         """
         sql_filter = self.get_filter()
+        data_sorting = self.get_data_sorting()
 
         if sql_filter is None:
             sql = render_template(
                 "/".join([self.sql_path, 'objectquery.sql']),
                 object_name=self.object_name,
                 nsp_name=self.nsp_name, cmd_type=self.cmd_type,
-                limit=self.limit
+                limit=self.limit, data_sorting=data_sorting
             )
         else:
             sql = render_template(
                 "/".join([self.sql_path, 'objectquery.sql']),
                 object_name=self.object_name,
                 nsp_name=self.nsp_name, cmd_type=self.cmd_type,
-                sql_filter=sql_filter, limit=self.limit
+                sql_filter=sql_filter, limit=self.limit,
+                data_sorting=data_sorting
             )
 
         return sql
@@ -883,20 +1037,22 @@ class CatalogCommand(GridCommand):
         to fetch the data for the specified catalog object
         """
         sql_filter = self.get_filter()
+        data_sorting = self.get_data_sorting()
 
         if sql_filter is None:
             sql = render_template(
                 "/".join([self.sql_path, 'objectquery.sql']),
                 object_name=self.object_name,
                 nsp_name=self.nsp_name, cmd_type=self.cmd_type,
-                limit=self.limit
+                limit=self.limit, data_sorting=data_sorting
             )
         else:
             sql = render_template(
                 "/".join([self.sql_path, 'objectquery.sql']),
                 object_name=self.object_name,
                 nsp_name=self.nsp_name, cmd_type=self.cmd_type,
-                sql_filter=sql_filter, limit=self.limit
+                sql_filter=sql_filter, limit=self.limit,
+                data_sorting=data_sorting
             )
 
         return sql
@@ -929,6 +1085,9 @@ class QueryToolCommand(BaseCommand, FetchedRowTracker):
     def get_sql(self, default_conn=None):
         return None
 
+    def get_all_columns_with_order(self, default_conn=None):
+        return None
+
     def can_edit(self):
         return False
 
diff --git a/web/pgadmin/tools/sqleditor/static/css/sqleditor.css b/web/pgadmin/tools/sqleditor/static/css/sqleditor.css
index 46588dc..25599a4 100644
--- a/web/pgadmin/tools/sqleditor/static/css/sqleditor.css
+++ b/web/pgadmin/tools/sqleditor/static/css/sqleditor.css
@@ -602,3 +602,10 @@ input.editor-checkbox:focus {
   font-size: 13px;
   line-height: 3em;
 }
+
+/* For Filter status bar */
+.data_sorting_dialog .pg-prop-status-bar {
+  position: absolute;
+  bottom: 37px;
+  z-index: 5;
+}
diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
index 923ccea..e2b23be 100644
--- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
@@ -14,6 +14,7 @@ define('tools.querytool', [
   'sources/sqleditor_utils',
   'sources/sqleditor/execute_query',
   'sources/sqleditor/is_new_transaction_required',
+  'sources/sqleditor/data_sorting',
   'sources/history/index.js',
   'sources/../jsx/history/query_history',
   'react', 'react-dom',
@@ -30,7 +31,7 @@ define('tools.querytool', [
 ], function(
   babelPollyfill, gettext, url_for, $, _, S, alertify, pgAdmin, Backbone, codemirror,
   pgExplain, GridSelector, ActiveCellCapture, clipboard, copyData, RangeSelectionHelper, handleQueryOutputKeyboardEvent,
-  XCellSelectionModel, setStagedRows, SqlEditorUtils, ExecuteQuery, transaction,
+  XCellSelectionModel, setStagedRows, SqlEditorUtils, ExecuteQuery, transaction, DataSortingHandler,
   HistoryBundle, queryHistory, React, ReactDOM,
   keyboardShortcuts, queryToolActions, Datagrid) {
   /* Return back, this has been called more than once */
@@ -71,6 +72,7 @@ define('tools.querytool', [
       'click #btn-delete-row': 'on_delete',
       'click #btn-filter': 'on_show_filter',
       'click #btn-filter-menu': 'on_show_filter',
+      'click #btn-data-sorting': 'on_data_sorting',
       'click #btn-include-filter': 'on_include_filter',
       'click #btn-exclude-filter': 'on_exclude_filter',
       'click #btn-remove-filter': 'on_remove_filter',
@@ -1366,6 +1368,21 @@ define('tools.querytool', [
       );
     },
 
+    // Callback function for data sorting button click.
+    on_data_sorting: function(ev) {
+      var self = this;
+
+      this._stopEventPropogation(ev);
+      this._closeDropDown(ev);
+
+      // Trigger the data_sorting signal to the SqlEditorController class
+      self.handler.trigger(
+        'pgadmin-sqleditor:button:data_sorting',
+        self,
+        self.handler
+      );
+    },
+
     // Callback function for include filter button click.
     on_include_filter: function(ev) {
       var self = this;
@@ -2057,6 +2074,7 @@ define('tools.querytool', [
         self.on('pgadmin-sqleditor:button:save', self._save, self);
         self.on('pgadmin-sqleditor:button:deleterow', self._delete, self);
         self.on('pgadmin-sqleditor:button:show_filter', self._show_filter, self);
+        self.on('pgadmin-sqleditor:button:data_sorting', self._data_sorting, self);
         self.on('pgadmin-sqleditor:button:include_filter', self._include_filter, self);
         self.on('pgadmin-sqleditor:button:exclude_filter', self._exclude_filter, self);
         self.on('pgadmin-sqleditor:button:remove_filter', self._remove_filter, self);
@@ -3245,6 +3263,12 @@ define('tools.querytool', [
         });
       },
 
+      // This function will used when user wants custom data sorting
+      _data_sorting: function() {
+        let self = this;
+        DataSortingHandler.dialog(self);
+      },
+
       // This function will include the filter by selection.
       _include_filter: function() {
         var self = this,
diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/get_columns.sql b/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/get_columns.sql
new file mode 100644
index 0000000..610747d
--- /dev/null
+++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/get_columns.sql
@@ -0,0 +1,9 @@
+{# ============= Fetch the columns ============= #}
+{% if obj_id %}
+SELECT at.attname, ty.typname
+    FROM pg_attribute at
+    LEFT JOIN pg_type ty ON (ty.oid = at.atttypid)
+WHERE attrelid={{obj_id}}::oid
+    AND at.attnum > 0
+    AND at.attisdropped = FALSE
+{% endif %}
diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/objectquery.sql b/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/objectquery.sql
index 1cb60d9..add1658 100644
--- a/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/objectquery.sql
+++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/objectquery.sql
@@ -3,7 +3,11 @@ SELECT {% if has_oids %}oid, {% endif %}* FROM {{ conn|qtIdent(nsp_name, object_
 {% if sql_filter %}
 WHERE {{ sql_filter }}
 {% endif %}
-{% if primary_keys %}
+{% if data_sorting and data_sorting|length > 0 %}
+ORDER BY {% for obj in data_sorting %}
+{{ conn|qtIdent(obj.name) }} {{ obj.order|upper }}{% if not loop.last %}, {% else %} {% endif %}
+{% endfor %}
+{% elif primary_keys %}
 ORDER BY {% for p in primary_keys %}{{conn|qtIdent(p)}}{% if cmd_type == 1 or cmd_type == 3 %} ASC{% elif cmd_type == 2 %} DESC{% endif %}
 {% if not loop.last %}, {% else %} {% endif %}{% endfor %}
 {% endif %}
diff --git a/web/pgadmin/tools/sqleditor/utils/data_sorting.py b/web/pgadmin/tools/sqleditor/utils/data_sorting.py
new file mode 100644
index 0000000..7a4c406
--- /dev/null
+++ b/web/pgadmin/tools/sqleditor/utils/data_sorting.py
@@ -0,0 +1,91 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2018, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+"""Code to handle data sorting in view data mode."""
+import pickle
+import simplejson as json
+from flask_babel import gettext
+from pgadmin.utils.ajax import make_json_response, internal_server_error
+from pgadmin.tools.sqleditor.utils.update_session_grid_transaction import \
+    update_session_grid_transaction
+
+
+class DataSorting(object):
+    @staticmethod
+    def get(*args):
+        """To fetch the current sorted columns"""
+        status, error_msg, conn, trans_obj, session_obj = args
+        if error_msg == gettext('Transaction ID not found in the session.'):
+            return make_json_response(
+                success=0,
+                errormsg=error_msg,
+                info='DATAGRID_TRANSACTION_REQUIRED',
+                status=404
+            )
+        column_list = []
+        if status and conn is not None and \
+                trans_obj is not None and session_obj is not None:
+            msg = gettext('Success')
+            columns, column_list = trans_obj.get_all_columns_with_order(conn)
+        else:
+            status = False
+            msg = error_msg
+            columns = None
+
+        return make_json_response(
+            data={
+                'status': status,
+                'msg': msg,
+                'result': {
+                    'data_sorting': columns,
+                    'column_list': column_list
+                }
+            }
+        )
+
+    @staticmethod
+    def save(*args, **kwargs):
+        """To save the sorted columns"""
+        # Check the transaction and connection status
+        status, error_msg, conn, trans_obj, session_obj = args
+        trans_id = kwargs['trans_id']
+        request = kwargs['request']
+
+        if request.data:
+            sorting_data = json.loads(request.data, encoding='utf-8')
+        else:
+            sorting_data = request.args or request.form
+
+        if error_msg == gettext('Transaction ID not found in the session.'):
+            return make_json_response(
+                success=0,
+                errormsg=error_msg,
+                info='DATAGRID_TRANSACTION_REQUIRED',
+                status=404
+            )
+
+        if status and conn is not None and \
+           trans_obj is not None and session_obj is not None:
+            trans_obj.set_data_sorting(sorting_data)
+            # As we changed the transaction object we need to
+            # restore it and update the session variable.
+            session_obj['command_obj'] = pickle.dumps(trans_obj, -1)
+            update_session_grid_transaction(trans_id, session_obj)
+            res = gettext('Data sorting object updated successfully')
+        else:
+            return internal_server_error(
+                errormsg=gettext('Failed to update the data on server.')
+            )
+
+        return make_json_response(
+            data={
+                'status': status,
+                'result': res
+            }
+        )
diff --git a/web/pgadmin/tools/sqleditor/utils/tests/test_data_sorting_callbacks.py b/web/pgadmin/tools/sqleditor/utils/tests/test_data_sorting_callbacks.py
new file mode 100644
index 0000000..6364cfb
--- /dev/null
+++ b/web/pgadmin/tools/sqleditor/utils/tests/test_data_sorting_callbacks.py
@@ -0,0 +1,103 @@
+#######################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2018, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+"""Apply Explain plan wrapper to sql object."""
+from pgadmin.utils.ajax import make_json_response, internal_server_error
+from pgadmin.tools.sqleditor.utils.data_sorting import DataSorting
+from pgadmin.utils.route import BaseTestGenerator
+
+TX_ID_ERROR_MSG = 'Transaction ID not found in the session.'
+FAILED_TX_MSG = 'Failed to update the data on server.'
+
+
+class MockRequest(object):
+    "To mock request object"
+    def __init__(self):
+        self.data = None
+        self.args = "Test data",
+
+
+class StartRunningDataSortingTest(BaseTestGenerator):
+    """
+    Check that the DataSorting methods works as
+    intended
+    """
+    scenarios = [
+        ('When we do not find Transaction ID in session in get', dict(
+            input_parameters=(None, TX_ID_ERROR_MSG, None, None, None),
+            expected_return_response={
+                'success': 0,
+                'errormsg': TX_ID_ERROR_MSG,
+                'info': 'DATAGRID_TRANSACTION_REQUIRED',
+                'status': 404
+            },
+            type='get'
+        )),
+        ('When we pass all the values as None in get', dict(
+            input_parameters=(None, None, None, None, None),
+            expected_return_response={
+                'data': {
+                    'status': False,
+                    'msg': None,
+                    'result': {
+                        'data_sorting': None,
+                        'column_list': []
+                    }
+                }
+            },
+            type='get'
+        )),
+
+        ('When we do not find Transaction ID in session in save', dict(
+            input_arg_parameters=(None, TX_ID_ERROR_MSG, None, None, None),
+            input_kwarg_parameters={
+                'trans_id': None,
+                'request': MockRequest()
+            },
+            expected_return_response={
+                'success': 0,
+                'errormsg': TX_ID_ERROR_MSG,
+                'info': 'DATAGRID_TRANSACTION_REQUIRED',
+                'status': 404
+            },
+            type='save'
+        )),
+
+        ('When we pass all the values as None in save', dict(
+            input_arg_parameters=(None, None, None, None, None),
+            input_kwarg_parameters={
+                'trans_id': None,
+                'request': MockRequest()
+            },
+            expected_return_response={
+                'status': 500,
+                'success': 0,
+                'errormsg': FAILED_TX_MSG
+
+            },
+            type='save'
+        ))
+    ]
+
+    def runTest(self):
+        expected_response = make_json_response(
+            **self.expected_return_response
+        )
+        if self.type == 'get':
+            result = DataSorting.get(*self.input_parameters)
+            self.assertEquals(
+                result.status_code, expected_response.status_code
+            )
+        else:
+            result = DataSorting.save(
+                *self.input_arg_parameters, **self.input_kwarg_parameters
+            )
+            self.assertEquals(
+                result.status_code, expected_response.status_code
+            )
diff --git a/web/regression/javascript/sqleditor/data_sorting_specs.js b/web/regression/javascript/sqleditor/data_sorting_specs.js
new file mode 100644
index 0000000..cb19556
--- /dev/null
+++ b/web/regression/javascript/sqleditor/data_sorting_specs.js
@@ -0,0 +1,30 @@
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2018, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+import dataSorting from 'sources/sqleditor/data_sorting';
+
+describe('dataSorting', () => {
+  let sqlEditorController;
+  sqlEditorController = jasmine.createSpy('sqlEditorController')
+  describe('dataSorting', () => {
+    describe('when data sorting filter dialog', () => {
+      beforeEach(() => {
+        spyOn(dataSorting, 'dialog');
+      });
+
+      it("it should be defined as function", function() {
+        expect(dataSorting.dialog).toBeDefined();
+      });
+
+      it('it should call without proper handler', () => {
+        expect(dataSorting.dialog).not.toHaveBeenCalledWith({});
+      });
+
+    });
+  });
+});
