-
Bug
-
Resolution: Unresolved
-
P4
-
8, 17, 21, 24, 25, 26
-
generic
-
generic
ADDITIONAL SYSTEM INFORMATION :
openjdk version "21.0.8" 2025-07-15 LTS
OpenJDK Runtime Environment Temurin-21.0.8+9 (build 21.0.8+9-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.8+9 (build 21.0.8+9-LTS, mixed mode, sharing)
A DESCRIPTION OF THE PROBLEM :
Trying to convert CMYK image to RGB image using ColorConvertOp fails unexpectedly:
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
Funny enough, if I change the ColorConvertOp initialization (see "ColorConvertTest.java" case) like:
ColorConvertOp convertOp = new ColorConvertOp(
sourceModel.getColorSpace(),
ColorSpace.getInstance(ColorSpace.CS_sRGB), null);
the conversion succeeds.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Run: java ColorConvertTest.java
2. Observe the output
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Console output:
< cmyk.jpg: ColorModel: #pixelBits = 32 numComponents = 4 color space = com.sun.imageio.plugins.common.SimpleCMYKColorSpace@7a92922 transparency = 1 has alpha = false isAlphaPre = false
> rgb.png
and an "rgb.png" file saved in the current directory.
ACTUAL -
Console output:
< cmyk.jpg: ColorModel: #pixelBits = 32 numComponents = 4 color space = com.sun.imageio.plugins.common.SimpleCMYKColorSpace@3d51f06e transparency = 1 has alpha = false isAlphaPre = false
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at java.desktop/java.awt.image.ComponentColorModel.getNormalizedComponents(ComponentColorModel.java:2343)
at java.desktop/java.awt.image.ColorConvertOp.nonICCBIFilter(ColorConvertOp.java:814)
at java.desktop/java.awt.image.ColorConvertOp.filter(ColorConvertOp.java:275)
at ColorConvertTest.main(ColorConvertTest.java:23)
and no "rgb.png" result.
---------- BEGIN SOURCE ----------
-----"ColorConvertTest.java"
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Base64;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.ColorModel;
import javax.imageio.ImageIO;
public class ColorConvertTest {
public static void main(String[] args) throws Exception {
BufferedImage source = ImageIO.read(openStream("cmyk.jpg.base64.txt"));
ColorModel sourceModel = source.getColorModel();
System.out.append("< cmyk.jpg: ").println(sourceModel);
ColorConvertOp convertOp = new ColorConvertOp(
ColorSpace.getInstance(ColorSpace.CS_sRGB), null);
BufferedImage rgb = convertOp.filter(source, null);
ImageIO.write(rgb, "png", new File("rgb.png"));
System.out.println("> rgb.png");
}
private static ByteArrayInputStream openStream(String name) throws IOException {
try (InputStream input = ColorConvertTest.class.getResourceAsStream(name)) {
return new ByteArrayInputStream(Base64
.getMimeDecoder().decode(input.readAllBytes()));
}
}
}
-----"ColorConvertTest.java"--
-----"cmyk.jpg.base64.txt"
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
AAAAAAAP/9k=
-----"cmyk.jpg.base64.txt"--
---------- END SOURCE ----------
openjdk version "21.0.8" 2025-07-15 LTS
OpenJDK Runtime Environment Temurin-21.0.8+9 (build 21.0.8+9-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.8+9 (build 21.0.8+9-LTS, mixed mode, sharing)
A DESCRIPTION OF THE PROBLEM :
Trying to convert CMYK image to RGB image using ColorConvertOp fails unexpectedly:
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
Funny enough, if I change the ColorConvertOp initialization (see "ColorConvertTest.java" case) like:
ColorConvertOp convertOp = new ColorConvertOp(
sourceModel.getColorSpace(),
ColorSpace.getInstance(ColorSpace.CS_sRGB), null);
the conversion succeeds.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Run: java ColorConvertTest.java
2. Observe the output
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Console output:
< cmyk.jpg: ColorModel: #pixelBits = 32 numComponents = 4 color space = com.sun.imageio.plugins.common.SimpleCMYKColorSpace@7a92922 transparency = 1 has alpha = false isAlphaPre = false
> rgb.png
and an "rgb.png" file saved in the current directory.
ACTUAL -
Console output:
< cmyk.jpg: ColorModel: #pixelBits = 32 numComponents = 4 color space = com.sun.imageio.plugins.common.SimpleCMYKColorSpace@3d51f06e transparency = 1 has alpha = false isAlphaPre = false
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at java.desktop/java.awt.image.ComponentColorModel.getNormalizedComponents(ComponentColorModel.java:2343)
at java.desktop/java.awt.image.ColorConvertOp.nonICCBIFilter(ColorConvertOp.java:814)
at java.desktop/java.awt.image.ColorConvertOp.filter(ColorConvertOp.java:275)
at ColorConvertTest.main(ColorConvertTest.java:23)
and no "rgb.png" result.
---------- BEGIN SOURCE ----------
-----"ColorConvertTest.java"
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Base64;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.ColorModel;
import javax.imageio.ImageIO;
public class ColorConvertTest {
public static void main(String[] args) throws Exception {
BufferedImage source = ImageIO.read(openStream("cmyk.jpg.base64.txt"));
ColorModel sourceModel = source.getColorModel();
System.out.append("< cmyk.jpg: ").println(sourceModel);
ColorConvertOp convertOp = new ColorConvertOp(
ColorSpace.getInstance(ColorSpace.CS_sRGB), null);
BufferedImage rgb = convertOp.filter(source, null);
ImageIO.write(rgb, "png", new File("rgb.png"));
System.out.println("> rgb.png");
}
private static ByteArrayInputStream openStream(String name) throws IOException {
try (InputStream input = ColorConvertTest.class.getResourceAsStream(name)) {
return new ByteArrayInputStream(Base64
.getMimeDecoder().decode(input.readAllBytes()));
}
}
}
-----"ColorConvertTest.java"--
-----"cmyk.jpg.base64.txt"
/9j/4AAQSkZJRgABAQIAJQAlAAD/7gAOQWRvYmUAZAAAAAAA/9sAQwADAgICAgIDAgICAwMDAwQG
BAQEBAQIBgYFBgkICgoJCAkJCgwPDAoLDgsJCQ0RDQ4PEBAREAoMEhMSEBMPEBAQ/8AAFAgBAAEA
BEMRAE0RAFkRAEsRAP/EAB4AAQACAwEAAwEAAAAAAAAAAAAICQUHCgYBAwQC/8QAQRAAAQMDAwIF
AQUECQMEAwAAAAECAwQFBgcIERIhCRMxQVFhFCJCcYEjMpGhFSQ0Q1JicpOiJVOSFnODo1SCsf/a
AA4EQwBNAFkASwAAPwC1MtTLUy1MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAxOU5biuDWOpybNMktlitFG3qqK641bKaCJP8z3qjU/iACFWsHjA7Z8Alntun9FfNQrhEqtSSgi
+x0HUnqizzIj17/iZE9q+qL8gCKGb+NVr/eJZI8E04wvG6Zy/dWrSouNQxP9fXHGv6xgA1VcvFY3
v10ivpdVKC3NX0ZTY5bnIn+7C9f5gAW3xWN79DIj6rVSguLU9WVOOW5qL/tQsX+YANq4R41Wv9nl
jjzvTfC8kpmr95aRKi3VD0/19csafpGACV+kHjBbZs+lht2oFHfNPa+XhqyV8P2yg6l9kngRXp39
3xManuvwAJp4nmOJZ5Y6fJ8Iya13+0VScwV1tq46mCT5RHsVU5T3TnlAAZgAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAEDd4/ioafaGz12n+jMNDm2b06ugqalZFdarXKnZWyPYqLUSI
vZY43IiLyjnoqK0AFROsmvur+v8AkTsm1azq5X+pRzlp4ZpOmlpEX8MEDeI4k/0tTn35XuADX4AA
AAAAAAAAANgaN6+6v6AZCmS6S51crBUuc1Z4YZOumq0T8M8DuY5U/wBTV49uF7gAt12c+Kjp7rjU
UOn2s0FFhObT9MNPVJJ02q6Sr2Rsb3qq08jl9I3qqKvCNeqqjQATzAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAB8KqInKgAqS8RbxLK2+1d20C28XxYLPEr6PIMno5eH1rvSSmpHp+7Cndr5U7
v7o1UZysgArFAAAAAAAAAAAAAAAAAAABZz4dXiWVtgq7ToHuIvrqizzOZR2DJ6yXl9C5ezKare79
6FezWSqvMfZHKrOFjAFtyKipyi9gAfIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3PFe3sVWn
loftp0vvDoMivdKkmT11O/iSgoZE5bStcndsszV5d7tiVP8AuIrQBT0AAAAAAAAAAAAAAAAAAAAA
AAC4nwod68+otjj21am3Z02S2KlV+NV07+X3C3xp96mcq+ssLU5b7uiRf+2quAFj4AAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAANdbhtZ7Ft90aynVzIEbJDYKJ0lPTq7haqreqMp4E9/vyuY1VT0RVX0
QAHNvnGaZHqLmF5zzL7i+vvV/rZbhXVD/wAcsjlc7hPZqc8I1OyIiInZAAYQAAAAAAAAAAAAAAAA
AAAAAAAGdwPN8l01zOy5/h1yfQXqwVsVfRVDfwyxu5RFT8TV9HNXsrVVF7KADpJ2/ax2LX7RzFdW
8f6GQZBQMmnp2u6vstU3llRAq/LJWvbz78IvuADYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKpfG
v1rldV4Rt+tdWqRMjdlF4Y137zlV8FI1ePhEqXKi/wCJi+yAAqxAAAAAAAAAAAAAAAAAAAAAAAAA
AABaf4KGtcyVOb7frrWK6JY25RZ2Od+6qKyCrYnPzzTORqfEi+6gAtZAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAABzu+ILqDLqRvD1NvCzrJBbbw6xUyc8tZHQtbTL0/RXxPd+blX3ABHkAAAAAAAAAAAA
AAAAAAAAAAAAAAAEiPD41Bl033iaZXdJ1jgud4bYalOeGvZXNdTIjvoj5WO/NqKADogAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABy5Z1e5MlzbIcjmer5Lrdaute5fdZZnPVf+QAMIfnr7hQWqjluF0rq
ejpYG9Us9RK2ONjflznKiIn5gA05le9baZhUr4L/ALgsKSaJeJIqO5srZGL8K2n61RfpxyADws/i
fbGKebyJNdYldzxyzHrs9v8A5NpVT+YAM7YfEL2X5HK2K37gcdhc5URFr2VFC39VqI2IgAN0YjqH
gGoFItfgecY/klM1EVZrRc4axiIvy6JzkAB6AAAAAAAAA8/l+oeAafUiV+e5xj+N0zkVWzXe5w0b
FRPXh0rmoADS9+8QvZfjkrorhuBx2ZzVVFWgZUVzf0WnjeigAwUHifbGKibyI9dYkcq8cyY9dmN/
8nUqJ/MAHusT3rbTM1ljgsG4LClmlXiOKsubKKR6/CNqOhVX6ccgA3HQXCgutHFcLXXU9ZSzt6op
6eVskcjflrmqqKn5AzmB3uTGc4x3JIX9Elqu1JXMd8LFM16L/wAQfoB1GAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAGsdddyejO3DHkyHVvNaS0pM1y0dC3matrVT2hgby9/fhFdwjW8p1OQA5Xq+mloq6o
o52q2WCV8T0X1RzVVF/mhV/r94y+qmVT1Vl0Axekw21L1Mju1yjZWXORPZ7WLzBD2/CrZV90cgB9
BBTUPV/VTVq4rddTNQ8gyaoV3U1bncJJ2R/RjHL0xp9GoiAA8gAAAAAD9dpvF2sNwhu1iulXbq6n
d1Q1NJO6GWN3y17VRUX8lABLDRLxRt1ukM1PR3nLm59ZIlRH0OSos8yt9+mrTidHceivc9qf4V7g
As52w+JVt+3HzUmNVVc/CMyqVbGyy3mZvl1Mi/hpqnsyZVVURGuRkir6MX1ABLQiZuf8SnQDbfPV
4zTVr83zKmVY32SzzN8umkT8NVUqishVF5RWtR8iL6sT1ABWNrd4pG6zV+SeisuVswCyyK5GUWNd
UE/T7ddWqrMruPVWOY1f8KdgAROu14u1+uE12vl0q7jXVDuqapq53TSyL8ue5VVV/NQAfkAAAAAB
6/TzWDVTSW4pddM9Q8gxmoR3U5bZcJIGSfSRjV6ZE+jkVAffb6WWtr6ajp2q6WeZkTET1VznIifz
UE6tv/jK6q4pPTWXcBjVLmlq5Rj7tbo46K5xJ7uVjUSCbhPwo2JfdXKDqhBaDoXuT0Z3H48uQ6SZ
rSXZIWtWsoXcw1tEq+00DuHs78ojuFa7hely+oANnAAAAAAAAAAAAAAAAAAAAAAAAAEEd9/iX47t
7dW6WaPrRZBqKjVirKh/7SisSqn94idpahPaLnhq93+nQ4AUy55qBmuqGU1ubahZPcL/AHy4v66i
trZlkkd8NT2a1PRrWojWp2RETsAcz25PEJcC3B6kYdJCsbbVlNzghRfeFKl6xO/JWK1U/M8+Aa4A
AAAAAAAAABjsiyOw4jYq/J8ovFJarRa4H1VZW1cqRQwRNTlz3ud2REQx2RZHYcRsVfk+UXiktVot
cD6qsrauVIoYImpy573O7IiIB6d0Kbt7nimZhqzU3DTXb5cK3GsJRX01VeY+YbjeWei9K9nU0C+z
U4kcn7ytRVjSm7e54pmYas1Nw012+XCtxrCUV9NVXmPmG43lnovSvZ1NAvs1OJHJ+8rUVY0FguyP
xTMx0lqbfpruCuFbk2EqraemvMnVNcbO30TqXu6ogb7tXmRqfuq5ESNa+fXup8bI/FMzHSWpt+mu
4K4VuTYSqtp6a8ydU1xs7fROpe7qiBvu1eZGp+6rkRI1FyWO5HYcusVBk+L3ekutoukDKqiraSVJ
IZ4nJy17HJ2VFQFyWO5HYcusVBk+L3ekutoukDKqiraSVJIZ4nJy17HJ2VFQGRBkQAAAAAAADZG2
rEJc93C6bYfHCsjbrlVsgmRE9IftLFld+SRo9f0AB0wA9BgeoGbaX5TRZtp7k9wsF8tz+unraKVY
5G/LV9nNX0cxyK1ydlRU7AAua2I+Jhjm4R9FpZrAtFj2oitSKjqWKkdFfVRP7vlf2VQvvF6OXuxe
/Q0ATuAAAAAAAAAAAAAAAAAAAAAIE+Jfv2k0Csr9F9Jrq1NQ73TdddXQuRXWGjenZyfFRIi/cT1Y
37/ZVZyAKUKionqp5Kqqmkmmmeskkkjlc57lXlXKq91VV7qoAP4AKOPF70plwXdQ/OKamVluz+00
9ya9E4Z9rgalNOxPrxHC9f8A3QAQeAAAAAAAAB9VXV0tBSzV1dUxU9NTxulmmlejGRsanLnOcvZE
REVVVeyIh9VXV0tBSzV1dUxU9NTxulmmlejGRsanLnOcvZEREVVVeyIgBRn4iu/O67k8rqNNdOrl
PS6Y2OpVsfluVi32oYv9qlT18pFT9lGv+t33lRGUZ+Irvzuu5PK6jTXTq5T0umNjqVbH5blYt9qG
L/apU9fKRU/ZRr/rd95URgEKCFAAAJreHVvzuu2vK4NNtRLlPVaY3ypRsnWqvWxVD1/tUSevlKq/
tY09vvtTqRUeJreHVvzuu2vK4NNtRLlPVaY3ypRsnWqvWxVD1/tUSevlKq/tY09vvtTqRUeLzaSr
pa+lhrqGpiqKaojbLDNE9HskY5OWua5OyoqKioqdlQF5tJV0tfSw11DUxVFNURtlhmiej2SMcnLX
NcnZUVFRUVOyoD7QfaAAAAAATi8IPSqXOd1Dc5qKVX27ALTUXF0ipyz7XO1aaBi/Xpkmen/tfQAF
4wAAP7p6ieknjqqWeSGaF6SRyRuVrmOReUcip3RUXuioAC6/w0d+z9frIzRfVm6NXUOyUyuoa6Vy
It+o2J3cvzURon309Xt+/wB+H8ACewAAAAAAAAAAAAAAAABqHdbuGsW2HRK/aqXdsU9ZTsSks1DI
7j7dcZEVIYu3fp7Oe/jujI3qnoADnOzPMcl1Cyy7ZxmF2mud7vlXJW11XMvLpZXryq/CJ7IidkRE
RERERAAYYAAAhl4qu32XWjbVU5XY6Hz8h05lffaZGN5kkoenitiT/wCNGy/KrTonuACiQAAAAAAA
AFa3i9bt6jDcbg2yYJdHRXbJKZKvKJ4X8OgtzlVI6TlPR0yornp2Xy2oi8tlK1vF63b1GG43Btkw
S6Oiu2SUyVeUTwv4dBbnKqR0nKejplRXPTsvltRF5bKAVAFQAAAAAAALfvCF3bVGZY3UbZM7ubpb
tjdMtXjE8z+XT25qoklLyvqsKqisT18tyoiIkQLfvCF3bVGZY3UbZM7ubpbtjdMtXjE8z+XT25qo
klLyvqsKqisT18tyoiIkQLKgWVAAAAAAF7nhWbfZtFttVLlV8ofIyHUaVl9qke3h8dF08UUS/wDx
q6Xj1RahU9gATMAAAABmsLzLJdPMstOcYddprZe7HVx11DVRLw6KVi8ovwqeytXsqKqKioqoADoy
2rbgrHub0Rx/Va0Mip6qsjWlu9FG7n7FcYuEnh+eOVR7ee6sexV9QAbcAAAAAAAAAAAAAAAKUvGC
3AP1D11o9GrLXq+yaeU/TVMY77kt1naj5VXjsvlx+VGnPdrvNT3UAEBAAAAAD+JYop4nwTxMkjka
rHse1Fa5qpwqKi+qKgAOfvxB9p1Ztc1tq4rLQvTBsqfLcscnRq9ELVdzLRKv+KFzkRO6qsbo1Xuq
ogAi8AAAADBZ3mVj06wq/Z7ktR5Fqx23VFzrJO3KQwxq93Hyqo3hE91VEMFneZWPTrCr9nuS1HkW
rHbdUXOsk7cpDDGr3cfKqjeET3VUQA5pNYNT8i1o1PybVPKpVfc8luMtdK3qVzYWOXiOFqr36I40
ZG3/ACsQ5pNYNT8i1o1PybVPKpVfc8luMtdK3qVzYWOXiOFqr36I40ZG3/KxADx548AAAAAAHsNH
9T8h0X1PxnVPFZVbcsauMVdG3qVrZmNXiSFyp+CSNXxu/wAr1B7DR/U/IdF9T8Z1TxWVW3LGrjFX
Rt6la2ZjV4khcqfgkjV8bv8AK9QdLeC5lY9RMLsWe41Uefacit1Pc6KT3WGaNHt5T2Xh3Cp7KioD
pbwXMrHqJhdiz3Gqjz7TkVup7nRSe6wzRo9vKey8O4VPZUVAZ0GdAAJReHxtOrd0WtlJHeqCRcGx
SSK5ZHOrV6Jmo7mKiRf8Uzmqi+6RtkX1ROQB0BxRRQRMggjZHHG1GMYxERrWonCIiJ6IgAP7AAAA
AABP3wfdwMmn2uVbove7grLHqFAv2Nj3fciu0DVdGqc9k8yJJY193OSJPZAAXVgAAAAAAAAAAAAG
HzLKLbhGIXzNLw5W0FgttTdKpUXhUhgidI//AItUAHMTm+XXfP8AM79nV/l8y55Fcqm6VjueeZp5
XSP4+nLlABhQAAAAAADVu5Pbzg+5zSq56X5xCsbKj+sW64RsR01trWovl1EfPqqcqjm8p1Nc5q8c
8gA57NedCNQ9ueo9x0z1ItS0tfRr5lPURoq09fTKqoyogeqJ1Ru4X6oqK1yI5qogA14AACDHjBaq
y4NtciwegqfLrc+vMFukai8OWig/rEyovx1xwMX5SRUIMeMFqrLg21yLB6Cp8utz68wW6RqLw5aK
D+sTKi/HXHAxflJFQAo+KPgAAAAAAAAAAXheD9qrLnW1uTCK+p8ytwG8z26Nqry77FPxUQqv065J
2J8JGiAvC8H7VWXOtrcmEV9T5lbgN5nt0bVXl32KfiohVfp1yTsT4SNEBOYE5jYegug+oe43Ui3a
Z6b2pamvrF8ypqZEVKegpkVEfUTvRPuxt5T6qqo1qK5yIoA6E9tu3nBtselVs0vwaFXx0/8AWLjc
JGI2a5VrkTzKiTj3XhEa3lUa1rWp6cgA2kAAAAAAAADN4Pl930/zSw53YJfLueO3OmutG7nhEmgl
bIzn6ctTkAHTrh2T23N8RseZ2dyuoL/baa6UqqvKrDPE2Rnp/lcgAMwAAAAAAAAAAARp8SHLp8N2
V6m3Clm8uevoKe0M793Nq6qGnkb/ALUkn6cgA57QAAAAAAAAAADT+5ra3pdupwR2GaiW50dTTK6W
03ilRqVltnVP3o3Kndq8Ij41+65ET0VGuaAKLd0mzXWPajkbqHOLQtdj1TKrLZkdDG51FWN/C1y/
3MvHrE/v2XpVzU6lAGiQU/eN3l0tZqtpvgfmqsdpx6pu/R8Oq6lYuf4URT943eXS1mq2m+B+aqx2
nHqm79Hw6rqVi5/hRAFbBWwAAAAAAAAAACyjwRMulo9VNSMD85fLu2P0138v5dSVPlcp+laCyjwR
Mulo9VNSMD85fLu2P0138v5dSVPlcp+lab22t7NdY912RtocHtC0GPU0qMueSV0bm0VG38TWr/fS
8ekTO/dOpWtXqS4AFwBejtk2taXbVcDZhunlvWSrqeiS73mpai1lznRP35HJ+6xOV6I0+61FX1VX
OcANwgAAAAAAAAAAAA6E/Dgy6fM9lemNwqpvMnobfUWh3K92tpKqanjb/txR/pwACSoAAAAAAAAA
ABCfxfal0Gzmtia5USoyK2RuRF9URz3cfxan8AAUXgAAAAAAAAAAAAGOyLHMfy6yVmNZTZKG72m4
xLBV0NdTtmgnjX1a9jkVrk/NAAV1bjfBrwTKpKrJNueUf+krhK5ZP6Cuz5J7Y5fiKZEdNAnPfhyS
p7IjUBSB4yNU+fdzSRP6uKbELdE3lfZZql3b9XKQb38+HJcd1+T02qWE6hx2nKqC1RWptuusSrb6
iGOSWRvEkbVkhd1TP5XpkRe3ZvqV1aw7LNzmhksz890kvTbdCq/9Vt0X2+hVqejlmh6msRU7oknS
76ICCxVRrDss3OaGSzPz3SS9Nt0Kr/1W3Rfb6FWp6OWaHqaxFTuiSdLvohpIA0kAAAAAAbr0h2Yb
m9cJoFwLSG+yUE6pxdLhAtDQI33ck8/Sx/Cd+GK53wigG69IdmG5vXCaBcC0hvslBOqcXS4QLQ0C
N93JPP0sfwnfhiud8IpYrty8GvB8Vnpcl3GZS3La6PiT+gLS6SC3Nd8Szr0zTp9GpEnsvUhOnwbq
p8G7iriZ1cVOH3GJ3C+yT0zu/wCrU/kC1fYN4cl02oZVU6p5tqJDdsnr7TLaX221wqlBTxSSRSO5
lkRJJndULOFRsaJ37OLFscxrHsPsdHjOJ2Ogs1ot8SQ0lDQ07IIIGJ+FjGIjWp+SF34JzGSAAAAA
AAAAAAAAABef4QNVLUbOaOKRyq2myO5xM7+jVWN//wDXqACbIAAAAAAAAAABDnxZ7HLdtleTVsbF
clnutqrncJ6NWqZDz/8AegAKHQAAAAAAAAAAAAAAAClTxo7JJQbn8cvKMXybphdJ95fRZI6ura5P
0asa/qACAQNd5vt00D1JlkqM80Zwy+VMnKuqqyyU76jv68TdPWn6OANd5vt00D1JlkqM80Zwy+VM
nKuqqyyU76jv68TdPWn6ONUXLw1NkF2kWWq0Gt7FX1Smu1xp0/hFUNRADVFy8NTZBdpFlqtBrexV
9UprtcadP4RVDUQ+bb4amyC0yJLS6DW96t9EqbtcahP4S1DkUA+bb4amyC0yJLS6DW96t9Eqbtca
hP4S1DkU2thG3XQTTaSOowPRnDLFUx8K2qo7JTsqO3pzN09a/q4A2thG3XQTTaSOowPRnDLFUx8K
2qo7JTsqO3pzN09a/q42IAbEBP7wW7JLXbnskvSsXybXhdVy5E7JJLWUjWov5tSRf0ABdUAAAAAA
AAAAAAAAAAXyeE1ZJbTsqxetkYrf6Yud1rW8p6tSrfDz/wDSACYgAAAAAAAAAABqXdpp9Lqnto1K
wSmg86ruOOVjqONE566qJizQJ+ssbAAc2IAAAAAAAAAAAAAAABWB43un0tTi+meqlNAvRbq6tsNZ
Iicp+3jbNAi/HH2ef/yABUsAAAAAAAAAAAW1eCHp9LS4rqZqnUwL0XGvorDSSKn/AOPG6adE+eft
EH/iACz4AAAAAAAAAAAAAAAA6T9p2n0ulm2rTXBKmDyau245RrWR8cdFVKxJZ0/3ZHgA2yAAAAAA
AAAAAAAc429TRWbQLcvm+AR0iwWv+kH3OzduGut9Svmwo356EcsSr/ijcADSAAAAAAAAAAAAAABo
jfDorLr5thzfArfSLUXhlF/StnY1OXurqVfNjY36yI10X5SqADnOVFRVRU4VPVAAAAAAAAAAiKqo
iJyqgA6MtkGismge2HCMBuFItPeHUP8ASl4Y5OHtrqpfOkY76x9TYvyiQAG9gAAAAAAAAAAAAADe
GyrRSbX3cvhOASUiz2pK9tzvPLeWtt9MqSzI74R6NSJF/wAUjQAdHAAAAAAAAAAAAAAABXv4vm2S
fUrSyh15xS3rNfcAjfHdWRs5fUWd7upzvlfIkVX/AAjJJlX0ABS+AAAAAAAAAAAAAAAAUI+Jltkm
2+bhK++WS3rFh+evlvVocxvEcE7nItVS/CdEjupqJ2SOWNPZQARFAAAAAAAJdeGZtkn3A7hKC/Xu
3LLh+AyRXq7ue3mOeoRyrSUvwvXIzqci9ljikRfVAAX3AAAAAAAAAAAAAAAAF0PhB7ZJtNdK67Xj
K7csN+z+NkdrZKzh9PZ2O6mu7908+REk+FZHC5PUAFg4AAAAAAAAAAAAAAB9NbR0lxo57fcKWKpp
aqJ0M8EzEfHLG5FRzXNXsqKiqiovZUUAFBPiC7NbptW1Skr8fopptO8onkqLDV8K5tI9eXPoJHez
4/wKv78fC8qqPRABFMAAAAAAAAAAAAAA03ux22Yxun0buumd9dFS1/8AbLJc3M6nW+vYi+XJ8qxU
VWPT3Y93HC8KgA539R9O8w0nze8ad57ZprXfbHUupaumkT0cndHNX0cxzVRzXJ2c1yKnZQAebAAA
PSacad5fqznFn06wOzy3O+32pbS0dPGnq5e6ucvo1jWornOXs1rVVeyAA6Idp+23GNrOjdq0ysLo
6qvT+uXu5tZ0uuFe9E8yX5RicIxiL6MY3nleVUAbjAAAAAAAAAAAAAAJWeHzs0um6nVKO4ZDRTRa
d4vPHUX6r4Vrat6cOZQRuT1fJ+NUX7kfK8ormcgC/ajo6S3UcFvt9LFTUtLG2GCGJiMZFG1OGta1
OyIiIiIieiIAD7gAAAAAAAAAAAAAAAADxmr+kWB656fXXTPUezMuVlu0XS9vZJYJE/cmifx9yRi9
2uT8l5RVRQBQhvC2Xak7SMydR3qGW74fcZnJZMiii4hqG+qRTInPlTonqxV4XhVaqpzwAI8gAAAA
AAAAAAAAAETt+GxLGd2mKtvthdS2fUey06stVzkTpirIkVXfZKpURVViqqq1/CqxyqqcormqAKKc
/wBPs00sy644JqDjtZY77aZVhqqOqZ0uavs5F9HscnCte1Va5FRUVUVFAPQYDp/meqOW27BNP8dr
L5fbtKkNJRUrOp7191VfRrUTlXPcqNaiKqqiIqnngC9bYdsRxnaXizr9f3Ut51HvdOjLpc2N6oqK
JeF+yUqqnKMRUTqf2WRyIq8IjWoAJZAAAAAAAAAAAAAAEhtnuy7UndvmTaOywS2jD7dM1L3kU0Sr
DTt7KsUPPaWdU9GJ2TlFcqJxyAL8NIdI8D0N0/tWmmnFlZbbLaYuhjfWSeRf35pX+r5Hr3c5ff04
RERAB7IAAAAAAAAAAAAAAAAAAAAAwma4TiWo2L3DC86x6hvljukSw1dDWRJJFK31TsvoqKiKjk4V
qoioqKiKACprdb4P+ZYvU1uZbY6p+R2VVdM/Gq2drbjSp6q2CV3Dahid+GuVsnHCftFXkAFct8sN
8xi7VVgySz11qudFIsVTRVtO+CeB6erXxvRHNX6KgAPwgAAAAAAAAAAAlDtg8O/cBuWqaS7QWSTE
cNmVrpMivNO5kckS+9LCvD6leOeFbxHynCvaaR3PbQdHd1uNNtOodnWC8Ucbm2u/0SIyuoVXvwju
OJI+fWN/LV5VU6XcOQC5nbDtA0d2pY0606e2d1ReKyNrbpf65Gvrq5U79KuROI4+e6Rs4anCKvU7
ly0zbn/Dv3AbaKiru89kky7DYVc6PIrPA57I4096qFOX0y8ccq7mPleEe4A3cReAAAAAAAAAAAB+
6x2G+ZPdqaw43Zq663OtkSKmo6KnfPPM9fRrI2IrnL9EQAFjG03wg8wyyejzTc5PLjdkRWzR4zST
Itxq09USokby2mYvblrVWThVRfLVOQAWzYVhGI6c4xQYXgmO0NjsdriSGkoaKJI4om+q9k9VVeVV
y8q5VVVVVVVABnAAAAAAAAAAAAAAAAAAAAAAAAAAADXGsO3TRLX22Ja9W9OLRkKMZ0Q1U0Sx1lOn
xFUxq2WNPo1yIvvyACDmqfgnaa3ieWu0g1ZvWNK7lyUF4pGXGDn2ayRjopGN+rvMUAEbsq8G7dfZ
JZFx+54RkUCL+zWluskEjk+rZ4mNRf8A9lT6gA8DP4WW+eGXy49F4p288dceS2lG/wDKpRf5AAzl
h8JHeheJWx3DEsdsbXLwr6+/072t/P7Osq/wRQAbz078EPKp5YqjVnW61UMTeFkpcet8lU56e6JP
P5aN/PynfkACaOiPhz7UtC5ae52bT5uSXunVHMu2SvSvma5PRzI1akEbkXujmRtcnyACTCIiJwic
IgAPk+FRFThU5RQARm1u8OfalrpLUXO8afNxu91Cq592xp6UEznL6ufGjVgkcq91c+NXL8gAhfqJ
4IeVU8stRpNrdaq6J3Kx0uQ2+SlcxPZFng81Hfn5TfyABoy/eEjvQs8ro7fiWO3xrV7PoL/Tsa78
vtCxL/FAAYODwst880vlyaLxQN5465MltKt/41Kr/IAHvsV8G7dfe5Y1yC54RjkCr+0Wqusk8jU+
jYIntVfp1In1ABJLSzwT9NbNPFXav6s3rJVbw5aCz0jLdBz7tfI90sj2/VvlqACcej23XRLQO2La
9JNOLPjyPZ0TVUMSyVdQnxLUyK6WRPo5yontwADYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAP/9k=
-----"cmyk.jpg.base64.txt"--
---------- END SOURCE ----------