|
|
Created:
3 years, 9 months ago by zakerinasab Modified:
3 years, 8 months ago CC:
chromium-reviews, dshwang, ajuma+watch-canvas_chromium.org, blink-reviews-html_chromium.org, Justin Novosad, haraken, dglazkov+blink, Rik, blink-reviews Target Ref:
refs/heads/master Project:
chromium Visibility:
Public. |
DescriptionPrepare ImageData for color managed BaseRenderingContext2D::create/put/get-ImageData
* createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas.
If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32.
* putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas.
This CL does half the job by adding required methods and the proper unit tests to ImageData.
BUG=704155, 706850
Review-Url: https://codereview.chromium.org/2771813003
Cr-Original-Commit-Position: refs/heads/master@{#461249}
Committed: https://chromium.googlesource.com/chromium/src/+/8befd9e691b73db52cc1d6edb6a99c1043a15b89
Review-Url: https://codereview.chromium.org/2771813003
Cr-Commit-Position: refs/heads/master@{#461758}
Committed: https://chromium.googlesource.com/chromium/src/+/c4df23d876fddc1f90b17aeaf4bad970239c6ecf
Patch Set 1 #Patch Set 2 : Work in progress #Patch Set 3 : Unit test added #
Total comments: 14
Patch Set 4 : Addressing comments #Patch Set 5 : Minor fixes #Patch Set 6 : Removing non-ImageData changes to break the CL to two #Patch Set 7 : Minor fixes #Patch Set 8 : Fixing some issues, turning on all test scenarios #Patch Set 9 : Minor corrections #
Total comments: 2
Patch Set 10 : Addressing comments #
Total comments: 4
Patch Set 11 : Fixing issues #
Messages
Total messages: 30 (15 generated)
Description was changed from ========== Fix BaseRenderingContext2D create/put/get-ImageData() for color managed canvas * createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas. If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32. * putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas. BUG=704155 ========== to ========== Fix BaseRenderingContext2D create/put/get-ImageData() for color managed canvas * createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas. If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32. * putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas. BUG=704155 ==========
zakerinasab@chromium.org changed reviewers: + junov@chromium.org
New CL uploaded. Still lacking some unit tests. PTAL.
https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... File third_party/WebKit/Source/core/html/ImageData.cpp (right): https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... third_party/WebKit/Source/core/html/ImageData.cpp:397: CanvasColorSpace ImageData::getCanvasColorSpace(const String& colorSpaceName) { In blink, don't use the "get" prefix in method names unless they need to perform non-trivial work. https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... third_party/WebKit/Source/core/html/ImageData.cpp:422: unsigned ImageData::getStorageFormatDataSize(const String& storageFormatName) { same here. https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... File third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp (right): https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp:1533: colorSettings.setColorSpace(renderingContext()->colorSpaceAsString()); Hmmm... so createImageData inherits the setting from the canvas context. That is an interesting Idea. Please add that to the feature proposal document. https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp:1564: LOG(ERROR) << renderingContext()->pixelFormatAsString(); I See a lot of error logging in this file that looks like debug traces. Please clean it up. https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... File third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h (right): https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h:248: virtual CanvasRenderingContext* renderingContext() const { return nullptr; } this should be private https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... File third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp (right): https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp:279: return (CanvasRenderingContext*)(this); please use static_cast https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... File third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp (right): https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp:257: return (CanvasRenderingContext*)(this); static_cast
Comments addressed. New unit test added for image data color conversion test, even though it does not run all the test cases due to crbug.com/706833 and crbug.com/706850. PTAL. https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... File third_party/WebKit/Source/core/html/ImageData.cpp (right): https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... third_party/WebKit/Source/core/html/ImageData.cpp:397: CanvasColorSpace ImageData::getCanvasColorSpace(const String& colorSpaceName) { On 2017/03/27 19:43:48, Justin Novosad wrote: > In blink, don't use the "get" prefix in method names unless they need to perform > non-trivial work. Done. https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... third_party/WebKit/Source/core/html/ImageData.cpp:422: unsigned ImageData::getStorageFormatDataSize(const String& storageFormatName) { On 2017/03/27 19:43:48, Justin Novosad wrote: > same here. Done. https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... File third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp (right): https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp:1533: colorSettings.setColorSpace(renderingContext()->colorSpaceAsString()); On 2017/03/27 19:43:48, Justin Novosad wrote: > Hmmm... so createImageData inherits the setting from the canvas context. That > is an interesting Idea. Please add that to the feature proposal document. I'll do. https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp:1564: LOG(ERROR) << renderingContext()->pixelFormatAsString(); On 2017/03/27 19:43:48, Justin Novosad wrote: > I See a lot of error logging in this file that looks like debug traces. Please > clean it up. This was a work in progress. Removed now. https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... File third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h (right): https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h:248: virtual CanvasRenderingContext* renderingContext() const { return nullptr; } On 2017/03/27 19:43:48, Justin Novosad wrote: > this should be private Done. https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... File third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp (right): https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp:279: return (CanvasRenderingContext*)(this); On 2017/03/27 19:43:48, Justin Novosad wrote: > please use static_cast Done. https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... File third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp (right): https://codereview.chromium.org/2771813003/diff/40001/third_party/WebKit/Sour... third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp:257: return (CanvasRenderingContext*)(this); On 2017/03/27 19:43:48, Justin Novosad wrote: > static_cast Done.
Description was changed from ========== Fix BaseRenderingContext2D create/put/get-ImageData() for color managed canvas * createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas. If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32. * putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas. BUG=704155 ========== to ========== Prepare ImageData for BaseRenderingContext2D::create/put/get-ImageData * createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas. If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32. * putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas. This CL does half the job by adding required methods and the proper unit tests to ImageData. BUG=704155 ==========
Description was changed from ========== Prepare ImageData for BaseRenderingContext2D::create/put/get-ImageData * createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas. If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32. * putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas. This CL does half the job by adding required methods and the proper unit tests to ImageData. BUG=704155 ========== to ========== Prepare ImageData for color managed BaseRenderingContext2D::create/put/get-ImageData * createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas. If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32. * putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas. This CL does half the job by adding required methods and the proper unit tests to ImageData. BUG=704155 ==========
Description was changed from ========== Prepare ImageData for color managed BaseRenderingContext2D::create/put/get-ImageData * createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas. If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32. * putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas. This CL does half the job by adding required methods and the proper unit tests to ImageData. BUG=704155 ========== to ========== Prepare ImageData for color managed BaseRenderingContext2D::create/put/get-ImageData * createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas. If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32. * putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas. This CL does half the job by adding required methods and the proper unit tests to ImageData. BUG=704155,706850 ==========
The last CL must be ready for review. I removed non-ImageData changes that are needed on BaseRenderingContext2D (along with CanvasRenderingContext2D and OffscreenCanvasRenderingContext2D). I will address them after fixing the base color conversion issue with canvas to make sure proper test coverage can be provided with the change.
lgtm with nit. https://codereview.chromium.org/2771813003/diff/160001/third_party/WebKit/Sou... File third_party/WebKit/Source/core/html/ImageData.cpp (right): https://codereview.chromium.org/2771813003/diff/160001/third_party/WebKit/Sou... third_party/WebKit/Source/core/html/ImageData.cpp:666: } Perhaps: else { NOTREACHED(); }
https://codereview.chromium.org/2771813003/diff/160001/third_party/WebKit/Sou... File third_party/WebKit/Source/core/html/ImageData.cpp (right): https://codereview.chromium.org/2771813003/diff/160001/third_party/WebKit/Sou... third_party/WebKit/Source/core/html/ImageData.cpp:666: } On 2017/03/31 20:20:19, Justin Novosad wrote: > Perhaps: else { NOTREACHED(); } Done.
The CQ bit was checked by zakerinasab@chromium.org
The patchset sent to the CQ was uploaded after l-g-t-m from junov@chromium.org Link to the patchset: https://codereview.chromium.org/2771813003/#ps180001 (title: "Addressing comments")
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
CQ is committing da patch. Bot data: {"patchset_id": 180001, "attempt_start_ts": 1490992335212240, "parent_rev": "a0b24ab6769b406319d70bffd462266032a49ebb", "commit_rev": "8befd9e691b73db52cc1d6edb6a99c1043a15b89"}
Message was sent while issue was closed.
Description was changed from ========== Prepare ImageData for color managed BaseRenderingContext2D::create/put/get-ImageData * createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas. If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32. * putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas. This CL does half the job by adding required methods and the proper unit tests to ImageData. BUG=704155,706850 ========== to ========== Prepare ImageData for color managed BaseRenderingContext2D::create/put/get-ImageData * createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas. If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32. * putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas. This CL does half the job by adding required methods and the proper unit tests to ImageData. BUG=704155,706850 Review-Url: https://codereview.chromium.org/2771813003 Cr-Commit-Position: refs/heads/master@{#461249} Committed: https://chromium.googlesource.com/chromium/src/+/8befd9e691b73db52cc1d6edb6a9... ==========
Message was sent while issue was closed.
Committed patchset #10 (id:180001) as https://chromium.googlesource.com/chromium/src/+/8befd9e691b73db52cc1d6edb6a9...
Message was sent while issue was closed.
Looks like there are some bot failures that refer to this code. E.g. https://build.chromium.org/p/chromium.fyi/builders/ClangToTLinuxASan%20tester... (which includes this commit for the first time) has: [ RUN ] ImageDataTest.TestConvertPixelsFromCanvasPixelFormatToImageDataStorageFormat [8855:8855:0401/012742.102071:47593233907:FATAL:TypedArrayBase.h(58)] Security DCHECK failed: index < TypedArrayBase<T>::m_length. #0 0x0000005eff21 __interceptor_backtrace #1 0x00000727cd8c base::debug::StackTrace::StackTrace() #2 0x0000072ba826 logging::LogMessage::~LogMessage() #3 0x000001a72c16 blink::(anonymous namespace)::ImageDataTest_TestConvertPixelsFromCanvasPixelFormatToImageDataStorageFormat_Test::TestBody() #4 0x00000750bb4d testing::Test::Run() #5 0x00000750d395 testing::TestInfo::Run() #6 0x00000750e4c7 testing::TestCase::Run() #7 0x0000075240f7 testing::internal::UnitTestImpl::RunAllTests() #8 0x000007523638 testing::UnitTest::Run() #9 0x000007461245 base::TestSuite::Run() #10 0x00000094c701 (anonymous namespace)::runHelper() #11 0x0000074644f2 base::(anonymous namespace)::LaunchUnitTestsInternal() #12 0x0000074640ff base::LaunchUnitTests() #13 0x00000094c54e main #14 0x7f5400ffdf45 __libc_start_main #15 0x0000005afb50 <unknown> [5477/5477] ImageDataTest.TestConvertPixelsFromCanvasPixelFormatToImageDataStorageFormat (CRASHED) 1 test crashed: ImageDataTest.TestConvertPixelsFromCanvasPixelFormatToImageDataStorageFormat (../../third_party/WebKit/Source/core/html/ImageDataTest.cpp:96) zakerinasab, would you mind taking a look at what's happening here?
Message was sent while issue was closed.
A revert of this CL (patchset #10 id:180001) has been created in https://codereview.chromium.org/2798523002/ by timloh@chromium.org. The reason for reverting is: TestConvertPixelsFromCanvasPixelFormatToImageDataStorageFormat crashing On WebKit Linux Trusty (dbg), has been flakily crashing (passing on retry) since it was added but now is crashing consistently. https://build.chromium.org/p/chromium.webkit/builders/WebKit%20Linux%20Trusty... Crashes more on the ClangToTLinuxASan/ClangToTMacASan fyi bots. https://test-results.appspot.com/dashboards/flakiness_dashboard.html#testType....
Message was sent while issue was closed.
tasak@google.com changed reviewers: + tasak@google.com
Message was sent while issue was closed.
FYI https://codereview.chromium.org/2771813003/diff/180001/third_party/WebKit/Sou... File third_party/WebKit/Source/core/html/ImageData.cpp (right): https://codereview.chromium.org/2771813003/diff/180001/third_party/WebKit/Sou... third_party/WebKit/Source/core/html/ImageData.cpp:513: numPixels = content.sizeInBytes(); I think, number of pixels = content.sizeInBytes() / 4, because 1 pixel = [R(8), G(8), B(8), A(8)]. https://codereview.chromium.org/2771813003/diff/180001/third_party/WebKit/Sou... third_party/WebKit/Source/core/html/ImageData.cpp:521: f32Array = allocateAndValidateFloat32Array(numPixels); I think, we need [R(float), G(float), B(float), A(float)] * numPixels. (I think, RGBA_F32 is the same as GL_RGBA32F. "F": Floating-point. Thus, GL_RGBA32F is a floating-point format where each component is a 32-bit IEEE floating-point value.) So f32Array = allocateAndValidateFloat32Array(numPixels * 4);?
Message was sent while issue was closed.
Description was changed from ========== Prepare ImageData for color managed BaseRenderingContext2D::create/put/get-ImageData * createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas. If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32. * putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas. This CL does half the job by adding required methods and the proper unit tests to ImageData. BUG=704155,706850 Review-Url: https://codereview.chromium.org/2771813003 Cr-Commit-Position: refs/heads/master@{#461249} Committed: https://chromium.googlesource.com/chromium/src/+/8befd9e691b73db52cc1d6edb6a9... ========== to ========== Prepare ImageData for color managed BaseRenderingContext2D::create/put/get-ImageData * createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas. If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32. * putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas. This CL does half the job by adding required methods and the proper unit tests to ImageData. BUG=704155,706850 Review-Url: https://codereview.chromium.org/2771813003 Cr-Commit-Position: refs/heads/master@{#461249} Committed: https://chromium.googlesource.com/chromium/src/+/8befd9e691b73db52cc1d6edb6a9... ==========
The CQ bit was checked by zakerinasab@chromium.org
The patchset sent to the CQ was uploaded after l-g-t-m from junov@chromium.org Link to the patchset: https://codereview.chromium.org/2771813003/#ps200001 (title: "Fixing issues")
https://codereview.chromium.org/2771813003/diff/180001/third_party/WebKit/Sou... File third_party/WebKit/Source/core/html/ImageData.cpp (right): https://codereview.chromium.org/2771813003/diff/180001/third_party/WebKit/Sou... third_party/WebKit/Source/core/html/ImageData.cpp:513: numPixels = content.sizeInBytes(); On 2017/04/04 06:30:15, tasak wrote: > I think, number of pixels = content.sizeInBytes() / 4, because 1 pixel = [R(8), > G(8), B(8), A(8)]. Good catch. Thanks. https://codereview.chromium.org/2771813003/diff/180001/third_party/WebKit/Sou... third_party/WebKit/Source/core/html/ImageData.cpp:521: f32Array = allocateAndValidateFloat32Array(numPixels); On 2017/04/04 06:30:15, tasak wrote: > I think, we need [R(float), G(float), B(float), A(float)] * numPixels. > (I think, RGBA_F32 is the same as GL_RGBA32F. "F": Floating-point. Thus, > GL_RGBA32F is a floating-point format where each component is a 32-bit IEEE > floating-point value.) > > So f32Array = allocateAndValidateFloat32Array(numPixels * 4);? Done.
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
I also did a through check to make sure this is not happening somewhere else. Hopefully, this one should not raise any issues.
CQ is committing da patch. Bot data: {"patchset_id": 200001, "attempt_start_ts": 1491323065881800, "parent_rev": "0d451b0dd7f92c5654c6032e578d62cc356ea346", "commit_rev": "c4df23d876fddc1f90b17aeaf4bad970239c6ecf"}
Message was sent while issue was closed.
Description was changed from ========== Prepare ImageData for color managed BaseRenderingContext2D::create/put/get-ImageData * createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas. If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32. * putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas. This CL does half the job by adding required methods and the proper unit tests to ImageData. BUG=704155,706850 Review-Url: https://codereview.chromium.org/2771813003 Cr-Commit-Position: refs/heads/master@{#461249} Committed: https://chromium.googlesource.com/chromium/src/+/8befd9e691b73db52cc1d6edb6a9... ========== to ========== Prepare ImageData for color managed BaseRenderingContext2D::create/put/get-ImageData * createImageData() and getImageData() must return an ImageData for which the color space and storage format matches those of canvas. If canvas pixel format is "float16", the storage format of the returned ImageData must be "float32". Values must be properly converted from float16 to float32. * putImageData must do the color conversion from the color space and storage format of given ImageData to the color space and matching pixel format of canvas prior to putting data into the canvas. This CL does half the job by adding required methods and the proper unit tests to ImageData. BUG=704155,706850 Review-Url: https://codereview.chromium.org/2771813003 Cr-Original-Commit-Position: refs/heads/master@{#461249} Committed: https://chromium.googlesource.com/chromium/src/+/8befd9e691b73db52cc1d6edb6a9... Review-Url: https://codereview.chromium.org/2771813003 Cr-Commit-Position: refs/heads/master@{#461758} Committed: https://chromium.googlesource.com/chromium/src/+/c4df23d876fddc1f90b17aeaf4ba... ==========
Message was sent while issue was closed.
Committed patchset #11 (id:200001) as https://chromium.googlesource.com/chromium/src/+/c4df23d876fddc1f90b17aeaf4ba... |