get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/809832/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 809832,
    "url": "http://patchwork.ozlabs.org/api/patches/809832/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/uboot/patch/1504555943-12893-5-git-send-email-pantelis.antoniou@konsulko.com/",
    "project": {
        "id": 18,
        "url": "http://patchwork.ozlabs.org/api/projects/18/?format=api",
        "name": "U-Boot",
        "link_name": "uboot",
        "list_id": "u-boot.lists.denx.de",
        "list_email": "u-boot@lists.denx.de",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<1504555943-12893-5-git-send-email-pantelis.antoniou@konsulko.com>",
    "list_archive_url": null,
    "date": "2017-09-04T20:12:13",
    "name": "[U-Boot,v3,04/14] fdt: Allow stacked overlays phandle references",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "6b2a8967d842e4dfc34f137f32439f1c5516b2f4",
    "submitter": {
        "id": 64098,
        "url": "http://patchwork.ozlabs.org/api/people/64098/?format=api",
        "name": "Pantelis Antoniou",
        "email": "pantelis.antoniou@konsulko.com"
    },
    "delegate": {
        "id": 3184,
        "url": "http://patchwork.ozlabs.org/api/users/3184/?format=api",
        "username": "sjg",
        "first_name": "Simon",
        "last_name": "Glass",
        "email": "sjg@chromium.org"
    },
    "mbox": "http://patchwork.ozlabs.org/project/uboot/patch/1504555943-12893-5-git-send-email-pantelis.antoniou@konsulko.com/mbox/",
    "series": [
        {
            "id": 1453,
            "url": "http://patchwork.ozlabs.org/api/series/1453/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/uboot/list/?series=1453",
            "date": "2017-09-04T20:12:09",
            "name": "uboot overlays, FIT image & unittest",
            "version": 3,
            "mbox": "http://patchwork.ozlabs.org/series/1453/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/809832/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/809832/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<u-boot-bounces@lists.denx.de>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org",
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=lists.denx.de\n\t(client-ip=81.169.180.215; helo=lists.denx.de;\n\tenvelope-from=u-boot-bounces@lists.denx.de;\n\treceiver=<UNKNOWN>)",
            "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=konsulko.com header.i=@konsulko.com\n\theader.b=\"fqiIUWsc\"; dkim-atps=neutral"
        ],
        "Received": [
            "from lists.denx.de (dione.denx.de [81.169.180.215])\n\tby ozlabs.org (Postfix) with ESMTP id 3xmLlt0jxtz9t2R\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue,  5 Sep 2017 06:19:06 +1000 (AEST)",
            "by lists.denx.de (Postfix, from userid 105)\n\tid C354AC21F1F; Mon,  4 Sep 2017 20:14:21 +0000 (UTC)",
            "from lists.denx.de (localhost [IPv6:::1])\n\tby lists.denx.de (Postfix) with ESMTP id 97B75C21EE5;\n\tMon,  4 Sep 2017 20:13:53 +0000 (UTC)",
            "by lists.denx.de (Postfix, from userid 105)\n\tid 78995C21EB4; Mon,  4 Sep 2017 20:13:03 +0000 (UTC)",
            "from mail-wm0-f51.google.com (mail-wm0-f51.google.com\n\t[74.125.82.51])\n\tby lists.denx.de (Postfix) with ESMTPS id ADD4DC21F25\n\tfor <u-boot@lists.denx.de>; Mon,  4 Sep 2017 20:12:59 +0000 (UTC)",
            "by mail-wm0-f51.google.com with SMTP id 187so8637937wmn.1\n\tfor <u-boot@lists.denx.de>; Mon, 04 Sep 2017 13:12:59 -0700 (PDT)",
            "from localhost.localdomain ([195.97.110.117])\n\tby smtp.gmail.com with ESMTPSA id\n\tu8sm3720435wrc.92.2017.09.04.13.12.57\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tMon, 04 Sep 2017 13:12:58 -0700 (PDT)"
        ],
        "X-Spam-Checker-Version": "SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de",
        "X-Spam-Level": "",
        "X-Spam-Status": "No, score=-0.0 required=5.0 tests=RCVD_IN_DNSWL_NONE,\n\tRCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,\n\tT_DKIM_INVALID autolearn=unavailable\n\tautolearn_force=no version=3.4.0",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=konsulko.com;\n\ts=google; \n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=9qpB2K0EV0MlFHV4kwHp//yJExoS1o3yNIqHXENlXOU=;\n\tb=fqiIUWscg5LtYGa9m7j9p+GezAEfjHiGDBuFvMyXAfN6aZDzX63Rvu3pYdLxgN33nc\n\taVC+Bko5ZEq6Rm37VVo99OO2lvVM2etfcWncEY7z7HPYvMNlN4QpElUvIEHHP99PWvjm\n\t+cYDsyQPe2Pm96wZ/SOwIVOZoc70Q3wDoIKUI=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=9qpB2K0EV0MlFHV4kwHp//yJExoS1o3yNIqHXENlXOU=;\n\tb=gYcTa7n0KCH30OXe6akra41YGBRlkH4bW5/4Nnarsbu8lfF8/5/miHdT2xvf8/6cKi\n\ttXdCo0xbsVOWaPUfSS2S3BbviPfFUK1OeMMM/ZNCaedHH1QuuLOVzvGTizWkA+E/6gJw\n\tOMvjfIfutP0+qVZTntehbrTDISlfAEt1UckozC0M7BY7/ZM2mMpfPt1nzPr0NMMAUcY+\n\tQSiK4GarwZrXXHkgafyLlLB/isPbmZmbNNQZ17vx8XgsJZl1QLw+mSmW4fMj8Hk64lH7\n\thrUR9vBc2Ranca2LlIKHXMUyuOnyvoeA+wWFFNItXsiGtoci5XElusOe4gAAN1WDCt16\n\tQQGA==",
        "X-Gm-Message-State": "AHPjjUhZsxAAu5dOx+uFrGjrK0wcknaC+YiLS+4Y2IpQP/a09syeCXgb\n\tiPOz4hJWEv52nmHO",
        "X-Google-Smtp-Source": "ADKCNb5IQzZzfhoD/Dixodgy6865GAT/WEignGaf/N4B3O1ovFpjOwBWMMxGi6gCc+ygIkSOXw8NLg==",
        "X-Received": "by 10.28.74.74 with SMTP id x71mr1191178wma.94.1504555979317;\n\tMon, 04 Sep 2017 13:12:59 -0700 (PDT)",
        "From": "Pantelis Antoniou <pantelis.antoniou@konsulko.com>",
        "To": "Tom Rini <trini@konsulko.com>",
        "Date": "Mon,  4 Sep 2017 23:12:13 +0300",
        "Message-Id": "<1504555943-12893-5-git-send-email-pantelis.antoniou@konsulko.com>",
        "X-Mailer": "git-send-email 2.1.4",
        "In-Reply-To": "<1504555943-12893-1-git-send-email-pantelis.antoniou@konsulko.com>",
        "References": "<1504555943-12893-1-git-send-email-pantelis.antoniou@konsulko.com>",
        "Cc": "Marek Vasut <marex@denx.de>,\n\tPantelis Antoniou <pantelis.antoniou@konsulko.com>,\n\tTero Kristo <t-kristo@ti.com>, u-boot@lists.denx.de,\n\tMaxime Ripard <maxime.ripard@free-electrons.com>,\n\tStefan Roese <sr@denx.de>, Alan Ott <alan@signal11.us>,\n\tDavid Gibson <david@gibson.dropbear.id.au>",
        "Subject": "[U-Boot] [PATCH v3 04/14] fdt: Allow stacked overlays phandle\n\treferences",
        "X-BeenThere": "u-boot@lists.denx.de",
        "X-Mailman-Version": "2.1.18",
        "Precedence": "list",
        "List-Id": "U-Boot discussion <u-boot.lists.denx.de>",
        "List-Unsubscribe": "<https://lists.denx.de/options/u-boot>,\n\t<mailto:u-boot-request@lists.denx.de?subject=unsubscribe>",
        "List-Archive": "<http://lists.denx.de/pipermail/u-boot/>",
        "List-Post": "<mailto:u-boot@lists.denx.de>",
        "List-Help": "<mailto:u-boot-request@lists.denx.de?subject=help>",
        "List-Subscribe": "<https://lists.denx.de/listinfo/u-boot>,\n\t<mailto:u-boot-request@lists.denx.de?subject=subscribe>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"utf-8\"",
        "Content-Transfer-Encoding": "base64",
        "Errors-To": "u-boot-bounces@lists.denx.de",
        "Sender": "\"U-Boot\" <u-boot-bounces@lists.denx.de>"
    },
    "content": "This patch enables an overlay to refer to a previous overlay's\nlabels by performing a merge of symbol information at application\ntime.\n\nIn a nutshell it allows an overlay to refer to a symbol that a previous\noverlay has defined. It requires both the base and all the overlays\nto be compiled with the -@ command line switch so that symbol\ninformation is included.\n\nbase.dts\n--------\n\n\t/dts-v1/;\n\t/ {\n\t\tfoo: foonode {\n\t\t\tfoo-property;\n\t\t};\n\t};\n\n\t$ dtc -@ -I dts -O dtb -o base.dtb base.dts\n\nbar.dts\n-------\n\n\t/dts-v1/;\n\t/plugin/;\n\t/ {\n\t\tfragment@1 {\n\t\t\ttarget = <&foo>;\n\t\t\t__overlay__ {\n\t\t\t\toverlay-1-property;\n\t\t\t\tbar: barnode {\n\t\t\t\t\tbar-property;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n\n\t$ dtc -@ -I dts -O dtb -o bar.dtb bar.dts\n\nbaz.dts\n-------\n\n\t/dts-v1/;\n\t/plugin/;\n\t/ {\n\t\tfragment@1 {\n\t\t\ttarget = <&bar>;\n\t\t\t__overlay__ {\n\t\t\t\toverlay-2-property;\n\t\t\t\tbaz: baznode {\n\t\t\t\t\tbaz-property;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n\n\t$ dtc -@ -I dts -O dtb -o baz.dtb baz.dts\n\nApplying the overlays:\n\n\t$ fdtoverlay -i base.dtb -o target.dtb bar.dtb baz.dtb\n\nDumping:\n\n\t$ fdtdump target.dtb\n\t/ {\n            foonode {\n                overlay-1-property;\n                foo-property;\n                linux,phandle = <0x00000001>;\n                phandle = <0x00000001>;\n                barnode {\n                    overlay-2-property;\n                    phandle = <0x00000002>;\n                    linux,phandle = <0x00000002>;\n                    bar-property;\n                    baznode {\n                        phandle = <0x00000003>;\n                        linux,phandle = <0x00000003>;\n                        baz-property;\n                    };\n                };\n            };\n            __symbols__ {\n                baz = \"/foonode/barnode/baznode\";\n                bar = \"/foonode/barnode\";\n                foo = \"/foonode\";\n            };\n\t};\n\nSigned-off-by: Pantelis Antoniou <pantelis.antoniou@konsulko.com>\nSigned-off-by: David Gibson <david@gibson.dropbear.id.au>\n---\n lib/libfdt/fdt_overlay.c | 228 ++++++++++++++++++++++++++++++++++++++++++-----\n 1 file changed, 206 insertions(+), 22 deletions(-)",
    "diff": "diff --git a/lib/libfdt/fdt_overlay.c b/lib/libfdt/fdt_overlay.c\nindex ceb9687..bd81241 100644\n--- a/lib/libfdt/fdt_overlay.c\n+++ b/lib/libfdt/fdt_overlay.c\n@@ -39,6 +39,7 @@ static uint32_t overlay_get_target_phandle(const void *fdto, int fragment)\n  * @fdt: Base device tree blob\n  * @fdto: Device tree overlay blob\n  * @fragment: node offset of the fragment in the overlay\n+ * @pathp: pointer which receives the path of the target (or NULL)\n  *\n  * overlay_get_target() retrieves the target offset in the base\n  * device tree of a fragment, no matter how the actual targetting is\n@@ -49,37 +50,47 @@ static uint32_t overlay_get_target_phandle(const void *fdto, int fragment)\n  *      Negative error code on error\n  */\n static int overlay_get_target(const void *fdt, const void *fdto,\n-\t\t\t      int fragment)\n+\t\t\t      int fragment, char const **pathp)\n {\n \tuint32_t phandle;\n-\tconst char *path;\n-\tint path_len;\n+\tconst char *path = NULL;\n+\tint path_len = 0, ret;\n \n \t/* Try first to do a phandle based lookup */\n \tphandle = overlay_get_target_phandle(fdto, fragment);\n \tif (phandle == (uint32_t)-1)\n \t\treturn -FDT_ERR_BADPHANDLE;\n \n-\tif (phandle)\n-\t\treturn fdt_node_offset_by_phandle(fdt, phandle);\n+\t/* no phandle, try path */\n+\tif (!phandle) {\n+\t\t/* And then a path based lookup */\n+\t\tpath = fdt_getprop(fdto, fragment, \"target-path\", &path_len);\n+\t\tif (path)\n+\t\t\tret = fdt_path_offset(fdt, path);\n+\t\telse\n+\t\t\tret = path_len;\n+\t} else\n+\t\tret = fdt_node_offset_by_phandle(fdt, phandle);\n \n-\t/* And then a path based lookup */\n-\tpath = fdt_getprop(fdto, fragment, \"target-path\", &path_len);\n-\tif (!path) {\n-\t\t/*\n-\t\t * If we haven't found either a target or a\n-\t\t * target-path property in a node that contains a\n-\t\t * __overlay__ subnode (we wouldn't be called\n-\t\t * otherwise), consider it a improperly written\n-\t\t * overlay\n-\t\t */\n-\t\tif (path_len == -FDT_ERR_NOTFOUND)\n-\t\t\treturn -FDT_ERR_BADOVERLAY;\n+\t/*\n+\t* If we haven't found either a target or a\n+\t* target-path property in a node that contains a\n+\t* __overlay__ subnode (we wouldn't be called\n+\t* otherwise), consider it a improperly written\n+\t* overlay\n+\t*/\n+\tif (ret < 0 && path_len == -FDT_ERR_NOTFOUND)\n+\t\tret = -FDT_ERR_BADOVERLAY;\n+\n+\t/* return on error */\n+\tif (ret < 0)\n+\t\treturn ret;\n \n-\t\treturn path_len;\n-\t}\n+\t/* return pointer to path (if available) */\n+\tif (pathp)\n+\t\t*pathp = path ? path : NULL;\n \n-\treturn fdt_path_offset(fdt, path);\n+\treturn ret;\n }\n \n /**\n@@ -590,7 +601,7 @@ static int overlay_apply_node(void *fdt, int target,\n  *\n  * overlay_merge() merges an overlay into its base device tree.\n  *\n- * This is the final step in the device tree overlay application\n+ * This is the next to last step in the device tree overlay application\n  * process, when all the phandles have been adjusted and resolved and\n  * you just have to merge overlay into the base device tree.\n  *\n@@ -618,7 +629,7 @@ static int overlay_merge(void *fdt, void *fdto)\n \t\tif (overlay < 0)\n \t\t\treturn overlay;\n \n-\t\ttarget = overlay_get_target(fdt, fdto, fragment);\n+\t\ttarget = overlay_get_target(fdt, fdto, fragment, NULL);\n \t\tif (target < 0)\n \t\t\treturn target;\n \n@@ -630,6 +641,175 @@ static int overlay_merge(void *fdt, void *fdto)\n \treturn 0;\n }\n \n+static int get_path_len(const void *fdt, int nodeoffset)\n+{\n+\tint len = 0, namelen;\n+\tconst char *name;\n+\n+\tFDT_CHECK_HEADER(fdt);\n+\n+\tfor (;;) {\n+\t\tname = fdt_get_name(fdt, nodeoffset, &namelen);\n+\t\tif (!name)\n+\t\t\treturn namelen;\n+\n+\t\t/* root? we're done */\n+\t\tif (namelen == 0)\n+\t\t\tbreak;\n+\n+\t\tnodeoffset = fdt_parent_offset(fdt, nodeoffset);\n+\t\tif (nodeoffset < 0)\n+\t\t\treturn nodeoffset;\n+\t\tlen += namelen + 1;\n+\t}\n+\n+\t/* in case of root pretend it's \"/\" */\n+\tif (len == 0)\n+\t\tlen++;\n+\treturn len;\n+}\n+\n+/**\n+ * overlay_symbol_update - Update the symbols of base tree after a merge\n+ * @fdt: Base Device Tree blob\n+ * @fdto: Device tree overlay blob\n+ *\n+ * overlay_symbol_update() updates the symbols of the base tree with the\n+ * symbols of the applied overlay\n+ *\n+ * This is the last step in the device tree overlay application\n+ * process, allowing the reference of overlay symbols by subsequent\n+ * overlay operations.\n+ *\n+ * returns:\n+ *      0 on success\n+ *      Negative error code on failure\n+ */\n+static int overlay_symbol_update(void *fdt, void *fdto)\n+{\n+\tint root_sym, ov_sym, prop, path_len, fragment, target;\n+\tint len, frag_name_len, ret, rel_path_len;\n+\tconst char *s, *e;\n+\tconst char *path;\n+\tconst char *name;\n+\tconst char *frag_name;\n+\tconst char *rel_path;\n+\tconst char *target_path;\n+\tchar *buf;\n+\tvoid *p;\n+\n+\tov_sym = fdt_subnode_offset(fdto, 0, \"__symbols__\");\n+\n+\t/* if no overlay symbols exist no problem */\n+\tif (ov_sym < 0)\n+\t\treturn 0;\n+\n+\troot_sym = fdt_subnode_offset(fdt, 0, \"__symbols__\");\n+\n+\t/* it no root symbols exist we should create them */\n+\tif (root_sym == -FDT_ERR_NOTFOUND)\n+\t\troot_sym = fdt_add_subnode(fdt, 0, \"__symbols__\");\n+\n+\t/* any error is fatal now */\n+\tif (root_sym < 0)\n+\t\treturn root_sym;\n+\n+\t/* iterate over each overlay symbol */\n+\tfdt_for_each_property_offset(prop, fdto, ov_sym) {\n+\t\tpath = fdt_getprop_by_offset(fdto, prop, &name, &path_len);\n+\t\tif (!path)\n+\t\t\treturn path_len;\n+\n+\t\t/* verify it's a string property (terminated by a single \\0) */\n+\t\tif (path_len < 1 || memchr(path, '\\0', path_len) != &path[path_len - 1])\n+\t\t\treturn -FDT_ERR_BADVALUE;\n+\n+\t\t/* keep end marker to avoid strlen() */\n+\t\te = path + path_len;\n+\n+\t\t/* format: /<fragment-name>/__overlay__/<relative-subnode-path> */\n+\n+\t\tif (*path != '/')\n+\t\t\treturn -FDT_ERR_BADVALUE;\n+\n+\t\t/* get fragment name first */\n+\t\ts = strchr(path + 1, '/');\n+\t\tif (!s)\n+\t\t\treturn -FDT_ERR_BADOVERLAY;\n+\n+\t\tfrag_name = path + 1;\n+\t\tfrag_name_len = s - path - 1;\n+\n+\t\t/* verify format; safe since \"s\" lies in \\0 terminated prop */\n+\t\tlen = sizeof(\"/__overlay__/\") - 1;\n+\t\tif ((e - s) < len || memcmp(s, \"/__overlay__/\", len))\n+\t\t\treturn -FDT_ERR_BADOVERLAY;\n+\n+\t\trel_path = s + len;\n+\t\trel_path_len = e - rel_path;\n+\n+\t\t/* find the fragment index in which the symbol lies */\n+\t\tret = fdt_subnode_offset_namelen(fdto, 0, frag_name,\n+\t\t\t\t\t       frag_name_len);\n+\t\t/* not found? */\n+\t\tif (ret < 0)\n+\t\t\treturn -FDT_ERR_BADOVERLAY;\n+\t\tfragment = ret;\n+\n+\t\t/* an __overlay__ subnode must exist */\n+\t\tret = fdt_subnode_offset(fdto, fragment, \"__overlay__\");\n+\t\tif (ret < 0)\n+\t\t\treturn -FDT_ERR_BADOVERLAY;\n+\n+\t\t/* get the target of the fragment */\n+\t\tret = overlay_get_target(fdt, fdto, fragment, &target_path);\n+\t\tif (ret < 0)\n+\t\t\treturn ret;\n+\t\ttarget = ret;\n+\n+\t\t/* if we have a target path use */\n+\t\tif (!target_path) {\n+\t\t\tret = get_path_len(fdt, target);\n+\t\t\tif (ret < 0)\n+\t\t\t\treturn ret;\n+\t\t\tlen = ret;\n+\t\t} else {\n+\t\t\tlen = strlen(target_path);\n+\t\t}\n+\n+\t\tret = fdt_setprop_placeholder(fdt, root_sym, name,\n+\t\t\t\tlen + (len > 1) + rel_path_len + 1, &p);\n+\t\tif (ret < 0)\n+\t\t\treturn ret;\n+\n+\t\tif (!target_path) {\n+\t\t\t/* again in case setprop_placeholder changed it */\n+\t\t\tret = overlay_get_target(fdt, fdto, fragment, &target_path);\n+\t\t\tif (ret < 0)\n+\t\t\t\treturn ret;\n+\t\t\ttarget = ret;\n+\t\t}\n+\n+\t\tbuf = p;\n+\t\tif (len > 1) { /* target is not root */\n+\t\t\tif (!target_path) {\n+\t\t\t\tret = fdt_get_path(fdt, target, buf, len + 1);\n+\t\t\t\tif (ret < 0)\n+\t\t\t\t\treturn ret;\n+\t\t\t} else\n+\t\t\t\tmemcpy(buf, target_path, len + 1);\n+\n+\t\t} else\n+\t\t\tlen--;\n+\n+\t\tbuf[len] = '/';\n+\t\tmemcpy(buf + len + 1, rel_path, rel_path_len);\n+\t\tbuf[len + 1 + rel_path_len] = '\\0';\n+\t}\n+\n+\treturn 0;\n+}\n+\n int fdt_overlay_apply(void *fdt, void *fdto)\n {\n \tuint32_t delta = fdt_get_max_phandle(fdt);\n@@ -654,6 +834,10 @@ int fdt_overlay_apply(void *fdt, void *fdto)\n \tif (ret)\n \t\tgoto err;\n \n+\tret = overlay_symbol_update(fdt, fdto);\n+\tif (ret)\n+\t\tgoto err;\n+\n \t/*\n \t * The overlay has been damaged, erase its magic.\n \t */\n",
    "prefixes": [
        "U-Boot",
        "v3",
        "04/14"
    ]
}