| tunboolification - dwm - [fork] customized build of dwm, the dynamic window man… | |
| git clone git://src.adamsgaard.dk/dwm | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 3c91283ede911916452345d545435b08dce9d556 | |
| parent e941181f464e43765bab98509ef6524e688a46ff | |
| Author: Hiltjo Posthuma <[email protected]> | |
| Date: Sun, 8 Nov 2015 22:48:43 +0100 | |
| unboolification | |
| Diffstat: | |
| M config.def.h | 14 +++++++------- | |
| M dwm.c | 141 +++++++++++++++--------------… | |
| 2 files changed, 77 insertions(+), 78 deletions(-) | |
| --- | |
| diff --git a/config.def.h b/config.def.h | |
| t@@ -13,8 +13,8 @@ static const char selbgcolor[] = "#005577"; | |
| static const char selfgcolor[] = "#eeeeee"; | |
| static const unsigned int borderpx = 1; /* border pixel of windows */ | |
| static const unsigned int snap = 32; /* snap pixel */ | |
| -static const bool showbar = true; /* false means no bar */ | |
| -static const bool topbar = true; /* false means bottom bar */ | |
| +static const int showbar = 1; /* 0 means no bar */ | |
| +static const int topbar = 1; /* 0 means bottom bar */ | |
| /* tagging */ | |
| static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; | |
| t@@ -25,14 +25,14 @@ static const Rule rules[] = { | |
| * WM_NAME(STRING) = title | |
| */ | |
| /* class instance title tags mask isfloating monit… | |
| - { "Gimp", NULL, NULL, 0, true, -1 }, | |
| - { "Firefox", NULL, NULL, 1 << 8, false, -1 }, | |
| + { "Gimp", NULL, NULL, 0, 1, -1 }, | |
| + { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, | |
| }; | |
| /* layout(s) */ | |
| -static const float mfact = 0.55; /* factor of master area size [0.05..0.9… | |
| -static const int nmaster = 1; /* number of clients in master area */ | |
| -static const bool resizehints = true; /* true means respect size hints in tile… | |
| +static const float mfact = 0.55; /* factor of master area size [0.05..0.95… | |
| +static const int nmaster = 1; /* number of clients in master area */ | |
| +static const int resizehints = 1; /* 1 means respect size hints in tiled re… | |
| static const Layout layouts[] = { | |
| /* symbol arrange function */ | |
| diff --git a/dwm.c b/dwm.c | |
| t@@ -24,7 +24,6 @@ | |
| #include <locale.h> | |
| #include <signal.h> | |
| #include <stdarg.h> | |
| -#include <stdbool.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| t@@ -93,7 +92,7 @@ struct Client { | |
| int basew, baseh, incw, inch, maxw, maxh, minw, minh; | |
| int bw, oldbw; | |
| unsigned int tags; | |
| - bool isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; | |
| + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; | |
| Client *next; | |
| Client *snext; | |
| Monitor *mon; | |
| t@@ -123,8 +122,8 @@ struct Monitor { | |
| unsigned int seltags; | |
| unsigned int sellt; | |
| unsigned int tagset[2]; | |
| - bool showbar; | |
| - bool topbar; | |
| + int showbar; | |
| + int topbar; | |
| Client *clients; | |
| Client *sel; | |
| Client *stack; | |
| t@@ -138,13 +137,13 @@ typedef struct { | |
| const char *instance; | |
| const char *title; | |
| unsigned int tags; | |
| - bool isfloating; | |
| + int isfloating; | |
| int monitor; | |
| } Rule; | |
| /* function declarations */ | |
| static void applyrules(Client *c); | |
| -static bool applysizehints(Client *c, int *x, int *y, int *w, int *h, bool int… | |
| +static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int inter… | |
| static void arrange(Monitor *m); | |
| static void arrangemon(Monitor *m); | |
| static void attach(Client *c); | |
| t@@ -171,10 +170,10 @@ static void focus(Client *c); | |
| static void focusin(XEvent *e); | |
| static void focusmon(const Arg *arg); | |
| static void focusstack(const Arg *arg); | |
| -static bool getrootptr(int *x, int *y); | |
| +static int getrootptr(int *x, int *y); | |
| static long getstate(Window w); | |
| -static bool gettextprop(Window w, Atom atom, char *text, unsigned int size); | |
| -static void grabbuttons(Client *c, bool focused); | |
| +static int gettextprop(Window w, Atom atom, char *text, unsigned int size); | |
| +static void grabbuttons(Client *c, int focused); | |
| static void grabkeys(void); | |
| static void incnmaster(const Arg *arg); | |
| static void keypress(XEvent *e); | |
| t@@ -190,17 +189,17 @@ static void pop(Client *); | |
| static void propertynotify(XEvent *e); | |
| static void quit(const Arg *arg); | |
| static Monitor *recttomon(int x, int y, int w, int h); | |
| -static void resize(Client *c, int x, int y, int w, int h, bool interact); | |
| +static void resize(Client *c, int x, int y, int w, int h, int interact); | |
| static void resizeclient(Client *c, int x, int y, int w, int h); | |
| static void resizemouse(const Arg *arg); | |
| static void restack(Monitor *m); | |
| static void run(void); | |
| static void scan(void); | |
| -static bool sendevent(Client *c, Atom proto); | |
| +static int sendevent(Client *c, Atom proto); | |
| static void sendmon(Client *c, Monitor *m); | |
| static void setclientstate(Client *c, long state); | |
| static void setfocus(Client *c); | |
| -static void setfullscreen(Client *c, bool fullscreen); | |
| +static void setfullscreen(Client *c, int fullscreen); | |
| static void setlayout(const Arg *arg); | |
| static void setmfact(const Arg *arg); | |
| static void setup(void); | |
| t@@ -214,10 +213,10 @@ static void togglebar(const Arg *arg); | |
| static void togglefloating(const Arg *arg); | |
| static void toggletag(const Arg *arg); | |
| static void toggleview(const Arg *arg); | |
| -static void unfocus(Client *c, bool setfocus); | |
| -static void unmanage(Client *c, bool destroyed); | |
| +static void unfocus(Client *c, int setfocus); | |
| +static void unmanage(Client *c, int destroyed); | |
| static void unmapnotify(XEvent *e); | |
| -static bool updategeom(void); | |
| +static int updategeom(void); | |
| static void updatebarpos(Monitor *m); | |
| static void updatebars(void); | |
| static void updateclientlist(void); | |
| t@@ -260,7 +259,7 @@ static void (*handler[LASTEvent]) (XEvent *) = { | |
| [UnmapNotify] = unmapnotify | |
| }; | |
| static Atom wmatom[WMLast], netatom[NetLast]; | |
| -static bool running = true; | |
| +static int running = 1; | |
| static Cur *cursor[CurLast]; | |
| static ClrScheme scheme[SchemeLast]; | |
| static Display *dpy; | |
| t@@ -284,7 +283,7 @@ applyrules(Client *c) { | |
| XClassHint ch = { NULL, NULL }; | |
| /* rule matching */ | |
| - c->isfloating = false; | |
| + c->isfloating = 0; | |
| c->tags = 0; | |
| XGetClassHint(dpy, c->win, &ch); | |
| class = ch.res_class ? ch.res_class : broken; | |
| t@@ -310,9 +309,9 @@ applyrules(Client *c) { | |
| c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mo… | |
| } | |
| -bool | |
| -applysizehints(Client *c, int *x, int *y, int *w, int *h, bool interact) { | |
| - bool baseismin; | |
| +int | |
| +applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) { | |
| + int baseismin; | |
| Monitor *m = c->mon; | |
| /* set minimum possible */ | |
| t@@ -419,7 +418,7 @@ buttonpress(XEvent *e) { | |
| click = ClkRootWin; | |
| /* focus monitor if necessary */ | |
| if((m = wintomon(ev->window)) && m != selmon) { | |
| - unfocus(selmon->sel, true); | |
| + unfocus(selmon->sel, 1); | |
| selmon = m; | |
| focus(NULL); | |
| } | |
| t@@ -470,7 +469,7 @@ cleanup(void) { | |
| selmon->lt[selmon->sellt] = &foo; | |
| for(m = mons; m; m = m->next) | |
| while(m->stack) | |
| - unmanage(m->stack, false); | |
| + unmanage(m->stack, 0); | |
| XUngrabKey(dpy, AnyKey, AnyModifier, root); | |
| while(mons) | |
| cleanupmon(mons); | |
| t@@ -506,7 +505,7 @@ void | |
| clearurgent(Client *c) { | |
| XWMHints *wmh; | |
| - c->isurgent = false; | |
| + c->isurgent = 0; | |
| if(!(wmh = XGetWMHints(dpy, c->win))) | |
| return; | |
| wmh->flags &= ~XUrgencyHint; | |
| t@@ -557,7 +556,7 @@ void | |
| configurenotify(XEvent *e) { | |
| Monitor *m; | |
| XConfigureEvent *ev = &e->xconfigure; | |
| - bool dirty; | |
| + int dirty; | |
| /* TODO: updategeom handling sucks, needs to be simplified */ | |
| if(ev->window == root) { | |
| t@@ -650,7 +649,7 @@ destroynotify(XEvent *e) { | |
| XDestroyWindowEvent *ev = &e->xdestroywindow; | |
| if((c = wintoclient(ev->window))) | |
| - unmanage(c, true); | |
| + unmanage(c, 1); | |
| } | |
| void | |
| t@@ -761,7 +760,7 @@ enternotify(XEvent *e) { | |
| c = wintoclient(ev->window); | |
| m = c ? c->mon : wintomon(ev->window); | |
| if(m != selmon) { | |
| - unfocus(selmon->sel, true); | |
| + unfocus(selmon->sel, 1); | |
| selmon = m; | |
| } | |
| else if(!c || c == selmon->sel) | |
| t@@ -784,7 +783,7 @@ focus(Client *c) { | |
| for(c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); | |
| /* was if(selmon->sel) */ | |
| if(selmon->sel && selmon->sel != c) | |
| - unfocus(selmon->sel, false); | |
| + unfocus(selmon->sel, 0); | |
| if(c) { | |
| if(c->mon != selmon) | |
| selmon = c->mon; | |
| t@@ -792,7 +791,7 @@ focus(Client *c) { | |
| clearurgent(c); | |
| detachstack(c); | |
| attachstack(c); | |
| - grabbuttons(c, true); | |
| + grabbuttons(c, 1); | |
| XSetWindowBorder(dpy, c->win, scheme[SchemeSel].border->pix); | |
| setfocus(c); | |
| } | |
| t@@ -820,7 +819,7 @@ focusmon(const Arg *arg) { | |
| return; | |
| if((m = dirtomon(arg->i)) == selmon) | |
| return; | |
| - unfocus(selmon->sel, false); /* s/true/false/ fixes input focus issues | |
| + unfocus(selmon->sel, 0); /* s/1/0/ fixes input focus issues | |
| in gedit and anjuta */ | |
| selmon = m; | |
| focus(NULL); | |
| t@@ -867,13 +866,13 @@ getatomprop(Client *c, Atom prop) { | |
| return atom; | |
| } | |
| -bool | |
| +int | |
| getrootptr(int *x, int *y) { | |
| int di; | |
| unsigned int dui; | |
| Window dummy; | |
| - return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui) … | |
| + return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); | |
| } | |
| long | |
| t@@ -893,18 +892,18 @@ getstate(Window w) { | |
| return result; | |
| } | |
| -bool | |
| +int | |
| gettextprop(Window w, Atom atom, char *text, unsigned int size) { | |
| char **list = NULL; | |
| int n; | |
| XTextProperty name; | |
| if(!text || size == 0) | |
| - return false; | |
| + return 0; | |
| text[0] = '\0'; | |
| XGetTextProperty(dpy, w, &name, atom); | |
| if(!name.nitems) | |
| - return false; | |
| + return 0; | |
| if(name.encoding == XA_STRING) | |
| strncpy(text, (char *)name.value, size - 1); | |
| else { | |
| t@@ -915,11 +914,11 @@ gettextprop(Window w, Atom atom, char *text, unsigned in… | |
| } | |
| text[size - 1] = '\0'; | |
| XFree(name.value); | |
| - return true; | |
| + return 1; | |
| } | |
| void | |
| -grabbuttons(Client *c, bool focused) { | |
| +grabbuttons(Client *c, int focused) { | |
| updatenumlockmask(); | |
| { | |
| unsigned int i, j; | |
| t@@ -964,13 +963,13 @@ incnmaster(const Arg *arg) { | |
| } | |
| #ifdef XINERAMA | |
| -static bool | |
| +static int | |
| isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) { | |
| while(n--) | |
| if(unique[n].x_org == info->x_org && unique[n].y_org == info->… | |
| && unique[n].width == info->width && unique[n].height == info-… | |
| - return false; | |
| - return true; | |
| + return 0; | |
| + return 1; | |
| } | |
| #endif /* XINERAMA */ | |
| t@@ -1046,7 +1045,7 @@ manage(Window w, XWindowAttributes *wa) { | |
| updatesizehints(c); | |
| updatewmhints(c); | |
| XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMas… | |
| - grabbuttons(c, false); | |
| + grabbuttons(c, 0); | |
| if(!c->isfloating) | |
| c->isfloating = c->oldstate = trans != None || c->isfixed; | |
| if(c->isfloating) | |
| t@@ -1058,7 +1057,7 @@ manage(Window w, XWindowAttributes *wa) { | |
| XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* so… | |
| setclientstate(c, NormalState); | |
| if (c->mon == selmon) | |
| - unfocus(selmon->sel, false); | |
| + unfocus(selmon->sel, 0); | |
| c->mon->sel = c; | |
| arrange(c->mon); | |
| XMapWindow(dpy, c->win); | |
| t@@ -1098,7 +1097,7 @@ monocle(Monitor *m) { | |
| if(n > 0) /* override layout symbol */ | |
| snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); | |
| for(c = nexttiled(m->clients); c; c = nexttiled(c->next)) | |
| - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, … | |
| + resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, … | |
| } | |
| void | |
| t@@ -1110,7 +1109,7 @@ motionnotify(XEvent *e) { | |
| if(ev->window != root) | |
| return; | |
| if((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { | |
| - unfocus(selmon->sel, true); | |
| + unfocus(selmon->sel, 1); | |
| selmon = m; | |
| focus(NULL); | |
| } | |
| t@@ -1167,7 +1166,7 @@ movemouse(const Arg *arg) { | |
| togglefloating(NULL); | |
| } | |
| if(!selmon->lt[selmon->sellt]->arrange || c->isfloatin… | |
| - resize(c, nx, ny, c->w, c->h, true); | |
| + resize(c, nx, ny, c->w, c->h, 1); | |
| break; | |
| } | |
| } while(ev.type != ButtonRelease); | |
| t@@ -1231,7 +1230,7 @@ propertynotify(XEvent *e) { | |
| void | |
| quit(const Arg *arg) { | |
| - running = false; | |
| + running = 0; | |
| } | |
| Monitor * | |
| t@@ -1248,7 +1247,7 @@ recttomon(int x, int y, int w, int h) { | |
| } | |
| void | |
| -resize(Client *c, int x, int y, int w, int h, bool interact) { | |
| +resize(Client *c, int x, int y, int w, int h, int interact) { | |
| if(applysizehints(c, &x, &y, &w, &h, interact)) | |
| resizeclient(c, x, y, w, h); | |
| } | |
| t@@ -1309,7 +1308,7 @@ resizemouse(const Arg *arg) { | |
| togglefloating(NULL); | |
| } | |
| if(!selmon->lt[selmon->sellt]->arrange || c->isfloatin… | |
| - resize(c, c->x, c->y, nw, nh, true); | |
| + resize(c, c->x, c->y, nw, nh, 1); | |
| break; | |
| } | |
| } while(ev.type != ButtonRelease); | |
| t@@ -1387,7 +1386,7 @@ void | |
| sendmon(Client *c, Monitor *m) { | |
| if(c->mon == m) | |
| return; | |
| - unfocus(c, true); | |
| + unfocus(c, 1); | |
| detach(c); | |
| detachstack(c); | |
| c->mon = m; | |
| t@@ -1406,11 +1405,11 @@ setclientstate(Client *c, long state) { | |
| PropModeReplace, (unsigned char *)data, 2); | |
| } | |
| -bool | |
| +int | |
| sendevent(Client *c, Atom proto) { | |
| int n; | |
| Atom *protocols; | |
| - bool exists = false; | |
| + int exists = 0; | |
| XEvent ev; | |
| if(XGetWMProtocols(dpy, c->win, &protocols, &n)) { | |
| t@@ -1442,22 +1441,22 @@ setfocus(Client *c) { | |
| } | |
| void | |
| -setfullscreen(Client *c, bool fullscreen) { | |
| +setfullscreen(Client *c, int fullscreen) { | |
| if(fullscreen && !c->isfullscreen) { | |
| XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, | |
| PropModeReplace, (unsigned char*)&netatom[NetW… | |
| - c->isfullscreen = true; | |
| + c->isfullscreen = 1; | |
| c->oldstate = c->isfloating; | |
| c->oldbw = c->bw; | |
| c->bw = 0; | |
| - c->isfloating = true; | |
| + c->isfloating = 1; | |
| resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh… | |
| XRaiseWindow(dpy, c->win); | |
| } | |
| else if(!fullscreen && c->isfullscreen){ | |
| XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, | |
| PropModeReplace, (unsigned char*)0, 0); | |
| - c->isfullscreen = false; | |
| + c->isfullscreen = 0; | |
| c->isfloating = c->oldstate; | |
| c->bw = c->oldbw; | |
| c->x = c->oldx; | |
| t@@ -1562,7 +1561,7 @@ showhide(Client *c) { | |
| if(ISVISIBLE(c)) { /* show clients top down */ | |
| XMoveWindow(dpy, c->win, c->x, c->y); | |
| if((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !… | |
| - resize(c, c->x, c->y, c->w, c->h, false); | |
| + resize(c, c->x, c->y, c->w, c->h, 0); | |
| showhide(c->snext); | |
| } | |
| else { /* hide clients bottom up */ | |
| t@@ -1625,12 +1624,12 @@ tile(Monitor *m) { | |
| for(i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->ne… | |
| if(i < m->nmaster) { | |
| h = (m->wh - my) / (MIN(n, m->nmaster) - i); | |
| - resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c-… | |
| + resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c-… | |
| my += HEIGHT(c); | |
| } | |
| else { | |
| h = (m->wh - ty) / (n - i); | |
| - resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->b… | |
| + resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->b… | |
| ty += HEIGHT(c); | |
| } | |
| } | |
| t@@ -1652,7 +1651,7 @@ togglefloating(const Arg *arg) { | |
| selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isf… | |
| if(selmon->sel->isfloating) | |
| resize(selmon->sel, selmon->sel->x, selmon->sel->y, | |
| - selmon->sel->w, selmon->sel->h, false); | |
| + selmon->sel->w, selmon->sel->h, 0); | |
| arrange(selmon); | |
| } | |
| t@@ -1682,10 +1681,10 @@ toggleview(const Arg *arg) { | |
| } | |
| void | |
| -unfocus(Client *c, bool setfocus) { | |
| +unfocus(Client *c, int setfocus) { | |
| if(!c) | |
| return; | |
| - grabbuttons(c, false); | |
| + grabbuttons(c, 0); | |
| XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].border->pix); | |
| if(setfocus) { | |
| XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); | |
| t@@ -1694,7 +1693,7 @@ unfocus(Client *c, bool setfocus) { | |
| } | |
| void | |
| -unmanage(Client *c, bool destroyed) { | |
| +unmanage(Client *c, int destroyed) { | |
| Monitor *m = c->mon; | |
| XWindowChanges wc; | |
| t@@ -1727,7 +1726,7 @@ unmapnotify(XEvent *e) { | |
| if(ev->send_event) | |
| setclientstate(c, WithdrawnState); | |
| else | |
| - unmanage(c, false); | |
| + unmanage(c, 0); | |
| } | |
| } | |
| t@@ -1776,9 +1775,9 @@ updateclientlist() { | |
| (unsigned char *) &(c->win), 1); | |
| } | |
| -bool | |
| +int | |
| updategeom(void) { | |
| - bool dirty = false; | |
| + int dirty = 0; | |
| #ifdef XINERAMA | |
| if(XineramaIsActive(dpy)) { | |
| t@@ -1809,7 +1808,7 @@ updategeom(void) { | |
| || (unique[i].x_org != m->mx || unique[i].y_or… | |
| || unique[i].width != m->mw || unique[i].h… | |
| { | |
| - dirty = true; | |
| + dirty = 1; | |
| m->num = i; | |
| m->mx = m->wx = unique[i].x_org; | |
| m->my = m->wy = unique[i].y_org; | |
| t@@ -1822,7 +1821,7 @@ updategeom(void) { | |
| for(i = nn; i < n; i++) { | |
| for(m = mons; m && m->next; m = m->next); | |
| while(m->clients) { | |
| - dirty = true; | |
| + dirty = 1; | |
| c = m->clients; | |
| m->clients = c->next; | |
| detachstack(c); | |
| t@@ -1844,7 +1843,7 @@ updategeom(void) { | |
| if(!mons) | |
| mons = createmon(); | |
| if(mons->mw != sw || mons->mh != sh) { | |
| - dirty = true; | |
| + dirty = 1; | |
| mons->mw = mons->ww = sw; | |
| mons->mh = mons->wh = sh; | |
| updatebarpos(mons); | |
| t@@ -1943,9 +1942,9 @@ updatewindowtype(Client *c) { | |
| Atom wtype = getatomprop(c, netatom[NetWMWindowType]); | |
| if(state == netatom[NetWMFullscreen]) | |
| - setfullscreen(c, true); | |
| + setfullscreen(c, 1); | |
| if(wtype == netatom[NetWMWindowTypeDialog]) | |
| - c->isfloating = true; | |
| + c->isfloating = 1; | |
| } | |
| void | |
| t@@ -1958,11 +1957,11 @@ updatewmhints(Client *c) { | |
| XSetWMHints(dpy, c->win, wmh); | |
| } | |
| else | |
| - c->isurgent = (wmh->flags & XUrgencyHint) ? true : fal… | |
| + c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; | |
| if(wmh->flags & InputHint) | |
| c->neverfocus = !wmh->input; | |
| else | |
| - c->neverfocus = false; | |
| + c->neverfocus = 0; | |
| XFree(wmh); | |
| } | |
| } |