Change cookie, configuration and cache files to use appdir path.
Review Request #11423 — Created Jan. 31, 2021 and updated
We need to unify the locations that store cookie, config and cache files for the later releases.
Copy any legacy cookie files to the new appdir path and create new cookie file at the new appdir path if no legacy cookie files exist.
Write a test for generate configuration file in appdir path and pass it.
Write a test for create_cookie_jar and pass it.
Summary | ID |
---|---|
7f8b6b99a8c39662a0d8831d449db3ca1945d162 | |
ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd | |
a5e2d448a613cffa1009674cdb1061cbbdcebf3b | |
f60f00f2d313b018825cca518633066896a2681a | |
b05575d3c99615d649bd3f4adc3dfb32e93402be | |
f5aa5eccc8ead51240a5f139a3248960e4c5cec2 | |
71c31506c3165d238d0eaa168ef1f4c17a5a7445 | |
6d57058e179ec636a8a3ac508c5a00807cdbc8f6 | |
552de386b0667a0db8020d88564844264d00f168 | |
d421c909bd01da48e004a11d0056481eb3e802f1 | |
a3295f5bad2cfc260341c06cf0945e05ec86733c | |
1fc9a6a01a54b98e09b3bde248b48c5175f051dc | |
8e48a26470284962daeb30e17a53dced2f2f189c | |
e7398999263160ee91f0500b8de28aab6b471b39 | |
0168f862bbbb32c1b146c1d3e09bd8d37c9c0089 | |
0892802e729248ba08535faeb3929a8184971da6 | |
08026e1c29d6ee12bb02308c659d48e4f0e8f598 | |
4b9d557452913202b6a589b82176cf0991cd8bfb |
Description | From | Last Updated |
---|---|---|
Your summary and description need some work. See https://www.notion.so/reviewboard/Writing-Good-Change-Descriptions-10529e7c207743fa8ca90153d4b21fea for our guide on how to write these. |
david | |
W291 trailing whitespace |
reviewbot | |
W291 trailing whitespace |
reviewbot | |
E303 too many blank lines (2) |
reviewbot | |
W291 trailing whitespace |
reviewbot | |
W293 blank line contains whitespace |
reviewbot | |
E122 continuation line missing indentation or outdented |
reviewbot | |
W291 trailing whitespace |
reviewbot | |
E501 line too long (80 > 79 characters) |
reviewbot | |
W291 trailing whitespace |
reviewbot | |
E127 continuation line over-indented for visual indent |
reviewbot | |
W291 trailing whitespace |
reviewbot | |
W293 blank line contains whitespace |
reviewbot | |
E127 continuation line over-indented for visual indent |
reviewbot | |
W291 trailing whitespace |
reviewbot | |
F841 local variable 'original_cookie' is assigned to but never used |
reviewbot | |
This kind of comment isn't particularly useful because it can get out of date quickly. It's better to give a … |
david | |
I'm thinking if it might be a lot simpler to have a list of legacy paths, which would include the … |
david | |
We don't use strings-as-comments like this. |
david | |
Comments should start with capital letters and end in periods. |
david | |
These imports are all out of order. It wasn't correct before but now it's worse. There should be three sections: … |
david | |
Comments should start with capital letters and end in periods. |
david | |
This should probably say appdirs_path rather than XDG. XDG applies to Linux but appdirs supports windows/mac too. |
david | |
Comments should start with capital letters and end in periods. |
david | |
Comments should start with capital letters and end in periods. |
david | |
Comments should start with capital letters and end in periods. |
david | |
I'm not really sure what this means. We're not doing anything with repos. |
david | |
This new line should be removed. |
david | |
In this case, we don't want to change it. setup-repo generates a .reviewboardrc file that users should add to their … |
david | |
Why this change? appdirs is a third-party module that we just happen to bundle. |
david | |
This shouldn't be needed. |
david | |
This should happen adjancent to the check for the one in the home path. The ones from walk_parents need to … |
david | |
E501 line too long (80 > 79 characters) |
reviewbot | |
F401 'rbtools.utils.appdirs.user_config_dir' imported but unused |
reviewbot | |
E127 continuation line over-indented for visual indent |
reviewbot | |
W291 trailing whitespace |
reviewbot | |
appdirs should come before encoding in this list. |
david | |
There should be a space between the argument name and the type. Inside the parens, this should say (unicode, optional) … |
david | |
This should be: Returns: tuple: A 2-tuple with the following items: 1. A :py:class:`http.cookiejar.MozillaCookieJar` object that can load and save … |
david | |
For these, let's use a loop. If you recall our last meeting, someone mentioned Python's for/else syntax, which is perfect … |
david | |
As mentioned in my other comment, you need to be using appdir_cookie_file here (cookie_file will never have been defined if … |
david | |
Let's reword this a bit: If we didn't find any existing cookie files, create a new one. |
david | |
We may not be able to assume that the appdirs directory exists already (unlike $HOME, which we can). Let's do … |
david | |
This test is using files from the user's system. It therefore seems like different setups might yield different results. The … |
david | |
This still needs to be reverted. rbt setup-repo should write to a .reviewboardrc file in the current working directory, not … |
david | |
There should still be two blank lines here. |
david | |
Capitalize the first letter of this comment. |
david | |
Please use single quotes here instead of double. |
david | |
E999 SyntaxError: invalid syntax |
reviewbot | |
F401 'io' imported but unused |
reviewbot | |
F401 'mock' imported but unused |
reviewbot | |
F401 'sys' imported but unused |
reviewbot | |
F841 local variable 'cookie_file' is assigned to but never used |
reviewbot | |
F401 'rbtools.utils.appdirs.user_config_dir' imported but unused |
reviewbot | |
This extra blank line should be removed, because there are still some (extra) imports just below this. There are correctly … |
david | |
We should create temporary directories and use kgb to override get_home_path and user_cache_dir to return the paths to the temporary … |
david | |
This file should not be part of this change. |
david | |
Please remove this line. |
david | |
Please add a blank line between these two. |
david | |
Let's update this comment to say "Check for a config file in the home directory", since the appdirs file is … |
david |
- Change Summary:
-
Fix coding style problems.
- Description:
-
~ [WIP] Edit cookie creating and path checking. Pass the test for XDG config file.
~ [WIP] Edit cookie creation and path checking. Pass the test for XDG config file.
- Commits:
-
Summary ID 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b - Bugs:
-
- Diff:
Revision 2 (+214 -64)
- Change Summary:
-
Remove spaces from a new line.
- Commits:
-
Summary ID 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a
Checks run (2 succeeded)
- Change Summary:
-
Add a unit test to
create_cookie_jar
and pass the test. - Summary:
-
[WIP] Add XDG path to config file. Add XDG path to cookie file. Caches already in the right path so no changesAdd XDG path to config file. Add XDG path to cookie file. Caches already in the right path so no changes
- Description:
-
~ [WIP] Edit cookie creation and path checking. Pass the test for XDG config file.
~ Edit the default path for creating cookie, configuration files. Alse checked the path for storing cache, since it is using XDG path already so no need to change.
+ We need to unify the locations that store cookie, config and cache files for the later releases and we still want the users with older releases can stick to the original locations that store these files. - Commits:
-
Summary ID 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be
- Change Summary:
-
Fix trailing white space, over-indented problems.
- Summary:
-
Add XDG path to config file. Add XDG path to cookie file. Caches already in the right path so no changes[WIP] Add XDG path to config file. Add XDG path to cookie file. Caches already in the right path so no changes
- Commits:
-
Summary ID 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be f5aa5eccc8ead51240a5f139a3248960e4c5cec2
Checks run (2 succeeded)
- Description:
-
Edit the default path for creating cookie, configuration files. Alse checked the path for storing cache, since it is using XDG path already so no need to change.
~ We need to unify the locations that store cookie, config and cache files for the later releases and we still want the users with older releases can stick to the original locations that store these files. ~ We need to unify the locations that store cookie, config and cache files for the later releases and we still want the users with older releases can stick with the original locations that store these files.
-
-
This kind of comment isn't particularly useful because it can get out of date quickly. It's better to give a higher-level overview of what file locations we use and which we prefer.
While you're in here, mind updating this method docstring to include "Args" and "Returns" sections?
-
I'm thinking if it might be a lot simpler to have a list of legacy paths, which would include the old post-review-cookies file and the home path (assuming that the appdirs path is not just
$HOME/.rbtools-cookies
). If the appdirs path doesn't exist, we can then scan through the legacy paths and move their content if they exist. -
-
-
These imports are all out of order. It wasn't correct before but now it's worse.
There should be three sections: standard library, third-party modules, and then anything from rbtools. Within each section, we keep things alphabetized:
import os import six from kgb import SpyAgency from six.moves.urllib.parse import parse_qsl, urlparse from rbtools.api.request import HttpRequest, create_cookie_jar from rbtools.testing import TestCase from rbtools.utils.appdirs import user_cache_dir from rbtools.utils.filestystem import get_home_path
-
-
This should probably say
appdirs_path
rather than XDG. XDG applies to Linux but appdirs supports windows/mac too. -
-
-
-
-
-
In this case, we don't want to change it.
setup-repo
generates a .reviewboardrc file that users should add to their repository. It's separate from the .reviewboardrc in their home directory. That actually probably means most/all of your changes togenerate_config_file
should be reverted too. -
-
-
This should happen adjancent to the check for the one in the home path. The ones from
walk_parents
need to happen first.We might want to call this
appdirs_path
too. XDG applies to linux but appdirs will do the right thing for windows/mac too.
- Change Summary:
-
Fix all problems described in David's review comments.
- Summary:
-
[WIP] Add XDG path to config file. Add XDG path to cookie file. Caches already in the right path so no changesAdd appdir path to config file. Add appdir path to cookie file. Caches already in the right path so no changes
- Description:
-
~ Edit the default path for creating cookie, configuration files. Alse checked the path for storing cache, since it is using XDG path already so no need to change.
~ Edit the default path for creating cookie, configuration files. Alse checked the path for storing cache, since it is using appdir path already so no need to change.
We need to unify the locations that store cookie, config and cache files for the later releases and we still want the users with older releases can stick with the original locations that store these files. - Testing Done:
-
~ Write a test for generate configuration file in XDG path and pass it.
~ Write a test for generate configuration file in appdir path and pass it.
Use the XDG config path as input for
generate_config_file method
, then check whether there's a config file generated in that path. - Commits:
-
Summary ID 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be f5aa5eccc8ead51240a5f139a3248960e4c5cec2 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be f5aa5eccc8ead51240a5f139a3248960e4c5cec2 71c31506c3165d238d0eaa168ef1f4c17a5a7445 6d57058e179ec636a8a3ac508c5a00807cdbc8f6 552de386b0667a0db8020d88564844264d00f168 d421c909bd01da48e004a11d0056481eb3e802f1 a3295f5bad2cfc260341c06cf0945e05ec86733c 1fc9a6a01a54b98e09b3bde248b48c5175f051dc
- Change Summary:
-
Fix coding style problems.
- Commits:
-
Summary ID 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be f5aa5eccc8ead51240a5f139a3248960e4c5cec2 71c31506c3165d238d0eaa168ef1f4c17a5a7445 6d57058e179ec636a8a3ac508c5a00807cdbc8f6 552de386b0667a0db8020d88564844264d00f168 d421c909bd01da48e004a11d0056481eb3e802f1 a3295f5bad2cfc260341c06cf0945e05ec86733c 1fc9a6a01a54b98e09b3bde248b48c5175f051dc 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be f5aa5eccc8ead51240a5f139a3248960e4c5cec2 71c31506c3165d238d0eaa168ef1f4c17a5a7445 6d57058e179ec636a8a3ac508c5a00807cdbc8f6 552de386b0667a0db8020d88564844264d00f168 d421c909bd01da48e004a11d0056481eb3e802f1 a3295f5bad2cfc260341c06cf0945e05ec86733c 1fc9a6a01a54b98e09b3bde248b48c5175f051dc 8e48a26470284962daeb30e17a53dced2f2f189c
- Change Summary:
-
Fix extra white space.
- Commits:
-
Summary ID 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be f5aa5eccc8ead51240a5f139a3248960e4c5cec2 71c31506c3165d238d0eaa168ef1f4c17a5a7445 6d57058e179ec636a8a3ac508c5a00807cdbc8f6 552de386b0667a0db8020d88564844264d00f168 d421c909bd01da48e004a11d0056481eb3e802f1 a3295f5bad2cfc260341c06cf0945e05ec86733c 1fc9a6a01a54b98e09b3bde248b48c5175f051dc 8e48a26470284962daeb30e17a53dced2f2f189c 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be f5aa5eccc8ead51240a5f139a3248960e4c5cec2 71c31506c3165d238d0eaa168ef1f4c17a5a7445 6d57058e179ec636a8a3ac508c5a00807cdbc8f6 552de386b0667a0db8020d88564844264d00f168 d421c909bd01da48e004a11d0056481eb3e802f1 a3295f5bad2cfc260341c06cf0945e05ec86733c 1fc9a6a01a54b98e09b3bde248b48c5175f051dc 8e48a26470284962daeb30e17a53dced2f2f189c e7398999263160ee91f0500b8de28aab6b471b39
Checks run (2 succeeded)
-
Since you took the "WIP" tag off of the summary, I'm going to start being more nitpicky from here on out.
-
Your summary and description need some work. See https://www.notion.so/reviewboard/Writing-Good-Change-Descriptions-10529e7c207743fa8ca90153d4b21fea for our guide on how to write these.
-
-
There should be a space between the argument name and the type. Inside the parens, this should say
(unicode, optional)
This also needs a colon at the end of the line.
-
This should be:
Returns: tuple: A 2-tuple with the following items: 1. A :py:class:`http.cookiejar.MozillaCookieJar` object that can load and save cookies to disk. 2. The path to the cookie file.
-
For these, let's use a loop. If you recall our last meeting, someone mentioned Python's
for/else
syntax, which is perfect here:for path in legacy_list: if os.path.isfile(path): try: shutil.copyfile(path, appdir_cookie_file) os.chmod(appdir_cookie_file, 0o600) except IOError as e: logging.warning(...) else: try: open(appdir_cookie_file, 'w').close() ...
-
As mentioned in my other comment, you need to be using
appdir_cookie_file
here (cookie_file
will never have been defined if we get to this part of the code).Given this and my comment about your unit tests, your existing test cases aren't going through this code path. We should both fix up the tests to generate situations whereby this code will be executed and verified, and also do manual testing for this situation.
-
-
We may not be able to assume that the appdirs directory exists already (unlike $HOME, which we can). Let's do this first:
try: os.makedirs(os.path.dirname(appdir_cookie_file), 0o700) except OSError: pass
-
This test is using files from the user's system. It therefore seems like different setups might yield different results.
The tests should be completely isolated from the system. We should be creating new directories with test cookie file data, and then using kgb to override appdirs methods to point the code to the fake data.
-
This still needs to be reverted.
rbt setup-repo
should write to a .reviewboardrc file in the current working directory, not the user's personal config dir. -
-
-
- Change Summary:
-
Finish unit test for create_cookie_jar function. Fix coding style problems.
- Summary:
-
Add appdir path to config file. Add appdir path to cookie file. Caches already in the right path so no changesChange cookie, configuration and cache files to use appdir path.
- Description:
-
~ Edit the default path for creating cookie, configuration files. Alse checked the path for storing cache, since it is using appdir path already so no need to change.
~ We need to unify the locations that store cookie, config and cache files for the later releases and we still want the users with older releases can stick with the original locations that store these files. ~ We need to unify the locations that store cookie, config and cache files for the later releases.
~ Copy any legacy cookie files to the new appdir path and create new cookie file at the new appdir path if no legacy cookie files exist. - Commits:
-
Summary ID 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be f5aa5eccc8ead51240a5f139a3248960e4c5cec2 71c31506c3165d238d0eaa168ef1f4c17a5a7445 6d57058e179ec636a8a3ac508c5a00807cdbc8f6 552de386b0667a0db8020d88564844264d00f168 d421c909bd01da48e004a11d0056481eb3e802f1 a3295f5bad2cfc260341c06cf0945e05ec86733c 1fc9a6a01a54b98e09b3bde248b48c5175f051dc 8e48a26470284962daeb30e17a53dced2f2f189c e7398999263160ee91f0500b8de28aab6b471b39 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be f5aa5eccc8ead51240a5f139a3248960e4c5cec2 71c31506c3165d238d0eaa168ef1f4c17a5a7445 6d57058e179ec636a8a3ac508c5a00807cdbc8f6 552de386b0667a0db8020d88564844264d00f168 d421c909bd01da48e004a11d0056481eb3e802f1 a3295f5bad2cfc260341c06cf0945e05ec86733c 1fc9a6a01a54b98e09b3bde248b48c5175f051dc 8e48a26470284962daeb30e17a53dced2f2f189c e7398999263160ee91f0500b8de28aab6b471b39 0168f862bbbb32c1b146c1d3e09bd8d37c9c0089 0892802e729248ba08535faeb3929a8184971da6
Checks run (1 failed, 1 succeeded)
flake8
- Change Summary:
-
Fix coding style problems and remove unused libraries and variables.
- Commits:
-
Summary ID 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be f5aa5eccc8ead51240a5f139a3248960e4c5cec2 71c31506c3165d238d0eaa168ef1f4c17a5a7445 6d57058e179ec636a8a3ac508c5a00807cdbc8f6 552de386b0667a0db8020d88564844264d00f168 d421c909bd01da48e004a11d0056481eb3e802f1 a3295f5bad2cfc260341c06cf0945e05ec86733c 1fc9a6a01a54b98e09b3bde248b48c5175f051dc 8e48a26470284962daeb30e17a53dced2f2f189c e7398999263160ee91f0500b8de28aab6b471b39 0168f862bbbb32c1b146c1d3e09bd8d37c9c0089 0892802e729248ba08535faeb3929a8184971da6 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be f5aa5eccc8ead51240a5f139a3248960e4c5cec2 71c31506c3165d238d0eaa168ef1f4c17a5a7445 6d57058e179ec636a8a3ac508c5a00807cdbc8f6 552de386b0667a0db8020d88564844264d00f168 d421c909bd01da48e004a11d0056481eb3e802f1 a3295f5bad2cfc260341c06cf0945e05ec86733c 1fc9a6a01a54b98e09b3bde248b48c5175f051dc 8e48a26470284962daeb30e17a53dced2f2f189c e7398999263160ee91f0500b8de28aab6b471b39 0168f862bbbb32c1b146c1d3e09bd8d37c9c0089 0892802e729248ba08535faeb3929a8184971da6 08026e1c29d6ee12bb02308c659d48e4f0e8f598
Checks run (2 succeeded)
-
-
This extra blank line should be removed, because there are still some (extra) imports just below this. There are correctly two blank lines between all the imports and the RBTOOLS_COOKIE_FILE definition.
-
We should create temporary directories and use kgb to override
get_home_path
anduser_cache_dir
to return the paths to the temporary directories. Right now it seems likely that this unit test will end up manipulating stuff in $HOME and ~/.config, which we really don't want. -
-
-
-
Let's update this comment to say "Check for a config file in the home directory", since the appdirs file is also the "user's own config"
- Change Summary:
-
Fix coding style problems. And the class of test_create_cookie_jar is inheriting from RBTestBase now, it will set the $HOME to a path like /var/folders/fr/yc_d5r_x16d38xjg9ydfpp480000gn/T/rbtools.12ezj6b_/ temporarily.
- Commits:
-
Summary ID 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be f5aa5eccc8ead51240a5f139a3248960e4c5cec2 71c31506c3165d238d0eaa168ef1f4c17a5a7445 6d57058e179ec636a8a3ac508c5a00807cdbc8f6 552de386b0667a0db8020d88564844264d00f168 d421c909bd01da48e004a11d0056481eb3e802f1 a3295f5bad2cfc260341c06cf0945e05ec86733c 1fc9a6a01a54b98e09b3bde248b48c5175f051dc 8e48a26470284962daeb30e17a53dced2f2f189c e7398999263160ee91f0500b8de28aab6b471b39 0168f862bbbb32c1b146c1d3e09bd8d37c9c0089 0892802e729248ba08535faeb3929a8184971da6 08026e1c29d6ee12bb02308c659d48e4f0e8f598 7f8b6b99a8c39662a0d8831d449db3ca1945d162 ec1cf8f0aa8ab5c81f42715270b0c2d4199331cd a5e2d448a613cffa1009674cdb1061cbbdcebf3b f60f00f2d313b018825cca518633066896a2681a b05575d3c99615d649bd3f4adc3dfb32e93402be f5aa5eccc8ead51240a5f139a3248960e4c5cec2 71c31506c3165d238d0eaa168ef1f4c17a5a7445 6d57058e179ec636a8a3ac508c5a00807cdbc8f6 552de386b0667a0db8020d88564844264d00f168 d421c909bd01da48e004a11d0056481eb3e802f1 a3295f5bad2cfc260341c06cf0945e05ec86733c 1fc9a6a01a54b98e09b3bde248b48c5175f051dc 8e48a26470284962daeb30e17a53dced2f2f189c e7398999263160ee91f0500b8de28aab6b471b39 0168f862bbbb32c1b146c1d3e09bd8d37c9c0089 0892802e729248ba08535faeb3929a8184971da6 08026e1c29d6ee12bb02308c659d48e4f0e8f598 4b9d557452913202b6a589b82176cf0991cd8bfb