)]}'
{
  "log": [
    {
      "commit": "b485cceb10656fa5e30a8d8840f7ab4e67a899b4",
      "tree": "f86db5e76a9dd5b70aa43ba7100fe3f3652480e1",
      "parents": [
        "6ba0ca9e5e64d0543541c0c460b74abb9ddbf8e1"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Aug 04 15:20:38 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Aug 04 15:20:38 2017"
      },
      "message": "[dsreadonly] Add read-only datastore filter.\n\nAdd a read-only datastore filter, which will error if a mutation\noperation is performed on the datastore.\n\nBUG\u003dNone\nTEST\u003dunit\n\nReview-Url: https://codereview.chromium.org/2993033002\n"
    },
    {
      "commit": "6ba0ca9e5e64d0543541c0c460b74abb9ddbf8e1",
      "tree": "5a7db394a96daf0443f40ab6dbe24db23cacff91",
      "parents": [
        "a1138385b0ad564e9baf32dc6f7f5eb1ae4eb886"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Aug 04 02:23:58 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Aug 04 02:23:58 2017"
      },
      "message": "[impl/memory] Enforce named tasks during txn.\n\nTask queue does not allow named tasks to be added in a transaction.\nEnforce this in \"impl/memory\" so that tests will properly fail when this\nis attempted.\n\nAlso update PRESUBMIT so that it properly validates the new license header\nformat.\n\nBUG\u003dNone\nTEST\u003dunit\n\nReview-Url: https://codereview.chromium.org/2995493002\n"
    },
    {
      "commit": "a1138385b0ad564e9baf32dc6f7f5eb1ae4eb886",
      "tree": "d9ce6ae3d383638f8c1749b24942b960a7c251a7",
      "parents": [
        "52a3b010d9f5696bfb2c9be999402bb8b27af38e"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu Jul 20 03:45:26 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jul 20 03:45:26 2017"
      },
      "message": "[datastore] Fix querying with []byte.\n\nimpl/prod previously converted []byte to datastore.ByteString for indexed\nproperties and the equality filters are internally represented with indexed\nproperties. However, the datastore SDK rejects ByteString as an equality\nfilter (even though that\u0027s what you\u0027re supposed to use if you want an\nindexed []byte in a model).\n\nR\u003ddnj@chromium.org, hinoka@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2986533002\n"
    },
    {
      "commit": "52a3b010d9f5696bfb2c9be999402bb8b27af38e",
      "tree": "b643b2c9e24f657c715e0c2d742785ccfc23b2c6",
      "parents": [
        "ddb41673109e1a1ae3128a93b478f63ab28529b2"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu Jul 20 02:13:56 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jul 20 02:13:56 2017"
      },
      "message": "[datastore] improve docs around auto-generated *Keys on Put.\n\nTBR\u003dseanmccullough@chromium.org,dnj@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2987513002\n"
    },
    {
      "commit": "ddb41673109e1a1ae3128a93b478f63ab28529b2",
      "tree": "49a11435ab90993bef71f9459eaa43486f6e9992",
      "parents": [
        "c229a75f89f00a0c8831817da917746ba1d89e4b"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Wed Jul 12 01:22:24 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed Jul 12 01:22:24 2017"
      },
      "message": "[dummy/info] Mock ModuleHostname and related functions.\n\nR\u003dhinoka@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2977773002\n"
    },
    {
      "commit": "c229a75f89f00a0c8831817da917746ba1d89e4b",
      "tree": "a04bd1fcb8b5746967ee4f7ccd22a36c1d4e157f",
      "parents": [
        "aaaaddc8f05a308fdb94820e7d7c42ec8fdee098"
      ],
      "author": {
        "name": "estaab",
        "email": "estaab@chromium.org",
        "time": "Mon Jul 10 20:25:46 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jul 10 20:25:46 2017"
      },
      "message": "Update apache2 license header to newer format.\n\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2976663002\n"
    },
    {
      "commit": "aaaaddc8f05a308fdb94820e7d7c42ec8fdee098",
      "tree": "d02dbeeaf9f6928ab874aacf14fc8220bbad5177",
      "parents": [
        "e593adff12097f50cee06ce6a9f0a659153ceee4"
      ],
      "author": {
        "name": "estaab",
        "email": "estaab@chromium.org",
        "time": "Sat Jul 08 01:40:55 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Jul 08 01:40:55 2017"
      },
      "message": "Add CONTRIBUTING file.\n\nCopied from the infra repo and removed wording about rietveld since it will be gone soon.\n\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2973283002\n"
    },
    {
      "commit": "e593adff12097f50cee06ce6a9f0a659153ceee4",
      "tree": "7e3e986c5234c4797e9912bbc8116235ba5d1b2e",
      "parents": [
        "95cce9c270cce4636d6ad2fcdf48382ce31c2490"
      ],
      "author": {
        "name": "hinoka",
        "email": "hinoka@google.com",
        "time": "Thu Jul 06 00:25:25 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jul 06 00:25:25 2017"
      },
      "message": "Info Memory: Implement dummy ServiceAccount()\n\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2957413002\n"
    },
    {
      "commit": "95cce9c270cce4636d6ad2fcdf48382ce31c2490",
      "tree": "b3443bac9cdcad785e7d0746df05a87d81a1c315",
      "parents": [
        "2ace7f669bcaec9339f45336080eb1e66ef022c8"
      ],
      "author": {
        "name": "Robert Iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu Jun 29 23:23:06 2017"
      },
      "committer": {
        "name": "Robert Iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu Jun 29 23:23:07 2017"
      },
      "message": "Use luci-go simplified errors API.\n\nR\u003ddnj@chromium.org, vadimsh@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2962083002 .\n"
    },
    {
      "commit": "2ace7f669bcaec9339f45336080eb1e66ef022c8",
      "tree": "6cd39909155372a368e40cbafae562ce579b0df9",
      "parents": [
        "0e27a767acba8bcee488f26d829d2ef515ac231e"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Fri Jun 23 00:24:54 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Jun 23 00:24:54 2017"
      },
      "message": "Break dependency on errors.Fix.\n\nThese are the only two locations where it\u0027s actually used.\n\nR\u003ddnj@chromium.org, vadimsh@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2955523002\n"
    },
    {
      "commit": "0e27a767acba8bcee488f26d829d2ef515ac231e",
      "tree": "f4b23be877c3499ec6b2d374064677fd0e4ccd79",
      "parents": [
        "7fe31a85c38ae699ea573c34cdb65829ee0709fc"
      ],
      "author": {
        "name": "tandrii",
        "email": "tandrii@chromium.org",
        "time": "Mon Jun 19 07:51:35 2017"
      },
      "committer": {
        "name": "Commit Bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jun 19 07:51:35 2017"
      },
      "message": "Fix typo in docs.\n\nTBR\u003diannuicci@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2852113002\n"
    },
    {
      "commit": "7fe31a85c38ae699ea573c34cdb65829ee0709fc",
      "tree": "d08e8271a8be6f1b81630a08d6e5abca2800bb85",
      "parents": [
        "da65416c45a996664d23f2bf22299e910e7b0561"
      ],
      "author": {
        "name": "tandrii",
        "email": "tandrii@chromium.org",
        "time": "Sun Apr 30 05:16:59 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sun Apr 30 05:16:59 2017"
      },
      "message": "Infra CQ: update OWNERS and add dry run access.\n\nTBR\u003diannucci@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2845333004\n"
    },
    {
      "commit": "da65416c45a996664d23f2bf22299e910e7b0561",
      "tree": "68d7bd4cf1221812b355acbd9c510c9068085c74",
      "parents": [
        "4e7c36ffa6c3a0e4904c3577ac80f8878aa78c28"
      ],
      "author": {
        "name": "hinoka",
        "email": "hinoka@google.com",
        "time": "Thu Apr 20 19:40:02 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Apr 20 19:40:02 2017"
      },
      "message": "Add UseFlex(c) for the cloud implementation.\n\nWhich installs an Info and Datastore module if the instance is\nrunning on GCE\n\nBUG\u003d698429\n\nReview-Url: https://codereview.chromium.org/2829903002\n"
    },
    {
      "commit": "4e7c36ffa6c3a0e4904c3577ac80f8878aa78c28",
      "tree": "e02276b9859578faa5e30a9c5cc3ebcfbf3d1afe",
      "parents": [
        "272e08846966144869f38a9f9f4cc151082b4975"
      ],
      "author": {
        "name": "hinoka",
        "email": "hinoka@google.com",
        "time": "Thu Apr 06 17:50:09 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Apr 06 17:50:09 2017"
      },
      "message": "gae cloud: Use with Datastore\n\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2802523002\n"
    },
    {
      "commit": "272e08846966144869f38a9f9f4cc151082b4975",
      "tree": "7525c175d235a818223ab5d8fa82f30b831a7b0b",
      "parents": [
        "89a62d1eb8fedbc521ce133e731fb8770c54eed9"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Thu Jan 19 21:46:22 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jan 19 21:46:23 2017"
      },
      "message": "impl/cloud: Report false for IsDevAppServer.\n\nThe check for IsDevAppServer is fairly common, and the minimal\nservices/info implementation for impl/cloud currently panics when\nIsDevAppServer is called.\n\nBUG\u003dNone\nTEST\u003dlocal\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2639383002\n"
    },
    {
      "commit": "89a62d1eb8fedbc521ce133e731fb8770c54eed9",
      "tree": "dca6a08a57fe83663d5573c9ade8c42773919940",
      "parents": [
        "4735254e6dbfa13048893cc43ede87a4110f4b27"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Wed Jan 11 03:12:51 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed Jan 11 03:12:51 2017"
      },
      "message": "Annotate ErrInvalidKey.\n\nThe ErrInvalidKey error is annoying when encountered, becuase it\nprovides no context about why the key is invalid and can occur in some\nobscure places (checkfilter, query finalization, implementations, etc.).\n\nTo address this, replace ErrInvalidKey with a test function,\nIsErrInvalidKey. This will return true for any invalid key errors.\nReplace instances of ErrInvalidKey with errors derived from\nMakeErrInvalidKey, annotated with some context and useful information.\n\nThis should be relatively minor change upstream, since no audited code\nactually checks for this error case.\n\nBUG\u003dNone\nTEST\u003dunit\n\nReview-Url: https://codereview.chromium.org/2620043002\n"
    },
    {
      "commit": "4735254e6dbfa13048893cc43ede87a4110f4b27",
      "tree": "9d7d8ecc5686532ec3c2bdcf0813803b4398783e",
      "parents": [
        "951a9bd6e11300d097436f797c397d42334c742e"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Tue Jan 10 23:12:00 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jan 10 23:12:00 2017"
      },
      "message": "impl/memory: Task queue Testable is per-namespace.\n\nCurrently, while task queue tasks are enqueued per-namespace, Testable\ninterface operations work across all namespaces. This patch makes the\nTestable interface only return tasks for the namespace to which it is\nbound.\n\nBUG\u003dchromium:678896\nTEST\u003dunit\nR\u003diannuci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2624803002\n"
    },
    {
      "commit": "951a9bd6e11300d097436f797c397d42334c742e",
      "tree": "bb280a6f0d2be41afc468ddec6ae368d45e1b14a",
      "parents": [
        "a05a77f8ad60158869c1dc908b16dc618a580101"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Sun Jan 08 20:35:36 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sun Jan 08 20:35:36 2017"
      },
      "message": "impl/memory: Replace gkvlite with \"treapstore\".\n\ngkvlite is the treap (tree + heap)-based key/value store used by\n\"impl/memory\"\u0027s backend. While it is very powerful package, its\ncomplexity and ensuing requirements make it a somewhat-imperfect fit.\nSpecifically, \"gkvlite\" is built around resources that must be\nexplicitly allocated and free\u0027d. While this makes a lot of sense for its\non-disk storage functionality, we don\u0027t use that functionality, and\nintegrating snapshot closing into every layer of \"impl/memory\" is\nnon-trivial.\n\nEnter \"treapstore\", a treap-based storage implementation that closesly\nmirrors the functionality in \"gkvlite\" that \"impl/memory\" uses, but\nspecifically focuses the in-memory use case. Because \"treapstore\"\nforegoes node reuse and snapshot cleanup, we can rely entirely on Go\u0027s\nmemory manager to clean things up, removing the need to close things.\n\n\"treapstore\" builds on an extended version of \"gkvlite\"\u0027s underlying\n\"gtreap\" package which introduces an iterator. This iterator removes the\nneed for the goroutine- and callback-based iteration implementations\nthat \"impl/memory\" used to interface with gkvlite (and \"gtreap\")\u0027s\nVisitItemsAscend method, resulting in signifcantly cleaner and likely\nhigher perfomant code. \"treapstore\" iterators don\u0027t have any cleanup\nrequirements. Consqeuently, explicit resource management via \"stop\" is\nno longer necessary to perform iteration.\n\nBUG\u003dchromium:675485\nTEST\u003dunit\n\nReview-Url: https://codereview.chromium.org/2604943002\n"
    },
    {
      "commit": "a05a77f8ad60158869c1dc908b16dc618a580101",
      "tree": "224502aa2d1f57e836d7523033d086c5f3a8a8bc",
      "parents": [
        "c68b2ca8e2df1303a96a5b1dc6834d5bf0e1100b"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Sat Jan 07 01:50:34 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Jan 07 01:50:34 2017"
      },
      "message": "Fix improper use of Stop in datastore.\n\nThe datastore.Stop sentinel error should be used by callbacks to\nindicate an end of iteration. We were improperly using it\nimpl/memory\u0027s query handler in response to reaching a limit (appropriate\nthing here is to just naturally stop the query) and datastore.Batcher\u0027s Run\nhandler as an unnecessary and erroneous safeguard.\n\nBUG\u003dchromium:679064\nTEST\u003dlocal\n  - Ran unit tests here and in luci-go, work now.\n\nReview-Url: https://codereview.chromium.org/2616243002\n"
    },
    {
      "commit": "c68b2ca8e2df1303a96a5b1dc6834d5bf0e1100b",
      "tree": "e1814c866912c1f606f13b6e2517cc027c1353a7",
      "parents": [
        "82198d4a25dda45a8ac8dbcfbc38add8f6879700"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Sat Jan 07 00:41:50 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Jan 07 00:41:50 2017"
      },
      "message": "Add batch Add to service/taskqueue.\n\nAdd the ability to batch-add task queue entries. Also adds\nimplementation-specific task queue constraints to guide the batch add.\n\nBUG\u003dchromium:679064\nTEST\u003dunit\n\nReview-Url: https://codereview.chromium.org/2580833006\n"
    },
    {
      "commit": "82198d4a25dda45a8ac8dbcfbc38add8f6879700",
      "tree": "e92de2168ae8750aa0c6eb0dba5bcd8281411983",
      "parents": [
        "e987b6b7b844edc39f589ffc1c69bd013018b82d"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Sat Jan 07 00:17:33 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Jan 07 00:17:33 2017"
      },
      "message": "Add datastore Put to service/datastore.Batcher.\n\nBUG\u003dchromium:679064\nTEST\u003dunit\n\nReview-Url: https://codereview.chromium.org/2582183002\n"
    },
    {
      "commit": "e987b6b7b844edc39f589ffc1c69bd013018b82d",
      "tree": "29194849608c9cf7fb307312c123b8b22b289d8b",
      "parents": [
        "ac70e96219aebdd26608395df0d7f8b41b15771d"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Jan 06 23:34:33 2017"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Jan 06 23:34:33 2017"
      },
      "message": "Add ds.Batcher class, implement Run, GetAll.\n\nAdd a Batcher class to services/datastore. Implement Run and GetAll\n(query methods) for the Batcher. Move dsQueryBatch into\nservices/datastore as Batcher\u0027s query implementation.\n\nTo support this, enable datastore implementations to emit constraints.\nThese constraints can be used by batch methods (and other things) to\nmake size judgement calls.\n\nAugment fakeDatastore to actually correctly respond to cursors to it can\nbe used for the batch query test.\n\nBUG\u003dchromium:679064\nTEST\u003dunit\n\nReview-Url: https://codereview.chromium.org/2584123003\n"
    },
    {
      "commit": "ac70e96219aebdd26608395df0d7f8b41b15771d",
      "tree": "f0a719a12ab1bd0a8045e6787bdad397ef06d591",
      "parents": [
        "6f48bc6066db79115eeaac986c0ac80c9bd6a21c"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue Dec 13 03:15:58 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Dec 13 03:15:58 2016"
      },
      "message": "Split Buffer into WriteBuffer/ReadBuffer.\n\nR\u003ddnj@chromium.org, vadimsh@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2569923002\n"
    },
    {
      "commit": "6f48bc6066db79115eeaac986c0ac80c9bd6a21c",
      "tree": "252f5ff19dc6371cb8a3b82846e1c3ab2ed86c60",
      "parents": [
        "c12ab6ff5cb4e6d9f78c89a172f8cc08bcdf56d5"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue Dec 13 03:01:28 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Dec 13 03:01:28 2016"
      },
      "message": "Fix bug in txnBuf\u0027s WithoutTransaction funcion.\n\nThis was using the nested ds.RawInterface from the \u0027parent\u0027\ntransaction, instead of the ds.RawInterface from the next layer in\nthe filter stack for WithoutTransaction. This means that there was\na Time-of-Construction, Time-of-Use confusion when manufacturing the\nnew context returned from WithoutTransaction.\n\nSince the nested-ness of the transaction does not matter (by\ndefinition, we are trying to escape from the entire transaction), calling\nthrough to the next layer\u0027s WithoutTransaction function is the more\nappropriate thing to do.\n\nFixes #69\n\nR\u003ddnj@chromium.org, vadimsh@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2568303003\n"
    },
    {
      "commit": "c12ab6ff5cb4e6d9f78c89a172f8cc08bcdf56d5",
      "tree": "5c5d365e6094043587cc1c5612fa70a8e0328b5d",
      "parents": [
        "794153648435d6a4d6c77320da2ac10948e8800c"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Tue Dec 06 17:29:01 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Dec 06 17:29:01 2016"
      },
      "message": "impl/memory: Fix memcache stats race.\n\nFix a race in memcache stats that was caused by modification of common\nstats varibles while holding a possibly-shared RLock. This fix switches\nlocking from RWMutex to Mutex, since potentially every access contains\nmutations to the shared state.\n\nBUG\u003dNone\nTEST\u003dlocal\n  - Re-ran external test with fix, race no longer triggered.\n\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2554793002\n"
    },
    {
      "commit": "794153648435d6a4d6c77320da2ac10948e8800c",
      "tree": "3cc5c9bc47bda3192c8eb1ecfe9c5e1dbd5aee9c",
      "parents": [
        "84c7d5968534a513c4bd0656a885e9f871ee4290"
      ],
      "author": {
        "name": "vadimsh",
        "email": "vadimsh@chromium.org",
        "time": "Fri Dec 02 19:36:36 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Dec 02 19:36:36 2016"
      },
      "message": "impl/memory: Use random int as auto generated task name in Task Queues.\n\nThis matches reality better than a string or 500 random characters, and makes\nwriting expectation-style tests simpler.\n\nR\u003diannucci@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2547793002\n"
    },
    {
      "commit": "84c7d5968534a513c4bd0656a885e9f871ee4290",
      "tree": "4dce0bd52ca9541214d66f453b0f2d131b995e09",
      "parents": [
        "a9451708f36e28488bea90aab94ce84153ead26f"
      ],
      "author": {
        "name": "vadimsh",
        "email": "vadimsh@chromium.org",
        "time": "Fri Dec 02 02:04:45 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Dec 02 02:04:45 2016"
      },
      "message": "Add Pull Task Queue impl/memory implementation.\n\nThe semantics is extracted from dev_appserver task queue stub implementation,\nsince the docs are not very specific about some details (like how lease by empty\ntag works, how ETA is getting updates, how lease ownership is tracked, and so\non).\n\nR\u003diannucci@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2537163003\n"
    },
    {
      "commit": "a9451708f36e28488bea90aab94ce84153ead26f",
      "tree": "79bd51ba546978b1a50c91b6bdc6816e3058d1eb",
      "parents": [
        "3d3367c3e63be9d05b0df0a8c728575f785b21b0"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Thu Nov 24 05:25:26 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Nov 24 05:25:26 2016"
      },
      "message": "impl/cloud: Add support for \"memcached\" memcache.\n\nAdd \"memcache\" service support to \"impl/cloud\" backed by a \"memcached\"\ncluster.\n\nThis enables a full dscache-backed datastore to be implemneted using\n\"impl/cloud\", as well as other services that need memcache to operate.\n\nUpdate the \"impl/cloud\" interface to start with a service Config and\ninstall services from that.\n\nBUG\u003dNone\nTEST\u003dlocal\n  - Started \"memcached\" server, tested against it.\n\nReview-Url: https://codereview.chromium.org/2513253002\n"
    },
    {
      "commit": "3d3367c3e63be9d05b0df0a8c728575f785b21b0",
      "tree": "42938bb574ed9a43ee067ec7653407f8d92f68c0",
      "parents": [
        "c0be5453dd28277f0f25addf540c7e9a64dc98b9"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sun Nov 20 18:43:26 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sun Nov 20 18:43:26 2016"
      },
      "message": "Fix #66.\n\nThis fixes an issue where, when multiple entities have overlaping field names, the indexEntries function will happily generate index rows for indicies where the Kind doesn\u0027t match (oops).\n\nR\u003ddnj@chromium.org, vadimsh@chromium.org\n\nReview-Url: https://codereview.chromium.org/2517833002\n"
    },
    {
      "commit": "c0be5453dd28277f0f25addf540c7e9a64dc98b9",
      "tree": "bb5fa28e71e8ce4b57ec2de9f4c1f2ad31643413",
      "parents": [
        "8ddad9162eff4fcb3c15f7cb0ac61fda3857565a"
      ],
      "author": {
        "name": "vadimsh",
        "email": "vadimsh@chromium.org",
        "time": "Sat Nov 19 01:55:02 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Nov 19 01:55:02 2016"
      },
      "message": "Refactor Task Queue memory implementation to use sortedQueue struct internally.\n\nIt will simplify adding Pull Queues support, since there\u0027s a clear place where\nto put additional queue state now.\n\nR\u003diannucci@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2511413003\n"
    },
    {
      "commit": "8ddad9162eff4fcb3c15f7cb0ac61fda3857565a",
      "tree": "ad696e65e33fb51223560eea7fab17f2243df017",
      "parents": [
        "1edd307a6443351516211d2636d71b4a76a0f607"
      ],
      "author": {
        "name": "vadimsh",
        "email": "vadimsh@chromium.org",
        "time": "Fri Nov 18 19:56:22 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Nov 18 19:56:22 2016"
      },
      "message": "Add support for Pull Queues to prod implementation.\n\nThis CL adds the interface (corresponding to native one) and prod\nimplementation. Memory implementation will be in a separate CL.\n\nR\u003diannucci@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2512093002\n"
    },
    {
      "commit": "1edd307a6443351516211d2636d71b4a76a0f607",
      "tree": "566e011ab4b2be4f224fec0f6e6e51437db36bfc",
      "parents": [
        "04506f4321aedd2dd1e8d08b68e1ff27a8a82894"
      ],
      "author": {
        "name": "Dan Jacques",
        "email": "dnj@chromium.org",
        "time": "Sat Nov 12 00:45:52 2016"
      },
      "committer": {
        "name": "Dan Jacques",
        "email": "dnj@chromium.org",
        "time": "Sat Nov 12 00:45:52 2016"
      },
      "message": "Use new mathrand API.\n\nBUG\u003dNone\nTEST\u003dNone\n\nReview URL: https://codereview.chromium.org/2481013012 .\n"
    },
    {
      "commit": "04506f4321aedd2dd1e8d08b68e1ff27a8a82894",
      "tree": "24bfdf2460b70a664629e36662b2cda375372285",
      "parents": [
        "da301ac8ccee61d3d59e0c548b890f7dd8adfa10"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Sat Nov 12 00:27:13 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Nov 12 00:27:13 2016"
      },
      "message": "Fix a bug where deletions weren\u0027t updating the raw Kind index.\n\nThis manifested as \"limit\" and \"offset\" fields being seemingly ignored.\nThe real reason for this is because the query iterator was (correctly)\nskipping index entries that weren\u0027t present in head, but counting them\nagainst the limit/offset.\n\nBUG\u003dNone\nTEST\u003dNone\n\nReview-Url: https://codereview.chromium.org/2498463003\n"
    },
    {
      "commit": "da301ac8ccee61d3d59e0c548b890f7dd8adfa10",
      "tree": "ac12b10daa3e0a11ab46bb83283551d64d1602fd",
      "parents": [
        "0fa8c6df06765f2889a9b4c1b1058b0d9d315970"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Nov 11 20:53:39 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Nov 11 20:53:39 2016"
      },
      "message": "Fix \u0027impl/memory\u0027 context key.\n\nCurrently the Context is using \"1\" as the key for the current\ntransaction. Make it (a) something internal, and (b) a string pointer\nfor easier Context readability.\n\nBUG\u003dNone\nTEST\u003dNone\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2492053003\n"
    },
    {
      "commit": "0fa8c6df06765f2889a9b4c1b1058b0d9d315970",
      "tree": "e4df6ae421ed3851b8bdd393ba592b042b3d5d2b",
      "parents": [
        "bc42c33f797ca09b2214075d00fba27373978673"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Nov 11 20:49:20 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Nov 11 20:49:20 2016"
      },
      "message": "Update cloud implementation w/ new datastore API\n\nThe cloud datastore API has been updated. Update the cloud datastore\nlayer implementation accordingly.\n\nBUG\u003dNone\nTEST\u003dNone\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2492103003\n"
    },
    {
      "commit": "bc42c33f797ca09b2214075d00fba27373978673",
      "tree": "c017276c1aac098f972830d3ae58380aa03e0e3e",
      "parents": [
        "a25fc49c0999ab4c1ee5f384801a1359002365a1"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Thu Nov 10 00:07:25 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Nov 10 00:07:25 2016"
      },
      "message": "Add callbacks to query batch filter.\n\nCurrently, the query batch filter transparently batches queries.\nHowever, users wanting to act on query data as it comes in have no safe\npoint of intervention: if they operate on the data inside their\ncallback, they may be operating in the middle of an ongoing query,\ncausing it to time out. If they operate afterwards, they will have to\nbuffer the full set of query results.\n\nThis adds optional callback(s) to the batch query filter. These\ncallbacks will be invoked in between batches.\n\nBUG\u003dNone\nTEST\u003dNone\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2484513002\n"
    },
    {
      "commit": "a25fc49c0999ab4c1ee5f384801a1359002365a1",
      "tree": "86239a3fe2d0ed7caa440190e6282fb75f64b5c5",
      "parents": [
        "31b3460980f3e048bb57f214952fb775aa21973f"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Wed Nov 02 21:13:30 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed Nov 02 21:13:30 2016"
      },
      "message": "Make AddShardFunctions separate from the FilterRDS function.\n\nThis will allow applications using the luci-go middleware to actually use the\nsharding functionality (including total disablement for certain entity types).\n\nR\u003dvadimsh@chromium.org, dnj@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2471743002\n"
    },
    {
      "commit": "31b3460980f3e048bb57f214952fb775aa21973f",
      "tree": "03244a4fdb7bbea895688bd49e8a5b61dc7925d3",
      "parents": [
        "cfd4c03f8de6f353360064aca2d2fcf517bedf8b"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Wed Nov 02 02:09:42 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed Nov 02 02:09:42 2016"
      },
      "message": "impl/prod: Make AEContext private.\n\nAEContext is confusing and magical, as is evidenced by #63, exposing\nimpl/prod\u0027s internal structures and a lot of gritty and nuanced details about\nhow it manages AppEngine SDK Contexts.\n\nRather than direct users here, let\u0027s offer a clean break: users who want\nto interact with the Google AppEngine SDK directly must explicitly create\ntheir own Context for this using appengine.(Use|With)Context.\nInternally, this is very efficient, as AppEngine retains Contexts bound\nto requests in a map.\n\nWith this patch the division is clearer: luci/gae will not help you\naccess the raw AppEngine SDK, period.\n\nBUG\u003dNone\nTEST\u003dlocal\n  - `goapp test ./impl/prod`\n\nReview-Url: https://codereview.chromium.org/2460473003\n"
    },
    {
      "commit": "cfd4c03f8de6f353360064aca2d2fcf517bedf8b",
      "tree": "4df2ed602532a5e5673bf31870c6804082fc0a7c",
      "parents": [
        "674c24e7256c2f71621475bc126a0b76508c4bf0"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Wed Sep 21 16:47:19 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed Sep 21 16:47:19 2016"
      },
      "message": "dscache: Use math/rand\u0027s Read for nonce.\n\nFixes #55.\n\nBUG\u003dNone\nTEST\u003dNone\n\nReview-Url: https://codereview.chromium.org/2354303002\n"
    },
    {
      "commit": "674c24e7256c2f71621475bc126a0b76508c4bf0",
      "tree": "e648f75a7deccfc56f50cd7bacd78a2e13ffd782",
      "parents": [
        "272b5f2351009dfef30f2a0f4a4681df4a8725ab"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Tue Sep 20 20:42:03 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Sep 20 20:42:03 2016"
      },
      "message": "Add \"MkKeyContext\" KeyContext generation function.\n\nThis function helps generate KeyContexts concisely in other packages,\nwhere direct struct initialization without field names will trigger linter\ncomplaints.\n\nBUG\u003dNone\nTEST\u003dlocal\n  - go test ./...\n  - Tested `goapp test ./impl/prod`\n  - Tested \"impl/cloud\" with \"gcd.sh\".\n\nR\u003diannucci@chromium.org\n\nReview-Url: https://codereview.chromium.org/2353063004\n"
    },
    {
      "commit": "272b5f2351009dfef30f2a0f4a4681df4a8725ab",
      "tree": "2637aeeb2469ec247ed751666d0cb0c723c09271",
      "parents": [
        "cf74102eddbae774689f0e0a867d657466093a84"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Tue Sep 20 02:19:56 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Sep 20 02:19:56 2016"
      },
      "message": "impl/memory: Fix round-tripping of AppID/Namespace.\n\nCurrently, impl/memory doesn\u0027t store a key field\u0027s AppID or Namespace\nwhen serializing keys. Fix this and add a test to assert that\nround-tripping of key fields works.\n\nBUG\u003dNone\nTEST\u003dlocal\n\nReview-Url: https://codereview.chromium.org/2350013002\n"
    },
    {
      "commit": "cf74102eddbae774689f0e0a867d657466093a84",
      "tree": "c4a0f574339e09195787e5097c82e3b2bb8b4233",
      "parents": [
        "3715a27a534b6e3896e23662e229fa8caaeb8a60"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Mon Sep 19 07:09:56 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Sep 19 07:09:56 2016"
      },
      "message": "Fix prod tests, add benchmark.\n\nTBR\u003diannucci@chromium.org\nBUG\u003dNone\nTEST\u003dNone\n\nReview-Url: https://codereview.chromium.org/2351613002\n"
    },
    {
      "commit": "3715a27a534b6e3896e23662e229fa8caaeb8a60",
      "tree": "c4ef191797c3f265733db0166ed6729afe52b79f",
      "parents": [
        "c4fab9e7d5a1b17dc32257a21fde91696d6cb217"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Mon Sep 19 02:19:04 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Sep 19 02:19:05 2016"
      },
      "message": "Interface update, per-method Contexts.\n\nThis is a very large patch that fixes #53. It carries some additional\nchanges. This is an API change, and will break virtually all users of\nany \"luci/gae\" packages. The API update is trivial, though.\n\nThis patch:\n- Remove user-facing \"Interface\" interfaces, when present, in favor of\n  package-level methods that each individually accept a Context parameter.\n- Remove package-level \"Get\" methods for services in favor of directly\n  using package-level methods.\n- Standardize all service/... packages\u0027 primary interfaces as\n  \"RawInterface\" instead of \"Interface\".\n- Add a datastore Transaction tracking interface, allowing a user to get\n  or set the current datastore transaction in the Context. This replaces\n  GetNoTxn-style methods in favor of setting a \"nil\" transaction which,\n  as it happens, is the only implemented part of the interface.\n- Introduce \"KeyContext\" to \"services/datastore\", which retains an AppID\n  and Namespace tuple and uses them as a base to generate GAE keys.\n  Rewrite several internal methods to use KeyContext.\n- Rename \"Testable\" interface method to \"GetTestable\" since it\u0027s\n  top-level now and it would conflict with the actual interface\n  definition.\n- Remove the boolean return value from the info service\u0027s \"GetNamespace\"\n  now that the empty string equals the default namespace.\n- Change *Multi \"service/taskqueue\" and \"service/memcache\" APIs to use\n  singular vararg versions.\n\nThe transaction interface was added here (as opposed to another patch\nset) because it is complementary to the API changes required in\ndatastore and taskqueue services to use Contexts directly. This is somewhat\nat odds with the *NoTxn-style function calls, which have consequently been\nremoved in favor of setting a \"nil\" Transaction. The datastore Transaction\ninterface is something that has been desired for a while, so supporting nil\nTransactions should be a good starting point without over-committing (e.g.,\nactually hacking transaction manipulation into \"impl/prod\").\n\nMigrating code to the new-style API should be fairly straightforward:\n- Calls to \"service/*\" methods will no longer call \"Get\" to get an\n  Interface instance; instead, use package-level calls and pass the\n  Context as an extra parameter.\n\n  BEFORE:\n  ds :\u003d datastore.Get(c)\n  if err :\u003d ds.Get(obj0, obj1, ...); err !\u003d nil { ... }\n\n  NOW:\n  if err :\u003d datastore.Get(c, obj0, obj1, ...); err !\u003d nil { ... }\n\n- The \"*NoTxn\"-style calls are gone, replaced by installing a nil\n  datastore Transaction.\n\n  BEFORE:\n  datastore.GetNoTxn(c).Put(obj0)\n  taskqueue.GetNoTxn(c).Add(task)\n  prod.AEContextNoTxn(c)\n\n  NOW:\n  datastore.Put(datastore.WithoutTransaction(c), obj0)\n  taskqueue.Add(datastore.WithoutTransaction(c), task)\n  prod.AEContext(datastore.WithoutTransaction(c))\n\n- Methods generating full datastore keys (manually specifying app ID and\n  namespace) now must use a KeyContext instance. This isn\u0027t expected to be\n  a problem, since most external packages should not be using direct key\n  generation, but should, instead, be using the datastore-bound versions of\n  those methods.\n\n  BEFORE:\n  key :\u003d datastore.MakeKey(\"aid\", \"ns\", \"kind\", \"stringID\")\n\n  NOW:\n  key :\u003d datastore.KeyContext{\"aid\", \"ns\"}.MakeKey(\"kind\", \"stringID\")\n\n- Methods using *Multi versions of public interfaces should use singular\n  versions. Additonally, to support this, the queue name and task list\n  parameter positions have been swapped.\n\n  If the error return value is being examined for anything\n  more than non-nil-ness, keep an eye out for the single-argument case, which\n  returns the error directly instead of wrapping it in a MultiError.\n\n  BEFORE:\n  taskqueue.Get(c).AddMulti([]*taskqueue.Task{t0, t1, t2}, \"queueName\")\n\n  NOW:\n  taskqueue.Add(c, \"queueName\", t0, t1, t2)\n\nBUG\u003dNone\nTEST\u003dlocal\n  - All unit tests pass locally.\n  - Ran \"impl/cloud\" tests successfully against emulator.\n  - Ran `goapp test` on \"impl/prod\" successfully.\n\npatch from issue 2302743002 at patchset 1 (http://crrev.com/2302743002#ps1)\n\nReview-Url: https://codereview.chromium.org/2302743002\n"
    },
    {
      "commit": "c4fab9e7d5a1b17dc32257a21fde91696d6cb217",
      "tree": "49a9d8f86ae6f92f59ea63898ca47ef9de3a60d1",
      "parents": [
        "5ea8e51f703d895c9e53595d49e109c5a349a652"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Sep 16 21:18:46 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Sep 16 21:18:46 2016"
      },
      "message": "Differentiate between single- and multi- props.\n\nFixes #58.\n\nChange PropertyMap to accept either a single Property or a\nPropertySlice, the former being a single Property and the latter\nbeing a multi-property regardless of content size.\n\nThis will likely break API compatibility for packages that directly use\nPropertyMap, which shouldn\u0027t be too many. Updating is not difficult:\n\nIf you want to have a single property, you can assign directly instead\nof wrapping in a []Property:\n\n  PropertyMap{\"Foo\": MkProperty(\"Bar\")}\n\nIf you want to have a multi-valued Property, use a PropertySlice:\n\n  PropertyMap{\"Foo\": PropertySlice{ds.MkProperty(\"Bar\")}}\n\nNote that datastore now differentiates between single-valued Properties\nand multi-valued Properties. When dealing with structs, luci/gae doesn\u0027t\nreally care when loading, but will export them as multi- if they are backed\nby a slice.\n\nBUG\u003dNone\nTEST\u003dlocal\n\nReview-Url: https://codereview.chromium.org/2342063003\n"
    },
    {
      "commit": "5ea8e51f703d895c9e53595d49e109c5a349a652",
      "tree": "14a3f7d427b3235f4e85d5b7442286caa2f9e612",
      "parents": [
        "715e06f753b48ea8e38698e77a8425f115899132"
      ],
      "author": {
        "name": "hinoka",
        "email": "hinoka@google.com",
        "time": "Fri Sep 16 18:53:11 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Sep 16 18:53:11 2016"
      },
      "message": "Luci GAE Datastore: Singlar Get() and Put() should always return single error\n\nThis covers a few more cases where errors.MultiError might be returned instead of\na singular error\n\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2347073002\n"
    },
    {
      "commit": "715e06f753b48ea8e38698e77a8425f115899132",
      "tree": "beb1ee989784c51d8359b5a67c11138447c0f3c8",
      "parents": [
        "747577ae5a8c1be5d5497e3449b6b8a7c00f14ba"
      ],
      "author": {
        "name": "vadimsh",
        "email": "vadimsh@chromium.org",
        "time": "Sat Aug 06 20:34:43 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Aug 06 20:34:43 2016"
      },
      "message": "Implement info.ServiceAccount() on devserver via info.AccessToken(...).\n\nR\u003diannucci@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2220193002\n"
    },
    {
      "commit": "747577ae5a8c1be5d5497e3449b6b8a7c00f14ba",
      "tree": "85176ed8b81261ae5fcc252c5519639a36d864d0",
      "parents": [
        "75ab19e8b10391a5dd466b1896433fad054ad811"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Aug 05 21:10:38 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Aug 05 21:10:38 2016"
      },
      "message": "Update cloud package.\n\nFixes #54.\n\nBUG\u003dNone\nTEST\u003dNone\n\nReview-Url: https://codereview.chromium.org/2217063003\n"
    },
    {
      "commit": "75ab19e8b10391a5dd466b1896433fad054ad811",
      "tree": "69d545ea32456d96ca4f5485afdf28ddb0018180",
      "parents": [
        "df1b5cd07568a326ea05ead1696807d71a219810"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Fri Aug 05 01:07:28 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Aug 05 01:07:28 2016"
      },
      "message": "Remove empty namespace assertion from impl/memory.\n\nThis was fixed upstream in:\n  https://github.com/golang/appengine/commit/5a9e2b406e4e87cd8a88d1881a31b1248da2e928\n\nR\u003ddnj@chromium.org, vadimsh@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2219673002\n"
    },
    {
      "commit": "df1b5cd07568a326ea05ead1696807d71a219810",
      "tree": "b1019118c0b34ea0977c0f3142b22c0e553b4ce0",
      "parents": [
        "989edcd423b8c20889c16d9dc7c89d909ea21522"
      ],
      "author": {
        "name": "Robert Iannucci",
        "email": "iannucci@chromium.org",
        "time": "Fri Jul 29 19:04:04 2016"
      },
      "committer": {
        "name": "Robert Iannucci",
        "email": "iannucci@chromium.org",
        "time": "Fri Jul 29 19:04:04 2016"
      },
      "message": "GAE CL for luci-go common refactor\n\nR\u003dnodir@chromium.org, dnj@chromium.org, estaab@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/2192003003 .\n"
    },
    {
      "commit": "989edcd423b8c20889c16d9dc7c89d909ea21522",
      "tree": "941487ed3d42b73b313fb73eae1b0fefd17f61aa",
      "parents": [
        "2edc40f473ec2225ac5a41070519ea2ea4430716"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Mon Jul 25 23:41:08 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jul 25 23:41:08 2016"
      },
      "message": "Add an option to install just Cloud Datastore.\n\nTBR\u003diannucci@chromium.org\nBUG\u003dNone\nTEST\u003dNone\n\nReview-Url: https://codereview.chromium.org/2179843004\n"
    },
    {
      "commit": "2edc40f473ec2225ac5a41070519ea2ea4430716",
      "tree": "3ad547c53cfdb3a498961aa2bc901673c3671387",
      "parents": [
        "f297774aec1105f91f8d863626b4d3ae58ae30ee"
      ],
      "author": {
        "name": "nodir",
        "email": "nodir@chromium.org",
        "time": "Fri Jul 22 17:54:09 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Jul 22 17:54:09 2016"
      },
      "message": "cq.cfg: use luci builders\n\ndo not use buildbot builder\nupdate luci bucket name\n\nR\u003destaab@chromium.org, dnj@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2179543003\n"
    },
    {
      "commit": "f297774aec1105f91f8d863626b4d3ae58ae30ee",
      "tree": "a6a09e20bf0cd7f6ac22fd03959a1ff02065badb",
      "parents": [
        "6caae3281b2245a2a1c2c0ced695ca1ab81605c2"
      ],
      "author": {
        "name": "Robert Iannucci",
        "email": "iannucci@chromium.org",
        "time": "Wed Jul 13 16:29:53 2016"
      },
      "committer": {
        "name": "Robert Iannucci",
        "email": "iannucci@chromium.org",
        "time": "Wed Jul 13 16:29:53 2016"
      },
      "message": "Add lightning talk that I didn\u0027t gave at Gophercon \u002716\n"
    },
    {
      "commit": "6caae3281b2245a2a1c2c0ced695ca1ab81605c2",
      "tree": "b92154e51815e37c0e0266c92e64888ae11b3c4a",
      "parents": [
        "a212da0491a31a03fb1e9fb21a328ac1dc72354c"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Jul 01 02:43:41 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Jul 01 02:43:41 2016"
      },
      "message": "Add cloud datastore implementation.\n\nFixes #52.\n\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/1957953002\n"
    },
    {
      "commit": "a212da0491a31a03fb1e9fb21a328ac1dc72354c",
      "tree": "945c8ecf54a253fbdb6911b8f88e5947006f702c",
      "parents": [
        "f11b1de0154fa1f3dc0f06ff77fba94949123326"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Jul 01 01:58:31 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Jul 01 01:58:31 2016"
      },
      "message": "datastore: Update AllocateIDs to take keys.\n\nUpdate the Datastore\u0027s AllocateIDs call to accept variadic arguments similar\nto Get/Put/Delete/Exists. Structs can be supplied to populate their keys\ndirectly, and keys or key slices can be supplied to directly allocate keys.\n\nThis adds some Key helper functions:\n- SameKind, which asserts that keys reference the same kind.\n- Partial, which returns a partial key given a source key.\n- WithID, which returns a derivative key with the specified ID.\n- NewIncompleteKeys, which allocates a slice of incomplete keys given a kind.\n\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2007123002\n"
    },
    {
      "commit": "f11b1de0154fa1f3dc0f06ff77fba94949123326",
      "tree": "8edd74c24e736e28d4ad702500f4a1a395716cb6",
      "parents": [
        "e3e2d44c2aa4405637f39d9db8d6aecbacd6cd54"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Jul 01 01:48:19 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Jul 01 01:48:19 2016"
      },
      "message": "Refactor multiarg, split MGS/PLS.\n\nRefactor the multiarg construction method to handle the various cases\ninline, rather than defining and invoking methods for specific\nscenarios. This enables PropertyLoadSaver-based methods to be handled\nseparately from MetaGetterSetter-based methods, which, in turn, enables\nthe two to be implemented independently.\n\nA bit of boilerplate is removed and the odd case of MGS/PLS Map/Chan fits\nbetter. Additionally, a few double-reflection code paths are optimized\nalong the way.\n\nBUG\u003dNone\n\nReview-Url: https://codereview.chromium.org/2048933004\n"
    },
    {
      "commit": "e3e2d44c2aa4405637f39d9db8d6aecbacd6cd54",
      "tree": "bc66b1e04d0567af515340f80ba08ee6b2982cf4",
      "parents": [
        "e9fd63bf1c518e700e225eb6160ed7300141b098"
      ],
      "author": {
        "name": "nodir",
        "email": "nodir@chromium.org",
        "time": "Mon Jun 27 17:47:42 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jun 27 17:47:42 2016"
      },
      "message": "make swarming trybuilders non-experimental\n\nR\u003diannucci@chromium.org, dnj@chromium.org\nBUG\u003d622093\n\nReview-Url: https://codereview.chromium.org/2083193006\n"
    },
    {
      "commit": "e9fd63bf1c518e700e225eb6160ed7300141b098",
      "tree": "3e7f6ea60ce90aa135b2eb256dc0f5db032a0aff",
      "parents": [
        "062a32372e8f6159980129438a7ff15b5509ddc2"
      ],
      "author": {
        "name": "nodir",
        "email": "nodir@google.com",
        "time": "Tue Jun 21 23:09:07 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jun 21 23:09:07 2016"
      },
      "message": "cq.cfg: enable experimental swarming builders\n\nR\u003destaab@chromium.org, vadimsh@chromium.org\nBUG\u003d622093\n\nReview-Url: https://codereview.chromium.org/2090433002\n"
    },
    {
      "commit": "062a32372e8f6159980129438a7ff15b5509ddc2",
      "tree": "2baea8daffb3e0ad27870e33597bc5710018e123",
      "parents": [
        "48d5fbded2f1bc5cfa24d377c180d871a238351e"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue Jun 14 00:11:05 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jun 14 00:11:05 2016"
      },
      "message": "Add datastore dumper tool.\n\nThis allows you to dump the datastore in whole or part, with or without special\nformatting directives.\n\nR\u003ddnj@chromium.org, nodir@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2037433002\n"
    },
    {
      "commit": "48d5fbded2f1bc5cfa24d377c180d871a238351e",
      "tree": "916134f7255e5751c452fadd95294ce26fb5d834",
      "parents": [
        "5f6e967be7e9893bd683f7deb1fa317d1dd462f0"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue Jun 14 00:07:10 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jun 14 00:07:10 2016"
      },
      "message": "Add TrimmedAppID to info service.\n\nAlso refactor info service to share common \u0027augmented\u0027 methods in\nthe service/info package itself, ala service/datastore.\n\nSplit out from CL: https://chromiumcodereview.appspot.com/1537883002\n\nR\u003ddnj@chromium.org\nBUG\u003d550684\n\nReview-Url: https://codereview.chromium.org/2062613002\n"
    },
    {
      "commit": "5f6e967be7e9893bd683f7deb1fa317d1dd462f0",
      "tree": "5a3d273c937b5068c6fc984700c86f2cd7901bd4",
      "parents": [
        "297328504121adcea7aaa6191f2c81c904f0ae99"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sat Jun 11 02:24:24 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Jun 11 02:24:24 2016"
      },
      "message": "Add DefaultVersionHostname to impl/memory/info.\n\nR\u003ddnj@chromium.org, nodir@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2028423002\n"
    },
    {
      "commit": "297328504121adcea7aaa6191f2c81c904f0ae99",
      "tree": "7b216dfb056d0a8948594d0cc8756c98e30768ea",
      "parents": [
        "47a59f64219fcbb9664e22499748a1e4a9f1d448"
      ],
      "author": {
        "name": "Robert Iannucci",
        "email": "iannucci@chromium.org",
        "time": "Fri Jun 10 23:05:07 2016"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 10 23:05:07 2016"
      },
      "message": "Fix typo in pls.go docs"
    },
    {
      "commit": "47a59f64219fcbb9664e22499748a1e4a9f1d448",
      "tree": "3fa72016cf16867f8a67cb5b90d2c06171a659f6",
      "parents": [
        "5787dea3cf12f40b4fc210c724dea92c7f5ff2bf"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu Jun 02 22:40:34 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jun 02 22:40:34 2016"
      },
      "message": "Allow uint16 and uint32 in MakeKey.\n\nR\u003ddnj@chromium.org, nodir@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2036543003\n"
    },
    {
      "commit": "5787dea3cf12f40b4fc210c724dea92c7f5ff2bf",
      "tree": "261519eb842ce2b1e60b70489df121a024ee3d50",
      "parents": [
        "ba34d4de4e197ec8cc420faea99caee59eb7205e"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Thu Jun 02 22:35:24 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Jun 02 22:35:24 2016"
      },
      "message": "Add GetNoTxn to txnBuf as a hack.\n\nI really don\u0027t like this but short of fixing #23, I don\u0027t think there\u0027s much we\ncan do.\n\nR\u003ddnj@chromium.org, nodir@chromium.org\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2036593002\n"
    },
    {
      "commit": "ba34d4de4e197ec8cc420faea99caee59eb7205e",
      "tree": "0ce4693b729e19f0c72d7c84dab7650cd6cc8530",
      "parents": [
        "5981afeac72c0be7cc10dc2b890fdd8190bb02c0"
      ],
      "author": {
        "name": "estaab",
        "email": "estaab@chromium.org",
        "time": "Tue May 31 22:03:56 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 31 22:03:56 2016"
      },
      "message": "Change gae to apache 2 license.\n\nUpdate AUTHORS, CONTRIBUTORS, and LICENSE.\nAdd apache 2 license check to PRESUBMIT.py.\n\nRan:\n  git sed \u0027s/Chromium Authors/LUCI Authors/\u0027\n  git sed \u0027s/governed by a BSD-style license that can be/governed under the Apache License, Version 2.0/\u0027\n  git sed \u0027s/found in the LICENSE file/that can be found in the LICENSE file/\u0027\n  git checkout HEAD -- $(git status -sb | grep \u0027^ T\u0027 | cut -c 4-)\n  git checkout origin/master -- $(git diff origin/master --name-only | grep third_party)\n\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2021753002\n"
    },
    {
      "commit": "5981afeac72c0be7cc10dc2b890fdd8190bb02c0",
      "tree": "0aea7fa5294f6ddba4168bfeac1f414dda8bacf5",
      "parents": [
        "6d785923cdc1615899a7632269e5e636a2300786"
      ],
      "author": {
        "name": "estaab",
        "email": "estaab@chromium.org",
        "time": "Tue May 31 17:25:42 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue May 31 17:25:42 2016"
      },
      "message": "Change codereview server to be consistent with other luci projects.\n\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/2020933002\n"
    },
    {
      "commit": "6d785923cdc1615899a7632269e5e636a2300786",
      "tree": "b707d78d6c4f98a050657e51feca7560d2087c9f",
      "parents": [
        "ee5266ebb4c1957a848000175f03ddb6845d01ed"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Sun May 29 21:28:05 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sun May 29 21:28:05 2016"
      },
      "message": "dscache: Reduce log level of memcache failures.\n\nWarning-level failures quickly pollute the AppEngine log space. This\nchange converts some of the more common warnings to Debug-level logs so\nthe Warning space remains reserved for higher attention calls.\n\nAlso add a warning about lock eviction poisoning to THERE BE DRAGONS\nsection of the doc.\n\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/1987353002\n"
    },
    {
      "commit": "ee5266ebb4c1957a848000175f03ddb6845d01ed",
      "tree": "e8882f240a60c1790cd42049b44e83ea42fe7721",
      "parents": [
        "5e312adb9e0e0ce0abaa10d4d94f5bd5e11671e3"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Sat May 28 17:54:16 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat May 28 17:54:16 2016"
      },
      "message": "datastore: variadic Get, Put, Exists, Delete.\n\nFixes #51.\n\nUpdate Get, Put, Exists, and Delete to be variadic. This will make the\ninterface more usable and get rid of boilerplate in client code.\n\nGet, Put, Exists, and Delete now accept variadic arguments. Any one of\nthese arguments can be an argument that was previously valid or\nthe *Multi version of those functions. This effectively obsoletes the *Multi\nversions, but they are left in for backwards compatiblility with the stated\nintention of removing them at a later date.\n\nGet/Put/Exists/Delete will now return a single error in the one-argument\ncase or a MultiError in a multiple-argument case. Note that now that single\nargument case can take a slice type, the single error may itself be a\nMultiError if the single argument is a slice.\n\nReview-Url: https://codereview.chromium.org/2011773002\n"
    },
    {
      "commit": "5e312adb9e0e0ce0abaa10d4d94f5bd5e11671e3",
      "tree": "4ced398d2048262adb0bf0050d13faf2471bb441",
      "parents": [
        "a4fb70d880408489a39aff1e77dfb74870731fdc"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Apr 29 19:19:10 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Apr 29 19:19:10 2016"
      },
      "message": "filter/txnBuf: Use fully-qualified App ID.\n\nUse the fully-qualified app ID when creating the in-memory datastore for\ntransaction buffer. Previously, transaction buffer would use the\nstandard App ID, while production datastore would use the\nfully-qualified App ID, causing key incompatibility errors in\nproduction.\n\nCleanup impl/memory\u0027s NewDatastore function to not install superfluous\nservices into the Context. This draws a cleaner line between\nimpl/memory\u0027s dual purposes as both a rich testing enviornment and a\nproduction-grade in-memory datastore.\n\nIn addition, have impl/memory\u0027s info service differentiate between the\ntwo. This causes tests for filter/txnBuf to properly fail lacking this\nfix, enabling regression protection.\n\nTo support this, impl/memory\u0027s Info service will now parse the supplied\nApp ID. If it contains a \"~\" character, it is split into fully-qualified\nand regular AppID. Otherwise, the two will be the same.\n\nBUG\u003d\n\nReview-Url: https://codereview.chromium.org/1929423002\n"
    },
    {
      "commit": "a4fb70d880408489a39aff1e77dfb74870731fdc",
      "tree": "11dbb4d5582a10fb7184afb8cbf3f6dbbb4ee0a2",
      "parents": [
        "a8c62dfd0a9db97a48483c1dc7bb5df3e5c3d263"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Mon Apr 25 16:04:02 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Apr 25 16:04:02 2016"
      },
      "message": "Travis: Increase system specs, limit concurrent.\n\nIncrease the Travis system specs and limit the number of concurrent\ntests to try and avoid the signal-kill error that we\u0027re seeing in Travis\nATM.\n\nTBR\u003diannucci@chromium.org\nBUG\u003dNone\n\nReview URL: https://codereview.chromium.org/1922583002\n"
    },
    {
      "commit": "a8c62dfd0a9db97a48483c1dc7bb5df3e5c3d263",
      "tree": "8e99ea52edb46810378909af97c2bea1df198e18",
      "parents": [
        "30cbeef9bced0f8dfcdbd1ed27faccc3ccced9a6"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Mon Apr 25 15:49:35 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Apr 25 15:49:35 2016"
      },
      "message": "pcg: Bump test time to 20 minutes.\n\nTravis is currently timing out.\n\nTBR\u003diannucci@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1918713003\n"
    },
    {
      "commit": "30cbeef9bced0f8dfcdbd1ed27faccc3ccced9a6",
      "tree": "bf55f843cb5e876c2d87ad73d1e8d927fe307533",
      "parents": [
        "76e946629e8d7f5e68963ff48fbaabe5ac2c2157"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Mon Apr 25 15:26:44 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Apr 25 15:26:44 2016"
      },
      "message": "Add meta package to datastore.\n\nAdd the service/datastore/meta package, which currently implements:\n- __entity_group__ meta.\n- Namespaces, which lists all datastore namespaces.\n\nFixes luci/gae#45.\n\nR\u003diannucci@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1917513002\n"
    },
    {
      "commit": "76e946629e8d7f5e68963ff48fbaabe5ac2c2157",
      "tree": "0becfb84fc23344e897212b972231d4a8fce5a70",
      "parents": [
        "f87060b920fcde72c22457a91ab69b495a416837"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Sun Apr 24 06:34:37 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sun Apr 24 06:34:37 2016"
      },
      "message": "impl/memory: datastore and memcache namespacing\n\nUpdate GetNamespace() to return an additional boolean, which will be\ntrue if the namespace was set and false if it was not. The AppEngine SDK\ndefaults to having no namespace installed (\"\", false), but will allow\nthe user to install any namespace. This allows a user to differentiate\nbetween no namespace and an empty namespace (\"\", true).\n\nMake impl/memory\u0027s datastore query operation to error if the namespace has\nbeen set to the empty namespace (\"\"). This reflects observed production\nbehavior.\n\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1916463004\n"
    },
    {
      "commit": "f87060b920fcde72c22457a91ab69b495a416837",
      "tree": "7d499d7d868e453d9d5eeca671696bcd4cec1906",
      "parents": [
        "e6d5b5947c9808f2ae778947377c2ef068510b34"
      ],
      "author": {
        "name": "Robert Iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sat Apr 23 20:23:51 2016"
      },
      "committer": {
        "name": "Robert Iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sat Apr 23 20:23:51 2016"
      },
      "message": "Bump max_duration for CI tests to 480s\n\nHopefully Fixes #48."
    },
    {
      "commit": "e6d5b5947c9808f2ae778947377c2ef068510b34",
      "tree": "e9f26d4adf5b8d598d5257f33674eef76b33a688",
      "parents": [
        "8304c6e51348d8faf0406169b9f137366a438295"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Fri Apr 22 16:29:48 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Apr 22 16:29:48 2016"
      },
      "message": "Fix memory corruption bug in impl/memory\n\nWhen you `SetCollection` in gkvlite, it invalidates the old\ncollection, but keeps the Items of the previous collection. The way\nthat impl/memory was using SetCollection was more along the lines of\nGetOrCreate, which could cause corruption or other issues if two\ncodepaths did SetCollection simultaneously.\n\nThis fixes the corruption bug by removing SetCollection from the\nmemStore interface and replaces it with a GetOrCreateCollection,\nwhich checks for the collection, and only calls SetCollection if it\ndoesn\u0027t exist. As a bonus, this seems to give a slight performance\nspeedup over the previous broken code.\n\nAdditionally, this forces all uses of VisitItemsAscend to use\na Snapshot, to avoid accidental modification of a Collection while\nits being iterated over, which can lead to the situation discussed\nabove, or other nasty errors.\n\nFinally, this adds an optional \u0027gkvlite tracer\u0027 functionality\nwhich came in (extremely) handy for finding this bug. When given\na folder, it will emit go-code-like invocations of the functions run\non every collection, and includes enough information to reveal which\nfunctions are being called on the root collection v. snapshots, and\nif there are any overlapping VisitItemsAscend invocations, etc.\n\nR\u003ddnj@chromium.org\nBUG\u003d550684\n\nReview URL: https://codereview.chromium.org/1911263002\n"
    },
    {
      "commit": "8304c6e51348d8faf0406169b9f137366a438295",
      "tree": "ed4cea0782bc762931772dbbdf518deb6a3fa630",
      "parents": [
        "5ede45528b3156419ec20f69d82c5b7a16d296a1"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Apr 22 05:54:33 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Apr 22 05:54:33 2016"
      },
      "message": "Travis: Build against Go1.6.\n\nTBR\u003diannucci@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1911293002\n"
    },
    {
      "commit": "5ede45528b3156419ec20f69d82c5b7a16d296a1",
      "tree": "18ed92b194909543bb83b90b84b9c401df28db60",
      "parents": [
        "19330b312aff818c8e78b36c597d5a4b63a9904c"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Apr 22 05:28:08 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Apr 22 05:28:08 2016"
      },
      "message": "Remove race from query finalization.\n\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1910293002\n"
    },
    {
      "commit": "19330b312aff818c8e78b36c597d5a4b63a9904c",
      "tree": "4d1fe7045c3b21d145da642b5a0b242283dda3ab",
      "parents": [
        "1ebcc92d2315f2c524c569f26b95a7e378d56ba9"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Wed Apr 20 15:38:10 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed Apr 20 15:38:10 2016"
      },
      "message": "datastore: Fix AddIndexes with existing namespaces\n\nAddIndexes previously only added an index for the current namespace.\nSince indexes are global, they should be added for all existing\nnamespaces.\n\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1894403002\n"
    },
    {
      "commit": "1ebcc92d2315f2c524c569f26b95a7e378d56ba9",
      "tree": "3d8c973ca12185906e91591293552021810b300a",
      "parents": [
        "5c6b98bf518b449a30ea8d5488cc1cfc56087bab"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Mon Apr 18 23:21:39 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Apr 18 23:21:39 2016"
      },
      "message": "service/taskqueue: Add NewPOSTTask, remove NewTask\n\nAdd NewPOSTTask, which mirrors the method of the same name in\nAppEngine\u0027s Go task queue SDK.\n\nRemove NewTask from the taskqueue Interface, since it was basically\nuseless.\n\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1890983004\n"
    },
    {
      "commit": "5c6b98bf518b449a30ea8d5488cc1cfc56087bab",
      "tree": "28991ffa5b98f2dc691903ed31480a3eb07f6030",
      "parents": [
        "15da1e8958be9f9f899296d2dbe882195a8b2090"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sat Apr 16 00:57:19 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Apr 16 00:57:19 2016"
      },
      "message": "Add __namespace__ metadata query support to impl/memory.\n\nRef: https://cloud.google.com/datastore/docs/concepts/metadataqueries\n\nR\u003ddnj@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1892343002\n"
    },
    {
      "commit": "15da1e8958be9f9f899296d2dbe882195a8b2090",
      "tree": "0ab5b59ddfc80e36d6152cdce0a7aab98af65960",
      "parents": [
        "6f2456b4ce69df457abfa02313a8ee3d9f2c1b16"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Thu Apr 14 01:20:45 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Apr 14 01:20:45 2016"
      },
      "message": "Add Info Testable interface, implement for memory.\n\nThis adds a Testable interface to the Info service which allows it to\ninstall Info parameters in Contexts.\n\nAdd support for setting version ID and request ID to impl/memory Info\nservice.\n\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1871943003\n"
    },
    {
      "commit": "6f2456b4ce69df457abfa02313a8ee3d9f2c1b16",
      "tree": "da583084b4d5447fdddc76ef4651123d625e8200",
      "parents": [
        "f2a2648b0e74fb73c9443669852606328952a017"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Thu Apr 07 23:31:33 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Apr 07 23:31:33 2016"
      },
      "message": "Add PopulateKey method to datastore.\n\nAdd PopulateKey, a method that, given an object, fills in its key\nfields.\n\nFixes #44.\n\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1867963003\n"
    },
    {
      "commit": "f2a2648b0e74fb73c9443669852606328952a017",
      "tree": "407329c39f7422c8be0be714c2533e533081da51",
      "parents": [
        "0a4fa8065e6843ebbbca94561b3df42447150ec4"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Apr 01 21:53:47 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Apr 01 21:53:47 2016"
      },
      "message": "Fix missing/broken ds.Stop handling in raw DS.\n\nSeveral places were missed when patching \"ds.Stop\" to being correctly filtred\nat the top interface rather than the raw interface.\n\nAt the top-level, GetAll and Count both did not filter the Stop error.\nAt the filter level, several filters were ignoring error values from\ntheir callbacks.\n\nAlso fixes an issue in count filter where the ds.Stop error was being\nincorrectly filtered at the RawInterface level.\n\nAdd datastore iterating query filter.\n\nR\u003diannucci@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1846123002\n"
    },
    {
      "commit": "0a4fa8065e6843ebbbca94561b3df42447150ec4",
      "tree": "5436733f320e0bcb05d22eb0bec33873a7f2c1f9",
      "parents": [
        "2b07306ebd082f630241b64a39c20cedf29e6c20"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Thu Mar 31 23:57:37 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Mar 31 23:57:37 2016"
      },
      "message": "Add datastore iterating query filter.\n\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1843313004\n"
    },
    {
      "commit": "2b07306ebd082f630241b64a39c20cedf29e6c20",
      "tree": "570341ea7ce520304cdd4e36f8c9b2ec726dc52f",
      "parents": [
        "ecb855a03c1c253984cab51cace564d204d349cd"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Thu Mar 31 00:26:36 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Thu Mar 31 00:26:36 2016"
      },
      "message": "Don\u0027t filter \"Stop\" error in raw interface.\n\nThe Stop error is a high-level error used by the datastore service to\nindicate that an iterative operation should stop rather. It should\nappear to the user as a \"nil\" error.\n\nHowever, currently the datastore raw implementations are filtering Stop\nand converting it to \"nil\". This prevents other filters from\nidentifying Stop events from their lower level callbacks.\n\nUpdate raw datastore methods to not filter Stop, and update their tests\nto accept Stop as a valid successful result.\n\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1844183003\n"
    },
    {
      "commit": "ecb855a03c1c253984cab51cace564d204d349cd",
      "tree": "3f8400a9b21fa170280a62dccc5c6510d9f54625",
      "parents": [
        "1ad17ed9115aa1e9414475e6bd60da943705f02b"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Tue Mar 22 18:46:37 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Mar 22 18:46:37 2016"
      },
      "message": "Make ExistsMulti return a BoolList\n\nBoolList has some convenience functions (e.g. to check if Any() or All() are\nset.). It\u0027s compatible with current uses of ExistsMulti.\n\nR\u003ddnj@chromium.org, estaab@chromium.org, nodir@chromium.org\nBUG\u003d550684\n\nReview URL: https://codereview.chromium.org/1816413002\n"
    },
    {
      "commit": "1ad17ed9115aa1e9414475e6bd60da943705f02b",
      "tree": "838d5ea0c0b5f301198e3c132b65fd12984f9902",
      "parents": [
        "8e00d275fb3b96b050708bb91e2c0bd69c73aa62"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Wed Mar 09 01:08:03 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed Mar 09 01:08:03 2016"
      },
      "message": "txnbuf: Add write count budget, size budget.\n\nAdd a \"maximum number of datastore writes\" budget to the transaction\nbuffer. Rework the size budget to remove preemptive child transaction\nfailures and directly derive budget from the parent.\n\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1776833002\n"
    },
    {
      "commit": "8e00d275fb3b96b050708bb91e2c0bd69c73aa62",
      "tree": "81c68697d49a9b9b95176ca0286d01c402277a6c",
      "parents": [
        "caeb69ff0011940b98cb55069d844bf9f987ac31"
      ],
      "author": {
        "name": "dsansome",
        "email": "dsansome@chromium.org",
        "time": "Tue Mar 08 10:59:00 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Mar 08 10:59:00 2016"
      },
      "message": "Add wrappers for the module module\n\nBUG\u003d570879\n\nReview URL: https://codereview.chromium.org/1772943003\n"
    },
    {
      "commit": "caeb69ff0011940b98cb55069d844bf9f987ac31",
      "tree": "5b7c54a2a7eacfd81d03a01a734b14a013ecdabb",
      "parents": [
        "63bef7c9b704957bc62cf3691b59c72bcfe544ce"
      ],
      "author": {
        "name": "dsansome",
        "email": "dsansome@chromium.org",
        "time": "Tue Mar 08 02:51:59 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Mar 08 02:51:59 2016"
      },
      "message": "Add a MustNamespace that panics if the namespace wasn\u0027t valid\n\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1766593002\n"
    },
    {
      "commit": "63bef7c9b704957bc62cf3691b59c72bcfe544ce",
      "tree": "6ec5afd1480b91959283bd9fea38d88036d17004",
      "parents": [
        "24f10074060aae9fef22a70b7ca764da668052ee"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Sat Feb 27 01:22:06 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Feb 27 01:22:06 2016"
      },
      "message": "Auto-project on distinct inequality fields.\n\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1745703002\n"
    },
    {
      "commit": "24f10074060aae9fef22a70b7ca764da668052ee",
      "tree": "5bb55bdd1f550e8f699e120c04475f722f7b4ae0",
      "parents": [
        "ccd7f43dada792cce1ec7b05c68a82f164dbbbb1"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Mon Feb 22 23:59:02 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Feb 22 23:59:02 2016"
      },
      "message": "Add header text to proto-gae tool\n\nIn order to appease our presubmit scripts, default to the Chromium Authors\ncopyright header.\n\nR\u003ddnj@chromium.org, estaab@chromium.org, hinoka@chromium.org, martiniss@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1718123003\n"
    },
    {
      "commit": "ccd7f43dada792cce1ec7b05c68a82f164dbbbb1",
      "tree": "15209bdfb5a744c38e35725c1673c9cba47f6b82",
      "parents": [
        "b272adef2808bbf770e47e1c681843f8d6f5d2cc"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Wed Feb 17 22:56:54 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Wed Feb 17 22:56:54 2016"
      },
      "message": "dscache: Only log unusual memcache errors.\n\nBUG\u003dNone\nTEST\u003dNone\nR\u003diannucci@chromium.org\n\nReview URL: https://codereview.chromium.org/1695833002\n"
    },
    {
      "commit": "b272adef2808bbf770e47e1c681843f8d6f5d2cc",
      "tree": "221d1f4436aaba8c7dc75a8b1e74080fde7141be",
      "parents": [
        "daecce9bc5397d278cf86dbab752bc15ddb91b7c"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Tue Feb 09 00:51:23 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Feb 09 00:51:23 2016"
      },
      "message": "Use ShouldResemble instead of ShouldResembleV.\n\nNow that goconvey incorporates our ShouldResembleV method directly, we\ncan go back to using ShouldResemble instead of hacking in\nShouldResembleV!\n\nBUG\u003dNone\n\nReview URL: https://codereview.chromium.org/1679093002\n"
    },
    {
      "commit": "daecce9bc5397d278cf86dbab752bc15ddb91b7c",
      "tree": "a3b4864e52c0b97167412ad8fb2d528988aac102",
      "parents": [
        "1fb004af6ec3634b29cd97406e17d4bb0a7d2236"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Fri Feb 05 08:26:38 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Feb 05 08:26:38 2016"
      },
      "message": "Add support for uint8, uint16 and uint32 in luci/gae\n\nThis has come up for like 3 models in DM so far, and I\u0027m tired of having this\nbe a stupid \"gotcha!\". I was working around it with some PropertyConverter, but\nwith this change it will just be obvious what the heck is going on.\n\nThey all map to positive int64 values (which should make indexes obvious), and\nthey include out-of-bounds checks on deserialization.\n\nI excluded uint64, since there\u0027s no way to properly encode it in the native\ndatastore representation which still makes any sense for indexes.\n\nI also added some (apparently?) missing documentation in PLS which explicitly\nlays out what field types are allowed in a pls-managed struct.\n\nR\u003ddnj@chromium.org, estaab@chromium.org, martiniss@chromium.org, vadimsh@chromium.org\nBUG\u003d550684\n\nReview URL: https://codereview.chromium.org/1667403003\n"
    },
    {
      "commit": "1fb004af6ec3634b29cd97406e17d4bb0a7d2236",
      "tree": "3295b2615c1d81bd3af7a037103c23e00bfae3b5",
      "parents": [
        "c955069ae2c75ada6bce5ea6942dd6d9e2ed8f0a"
      ],
      "author": {
        "name": "nishanths",
        "email": "nishanths@utexas.edu",
        "time": "Sat Jan 30 02:48:31 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Jan 30 02:48:31 2016"
      },
      "message": "Fixes #8: Seed indexes from index.yml\n\n- Add `ParseIndexYAML` and `FindAndParseIndexYAML` functions\n  to service/datastore\n- Add YAML marshalling and unmarshalling for IndexDefinition and IndexColumn\n- Add tests for the changes\n- Imports: additional package: gopkg.in/yaml.v2\n\nhttps://github.com/luci/gae/issues/8\n\nCloses #8\n\nR\u003ddnj@chromium.org, estaab@chromium.org, iannucci@chromium.org, vadimsh@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1574353004\n"
    },
    {
      "commit": "c955069ae2c75ada6bce5ea6942dd6d9e2ed8f0a",
      "tree": "73d85fcb9e2aa8e2b8bf873096233fbc69cf0621",
      "parents": [
        "ea770b89291efbda72378f5a313967aec98b6bd9"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Tue Jan 26 07:05:18 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Tue Jan 26 07:05:18 2016"
      },
      "message": "impl/prod: Expose Remote API scopes.\n\nR\u003diannucci@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1632943003\n"
    },
    {
      "commit": "ea770b89291efbda72378f5a313967aec98b6bd9",
      "tree": "afb1009c395a64b0837863bbf75467ecbd5c5321",
      "parents": [
        "fc6a3943c17800288641bf4391132d2f08a43f33"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Mon Jan 25 19:09:45 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Mon Jan 25 19:09:45 2016"
      },
      "message": "Add UseBackground.\n\nFixes #39.\n\nR\u003ddnj@chromium.org, estaab@chromium.org, martiniss@chromium.org, vadimsh@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1630833002\n"
    },
    {
      "commit": "fc6a3943c17800288641bf4391132d2f08a43f33",
      "tree": "74c4d8f35da8e0bb907588d5ba44b6436b07980e",
      "parents": [
        "7816a48be5324f7626c65cf4954ac4002b39479e"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sat Jan 23 10:03:12 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Jan 23 10:03:12 2016"
      },
      "message": "Add tool to generate PropertyConverter implementations for proto messages.\n\nR\u003ddnj@chromium.org, estaab@chromium.org, martiniss@chromium.org, vadimsh@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1625773002\n"
    },
    {
      "commit": "7816a48be5324f7626c65cf4954ac4002b39479e",
      "tree": "75752836bd8ed6b21498778a54abe03c636fdd1d",
      "parents": [
        "139eaf1a2be0c19e798c7c25bc40d24477c2f4e1"
      ],
      "author": {
        "name": "iannucci",
        "email": "iannucci@chromium.org",
        "time": "Sat Jan 23 06:12:03 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Jan 23 06:12:03 2016"
      },
      "message": "Fix logger for filter api change in luci-go.\n\nAPI change will occur: https://chromiumcodereview.appspot.com/1622553005/\n\nR\u003ddnj@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1621993003\n"
    },
    {
      "commit": "139eaf1a2be0c19e798c7c25bc40d24477c2f4e1",
      "tree": "29b6ee190bbac51f0035599e3df9ea90b6f46904",
      "parents": [
        "3ca84d6723827aa1d5d0e68a683fb77cd1ef97d9"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Sat Jan 23 00:51:00 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Sat Jan 23 00:51:00 2016"
      },
      "message": "Fix fast string comparison bug.\n\nR\u003diannucci@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1620873004\n"
    },
    {
      "commit": "3ca84d6723827aa1d5d0e68a683fb77cd1ef97d9",
      "tree": "21f4bdee7a437ae5d87386396b9093983982486a",
      "parents": [
        "273b8ea01f0d03bd19cd4c14a9b1ba790d125306"
      ],
      "author": {
        "name": "dnj",
        "email": "dnj@chromium.org",
        "time": "Fri Jan 22 00:54:52 2016"
      },
      "committer": {
        "name": "Commit bot",
        "email": "commit-bot@chromium.org",
        "time": "Fri Jan 22 00:54:52 2016"
      },
      "message": "Add a test to ensure []byte \u003d\u003e BlobKey PLS works.\n\nR\u003diannucci@chromium.org\nBUG\u003d\n\nReview URL: https://codereview.chromium.org/1616033004\n"
    }
  ],
  "next": "273b8ea01f0d03bd19cd4c14a9b1ba790d125306"
}
