)]}'
{"swift/common/ring/ring.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"96bd178e85d42c09ee49eadd122decec9b19bd16","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    :param serialized_path: path to serialized RingData instance"},{"line_number":159,"context_line":"    :param reload_time: time interval in seconds to check for a ring change"},{"line_number":160,"context_line":"    :param ring_name: ring name string (basically specified from policy)"},{"line_number":161,"context_line":"    :param validation_hook: hook point to validate ring configuration ontime"},{"line_number":162,"context_line":"    \"\"\""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def __init__(self, serialized_path, reload_time\u003d15, ring_name\u003dNone,"}],"source_content_type":"text/x-python","patch_set":14,"id":"dab17558_e665fa1d","line":161,"updated":"2016-05-11 21:18:13.000000000","message":"Not exactly sure what docstring rules are, but do you want to add :raises RingLoadError: somewhere here?","commit_id":"b4fe89f22c1b2aabec16de225f9b7aaf70312875"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"2e0bebc892abaf3b89dbfe7e41fcbd5244cd7796","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    :param serialized_path: path to serialized RingData instance"},{"line_number":159,"context_line":"    :param reload_time: time interval in seconds to check for a ring change"},{"line_number":160,"context_line":"    :param ring_name: ring name string (basically specified from policy)"},{"line_number":161,"context_line":"    :param validation_hook: hook point to validate ring configuration ontime"},{"line_number":162,"context_line":"    \"\"\""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def __init__(self, serialized_path, reload_time\u003d15, ring_name\u003dNone,"}],"source_content_type":"text/x-python","patch_set":14,"id":"dab17558_625c4d19","line":161,"in_reply_to":"dab17558_e665fa1d","updated":"2016-05-12 03:32:31.000000000","message":"Good call, done.","commit_id":"b4fe89f22c1b2aabec16de225f9b7aaf70312875"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"96bd178e85d42c09ee49eadd122decec9b19bd16","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                if force:"},{"line_number":186,"context_line":"                    raise"},{"line_number":187,"context_line":"                else:"},{"line_number":188,"context_line":"                    # In on-time reload at working server, it\u0027s ok to use old"},{"line_number":189,"context_line":"                    # ring data if the new ring data is invalid."},{"line_number":190,"context_line":"                    return"},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"dab17558_e99dcbbc","line":188,"updated":"2016-05-11 21:18:13.000000000","message":"Did you mean \"runtime reload\"? The \"on-time\" something means \"accurately according to pre-set schedule\". Like a train arriving on time.","commit_id":"b4fe89f22c1b2aabec16de225f9b7aaf70312875"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"2e0bebc892abaf3b89dbfe7e41fcbd5244cd7796","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                if force:"},{"line_number":186,"context_line":"                    raise"},{"line_number":187,"context_line":"                else:"},{"line_number":188,"context_line":"                    # In on-time reload at working server, it\u0027s ok to use old"},{"line_number":189,"context_line":"                    # ring data if the new ring data is invalid."},{"line_number":190,"context_line":"                    return"},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"dab17558_02a46105","line":188,"in_reply_to":"dab17558_e99dcbbc","updated":"2016-05-12 03:32:31.000000000","message":"Oh, god. Will change as runtime, thanks :)","commit_id":"b4fe89f22c1b2aabec16de225f9b7aaf70312875"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"96bd178e85d42c09ee49eadd122decec9b19bd16","unresolved":false,"context_lines":[{"line_number":210,"context_line":"            self._rebuild_tier_data()"},{"line_number":211,"context_line":"            self._rebuild_handoff_info()"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def _rebuild_handoff_info(self):"},{"line_number":214,"context_line":"            # Do this now, when we know the data has changed, rather than"},{"line_number":215,"context_line":"            # doing it on every call to get_more_nodes()."},{"line_number":216,"context_line":"            #"}],"source_content_type":"text/x-python","patch_set":14,"id":"dab17558_466686ed","line":213,"updated":"2016-05-11 21:18:13.000000000","message":"The function _rebuild_handoff_info is not used anymore, and there aren\u0027t any new variables that need to get scoped, so it is not necessary to add it, right?","commit_id":"b4fe89f22c1b2aabec16de225f9b7aaf70312875"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"2e0bebc892abaf3b89dbfe7e41fcbd5244cd7796","unresolved":false,"context_lines":[{"line_number":210,"context_line":"            self._rebuild_tier_data()"},{"line_number":211,"context_line":"            self._rebuild_handoff_info()"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def _rebuild_handoff_info(self):"},{"line_number":214,"context_line":"            # Do this now, when we know the data has changed, rather than"},{"line_number":215,"context_line":"            # doing it on every call to get_more_nodes()."},{"line_number":216,"context_line":"            #"}],"source_content_type":"text/x-python","patch_set":14,"id":"dab17558_a287555f","line":213,"in_reply_to":"dab17558_466686ed","updated":"2016-05-12 03:32:31.000000000","message":"Yeah, that\u0027s remaining since previous and I thought it may be used in later patch but exactly this is needn\u0027t right now. So will remove the change around here.","commit_id":"b4fe89f22c1b2aabec16de225f9b7aaf70312875"}],"swift/common/storage_policy.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"76dd9e0358e358db70d8766008f330b6a5d92028","unresolved":false,"context_lines":[{"line_number":589,"context_line":""},{"line_number":590,"context_line":"        self.object_ring \u003d Ring("},{"line_number":591,"context_line":"            swift_dir, ring_name\u003dself.ring_name,"},{"line_number":592,"context_line":"            validation_hook\u003dlambda ring: validate_ring_data(ring))"},{"line_number":593,"context_line":""},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"class StoragePolicyCollection(object):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_3b090485","line":592,"updated":"2016-04-27 22:15:04.000000000","message":"What does labmda do here? Why not  validation_hook\u003dvalidate_ring_data?","commit_id":"e2b262a4a9993d34ce31e586821201436ac8f762"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"59469179c3272322aedcb894a6c7336a19cb9b28","unresolved":false,"context_lines":[{"line_number":589,"context_line":""},{"line_number":590,"context_line":"        self.object_ring \u003d Ring("},{"line_number":591,"context_line":"            swift_dir, ring_name\u003dself.ring_name,"},{"line_number":592,"context_line":"            validation_hook\u003dlambda ring: validate_ring_data(ring))"},{"line_number":593,"context_line":""},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"class StoragePolicyCollection(object):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_798d3230","line":592,"in_reply_to":"1a122d0e_3b090485","updated":"2016-04-28 14:50:44.000000000","message":"Whoops, exactly.","commit_id":"e2b262a4a9993d34ce31e586821201436ac8f762"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"96bd178e85d42c09ee49eadd122decec9b19bd16","unresolved":false,"context_lines":[{"line_number":583,"context_line":"            if nodes_configured !\u003d (self.ec_ndata + self.ec_nparity):"},{"line_number":584,"context_line":"                raise RingLoadError("},{"line_number":585,"context_line":"                    \u0027EC ring for policy %s needs to be configured with \u0027"},{"line_number":586,"context_line":"                    \u0027exactly %d nodes. Got %d.\u0027 % ("},{"line_number":587,"context_line":"                        self.name, self.ec_ndata + self.ec_nparity,"},{"line_number":588,"context_line":"                        nodes_configured))"},{"line_number":589,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"dab17558_e9eb0b11","line":586,"updated":"2016-05-11 21:18:13.000000000","message":"This looks like a number of devices, not nodes. Although I suppose it\u0027s a good practice to spread devices across nodes for reliability, so it is a number of nodes in a sensible cluster...","commit_id":"b4fe89f22c1b2aabec16de225f9b7aaf70312875"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"7a6d87da5972e4a436fca08aea4a69cd558d4ebd","unresolved":false,"context_lines":[{"line_number":583,"context_line":"            if nodes_configured !\u003d (self.ec_ndata + self.ec_nparity):"},{"line_number":584,"context_line":"                raise RingLoadError("},{"line_number":585,"context_line":"                    \u0027EC ring for policy %s needs to be configured with \u0027"},{"line_number":586,"context_line":"                    \u0027exactly %d nodes. Got %d.\u0027 % ("},{"line_number":587,"context_line":"                        self.name, self.ec_ndata + self.ec_nparity,"},{"line_number":588,"context_line":"                        nodes_configured))"},{"line_number":589,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"dab17558_a0090d97","line":586,"in_reply_to":"dab17558_829e9160","updated":"2016-05-12 03:48:35.000000000","message":"\"replicas\" sounds good to me here, even in case of EC rings. I just don\u0027t want a confusion with nodes.","commit_id":"b4fe89f22c1b2aabec16de225f9b7aaf70312875"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"2e0bebc892abaf3b89dbfe7e41fcbd5244cd7796","unresolved":false,"context_lines":[{"line_number":583,"context_line":"            if nodes_configured !\u003d (self.ec_ndata + self.ec_nparity):"},{"line_number":584,"context_line":"                raise RingLoadError("},{"line_number":585,"context_line":"                    \u0027EC ring for policy %s needs to be configured with \u0027"},{"line_number":586,"context_line":"                    \u0027exactly %d nodes. Got %d.\u0027 % ("},{"line_number":587,"context_line":"                        self.name, self.ec_ndata + self.ec_nparity,"},{"line_number":588,"context_line":"                        nodes_configured))"},{"line_number":589,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"dab17558_829e9160","line":586,"in_reply_to":"dab17558_e9eb0b11","updated":"2016-05-12 03:32:31.000000000","message":"In the Swift context, I think we call each device as \"node\" (e.g. ring.get_nodes returns a list of \"nodes\") but maybe it is differ from what we\u0027d like to say here because this explanation is complicated to know if this means what number of nodes (whole number of nodes?).\n\nProbably, something like \"number of *replicas* configured\" is suitable for this, right?\n\nSo my suggestion for addressing for your comment is like:\n \"EC ring for policy %s needs to be configured with exactly %d replicas. Got %d.\"\n\nHow do you think of?","commit_id":"b4fe89f22c1b2aabec16de225f9b7aaf70312875"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"919df9b4a27b9047b545550931c85a0c86345177","unresolved":false,"context_lines":[{"line_number":587,"context_line":"            if nodes_configured !\u003d (self.ec_ndata + self.ec_nparity):"},{"line_number":588,"context_line":"                raise RingLoadError("},{"line_number":589,"context_line":"                    \u0027EC ring for policy %s needs to be configured with \u0027"},{"line_number":590,"context_line":"                    \u0027exactly %d replicas. Got %d.\u0027 % ("},{"line_number":591,"context_line":"                        self.name, self.ec_ndata + self.ec_nparity,"},{"line_number":592,"context_line":"                        nodes_configured))"},{"line_number":593,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"fa7ab95a_b85f660d","line":590,"range":{"start_line":590,"start_character":32,"end_line":590,"end_character":40},"updated":"2016-08-26 01:53:06.000000000","message":"nit: maybe better to keep the original \u0027nodes\u0027?","commit_id":"1eb96397e7a6f477ba31df85eda892769a8a182e"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"e2d04bc2061f77d76b54f50059bd36cc8d42c81b","unresolved":false,"context_lines":[{"line_number":587,"context_line":"            if nodes_configured !\u003d (self.ec_ndata + self.ec_nparity):"},{"line_number":588,"context_line":"                raise RingLoadError("},{"line_number":589,"context_line":"                    \u0027EC ring for policy %s needs to be configured with \u0027"},{"line_number":590,"context_line":"                    \u0027exactly %d replicas. Got %d.\u0027 % ("},{"line_number":591,"context_line":"                        self.name, self.ec_ndata + self.ec_nparity,"},{"line_number":592,"context_line":"                        nodes_configured))"},{"line_number":593,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"fa7ab95a_ad79d831","line":590,"range":{"start_line":590,"start_character":32,"end_line":590,"end_character":40},"in_reply_to":"fa7ab95a_b85f660d","updated":"2016-08-26 08:43:20.000000000","message":"That\u0027s from a Pete\u0027s comment. Please see our discussion at patch set 14 (same lines with here)","commit_id":"1eb96397e7a6f477ba31df85eda892769a8a182e"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"7b1a4001f37421aab258bd608a96cf24deb286dc","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            return func(*args, **kwargs)"},{"line_number":77,"context_line":"        except RingValidationError:"},{"line_number":78,"context_line":"            logger.error(\u0027Ring reload retry failed as ValidationError\u0027)"},{"line_number":79,"context_line":"            raise"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def safe_ring_operation_wrap(func):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7af24918_c3bf5aa8","line":79,"updated":"2016-03-03 14:29:58.000000000","message":"I don\u0027t really understand this. I don\u0027t see why func() will do anything different the second time. The logged messages implies there is an older ring being used, but where is that done?","commit_id":"71e7a23232148ae3913da43aeec85462bdebd790"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3466e65401028e78dd6d81cc81bd83deb40985fd","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            return func(*args, **kwargs)"},{"line_number":77,"context_line":"        except RingValidationError:"},{"line_number":78,"context_line":"            logger.error(\u0027Ring reload retry failed as ValidationError\u0027)"},{"line_number":79,"context_line":"            raise"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def safe_ring_operation_wrap(func):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7af24918_8f6a93b1","line":79,"in_reply_to":"7af24918_c3bf5aa8","updated":"2016-03-03 15:21:08.000000000","message":"Alright, I have to add/change docs like as \"try to continue with older one expecting it won\u0027t be reloaded again\" or more.(not sure I am able to write good English docs :/)\n\nThis safe_ring_operation wrapper designed to be called for the func includes swift.common.ring.Ring._reload operation.\n\nFor now, the ring reload operation is called as,\n\n1. update _rtime (which means next reload time and default\u003d15sec)\n2. validate RingData instance\n3. apply the RingData instance to Ring itself\n\nAnd safe_ring_operation expecting the validation error will happen at \"2. validate RingData\", so yes I thought we can assume the ring reload never happend if the reload time is long enough to call the func again.\n\nThat\u0027s why the retry (with nothing) will change the behavior with the previous call.","commit_id":"71e7a23232148ae3913da43aeec85462bdebd790"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"76dd9e0358e358db70d8766008f330b6a5d92028","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def safe_ring_operation(logger, func, *args, **kwargs):"},{"line_number":65,"context_line":"    \"\"\"Wrap up function for unsafe (ValidationErrorRasiable) operation"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    :param logger: swift logger to dump error/warn when invalid ring found"},{"line_number":68,"context_line":"    :param func: function (or method) which has unsafe ring operation inside"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_78738280","line":65,"updated":"2016-04-27 22:15:04.000000000","message":"What is ValidationErrorRasiable? Did you rename it to RingValidationError?","commit_id":"e2b262a4a9993d34ce31e586821201436ac8f762"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"59469179c3272322aedcb894a6c7336a19cb9b28","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def safe_ring_operation(logger, func, *args, **kwargs):"},{"line_number":65,"context_line":"    \"\"\"Wrap up function for unsafe (ValidationErrorRasiable) operation"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    :param logger: swift logger to dump error/warn when invalid ring found"},{"line_number":68,"context_line":"    :param func: function (or method) which has unsafe ring operation inside"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_d9b28605","line":65,"in_reply_to":"1a122d0e_78738280","updated":"2016-04-28 14:50:44.000000000","message":"Yeah, that\u0027s RingValidationError. I meant \"the operation which could raise RingValidationError\".","commit_id":"e2b262a4a9993d34ce31e586821201436ac8f762"}],"swift/proxy/server.py":[{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"7b1a4001f37421aab258bd608a96cf24deb286dc","unresolved":false,"context_lines":[{"line_number":411,"context_line":"                if old_authorize:"},{"line_number":412,"context_line":"                    req.environ[\u0027swift.authorize\u0027] \u003d old_authorize"},{"line_number":413,"context_line":"        except RingValidationError:"},{"line_number":414,"context_line":"            print \u0027ring validation error found\u0027"},{"line_number":415,"context_line":"            return HTTPServiceUnavailable(request\u003dreq)"},{"line_number":416,"context_line":"        except HTTPException as error_response:"},{"line_number":417,"context_line":"            return error_response"}],"source_content_type":"text/x-python","patch_set":7,"id":"7af24918_201a747d","line":414,"updated":"2016-03-03 14:29:58.000000000","message":"extraneous print statement left in","commit_id":"71e7a23232148ae3913da43aeec85462bdebd790"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"3466e65401028e78dd6d81cc81bd83deb40985fd","unresolved":false,"context_lines":[{"line_number":411,"context_line":"                if old_authorize:"},{"line_number":412,"context_line":"                    req.environ[\u0027swift.authorize\u0027] \u003d old_authorize"},{"line_number":413,"context_line":"        except RingValidationError:"},{"line_number":414,"context_line":"            print \u0027ring validation error found\u0027"},{"line_number":415,"context_line":"            return HTTPServiceUnavailable(request\u003dreq)"},{"line_number":416,"context_line":"        except HTTPException as error_response:"},{"line_number":417,"context_line":"            return error_response"}],"source_content_type":"text/x-python","patch_set":7,"id":"7af24918_f4c20ee8","line":414,"in_reply_to":"7af24918_201a747d","updated":"2016-03-03 15:21:08.000000000","message":"Oh, yeah. Obviously my mistaken. Will fix.","commit_id":"71e7a23232148ae3913da43aeec85462bdebd790"}],"test/unit/common/test_storage_policy.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"919df9b4a27b9047b545550931c85a0c86345177","unresolved":false,"context_lines":[{"line_number":1157,"context_line":""},{"line_number":1158,"context_line":"        def create_mock_ring_data(num_replica):"},{"line_number":1159,"context_line":"            class mock_ring_data_klass(object):"},{"line_number":1160,"context_line":"                def __init__(self):"},{"line_number":1161,"context_line":"                    self._replica2part2dev_id \u003d [0] * num_replica"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":"            return mock_ring_data_klass()"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa7ab95a_d8042ac8","line":1160,"updated":"2016-08-26 01:53:06.000000000","message":"nit: We could have the __init__ take num_replica and remove a layer of indirection.","commit_id":"1eb96397e7a6f477ba31df85eda892769a8a182e"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"e2d04bc2061f77d76b54f50059bd36cc8d42c81b","unresolved":false,"context_lines":[{"line_number":1157,"context_line":""},{"line_number":1158,"context_line":"        def create_mock_ring_data(num_replica):"},{"line_number":1159,"context_line":"            class mock_ring_data_klass(object):"},{"line_number":1160,"context_line":"                def __init__(self):"},{"line_number":1161,"context_line":"                    self._replica2part2dev_id \u003d [0] * num_replica"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":"            return mock_ring_data_klass()"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa7ab95a_8d541455","line":1160,"in_reply_to":"fa7ab95a_d8042ac8","updated":"2016-08-26 08:43:20.000000000","message":"ah, yeah. that is. good catch. if we need to update for something significant, I will fix to remove the layer. thanks!","commit_id":"1eb96397e7a6f477ba31df85eda892769a8a182e"}]}
