12b0e4ecdSDaniel P. Berrangé.. _code-provenance: 22b0e4ecdSDaniel P. Berrangé 32b0e4ecdSDaniel P. BerrangéCode provenance 42b0e4ecdSDaniel P. Berrangé=============== 52b0e4ecdSDaniel P. Berrangé 62b0e4ecdSDaniel P. BerrangéCertifying patch submissions 72b0e4ecdSDaniel P. Berrangé~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82b0e4ecdSDaniel P. Berrangé 92b0e4ecdSDaniel P. BerrangéThe QEMU community **mandates** all contributors to certify provenance of 102b0e4ecdSDaniel P. Berrangépatch submissions they make to the project. To put it another way, 112b0e4ecdSDaniel P. Berrangécontributors must indicate that they are legally permitted to contribute to 122b0e4ecdSDaniel P. Berrangéthe project. 132b0e4ecdSDaniel P. Berrangé 142b0e4ecdSDaniel P. BerrangéCertification is achieved with a low overhead by adding a single line to the 152b0e4ecdSDaniel P. Berrangébottom of every git commit:: 162b0e4ecdSDaniel P. Berrangé 172b0e4ecdSDaniel P. Berrangé Signed-off-by: YOUR NAME <YOUR@EMAIL> 182b0e4ecdSDaniel P. Berrangé 192b0e4ecdSDaniel P. BerrangéThe addition of this line asserts that the author of the patch is contributing 202b0e4ecdSDaniel P. Berrangéin accordance with the clauses specified in the 212b0e4ecdSDaniel P. Berrangé`Developer's Certificate of Origin <https://developercertificate.org>`__: 222b0e4ecdSDaniel P. Berrangé 232b0e4ecdSDaniel P. Berrangé.. _dco: 242b0e4ecdSDaniel P. Berrangé 252b0e4ecdSDaniel P. Berrangé Developer's Certificate of Origin 1.1 262b0e4ecdSDaniel P. Berrangé 272b0e4ecdSDaniel P. Berrangé By making a contribution to this project, I certify that: 282b0e4ecdSDaniel P. Berrangé 292b0e4ecdSDaniel P. Berrangé (a) The contribution was created in whole or in part by me and I 302b0e4ecdSDaniel P. Berrangé have the right to submit it under the open source license 312b0e4ecdSDaniel P. Berrangé indicated in the file; or 322b0e4ecdSDaniel P. Berrangé 332b0e4ecdSDaniel P. Berrangé (b) The contribution is based upon previous work that, to the best 342b0e4ecdSDaniel P. Berrangé of my knowledge, is covered under an appropriate open source 352b0e4ecdSDaniel P. Berrangé license and I have the right under that license to submit that 362b0e4ecdSDaniel P. Berrangé work with modifications, whether created in whole or in part 372b0e4ecdSDaniel P. Berrangé by me, under the same open source license (unless I am 382b0e4ecdSDaniel P. Berrangé permitted to submit under a different license), as indicated 392b0e4ecdSDaniel P. Berrangé in the file; or 402b0e4ecdSDaniel P. Berrangé 412b0e4ecdSDaniel P. Berrangé (c) The contribution was provided directly to me by some other 422b0e4ecdSDaniel P. Berrangé person who certified (a), (b) or (c) and I have not modified 432b0e4ecdSDaniel P. Berrangé it. 442b0e4ecdSDaniel P. Berrangé 452b0e4ecdSDaniel P. Berrangé (d) I understand and agree that this project and the contribution 462b0e4ecdSDaniel P. Berrangé are public and that a record of the contribution (including all 472b0e4ecdSDaniel P. Berrangé personal information I submit with it, including my sign-off) is 482b0e4ecdSDaniel P. Berrangé maintained indefinitely and may be redistributed consistent with 492b0e4ecdSDaniel P. Berrangé this project or the open source license(s) involved. 502b0e4ecdSDaniel P. Berrangé 512b0e4ecdSDaniel P. BerrangéThe name used with "Signed-off-by" does not need to be your legal name, nor 522b0e4ecdSDaniel P. Berrangébirth name, nor appear on any government ID. It is the identity you choose to 532b0e4ecdSDaniel P. Berrangébe known by in the community, but should not be anonymous, nor misrepresent 542b0e4ecdSDaniel P. Berrangéwhom you are. 552b0e4ecdSDaniel P. Berrangé 562b0e4ecdSDaniel P. BerrangéIt is generally expected that the name and email addresses used in one of the 572b0e4ecdSDaniel P. Berrangé``Signed-off-by`` lines, matches that of the git commit ``Author`` field. 582b0e4ecdSDaniel P. BerrangéIt's okay if you subscribe or contribute to the list via more than one 592b0e4ecdSDaniel P. Berrangéaddress, but using multiple addresses in one commit just confuses 602b0e4ecdSDaniel P. Berrangéthings. 612b0e4ecdSDaniel P. Berrangé 622b0e4ecdSDaniel P. BerrangéIf the person sending the mail is not one of the patch authors, they are 632b0e4ecdSDaniel P. Berrangénonetheless expected to add their own ``Signed-off-by`` to comply with the 642b0e4ecdSDaniel P. BerrangéDCO clause (c). 652b0e4ecdSDaniel P. Berrangé 662b0e4ecdSDaniel P. BerrangéMultiple authorship 672b0e4ecdSDaniel P. Berrangé~~~~~~~~~~~~~~~~~~~ 682b0e4ecdSDaniel P. Berrangé 692b0e4ecdSDaniel P. BerrangéIt is not uncommon for a patch to have contributions from multiple authors. In 702b0e4ecdSDaniel P. Berrangéthis scenario, git commits will usually be expected to have a ``Signed-off-by`` 712b0e4ecdSDaniel P. Berrangéline for each contributor involved in creation of the patch. Some edge cases: 722b0e4ecdSDaniel P. Berrangé 732b0e4ecdSDaniel P. Berrangé * The non-primary author's contributions were so trivial that they can be 742b0e4ecdSDaniel P. Berrangé considered not subject to copyright. In this case the secondary authors 752b0e4ecdSDaniel P. Berrangé need not include a ``Signed-off-by``. 762b0e4ecdSDaniel P. Berrangé 772b0e4ecdSDaniel P. Berrangé This case most commonly applies where QEMU reviewers give short snippets 782b0e4ecdSDaniel P. Berrangé of code as suggested fixes to a patch. The reviewers don't need to have 792b0e4ecdSDaniel P. Berrangé their own ``Signed-off-by`` added unless their code suggestion was 802b0e4ecdSDaniel P. Berrangé unusually large, but it is common to add ``Suggested-by`` as a credit 812b0e4ecdSDaniel P. Berrangé for non-trivial code. 822b0e4ecdSDaniel P. Berrangé 832b0e4ecdSDaniel P. Berrangé * Both contributors work for the same employer and the employer requires 842b0e4ecdSDaniel P. Berrangé copyright assignment. 852b0e4ecdSDaniel P. Berrangé 862b0e4ecdSDaniel P. Berrangé It can be said that in this case a ``Signed-off-by`` is indicating that 872b0e4ecdSDaniel P. Berrangé the person has permission to contribute from their employer who is the 882b0e4ecdSDaniel P. Berrangé copyright holder. It is nonetheless still preferable to include a 892b0e4ecdSDaniel P. Berrangé ``Signed-off-by`` for each contributor, as in some countries employees are 902b0e4ecdSDaniel P. Berrangé not able to assign copyright to their employer, and it also covers any 912b0e4ecdSDaniel P. Berrangé time invested outside working hours. 922b0e4ecdSDaniel P. Berrangé 932b0e4ecdSDaniel P. BerrangéWhen multiple ``Signed-off-by`` tags are present, they should be strictly kept 942b0e4ecdSDaniel P. Berrangéin order of authorship, from oldest to newest. 952b0e4ecdSDaniel P. Berrangé 962b0e4ecdSDaniel P. BerrangéOther commit tags 972b0e4ecdSDaniel P. Berrangé~~~~~~~~~~~~~~~~~ 982b0e4ecdSDaniel P. Berrangé 992b0e4ecdSDaniel P. BerrangéWhile the ``Signed-off-by`` tag is mandatory, there are a number of other tags 1002b0e4ecdSDaniel P. Berrangéthat are commonly used during QEMU development: 1012b0e4ecdSDaniel P. Berrangé 1022b0e4ecdSDaniel P. Berrangé * **``Reviewed-by``**: when a QEMU community member reviews a patch on the 1032b0e4ecdSDaniel P. Berrangé mailing list, if they consider the patch acceptable, they should send an 1042b0e4ecdSDaniel P. Berrangé email reply containing a ``Reviewed-by`` tag. Subsystem maintainers who 1052b0e4ecdSDaniel P. Berrangé review a patch should add this even if they are also adding their 1062b0e4ecdSDaniel P. Berrangé ``Signed-off-by`` to the same commit. 1072b0e4ecdSDaniel P. Berrangé 1082b0e4ecdSDaniel P. Berrangé * **``Acked-by``**: when a QEMU subsystem maintainer approves a patch that 1092b0e4ecdSDaniel P. Berrangé touches their subsystem, but intends to allow a different maintainer to 1102b0e4ecdSDaniel P. Berrangé queue it and send a pull request, they would send a mail containing a 1112b0e4ecdSDaniel P. Berrangé ``Acked-by`` tag. Where a patch touches multiple subsystems, ``Acked-by`` 1122b0e4ecdSDaniel P. Berrangé only implies review of the maintainers' own areas of responsibility. If a 1132b0e4ecdSDaniel P. Berrangé maintainer wants to indicate they have done a full review they should use 1142b0e4ecdSDaniel P. Berrangé a ``Reviewed-by`` tag. 1152b0e4ecdSDaniel P. Berrangé 1162b0e4ecdSDaniel P. Berrangé * **``Tested-by``**: when a QEMU community member has functionally tested the 1172b0e4ecdSDaniel P. Berrangé behaviour of the patch in some manner, they should send an email reply 1182b0e4ecdSDaniel P. Berrangé containing a ``Tested-by`` tag. 1192b0e4ecdSDaniel P. Berrangé 1202b0e4ecdSDaniel P. Berrangé * **``Reported-by``**: when a QEMU community member reports a problem via the 1212b0e4ecdSDaniel P. Berrangé mailing list, or some other informal channel that is not the issue tracker, 1222b0e4ecdSDaniel P. Berrangé it is good practice to credit them by including a ``Reported-by`` tag on 1232b0e4ecdSDaniel P. Berrangé any patch fixing the issue. When the problem is reported via the GitLab 1242b0e4ecdSDaniel P. Berrangé issue tracker, however, it is sufficient to just include a link to the 1252b0e4ecdSDaniel P. Berrangé issue. 1262b0e4ecdSDaniel P. Berrangé 1272b0e4ecdSDaniel P. Berrangé * **``Suggested-by``**: when a reviewer or other 3rd party makes non-trivial 1282b0e4ecdSDaniel P. Berrangé suggestions for how to change a patch, it is good practice to credit them 1292b0e4ecdSDaniel P. Berrangé by including a ``Suggested-by`` tag. 1302b0e4ecdSDaniel P. Berrangé 1312b0e4ecdSDaniel P. BerrangéSubsystem maintainer requirements 1322b0e4ecdSDaniel P. Berrangé~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332b0e4ecdSDaniel P. Berrangé 1342b0e4ecdSDaniel P. BerrangéWhen a subsystem maintainer accepts a patch from a contributor, in addition to 1352b0e4ecdSDaniel P. Berrangéthe normal code review points, they are expected to validate the presence of 1362b0e4ecdSDaniel P. Berrangésuitable ``Signed-off-by`` tags. 1372b0e4ecdSDaniel P. Berrangé 1382b0e4ecdSDaniel P. BerrangéAt the time they queue the patch in their subsystem tree, the maintainer 1392b0e4ecdSDaniel P. Berrangé**must** also then add their own ``Signed-off-by`` to indicate that they have 1402b0e4ecdSDaniel P. Berrangédone the aforementioned validation. This is in addition to any of their own 1412b0e4ecdSDaniel P. Berrangé``Reviewed-by`` tags the subsystem maintainer may wish to include. 1422b0e4ecdSDaniel P. Berrangé 1432b0e4ecdSDaniel P. BerrangéWhen the maintainer modifies the patch after pulling into their tree, they 1442b0e4ecdSDaniel P. Berrangéshould record their contribution. This is typically done via a note in the 1452b0e4ecdSDaniel P. Berrangécommit message, just prior to the maintainer's ``Signed-off-by``:: 1462b0e4ecdSDaniel P. Berrangé 1472b0e4ecdSDaniel P. Berrangé Signed-off-by: Cory Contributor <cory.contributor@example.com> 1482b0e4ecdSDaniel P. Berrangé [Comment rephrased for clarity] 1492b0e4ecdSDaniel P. Berrangé Signed-off-by: Mary Maintainer <mary.maintainer@mycorp.test> 1502b0e4ecdSDaniel P. Berrangé 1512b0e4ecdSDaniel P. Berrangé 1522b0e4ecdSDaniel P. BerrangéTools for adding ``Signed-off-by`` 1532b0e4ecdSDaniel P. Berrangé~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542b0e4ecdSDaniel P. Berrangé 1552b0e4ecdSDaniel P. BerrangéThere are a variety of ways tools can support adding ``Signed-off-by`` tags 1562b0e4ecdSDaniel P. Berrangéfor patches, avoiding the need for contributors to manually type in this 1572b0e4ecdSDaniel P. Berrangérepetitive text each time. 1582b0e4ecdSDaniel P. Berrangé 1592b0e4ecdSDaniel P. Berrangégit commands 1602b0e4ecdSDaniel P. Berrangé^^^^^^^^^^^^ 1612b0e4ecdSDaniel P. Berrangé 1622b0e4ecdSDaniel P. BerrangéWhen creating, or amending, a commit the ``-s`` flag to ``git commit`` will 1632b0e4ecdSDaniel P. Berrangéappend a suitable line matching the configured git author details. 1642b0e4ecdSDaniel P. Berrangé 1652b0e4ecdSDaniel P. BerrangéIf preparing patches using the ``git format-patch`` tool, the ``-s`` flag can 1662b0e4ecdSDaniel P. Berrangébe used to append a suitable line in the emails it creates, without modifying 1672b0e4ecdSDaniel P. Berrangéthe local commits. Alternatively to modify all the local commits on a branch:: 1682b0e4ecdSDaniel P. Berrangé 1692b0e4ecdSDaniel P. Berrangé git rebase master -x 'git commit --amend --no-edit -s' 1702b0e4ecdSDaniel P. Berrangé 1712b0e4ecdSDaniel P. Berrangéemacs 1722b0e4ecdSDaniel P. Berrangé^^^^^ 1732b0e4ecdSDaniel P. Berrangé 1742b0e4ecdSDaniel P. BerrangéIn the file ``$HOME/.emacs.d/abbrev_defs`` add: 1752b0e4ecdSDaniel P. Berrangé 1762b0e4ecdSDaniel P. Berrangé.. code:: elisp 1772b0e4ecdSDaniel P. Berrangé 1782b0e4ecdSDaniel P. Berrangé (define-abbrev-table 'global-abbrev-table 1792b0e4ecdSDaniel P. Berrangé '( 1802b0e4ecdSDaniel P. Berrangé ("8rev" "Reviewed-by: YOUR NAME <your@email.addr>" nil 1) 1812b0e4ecdSDaniel P. Berrangé ("8ack" "Acked-by: YOUR NAME <your@email.addr>" nil 1) 1822b0e4ecdSDaniel P. Berrangé ("8test" "Tested-by: YOUR NAME <your@email.addr>" nil 1) 1832b0e4ecdSDaniel P. Berrangé ("8sob" "Signed-off-by: YOUR NAME <your@email.addr>" nil 1) 1842b0e4ecdSDaniel P. Berrangé )) 1852b0e4ecdSDaniel P. Berrangé 1862b0e4ecdSDaniel P. Berrangéwith this change, if you type (for example) ``8rev`` followed by ``<space>`` 1872b0e4ecdSDaniel P. Berrangéor ``<enter>`` it will expand to the whole phrase. 1882b0e4ecdSDaniel P. Berrangé 1892b0e4ecdSDaniel P. Berrangévim 1902b0e4ecdSDaniel P. Berrangé^^^ 1912b0e4ecdSDaniel P. Berrangé 1922b0e4ecdSDaniel P. BerrangéIn the file ``$HOME/.vimrc`` add:: 1932b0e4ecdSDaniel P. Berrangé 1942b0e4ecdSDaniel P. Berrangé iabbrev 8rev Reviewed-by: YOUR NAME <your@email.addr> 1952b0e4ecdSDaniel P. Berrangé iabbrev 8ack Acked-by: YOUR NAME <your@email.addr> 1962b0e4ecdSDaniel P. Berrangé iabbrev 8test Tested-by: YOUR NAME <your@email.addr> 1972b0e4ecdSDaniel P. Berrangé iabbrev 8sob Signed-off-by: YOUR NAME <your@email.addr> 1982b0e4ecdSDaniel P. Berrangé 1992b0e4ecdSDaniel P. Berrangéwith this change, if you type (for example) ``8rev`` followed by ``<space>`` 2002b0e4ecdSDaniel P. Berrangéor ``<enter>`` it will expand to the whole phrase. 2012b0e4ecdSDaniel P. Berrangé 2022b0e4ecdSDaniel P. BerrangéRe-starting abandoned work 2032b0e4ecdSDaniel P. Berrangé~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042b0e4ecdSDaniel P. Berrangé 2052b0e4ecdSDaniel P. BerrangéFor a variety of reasons there are some patches that get submitted to QEMU but 2062b0e4ecdSDaniel P. Berrangénever merged. An unrelated contributor may decide (months or years later) to 2072b0e4ecdSDaniel P. Berrangécontinue working from the abandoned patch and re-submit it with extra changes. 2082b0e4ecdSDaniel P. Berrangé 2092b0e4ecdSDaniel P. BerrangéThe general principles when picking up abandoned work are: 2102b0e4ecdSDaniel P. Berrangé 2112b0e4ecdSDaniel P. Berrangé * Continue to credit the original author for their work, by maintaining their 2122b0e4ecdSDaniel P. Berrangé original ``Signed-off-by`` 2132b0e4ecdSDaniel P. Berrangé * Indicate where the original patch was obtained from (mailing list, bug 2142b0e4ecdSDaniel P. Berrangé tracker, author's git repo, etc) when sending it for review 2152b0e4ecdSDaniel P. Berrangé * Acknowledge the extra work of the new contributor by including their 2162b0e4ecdSDaniel P. Berrangé ``Signed-off-by`` in the patch in addition to the orignal author's 2172b0e4ecdSDaniel P. Berrangé * Indicate who is responsible for what parts of the patch. This is typically 2182b0e4ecdSDaniel P. Berrangé done via a note in the commit message, just prior to the new contributor's 2192b0e4ecdSDaniel P. Berrangé ``Signed-off-by``:: 2202b0e4ecdSDaniel P. Berrangé 2212b0e4ecdSDaniel P. Berrangé Signed-off-by: Some Person <some.person@example.com> 2222b0e4ecdSDaniel P. Berrangé [Rebased and added support for 'foo'] 2232b0e4ecdSDaniel P. Berrangé Signed-off-by: New Person <new.person@mycorp.test> 2242b0e4ecdSDaniel P. Berrangé 2252b0e4ecdSDaniel P. BerrangéIn complicated cases, or if otherwise unsure, ask for advice on the project 2262b0e4ecdSDaniel P. Berrangémailing list. 2272b0e4ecdSDaniel P. Berrangé 2282b0e4ecdSDaniel P. BerrangéIt is also recommended to attempt to contact the original author to let them 2292b0e4ecdSDaniel P. Berrangéknow you are interested in taking over their work, in case they still intended 2302b0e4ecdSDaniel P. Berrangéto return to the work, or had any suggestions about the best way to continue. 231*b5d00557SDaniel P. Berrangé 232*b5d00557SDaniel P. BerrangéInclusion of generated files 233*b5d00557SDaniel P. Berrangé~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 234*b5d00557SDaniel P. Berrangé 235*b5d00557SDaniel P. BerrangéFiles in patches contributed to QEMU are generally expected to be provided 236*b5d00557SDaniel P. Berrangéonly in the preferred format for making modifications. The implication of 237*b5d00557SDaniel P. Berrangéthis is that the output of code generators or compilers is usually not 238*b5d00557SDaniel P. Berrangéappropriate to contribute to QEMU. 239*b5d00557SDaniel P. Berrangé 240*b5d00557SDaniel P. BerrangéFor reasons of practicality there are some exceptions to this rule, where 241*b5d00557SDaniel P. Berrangégenerated code is permitted, provided it is also accompanied by the 242*b5d00557SDaniel P. Berrangécorresponding preferred source format. This is done where it is impractical 243*b5d00557SDaniel P. Berrangéto expect those building QEMU to run the code generation or compilation 244*b5d00557SDaniel P. Berrangéprocess. A non-exhaustive list of examples is: 245*b5d00557SDaniel P. Berrangé 246*b5d00557SDaniel P. Berrangé * Images: where an bitmap image is created from a vector file it is common 247*b5d00557SDaniel P. Berrangé to include the rendered bitmaps at desired resolution(s), since subtle 248*b5d00557SDaniel P. Berrangé changes in the rasterization process / tools may affect quality. The 249*b5d00557SDaniel P. Berrangé original vector file is expected to accompany any generated bitmaps. 250*b5d00557SDaniel P. Berrangé 251*b5d00557SDaniel P. Berrangé * Firmware: QEMU includes pre-compiled binary ROMs for a variety of guest 252*b5d00557SDaniel P. Berrangé firmwares. When such binary ROMs are contributed, the corresponding source 253*b5d00557SDaniel P. Berrangé must also be provided, either directly, or through a git submodule link. 254*b5d00557SDaniel P. Berrangé 255*b5d00557SDaniel P. Berrangé * Dockerfiles: the majority of the dockerfiles are automatically generated 256*b5d00557SDaniel P. Berrangé from a canonical list of build dependencies maintained in tree, together 257*b5d00557SDaniel P. Berrangé with the libvirt-ci git submodule link. The generated dockerfiles are 258*b5d00557SDaniel P. Berrangé included in tree because it is desirable to be able to directly build 259*b5d00557SDaniel P. Berrangé container images from a clean git checkout. 260*b5d00557SDaniel P. Berrangé 261*b5d00557SDaniel P. Berrangé * eBPF: QEMU includes some generated eBPF machine code, since the required 262*b5d00557SDaniel P. Berrangé eBPF compilation tools are not broadly available on all targetted OS 263*b5d00557SDaniel P. Berrangé distributions. The corresponding eBPF C code for the binary is also 264*b5d00557SDaniel P. Berrangé provided. This is a time-limited exception until the eBPF toolchain is 265*b5d00557SDaniel P. Berrangé sufficiently broadly available in distros. 266*b5d00557SDaniel P. Berrangé 267*b5d00557SDaniel P. BerrangéIn all cases above, the existence of generated files must be acknowledged 268*b5d00557SDaniel P. Berrangéand justified in the commit that introduces them. 269*b5d00557SDaniel P. Berrangé 270*b5d00557SDaniel P. BerrangéTools which perform changes to existing code with deterministic algorithmic 271*b5d00557SDaniel P. Berrangémanipulation, driven by user specified inputs, are not generally considered 272*b5d00557SDaniel P. Berrangéto be "generators". 273*b5d00557SDaniel P. Berrangé 274*b5d00557SDaniel P. BerrangéFor instance, using Coccinelle to convert code from one pattern to another 275*b5d00557SDaniel P. Berrangépattern, or fixing documentation typos with a spell checker, or transforming 276*b5d00557SDaniel P. Berrangécode using sed / awk / etc, are not considered to be acts of code 277*b5d00557SDaniel P. Berrangégeneration. Where an automated manipulation is performed on code, however, 278*b5d00557SDaniel P. Berrangéthis should be declared in the commit message. 279*b5d00557SDaniel P. Berrangé 280*b5d00557SDaniel P. BerrangéAt times contributors may use or create scripts/tools to generate an initial 281*b5d00557SDaniel P. Berrangéboilerplate code template which is then filled in to produce the final patch. 282*b5d00557SDaniel P. BerrangéThe output of such a tool would still be considered the "preferred format", 283*b5d00557SDaniel P. Berrangésince it is intended to be a foundation for further human authored changes. 284*b5d00557SDaniel P. BerrangéSuch tools are acceptable to use, provided there is clearly defined copyright 285*b5d00557SDaniel P. Berrangéand licensing for their output. 286