From 6c66db550f74be80364ec3143bf515218d6812dd Mon Sep 17 00:00:00 2001 From: Igor Date: Tue, 12 May 2015 23:59:18 +0300 Subject: [PATCH 01/23] alpha channel support added --- src/rgbquant.js | 151 ++++++++++++++++++++++++++---------------------- 1 file changed, 83 insertions(+), 68 deletions(-) diff --git a/src/rgbquant.js b/src/rgbquant.js index bc0bd1b..f277f37 100644 --- a/src/rgbquant.js +++ b/src/rgbquant.js @@ -65,19 +65,19 @@ // if pre-defined palette, build lookups if (this.idxrgb.length > 0) { - var self = this; this.idxrgb.forEach(function(rgb, i) { - var i32 = ( - (255 << 24) | // alpha - (rgb[2] << 16) | // blue - (rgb[1] << 8) | // green - rgb[0] // red - ) >>> 0; - - self.idxi32[i] = i32; - self.i32idx[i32] = i; - self.i32rgb[i32] = rgb; - }); + var alpha = rgb.length >= 4 ? rgb[3] : 255, + i32 = ( + (alpha << 24) | // alpha + (rgb[2] << 16) | // blue + (rgb[1] << 8) | // green + rgb[0] // red + ) >>> 0; + + this.idxi32[i] = i32; + this.i32idx[i32] = i; + this.i32rgb[i32] = rgb; + }, this); } } @@ -222,7 +222,7 @@ [2 / 4, 1, 0], [1 / 4, -1, 1], [1 / 4, 0, 1], - ], + ] }; if (!kernel || !kernels[kernel]) { @@ -251,24 +251,29 @@ var idx = lni + x, i32 = buf32[idx], r1 = (i32 & 0xff), - g1 = (i32 & 0xff00) >> 8, - b1 = (i32 & 0xff0000) >> 16; + g1 = (i32 >>> 8) & 0xff, + b1 = (i32 >>> 16) & 0xff, + a1 = (i32 >>> 24) & 0xff; + + ASSERT(i32 > 0, "negative color. use >>> 0 to avoid it"); // Reduced pixel var i32x = this.nearestColor(i32), r2 = (i32x & 0xff), - g2 = (i32x & 0xff00) >> 8, - b2 = (i32x & 0xff0000) >> 16; + g2 = (i32x >>> 8) & 0xff, + b2 = (i32x >>> 16) & 0xff, + a2 = (i32x >>> 24) & 0xff; - buf32[idx] = - (255 << 24) | // alpha + buf32[idx] = ( + (a2 << 24) | // alpha (b2 << 16) | // blue (g2 << 8) | // green - r2; + r2 // red + ) >>> 0; // dithering strength if (this.dithDelta) { - var dist = this.colorDist([r1, g1, b1], [r2, g2, b2]); + var dist = this.colorDist([r1, g1, b1, a1], [r2, g2, b2, a2]); if (dist < this.dithDelta) continue; } @@ -276,7 +281,8 @@ // Component distance var er = r1 - r2, eg = g1 - g2, - eb = b1 - b2; + eb = b1 - b2, + ea = a1 - a2; for (var i = (dir == 1 ? 0 : ds.length - 1), end = (dir == 1 ? ds.length : 0); i !== end; i += dir) { var x1 = ds[i][1] * dir, @@ -289,18 +295,21 @@ var idx2 = idx + (lni2 + x1); var r3 = (buf32[idx2] & 0xff), - g3 = (buf32[idx2] & 0xff00) >> 8, - b3 = (buf32[idx2] & 0xff0000) >> 16; + g3 = (buf32[idx2] >>> 8) & 0xff, + b3 = (buf32[idx2] >>> 16) & 0xff, + a3 = (buf32[idx2] >>> 24) & 0xff; var r4 = Math.max(0, Math.min(255, r3 + er * d)), g4 = Math.max(0, Math.min(255, g3 + eg * d)), - b4 = Math.max(0, Math.min(255, b3 + eb * d)); + b4 = Math.max(0, Math.min(255, b3 + eb * d)), + a4 = Math.max(0, Math.min(255, a3 + ea * d)); - buf32[idx2] = - (255 << 24) | // alpha + buf32[idx2] = ( + (a4 << 24) | // alpha (b4 << 16) | // blue (g4 << 8) | // green - r4; // red + r4 // red + ) >>> 0; } } } @@ -429,8 +438,9 @@ var idxrgb = idxi32.map(function(i32) { return [ (i32 & 0xff), - (i32 & 0xff00) >> 8, - (i32 & 0xff0000) >> 16, + (i32 >>> 8) & 0xff, + (i32 >>> 16) & 0xff, + (i32 >>> 24) & 0xff ]; }); @@ -534,22 +544,21 @@ boxH = this.boxSize[1], area = boxW * boxH, boxes = makeBoxes(width, buf32.length / width, boxW, boxH), - histG = this.histogram, - self = this; + histG = this.histogram; boxes.forEach(function(box) { - var effc = Math.max(Math.round((box.w * box.h) / area) * self.boxPxls, 2), + var effc = Math.max(Math.round((box.w * box.h) / area) * this.boxPxls, 2), histL = {}, col; - iterBox(box, width, function(i) { + this.iterBox(box, width, function(i) { col = buf32[i]; // skip transparent if ((col & 0xff000000) >> 24 == 0) return; // collect hue stats - if (self.hueStats) - self.hueStats.check(col); + if (this.hueStats) + this.hueStats.check(col); if (col in histG) histG[col]++; @@ -560,7 +569,7 @@ else histL[col] = 1; }); - }); + }, this); if (this.hueStats) this.hueStats.inject(histG); @@ -596,9 +605,22 @@ // sync idxrgb & i32idx this.idxi32.forEach(function(i32, i) { - self.idxrgb[i] = self.i32rgb[i32]; - self.i32idx[i32] = i; - }); + this.idxrgb[i] = this.i32rgb[i32]; + this.i32idx[i32] = i; + }, this); + }; + + // iterates @bbox within a parent rect of width @wid; calls @fn, passing index within parent + RgbQuant.prototype.iterBox = function(bbox, wid, fn) { + var b = bbox, + i0 = b.y * wid + b.x, + i1 = (b.y + b.h - 1) * wid + (b.x + b.w - 1), + cnt = 0, incr = wid - b.w + 1, i = i0; + + do { + fn.call(this, i); + i += (++cnt % b.w == 0) ? incr : 1; + } while (i <= i1); }; // TOTRY: use HUSL - http://boronine.com/husl/ @@ -620,8 +642,9 @@ idx, rgb = [ (i32 & 0xff), - (i32 & 0xff00) >> 8, - (i32 & 0xff0000) >> 16, + (i32 >>> 8) & 0xff, + (i32 >>> 16) & 0xff, + (i32 >>> 24) & 0xff ], len = this.idxrgb.length; @@ -660,8 +683,9 @@ this.check = function() {return;}; var r = (i32 & 0xff), - g = (i32 & 0xff00) >> 8, - b = (i32 & 0xff0000) >> 16, + g = (i32 >>> 8) & 0xff, + b = (i32 >>> 16) & 0xff, + a = (i32 >>> 24) & 0xff, hg = (r == g && g == b) ? -1 : hueGroup(rgb2hsl(r,g,b).h, this.numGroups), gr = this.stats[hg], min = this.minCols; @@ -703,7 +727,8 @@ // Rec. 709 (sRGB) luma coef var Pr = .2126, Pg = .7152, - Pb = .0722; + Pb = .0722, + Pa = 1; // TODO: (igor-bezkrovny) what should be here? // http://alienryderflex.com/hsp.html function rgb2lum(r,g,b) { @@ -716,26 +741,29 @@ var rd = 255, gd = 255, - bd = 255; + bd = 255, + ad = 255; - var euclMax = Math.sqrt(Pr*rd*rd + Pg*gd*gd + Pb*bd*bd); + var euclMax = Math.sqrt(Pr*rd*rd + Pg*gd*gd + Pb*bd*bd + Pa*ad*ad); // perceptual Euclidean color distance function distEuclidean(rgb0, rgb1) { var rd = rgb1[0]-rgb0[0], gd = rgb1[1]-rgb0[1], - bd = rgb1[2]-rgb0[2]; + bd = rgb1[2]-rgb0[2], + ad = rgb1[3]-rgb0[3]; - return Math.sqrt(Pr*rd*rd + Pg*gd*gd + Pb*bd*bd) / euclMax; + return Math.sqrt(Pr*rd*rd + Pg*gd*gd + Pb*bd*bd + Pa*ad*ad) / euclMax; } - var manhMax = Pr*rd + Pg*gd + Pb*bd; + var manhMax = Pr*rd + Pg*gd + Pb*bd + Pa*ad; // perceptual Manhattan color distance function distManhattan(rgb0, rgb1) { var rd = Math.abs(rgb1[0]-rgb0[0]), gd = Math.abs(rgb1[1]-rgb0[1]), - bd = Math.abs(rgb1[2]-rgb0[2]); + bd = Math.abs(rgb1[2]-rgb0[2]), + ad = Math.abs(rgb1[3]-rgb0[3]); - return (Pr*rd + Pg*gd + Pb*bd) / manhMax; + return (Pr*rd + Pg*gd + Pb*bd + Pa*ad) / manhMax; } // http://rgb2hsl.nichabi.com/javascript-function.php @@ -765,7 +793,7 @@ return { h: h, s: s, - l: rgb2lum(r,g,b), + l: rgb2lum(r,g,b) }; } @@ -880,7 +908,7 @@ buf8: buf8, buf32: buf32, width: width, - height: height, + height: height }; } @@ -899,19 +927,6 @@ return bxs; } - // iterates @bbox within a parent rect of width @wid; calls @fn, passing index within parent - function iterBox(bbox, wid, fn) { - var b = bbox, - i0 = b.y * wid + b.x, - i1 = (b.y + b.h - 1) * wid + (b.x + b.w - 1), - cnt = 0, incr = wid - b.w + 1, i = i0; - - do { - fn.call(this, i); - i += (++cnt % b.w == 0) ? incr : 1; - } while (i <= i1); - } - // returns array of hash keys sorted by their values function sortedHashKeys(obj, desc) { var keys = []; @@ -932,4 +947,4 @@ module.exports = RgbQuant; } -}).call(this); \ No newline at end of file +}).call(this); From 642360dd5a97d34c333db06cc45657adad39cb7d Mon Sep 17 00:00:00 2001 From: Igor Date: Wed, 13 May 2015 00:00:12 +0300 Subject: [PATCH 02/23] images with alpha channel added to demo --- demo/css/demo.css | 21 ++++++++++- demo/index.html | 39 ++++++++++++++++++++- demo/png/Angry-Minion-icon.png | Bin 0 -> 26311 bytes demo/png/Curious-Minion-Icon-2.png | Bin 0 -> 18323 bytes demo/png/Curious-Minion-Icon.png | Bin 0 -> 25594 bytes demo/png/Dancing-minion-icon.png | Bin 0 -> 29817 bytes demo/png/Edith-despicable-me-2-icon.png | Bin 0 -> 17420 bytes demo/png/Evil-Minion-Icon-3.png | Bin 0 -> 30586 bytes demo/png/Evil-Minion-Icon-4.png | Bin 0 -> 28899 bytes demo/png/Happy-Minion-Icon.png | Bin 0 -> 24670 bytes demo/png/Margo-dispicable-me-2-icon.png | Bin 0 -> 15312 bytes demo/png/Minion icon.png | Bin 0 -> 28286 bytes demo/png/Minion-playing-golf-icon.png | Bin 0 -> 23833 bytes demo/png/Minion-reading-icon.png | Bin 0 -> 25793 bytes demo/png/Sad-Agnes-Icon.png | Bin 0 -> 14813 bytes demo/png/Shy-Minion-icon.png | Bin 0 -> 22001 bytes demo/png/agnes-overjoyed-icon.png | Bin 0 -> 25427 bytes demo/png/agnes-sleeping-icon.png | Bin 0 -> 20291 bytes demo/png/despicable-me-2-Minion-icon-1.png | Bin 0 -> 24618 bytes demo/png/despicable-me-2-Minion-icon-2.png | Bin 0 -> 26812 bytes demo/png/despicable-me-2-Minion-icon-3.png | Bin 0 -> 32685 bytes demo/png/despicable-me-2-Minion-icon-4.png | Bin 0 -> 32805 bytes demo/png/despicable-me-2-Minion-icon-5.png | Bin 0 -> 27802 bytes demo/png/despicable-me-2-Minion-icon-6.png | Bin 0 -> 29896 bytes demo/png/despicable-me-2-Minion-icon-7.png | Bin 0 -> 26920 bytes demo/png/despicable-me-2-Minion-icon-8.png | Bin 0 -> 21991 bytes demo/png/evil-minion-icon-2.png | Bin 0 -> 26936 bytes demo/png/evil-minion-icon.png | Bin 0 -> 35274 bytes demo/png/girl-minion-icon.png | Bin 0 -> 28604 bytes demo/png/gru-icon-2.png | Bin 0 -> 17768 bytes demo/png/gru-icon.png | Bin 0 -> 14562 bytes demo/png/happy-agnes-icon.png | Bin 0 -> 29510 bytes demo/png/kungfu-Minion.png | Bin 0 -> 25070 bytes demo/png/superman-minion-icon.png | Bin 0 -> 21109 bytes 34 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 demo/png/Angry-Minion-icon.png create mode 100644 demo/png/Curious-Minion-Icon-2.png create mode 100644 demo/png/Curious-Minion-Icon.png create mode 100644 demo/png/Dancing-minion-icon.png create mode 100644 demo/png/Edith-despicable-me-2-icon.png create mode 100644 demo/png/Evil-Minion-Icon-3.png create mode 100644 demo/png/Evil-Minion-Icon-4.png create mode 100644 demo/png/Happy-Minion-Icon.png create mode 100644 demo/png/Margo-dispicable-me-2-icon.png create mode 100644 demo/png/Minion icon.png create mode 100644 demo/png/Minion-playing-golf-icon.png create mode 100644 demo/png/Minion-reading-icon.png create mode 100644 demo/png/Sad-Agnes-Icon.png create mode 100644 demo/png/Shy-Minion-icon.png create mode 100644 demo/png/agnes-overjoyed-icon.png create mode 100644 demo/png/agnes-sleeping-icon.png create mode 100644 demo/png/despicable-me-2-Minion-icon-1.png create mode 100644 demo/png/despicable-me-2-Minion-icon-2.png create mode 100644 demo/png/despicable-me-2-Minion-icon-3.png create mode 100644 demo/png/despicable-me-2-Minion-icon-4.png create mode 100644 demo/png/despicable-me-2-Minion-icon-5.png create mode 100644 demo/png/despicable-me-2-Minion-icon-6.png create mode 100644 demo/png/despicable-me-2-Minion-icon-7.png create mode 100644 demo/png/despicable-me-2-Minion-icon-8.png create mode 100644 demo/png/evil-minion-icon-2.png create mode 100644 demo/png/evil-minion-icon.png create mode 100644 demo/png/girl-minion-icon.png create mode 100644 demo/png/gru-icon-2.png create mode 100644 demo/png/gru-icon.png create mode 100644 demo/png/happy-agnes-icon.png create mode 100644 demo/png/kungfu-Minion.png create mode 100644 demo/png/superman-minion-icon.png diff --git a/demo/css/demo.css b/demo/css/demo.css index 46fc18a..0ff9fbd 100644 --- a/demo/css/demo.css +++ b/demo/css/demo.css @@ -91,4 +91,23 @@ input[type="text"] { pre { margin: 10px 0 0 0; -} \ No newline at end of file +} + +#orig, #redu { + background-image: + -moz-linear-gradient(45deg, #000 25%, transparent 25%), + -moz-linear-gradient(-45deg, #000 25%, transparent 25%), + -moz-linear-gradient(45deg, transparent 75%, #000 75%), + -moz-linear-gradient(-45deg, transparent 75%, #000 75%); + background-image: + -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, #000), color-stop(.25, transparent)), + -webkit-gradient(linear, 0 0, 100% 100%, color-stop(.25, #000), color-stop(.25, transparent)), + -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.75, transparent), color-stop(.75, #000)), + -webkit-gradient(linear, 0 0, 100% 100%, color-stop(.75, transparent), color-stop(.75, #000)); + + -moz-background-size:20px 20px; + background-size:20px 20px; + -webkit-background-size:20px 21px; /* override value for shitty webkit */ + + background-position:0 0, 10px 0, 10px -10px, 0px 10px; +} diff --git a/demo/index.html b/demo/index.html index b3acd9a..99b8126 100644 --- a/demo/index.html +++ b/demo/index.html @@ -94,6 +94,43 @@

RgbQuant.js

A single, optimal palette is progressivley generated for a set of images. Each is then reduced using it.
+ + Alpha + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + POK5!MPVWMFO#_gpfXJc-XJ2x5@u`|L0A<|dk@>ym^6EO}W4S~Oxx;>4dU@V1B^HAY=xSa%c*&rES0Gae| zWKvXIg4d8Kpr$kfOK2FCYUw$$0(~6w8}qOk;;>DTL6}a&i39Wo8kfPQhIVOIH=0Vv zVC<6G0_mgG#Asqu1udi5+*^RYzo2IPoIE87OOnAcQ>V{B|L{N&6q-*G=01t?npY&_ z?PttrRb&5U-1>=8OcpDB&5_CDB6Hc(n)`P?PvoylJO=C?bmQ+HJA?(>?YQZTQcSOl z!EA}BHT`7-jvD$Ut9z?Tn#?yW1?)bUY$TJy&xxo?h#B=%dWPs;m3|8Zhy^=6O@N^t z@q9{N(fj0BHY&R~rq668rL;R>rm>`mVLZk%B&2v$ND@m-4Y=)&d@@}e?0GUpqT{qF zCCD*FJ^0ikJg;%Qr2g)aS2Y0X0FnidtLnCE?=Oe0e6Htmr69FR7vs zy<4h(Qnt+&YruRh;{e8isT$NFMj&WRj7P6l1eNCoCUjX$udl(tm><=prKm5jj>>}{ z&1zWK$rWibEnmRmg$vL#*oR$vcc|z3y_@7!4L~|HCQoUC$xMHeP8Ic-^EWRtE!t)% z{ahYnJEl}s*APPp@+vwBQP46uPrnH z>28+4;}%FItD^Aus3GZBkjJ&j^LTa4`^9cv=|hme3GSXGAeC7}JZDZ)SyoM_n$f&i zbxD)eWW-*Kr^qwMxf8Cx>I$Z^1a=?Tr`9Kax5!HjKrXg8>C%9s18vZZ#ZHd5E;6)3 zzq61{{Fi3RerkHtWcA$q%5n`M3+bRnu$HWY%h!s#w;Hf=>p@f#1Jsz4SlVR4l+rjo zm#E*EW(YUJA`kqdXUij2GE}~S7($*1DvK-^dj%yzq>;{%t>h$4&~ViA^fEX$L^?@U z;IQgY;&Ld3JM4BDfMl~9n1YTk9C`Ak*r930jUW6F3J>bAfB%8;TFPHujvIhXO3bG6 z>S0FR;Z8ief314HolL%bTOuQS^xAsXI-<}So_=e4+GXqqelbt)wj zPZ0B1albKb17m4=3T29cB`znYr(X-saQ0*2fbrsxMkUe$RsreP8am0<-jP} zVuK#{ZGMhG&WxKXFNE3VMn+5F?wy;lyXOE54DWVR1?IM%h3`D~I0BgzE}BnJNR05i z9bxQ>df>G%7Ua^{(blIbio1?>8w=0si%~l(Rw(eYEAEUQ=Z1~Z`58=Sk5xj57BGffh zB9W0&u{=dnhbtDGt;)O>jTF(CK`3TWk6Mv6_pg{g3*q>Psw12>xrW~*QBrEfhnFqG z$eLaZj*ek&%T#>k;tSw&=-F*+lL10!O5b94r+T|M>mWl~(-qXwlVrNt+T zzD=1hAz3Eo-5|$j2cIhGIeNI^ncx0L=kTF}h^1mU>NH`bTxJ=kkP1dnYPDiP;}jT8 zR_q_{h0SBd2hLoMSuHI{M9nbTN&gbEXo8GMjAPB=-MDDh0tMub^`_MG`^%gL^an;! zRa(J)VvG(s8juDvz5brfYq0Ln9=w0vIXHjLLPn%4b{_7+{hKzCb?Py?S1HzzqXqu=yhxtaQNdcEX=b z;faI0RTr*}q0v0ZG;!n)nAtQ93nn-4Z-tbUnS(X#>*>HF8(%<2e;;l+>tcAU9z@bn zB=Z`2M*Y~<-iAvSo(U(CINF_{=bG@o`KPP74NK?FLW)2)63XzHQ(>|iaQBNZ5+sst zrc;+$%()Vy*)aO@YG83aqW`&a!V)p3M#ABMp>5aJFGKJ0Ye^6oN1dT z9oO-UGgHshGtNw=$+RBrJ%+zU;aj086!48ka1Ytl1gm@TRAOQk| zp8MYW*uD4m{Js@75roX7UYl+>nw3_&_ujqId7tlm=QqPKLq3enCJNa|OWEg^`52_4 z7z2a#g)lQh!LB715?QLy{i|-FzV0si;f~j7E|aB_XHsWlH>Y>EQQzVer;t8+d3YZM z`T84fzMBf=45yD}VxCi5BU_<@N%@M8dRmq&D_6X?76w2rTdl@qCp9FhXxsHhHFp8| z%;W>Am1oAdl;ylX%(*z`-GqWFX|f~&tEi(91G!8gIFnDZD@*OpZHl<^27+0Q{EJ(9k$6@jnn1MWj-; z?A_8OGXC*V{eUdi<6KL&P@wr>v$9m>fny|8l!4ZeL$G__*vd)_qoIu6~k z@@D5;_JWw_f2qTVEC464w^V%h#X6&!3xGeMzZPw1tQ4mwWXYApXg4%oph%1*WpsX< zoRT5I(lCY%8}2w=jB&c?S5<0c!D!)}PxiZ1j|h1hsHVxy)AYUenf3WziGxZYl^_ z0F+BtxbdCW>WykH0FG(p!pYXH(&)$oC4X%kD!i^1!rh< zkbifWp(X+`z_haV141o|eVnYGah!`4K^CBrSs{yK37~7CU}Lg|S0H4V`!AW*o&$az z?Db0lYEL$^bqNW?&KttX+he*Otpv2(JN=I0ejq#+X&eOBE7e>8ERNs~m%8xWyzg9==TPgnpkSC7ww zHtVdtS#}{xwKbQ`3R=?~{+)#hd;i%QpnnN2NM=EaF;i0=og`s0ndH;WN+sm;+??nN z;(Nm^Um$omEQr-snEIre3xHWHz(cqgc56B+OWxVSbN!L7dZ_pSQSdM@3%Pyuvtj5 zrY+!8Gh~*q6Wt&Bg4WzgF2ED~n9<9O z5Dgw!a`8k>07DirDLZEZe5ne?fLXqIW`2>GUu0pj%NRO|l|77vb*P=P-;ou3&+W0ZIn502QzKfU}!W3byS$yIm4t`%OZn)G(ehwm{no{ z$yhF-^A9n@#fNAFLlY`n8$h^#Wv~?RF2MP(h#5e5_{0zgxEKVE7#?M0W~ewbLCJVz zJ$V+p9L_lOs2I=wyFl-Y00@H5$K3ybwzK!dQS zwgeF4*|`jj7c9y!H&GKrR$xPund{Ja?7s0hHW1@s1FB#gW=8;&0uwwXejQkaejl1p z5Pb5RBH-i`U5+twvvhhU_mA=Ax9#b>?;(mcCTQ~PsTF)eFc=EqW-k9*>WFH-7BF%8 z1ZC%D1SASp)+!k3s)y|6j?NdOE$#m)1ywQ(x0BsO1f^e_g#-^Ye49Si589!-Q8`*}zt~1I+4GNm79ShfZT;2J>?X5qR>K#)095l0*aN zeRMD#=(c=;Rrx|by6JoW_UyO5`PA2k4(xq$`O@VlI8!(Z>jKQ5dZhPV0MMBm2ykA_ zCRtI{*?=C~QgWQ9BQ4GUqw3L7juv$G!>zXGN)88VU@SB~Z~G|iB`DC+`8P`0da&s8 zj>vxBO`0q>AqaF>5HNqh0*s9xmH-&tZ0hGV7|cgD;jq;}?O||ErCl=`WgLY}qZAoF ze5`+9_kjmz3e;&y5js9Rs943>&wjZ7rk4`QRvtke@-8YR*)Oo{FT0c?x{^;rRUvW7#G%b^wT9ct= zOPXm>R~PNFGBkDe428oHY(*;gNZC^M`L+Or!Qg9{C^2)Y=s2v|{FkD9j4T7`9k6(V zitk5Fnz4J@aQ3>A-Yz0ymI5UhCOvD5IO6!xH|g$=&em-u=>5wAeiNY_T(L#Vc=sJ^ z$scVIAQtWI%|p?KI3FOh%K%ffpsF=cC>E#H>mC-Z)@A!*L+{0Ma&;j`%obpcMtX=p z6i&dkQC3EE(4kT(#}b!2+oI&3G)#+JDM;aXJG+fC>HY#KnnI(eMkx>q9=dp&^+wl( z1rS@h*!=6!CQ2+@${HA@idi6;84wESXQHtL2WkMCRH$HiO&NnzK+_<-p@aJF`V1Z4 zxtU}Y*u7VgXH*(F=8!`=-FnCGQMj>Lq>pyRqf@8G{^&z8KL&OJ*_8Z(%+mws-mbBEMHu(LWH>6i-!w zxZ$$9$Wrgh+sQ3V(}{zxlm2VAT%j~%vxdXHwBE9YoM4=0vU%hPbmq+2dj|&hJ@}`e z`wTt$hy8Tqzi%{3Y)?;R}r_hC5zR9ehn&)G4AEM0M`Tmv_E#!-ZL`sPwPjbVj zD4g%{$3g#(FrhXyLbNb&Y(N}@Xae% zZz>ukagJYB>4uwDi`BuA;eA4g(BfUp6-d(qwD!S==&t)WQX~{4(=DMe#5G zMPE7c!zU6)hbWWD(W~2kPU*Qct^e3v9B@`h*8;C5lPL;l^;rZ0)m#9YQa$94G>I)y z0BXjbK-hWFcf-u9*6u*_<6p&hA5G6@NS7;L`*4f(c<1V!KRZM+QmLg7lG(-9{g|cOA8-x;Ta?5_W$fFx2%RZQs7* z>pQk>`D#}xNlSZrC=w4-b5kol_nl`c-k6}#(Gx6i;oYTtmc;CUI;ENmfWcZ?n4Kd< zz4%dR0;&GI5&`W?Vr#K^^X9LO92tJfsTjhHODsUPPouV&OdVZ4J#QU5Dh5e{p&(&9 z@SI&hq-`JN4(!KJyP>EoQS6Z-|NMC)k+siBD{# zZ~yZ@k+M}SkSi6%?x1?5nhU_lpXt1J5i{_oBt@Hh^!)7Kt;0pKRGmYuDaSg`za;oqzlK zYdb=QSpdWw6^rb<*#Zv@9ilHi_Gh%^)t^z%@;-5V0C4tK+B8}(RC58Co}8em z>2Xqk#d8%B%eow~|6=>k?g%LoE$Ls$rq`tO%nUg!Jc)RMwrt%>Z=F2-OzF_ke~mT7 zFJ}xh5V%K~bVl?OUTN$b8bl4#`c}E(Zu4aIA-n7>_OPA6^A5>A`6tnM@RW*4BupqQ z;lAFBZQ<7{)m#9Mjhv*zti5{Z>aEq#UR}{>{QP9Y$k<7mW)tqRZ!VM!QiD3prSqgU zG;M2$#-6YZt2z?q3SPzMR#8p>Ka1Hxmmh$UvuGHngJsh`c*;*GHl9Wva5Z85`^Tk_xT(Qkizo??}0=-0E998L@PPw7+!u@-B8Vg z!0G8J%I9;{3f)x*cOhEAN@lf}Px4^}PIFyf)<g>yT`r-|r)0k{n=5%^uO7XSbN07*qoM6N<$f(x+4mjD0& literal 0 HcmV?d00001 diff --git a/demo/png/Minion-reading-icon.png b/demo/png/Minion-reading-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9ca96f2a29452390967f67c3c515c0df7a019e2d GIT binary patch literal 25793 zcmV(|K+(U6P)TKTzr(=DAj!bYpvhpFm|R@o7!csYfD?SX z22>3MmvupAq015gTq&u=$w2xK5XU7K6qPVAFvbAc+~p+&Aa(|jEs~TCX4in&ML-7v z*%LtQbO?J1SPg`|1FR+_$Qj5!17tg-Be9c^*id^xfH~O+%Az7DNv#07nSsI0iGcwW zrVvp?SRuri#emot7#B+rV)=_07%aX5#U~)dl4de6Y;R>?khp~qQ(3^kz~92auq%~`f#tDpvkR(NJ2%d%S(CZH z_VVGE2LJy90Nz1UeUj`h^#A}M07*naRCr$Oy$OI^S9LAA>ej7!?CN<`x8_-vB};_#(csf$s_O}fg})!nGyzLMjK<~S+-=!np;x0TIzYM zc^>YqxAwVJt+vd6|65Vp&QFeXyQ=Pd&)$3Owa?k-TwAqT#ebFmyhVHAs{bngnaY1D zz<=`cUkdP_yy!1n_5WTHi8xH70-MeDy!9segswZ`^?G2p+o5T8R4OKtsVD-@GIV

YTz+{4OUvkr49v3NpO5-LAnO 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�PUrt62l5gm8YH-affW_660!WIQq@T&`Br>K^ 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 Q9smFU07*qoM6N<$f=ztJO8@`> literal 0 HcmV?d00001 diff --git a/demo/png/Sad-Agnes-Icon.png b/demo/png/Sad-Agnes-Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bea605b114db579e5da22e9e3febc5f11cf07011 GIT binary patch literal 14813 zcmV<3IU>f1P)TKTzr(=DAj!bYpvhpFm|R@o7!csYfD?SX z22>3MmvupAq015gTq&u=$w2xK5XU7K6qPVAFvbAc+~p+&Aa(|jEs~TCX4in&ML-7v z*%LtQbO?J1SPg`|1FR+_$Qj5!17tg-Be9c^*id^xfH~O+%Az7DNv#07nSsI0iGcwW zrVvp?SRuri#emot7#B+rV)=_07%aX5#U~)dl4de6Y;R>?khp~qQ(3^kz~92auq%~`f#tDpvkR(NJ2%d%S(CZH z_VVGE2LJy90Nz1UeUj`h^#A}M07*naRCr$Py$PILXLTp~zkBUfy-TfKvMkB6B;!Rk z25e(uL+k)!8^R+YVIBdJNrudjFuc4M5+IYw5C+~$2$M`g5=d|$nGBe57Qh&Xcnlch zU9u!=S1;j6oq^BenynU0+st%LhZh7$c`c6V zzzf?bmuoOg6UAH(hGC$-xQKVX`={~V_r3qZ3+fTlFMMg`lKiozuEWSulnX@^iUn=; z=pb~{&`ig$N`<05IM|mn4a15Mmx=|asGE9PuP>T$lor~a?-a{#c_;`LJR7YD3%CaFDlr%^e;vL#4;pgh+2S?{Bay$1*IvXc}fUh=ZbS7_~w!SMYqlR4NwrYJb(-uy!;{;!JZKOUvbR zn%vPSi=a_1?7Rij>g`)>Uii}TBhj&cNY6ByY%%*!?>mYuTh?G?bd_FTYUrkE$eX!Z zxmXF~#01U0*KzgA=*ZqEiXIBwpd`YR&*h7D#c%^Zh;7qu8 zHG&Llv9V-nhLzWCeO1vi0@n>U8HPS&8|H?<_s1LUmPyK2tCf*VOQ*shZdR(rQ#_+J zH8V4j&lPJscWui$?Y1tSqko{9m8<2faq_gb&}?J@@kuY!@)rP6eVW_VYlhHY>!&Y{ zaWNbyhgp_|C=9f*u_<$WeBA6G=r;!j`ujQ^uabu8kYQNG1pQP!M zt?4@{SWE4eTcI2sr(YPPAe|bl4H&s{KAfMKU$Szx4=qaOW*3dw>4mJZ)J(=E$1uA% zf5El%60Haqkj5!2YW}5{tR<(Z=`R4hL@*?RV6+eiewc5!+D?CewXaex4N+4!dO=*y zvSfEoH#c>@`G2GWT(CV}o7ZzJ-5QS!vB`G5gI-Qq5;Q#L=AWh)6AJE^DKQE99P?RRA zvAEc@N=1jl;`F6)IMix+YojP$&$ri-Z|l<}%cmM@TB?^R6sZ@x4W55}7NkstKY*RP?UU(2|?$}<>@=5;;G3_tavh^~R>H5uZ2rm2rg zC>bWfw+IePx`s9NX6tCD;}(72n+^OZ5DBDE@*{d?>Aii6SBL-z>FBsEka2wW!a-ro z0|xslakZ}+d4ccb?Oe^J0Ay)eBjZNmC`6*^5zV)mP_B|Vv7$6KDPb9zoljGllK$D-= zk|=G4{1};E=KFno6v+Fo9YA{CRrVIGAPXR*A=YCgkqE`~o?+!?+8&}ktwY8O42^hv z%xj^vyf`NL=cX0679h9##f+{ngf>0%eLtZvxKWe{LklqlAcz^f(e#V?53>Y8kPtJ7 z1vsO~gmwHkO10D{R-lw*BZjUI5EFO=kBk)H3-kFE^d=c)BvY$~y-X`_F{m38@*xa+ z;YUnc;n+5HJ;{;fb}0Bjm`~{u-yeFivUdhI@N~q4{FEe=yR!^MDDFmXK(?Y570;GchmJw+=F1CWTjsdz|U#Peppr7Vcu4hn=}$Zb;ViHpPp3uOLNNgV$P-)~X~G~2Z4`w@1+ zh=7qd)utO!SR$cJy%Yxilaqo0{}A}rRke;qrLLqA1%_xqu}XNZOg}ZAOcc#G3>`#s zA>;i?I+t-hP5;p6^Dy!Awr+WbX>p@QH%KV$Kq-Z40W(XdqlOXzS!i5Px3JP(Mc%tE2wtR2n%8LR>nmF%&fK=fKt$UVc zIVlyRHRu+|K4-EC6sh^5{YV7`qRp57h8W=~H}H!L0~siU-NQ55{T`3^Ux-$w3$UoM z0_t9j$g{-CObH3ISQ2*%|1%QEVA&GLC$KHa2^wM%+FFVye82rEKZ8!f2ip04nmPdYv?qX%j7|1^psOE)#2 z#(^a3JZH|sr%9N=;OEYUo(3G^OwAuYg#!qH2#0yBZ#f5_PL-+7MY9b$ZWVoC;3 zgh8^0Y5`Z?rFnN8OR|5lA4Y!^c@*q2TW3BOv30AU=~>Tz<476F~yXw(Q!2 zzkH2{zSDC^9UB(G_$Q7&g^$-ypv3sTL`|njUnMzwAqnYXGSsp}`=igdJDo?RyH~VY z3CVe+*v)^uBvjR(%T<$BqyPv23qv18YI@PMByfjKHGj7=ip`@H{OZCppkqftGy2c2 z9Eu#s&5-1e>wBLRo?HCv#Yo;uH3Cgpc9u?)GvVKIq?IWELgbRv_Q@kkb(-rG3z?6% ztl5H91ATb=GY>Lkiz|*KedxNy5;*ysEdJcnayyR&-F(nRS(|AYN}9>&p_>R^zU*Jg z0zi`3zH6%aubB70rwnz@wa_H~L9%6v#>G6+Mj!gd|?Ep^0#TzLU&)8}5 zl>^^H?2$oP#Vqf ztdxUp=HVTfcyIRX(O=BN!3;by&BA)>_Xk4F__`6|Aw9roWZAJTmou#x0T3`JiJF)U5m44&DC4QY947zn z2zEX*_i;)69z(zoFu`zUqC%}-hkk62L)@r&DDeGDGRrxI1ex2x!twF{l4Z$5mZd)| zEya>7sv06d5q_sNj(fdn^znCZSv!CgBLLkZ&SI$m+a})6;4TjQ z8To}PlHA}XYQ9Hje+(UL)bjWynmD2P6a!OfxW#{4RQHovgjyP7*fj6#UpxG8J~g20 zDekSG#&1m=#8}ipMYoqV`aes{S^$*B$1y6E3N~$6w<`$aH*~zy^2M~ z1-8+7f1zP+OFMXdn1^(4%+V6`6U2SRY$315_+h_>Q+!Pt`%=1&u`EP`!mv%xk{m(e z151;5bWH*G*QYTRxu|LmS>NkzpZ_>orUJlQPqUn3*p|;bTin3^wU!_MShL+!GXlCf zdkb#pBa4#ajILqQjI#&GeyQ-vlYP3%3IfBagKroCri=*3vlgm!4+Dt_*Dw$p#@I(s zK8erFp2Ur-_o9!tYf-iQtsLrE0g&5#u^3y`-;fCrW4e)%p|^&y_Nl3fv7+ZT5k&-K z4APUBpG*@?C$iTJ3nkIlgx=py)$BfL_{=CERB%jF<0o_czSP2g#`jhdp=`%kH#m%g z)z;4)Y{i9gF8}2sj01J~?lbEOD}{PCgDG*jF45dM4=KiwdvBW-%H_(>W}5Xm(ePZ( z$xOq}WC&ywg#_k_Cd;yhZb1e=35wTE9R`^#<75czcn@)VG2Ka{=-cZ_+E^m z{((1DtF`~Sv`C#av&_(S&9S6+j~`U4d(>pc{!-Z+^E|TRr>b}5uRYWMC+%U~@()dN zL@H6FQ7D|8gHoOXX63btV`j~E3%YG#aA4r&wOZd__V?GGvJ7XhxS5rJ0(#N~2tQOk zUZTNPT{&Hnn_lRzZm9NEKQ}fxh5l+O%ja`ip+K*$TDKAua<dl+o8$)7ou!H_!8( zpyU3$>$ZPKDgsq?(K4l;6acXRX`FOBb1m`PQs^7Ov264eOTTk^wr&M}M>TV{+OA@_ zEXzh=gkrHsKb?XRp{nRL`*pNi9+JGnb0pFdhFs1nMG>=FVO6K?i0G6m4n6LHxj81KCdO{Yyz>@twe7M08MwN zEr3qe+EdhOdGrnT5f_;6Y6kJ^L*JF*%$S~?L+BIrOQoLR1gXC}1JcCbX9g{Xlc$a* zsP$Fh*fs|GMDu9@2=;7hc|brZ@5u=)`hLqYCSJRwYN5 z;RS89njZasw-H2^frG$T&*LOf=aBXg!3t59X$d0@=@<&*0EJTVGa8cnqc~}uTQjJt zki@;bG%Wi2Cn>UAJv>MajF2~T*tB)i7b}Ba^OwEY-wkNmUw4W9d01+6`rPi8QtrCOy= zFVG6muS+|(%J^k;2O%V{C-ZzH(c^YJRiZ7E!9y~U=OJTFB{YVSgP9`+ApbKW{~QG) zbOWBJiy!3k{E*}dkp%>WHr83$pSqqgn5DvIL=q_q4j z_4<4up&pF_Qq&tw(f+qrO=ECjaY0#E*`h^?Hl%Lg z2Sold!Jh)qj;Q5vrhIv*HjGFSGUPJ}_QXKPv={>5BzKUB*3-V1$^}$PHmcPcPMta} z(?ry{#R??EC{hGUps8sh5WI%6QGRWjgb#G5!*wlyfX;4ddhb%trh=tzzvSfJPRON_ zLNWxpz9gg9Y0?E;5wSZKwVC%<7lu$PB_M;QeK5^3~y$w<%U0W3=!HXZX?0eCW}N8M0C`P5{w2DTp2*NYvOb)l5n z=AhYZ(hWpvsDm((I!b0~C|Cs;jzROTk*NfInTcY?@GcCH7cFJ%FA;=%PKHIwOdv`X zJVptNjkfw;O>)sPOo-ntE=txJgi5)hN(9jbtS#8I9wr4ynn-xPvREZns+XxZGl9If zjM1+!slwt##rMYa%@S!_M$$Fg68cNpmq1Y(eY3=+mUr|1(1-~F3X1gkhY5;>4qxP% zr0XXqS;K@HPk|C^AfX{GM#uFP_!I$4r3p}`hB1tk%%K$hXf!ov=RQjkNi2(8k(wZ4 z8H^?h1&wk=Y3WD=qFT-fW`bu(1afR&I@HkVg$5Q}53VoE$r&od1oMpf=h`8h zfXt%nXoeaFX(jpy7WI60MnD?LYyfF2(PfuVGBH(?!o(V=>>iQ52!yOQx_(EKX3}~T z-PdU|bUo7`Dgw}HcNoD)j-hv{H(h|3a+{vk)z-}}F5xY={4lm(b{Xu9@wyCfjyiCu zrzAM8&l_mxR0&vpY7$HH^GJxuD|rV)!$U}O()BCA z&_v=;+su}V<*TdK;>Yi}9fwa%;K=waj!#bG;A9JjC+jFuxUSr~9(TTc4_<#wg!u+7 z22J^~nFSo5X~JbFnM9J|qt?snAn#I2%}xbhsO#!3HRmWOLT;z?7fp9*PDa(M7?vag z5PF_!SMO!&%{%}fYPyz|I*pc~Gz*=MkGh%1$gOX}^jsak^}!FIk3RUF|Nfn*Y}&3u zGc9&hJ6F_d!J*Jxef1t(ciq*hc|%gdl1XedJD6LnW8a~p_{w94uy@Bs-173hYP;8^ z#Reu87IAv6`}5Rn1551)HZ4J*F&ZJ$9a;l59ZZHqrHnEtY!g$HA4o#UJe~JP@K0#A z+vmL4d(@j4fHzN3=|7Oi{Z+|4syasL-mIiWbJ>riVds#amDt{XmmV0^UPuF8=Ju8TQ*{7 zbs2+0L)f*A0z+3aUvKbx=P*Wm@#M)mPDPT1B%qWW0MF$`F8T`2@80#UcOJEKG93C` zZP(ChxA3Z0-gwSyy+^&93Kl7#4h6pJ(Uj&#*NpO>4q@NJe~S};e?Jahbu+&0Wte*O z2=3bdB(`4rN`#$`#E8#@Us@Vr@zg0iyAWXi)BEAi&R`uuPv+Vb7kzQ&aQ!>d`Sg&SP6G7sn@NvFL1s@4Ma4NG}2Hp)4w?2V;B5M+m6% z7|OZ6r-UI#q<_b*)wt!=ufoWVov71AM4jM4bo?(s+uwj7>>vxtB>H|S=13?2 zGPr-+uFLRHwS*H#pT*II6n*79EGI;@RzPjb4lF)4#em;eOS(#F&q>}1mPiTm0?$Pl zq$>5iYh4Aeyk^2H%W}`r+EggOaMyZCkzWZm;?zAw-kj~Omm2_dOh)ik%RTWUTAfs9= z;i@;h8T%joE`D^qgApfzYxLuqA9^kF7TvR01U!!w&1rKFbm~m=!f6EXU>ZlqMYnX%sC{BO{-PW=}Q9eeUZk?5^XCNi=Dx0 zJ_x;_KtoK6nnR_pA93g+skbm>+0=RszAXFFK+9@iD&ZOb%asZ!`979T9mQ+^)g4M0 z4t@Dvl&b|?amU-Raq|Y$=N3^Y6p+t@ojip?c8;{sziu78`UGb7XSm^}n{oY3KO|y;EC?|>F^!;A zhc-8XJZ-<2cr`GZF~7nP0s!fHT*mP-M#iaB=#r*UqjiZIO*pr_@!u_Gh5a~w_}okX z9w|c-pXj8{yxON6zOB|#y7KVuVJ+P%@+@kL%sN}iV@45o}9ytsL-EX%8EV=`~UzLcS%G+RDn!N%jL_-blo88pnwcB$|!HX>d!y_>z`c+Bjcuz{oRqvYmfb| z+EVsnOZ`$+?D0C@{kAuwx_ZNf2lN>AqySjd{+n*zi$*KLgWr7Y!Mnfwol|eW`SK03 z^*L4IB_W&EN2cl}m6DaBpw6jd@Ec3$blNEP4M3A(OjRi)%ecf8;^X<7FgX)J35e{8 z1rqfj<7JqHSQ2Gnx;uRcGq=6`<|AKy!SC?87kZxZ3rS^> z!>HulKl$e8Rt9^SdQt$SSHG{i%B+@>`0~p-!RNmEoe$jb@~bZ$Fq~iMc(ZWpWZ3K+ z3TxKFs`XRTODL>c+g+=tpLWUwUiAMdO)(JwBDD($wV!r5lZ~E;@VisR1*r?%lk_o# zN>9`(Uq-i)_-%~rxB}H}*Zj}}zxRHW%e6trwnGsRX(xLj)|y778cCK*$8b*yfJZ>~ zmHQrmWf*&Qzij88v9Z$+KQ&pu`;H&F?Fs+suYcMcKUVeHEqD{-Dle}~?H)r!d(|lP zGQ%!0`LqP8M(`}Bq)JChwIrD6?ir{`x+Kv9**i*?#E}3>NeGdNr7Cv5?HAs3e0*W- znP-opn0KTkFw!hy4^@3}5KM2|wrNJq@v08q zQ@!H0zx9R={)Tb*iC>TmK+J}0y%MtDDJ)Om-D0B zepAZIzVhX-AeYa}-am`HkVtJWtr`i>zv43_{R5JpSRVZET>%j4R@SN~-+PTr%3_c4 zd*AWm)|cNlAK~@wxo>@9#LzeT^(I;!83xG%=^E@}5xM>WH6KWrA`ygi_Gko$rfm00 zW;*oMnaOh!B)X;knRsOLPv!>K+$Z1lo_GBe4jnp(zDgN(xkyu!MLA-N_(e>-p))E` zyH_s{>S+NumsBIDTI-j(eLmuVfXzW^bjx2&&NROK*AIT9e#4Mf+A<=`#Ya{J*7QALIhvcEnL5*ydT|PZ2&JNQ7Inu+_PQbHc>xfM8_=h##dwRpJ`GSBVT{i( z&oCX-@&jn?+jq~e-S?chSD)VG_u7>Ff=D>Nlq+zwjfDQG}7p z<4dQO@a)(LT)m}A9>`K|2c58k2G7%UGdw=uhjv(jNi^>e8*J&H;SMC`JYE2&)7cWja8U{>^B(trJYM2xcf8j-+$1BOz|q@3=|Us zw_Qml5eS@^n8W0J2VvCau_lhk>k%Ih$MEqOwE?zP0VtB9$qad?{O#JLyU$m9;inJfFTzy zy>uIPY`+A*@+-eaKP)L#39ZDp$`Nw&HMEzW{M9WR=JChhsq!-(Oz9Dz2@aZhIC+L{ zriRf0+5dL{e?K*d8P7o_FUcPZSFTR5(`nNxBxp^9xZ)~MFx1x!3iE|taqV^Z+^7El zO$q=*k}u6oFI;A5R{LU`K}yyy@B-B%P$2k}HKms_fj=Ov8Xm@j5B@LJkSUbOK7i*$ z0%`?N%L)g+^^Lb4cyt{3ktiZgnvlmj#|KhBxue)NU=Bd>fJkG z4y~$Su9L@x?b}f*IdFnHW|vZ&9&e(-u<#hxqHPVsmVIILJVB#{+b&J8X4pbyporY-%Id{TW?ctM|J|2Ara@3FuzTJDf0zB@{y0=&2RZp z_%5&cr9{vVPHIbbwTvpondgmIks1I#!nwt_1t$iuwYnbVatUd$cT!^L1-6 zHlE>69v#Mkrvnts5Vl=Fi(%hYgDxCB#PJDFm7c$h)*{i1n3}b*XYU}~M(rt~>9-SZ<_cUoG6c_$Aw!@yl$+Rnxr2#m3nOdR!(M&qr)vGe z+%q8_nOyCw;ij8!#_xaf08F}%?#min*X4P9eEee{$DMcHh1uCz6df5|vAn291wiuY zZZ{Ed?rZenLHqQ(Qg@-6NjX-r4_j`$4ex9|fDcZOqgCmHR;%Ea#}DCk6DRQG(OLY; zC4+d!tvm34z56Fn9vnfV=_2(T=*-Sz_SiV$e1=P2K8U%N9Sm+9d?d(1GVyyRyrWfc z!)xD+&)@xNEVUR?>eBP?t2FZe`Jw-W+g^7&=E-~+2P0966tYMpAQ{Wv&ja?X0Hg|l zJuiu(T!M#i;q*IG--S6agmhvG@xlZGcLw#z2&YlT*4>vO9-F~J;G%kIKR)&2d-2BG zZ-5(Qm~WB!5g(qkg8At0ui@~bi_^_#u=Uz2k9_5uk2f8q{oiApOd8AON?5gF8>Sxq zj=~eVVdB62(WkNJ6*pk|*kLtoRFI;=F4BRNNL!i|g~}OvI}^~O0>GPok!spB%Z38q zza}$^2v47c*Ia-`a96r)CqBGt3HKjAjsN**3*WhH7_S&ygCF_HTTmJqMq{CYi0%S( z8wjNeBu3T=QL6Ug8{d8y|MS6bY;(V3pb;kJe~mu|(#rZsdI1Zj;X;J1;`BBY_KM$Bj(T7VV> z<DQ-H zx~<13?!E@zp~n%NJdAA3W+a8xFgFh18Y29V{@6V|LsQ>@MpLhaKFlaU-0r9jqUq)m zj?Ir@yuFBPcVB^TA1h+(_LmX<$z&4eqA|SWB~}{qg_ex~2usqAC*!w~EG;6KcA-~> z(K+-aqPaN?yzFXK;vEGI`rj0JDa|HU@LCN_&o-sJ9FISH1pAL4Mq73kuax;1!XuLt z@X8ypE0>e#ABGHoyr@y^4u3p%7Vt`-WhDTyhR4#-dxKQ^$^ePRv1e$$+iF}~=g>hg zHpB6mI_4uCogl!m**2b~g+-`3>rt!lvw2zI89?IYuz944iOGqr{EDif zX^k#;`#|6m1MyL3@QIdT)m^p>cViQxx$Iz_LsA-ld|#O)BCB)~>V+}|91+@$Iu0K>RSbf7r{kF4dZA!`W$AvGmW=>N zH;HC~c8W;=jSA@GR$rD#KH1&fvgr%+N& zqjL-OO{0VTDssP=5WHjo{uxO^Guiz^Dn7M!FZ&U#ZymuLaA8+)PLhf-GA(DzkXj%j!q3?mT7iWFa|zb<7atoO8bB^zKy`Q+PEN)?@(+_m8JRFH89JHyo5gB) zb1Kt7sN*@Bec9YWay~LEDDXo(d;HYy=f3MAkCjNvM*zrt8Q@HihWUj>eD2=+@zpPX z8M7yj{?+KnF!GH5ivt5FR4UybfiOlPXA$IyAS5*LvR#}^0PV6;Hi{6lpq7^XnC~Ze z;_%_2rH;Q>-Y3|+;2~{fD~*lE#o<49Z1>l2`tnQuLkisvMVo$5bcL4c* zY5Dv$sz^kdGRZ(XZa0vPo&X0nh6ZYXTQKZ9mwaja4%NOrGU_Ftcci8t8O?ntbNyuo zFvCFsgp%x$&#TEZ(#=Z{Dd6wG@#E{KXJ#lo{_`3@q~t44oUv~0>gQft3AB6!K<4+T z&LA=2-_y)E^cnXTzuG@gMSXl885t)X!%nHl&`+8`V`cIM42D!=S+^I{A;KiHfTX@u z?L13UQ0VWMokEg@#d&yi9p?%_M8WCHq#ki)3BdAkbYzqu_Vbas2t&nkCN>WZJ|^4q z$aFAUy%DQjLTrnnAGO;lImpo+$kb8U@IlRR>`HL9M zFORz-Bge-wIYbPBp>~vHtt?tL z^#HQ=f9&9Xgam;y8|Yk;i6T_ufsg&wH|8II>KV9=y2=C8`YNc@24I#-G9L;tt%B?Y z91|ya(nTEkY80G|`In(nwrom8moa_fIDYv9zk21!K>ri6F_e((CA4aI05@N=>v`Y3 z+-Vu5f;Ft)e5nfKy5(VKi1I62vz?lpSVP3`)i!L*r{lovi6c01@)+Gff}z1-Y~Ha4 z$QPBS3pS9t--Mjccn8urQndnso+3xfvHr?yU`5_&(yl)t1tgIqiYPc?Y2}56%P0?^ z;qc^ScjwM?I&Te$3@pvK=b^_Rn4DY6%LbC=;Z^k428@#@Ff%cRqx<$_X<-gm+;l5L z$pS5b%pxTb5XuzLC=1m_RD-M6sFlLCeFG?%$?)Wn{g6rGt5>f=%`s73c^+UHVE}4u zur#OU@1EP6r*Z*w_kDepNAqh&U+c)cKbh-ID4aUm{T=W8sZXCebqYD%R^KU;LRK0rqdWi+J(0LZ zz<0g?1+g)@dygzBLyukL3nc=(oSGz-dI3V8 zF2JXmHw&my0KRkeHw2L#I4SP9gwh~xj= zJ+|;u$ES|{O{>1}x`e=O7}V@aiY5B|>vvxsZ@+x+wSW59$-gddxa4-wY6KolyOftP zT(lNWp}&0`S6D6BvsL)C5{BEx!a`&9vEzroetmY;^*eW6{_XEw(aNCZ0|JT0@BXv9 z(P_5M+ml~*?l!RRz%%&!`|eAB;XOZB+_QNXCZ=Z2Y&b1L8zNW*%Ur!?{TtUEJpFrP z&BfahYAD1WictgkspBZ?E=D%)f>F+J?9}~OXxDJrwgJ=^rZL#xho|;E{gEqQwx_pu zfcgPw`B(r7z(ZfVAM=azY6tM=y+^B1sg`lu8}EcuEPoA#{;DR!x@N11Mx%umk^aV^ zG9G!X`lYwt_S%6@{_!7cCEMN-cj_Mv-PWD`wE~>{klH5x=!|S1H;BQ}%__WXQs63; zK1|Kb+)!_{E-ekNdV%@y%afLk0LZ++SH9{-v^x!0ME2)WK=eMkW*y%1-uGR9Xy13< zJ$~{qhKC2$((u&O6rSFH5dCY`!Yr0i%A0rot6OjS!}|Qfv9XgU?!NcFC+^HUIh0Bz zV{RTv327HwcsN%;_3;?MDEkmGuXHP05)ydfO4rkI5~D2wf@rEckbA6+3A@%xO5jX zK{TOt8C^Ys>-JucVyTG0bcEW?iBzW3d5 z<6hix+p96V*g!~kA@hR+eveDc;JFEL2SZE>$NDvc@Bp1y(F z<)Zcd>o=l*G{EfSET(7YR4bWm8QW}lYQJL5=nj_dbi(mUC4BmV>ssctd@MksVe;g0 zmAhBwnp$id#=0Fl);$^p0cIv!e2qd8MrbwLs4q3Cu^w`!fxf;n;&=o{PfXy%k$rvd z`0+bGk+V&lI6e-?ndW;bmX=y*5b?L9qc{i=1TNgb!|LIFHGg<%sd?}6SU3ItX!(SJ zX^02^*SE-|hRW}Iu8&JD-TbOoUb|B!d85;AlaaFCpTLy5ez6WbuCG#60$~|B%+JhV zXmpSf!U%;YLoBAg-C|_n)9eRC`5s(ai!6>&avb7_3=8vhT7ewK$Hsqad!cyYg)MVh zK8YYY{I5Uw5at(W7_Jq_C?Cg89?Q0FU5iz#MxezZ(#$}ZP#BsWEVW!}vrElw;1ogM z#OX0io}OY%U&!Vbmb7wC3dVI6RrpdL;K%S}VmJlCCGe{^n>al&ODo{xyWf56gNKeB zIlA|nYw^?n_B|I~+%l%+V*#kqC&#B16HCRSst+7LUH|;iQ@=5><&q6I^bPiHuIBQq zbW`ioG_w%Ik>NI5+0^V@v%a)A+id##TT%44Pwzi9{oB9)*>_&LY4qw+rLwM6C>7%* za->EumJzkI7W@p39Y5tQ)*H{J2|hJBJNHGI0n%TqU3g*3oR-mqkPJSxR6jGqO$tQh z+I>GjsOIxa+LsSCWKw>W&7TMsWm#CNe)-chWn@bNm+nJ){SC&JhN0=Y&Sx?-Fq2(F zRN0x9=~-mzrWyt%y@lQKL4C!Qg)gfSF)z{o*982(Hxt{uwwWL$00000NkvXXu0mjf DCo{PE literal 0 HcmV?d00001 diff --git a/demo/png/Shy-Minion-icon.png b/demo/png/Shy-Minion-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..384ac31a5cdcfc5952ab8c6fd5970a9a2a73a1e2 GIT binary patch literal 22001 zcmV(}K+wO5P)TKTzr(=DAj!bYpvhpFm|R@o7!csYfD?SX z22>3MmvupAq015gTq&u=$w2xK5XU7K6qPVAFvbAc+~p+&Aa(|jEs~TCX4in&ML-7v z*%LtQbO?J1SPg`|1FR+_$Qj5!17tg-Be9c^*id^xfH~O+%Az7DNv#07nSsI0iGcwW zrVvp?SRuri#emot7#B+rV)=_07%aX5#U~)dl4de6Y;R>?khp~qQ(3^kz~92auq%~`f#tDpvkR(NJ2%d%S(CZH z_VVGE2LJy90Nz1UeUj`h^#A}M07*naRCr$Oy$76JXL&CEOz$&0GuxZATJ>s4wrsiE zxPVPb3&NXsQ~NOk z{3mbDm+xBYRzta5G4Ja28n-&?HExYPsFp2MY&Pg$y;>y8x=}3T;PSZ99BVd574msl z)hg_E2REH&=b06rVTaA;;*Kh6yl%N{xk`n+8#YI%QYrd8c30N!b7t*zXUXAk)SPY) zta4Gm1gEpnHFbTm)!?Yv;P!gqSlIt+X_x$I3MA(I+zg84GIH4*`Jsw}RYf+PhMPnl z9~&isbMSgS7&vnd(dIaIKk*d$R`uh5{>h({St>Yu_#nnc1`unG!R7R#qpKU|&Yjh{ z(YfidEi;o-8z)AFw&n{~+>Yu=x4mAg+U+gky>KWn-V|#-7l}8YZEkCuEavNpmiEqk zUwUw84+#{)(BSZj2fq3BUr$euhuv;# zY-T32)>bX1+gc;vvMM!iC=#71SM5WC=V!9*Eq>VY<6X&eV#mnfF;{E6bs(FX9BYY3 zhdjaHT)DyPe=asBdI zB-UbCW$S(A3b*P@#b)(Wq$d}&4)bRKv}>0YHY7~gJvUP%2vsC z-?#qtgEJ$;n8hAMHuakNXKOx1e10Y`*HMp_km=E52RwKv1EOMS>u(Ot6*DXHl)z zVG%qD*$09ljE#*Uo6DeT)tb)_oc1}LF3+AldxOiDuSos!um4WR$%9XPX8TpEm$!Ab zI8mK-)-p2~9v(5C!ua?!c3!z0d!8A_z_|%@bp^0?MGVcYP4Icd`wQ5@?nJR1VT zsp3a4z6`Cs8xEjq|JGOj`5Obz?b$u)c2_b#@%DEOZ@cEEQF$)Js)8>+pc$XV;D(pt zfXfXRTy_i~VyFXWXJ%|8LxZ@wY0W|*RJhHcTYRK9y>~< zD%P%S$DOzLA=c_8O-UK6jLb{|bIClu^0mX*xHg7cZ(I&<#4V2yJju9)q@yUpS78h? z16{^i-GNl5icA)Ww)7*ke4{mReCC-$ht7QA{Mi$GufAsI{xvJtk^#sBi+v}cdciZ* zD)btfTM=w+QwLx0&5s%2Wo?lGIaJD|l)X$%kwrWn#@hY})~zKVBp+qx(`2YR0KjyvS2G45){d4(HueedEIpA^yVT*PXUiRX|vBXn_viqHzue#h*mYUZxCM_8KCZL1fO(FotlE$z-DuEpW;T^BCrQK0pDuWJ zJ zVhx~XBAVQO%m6>6QTm;aed`}KkDfoZrktL&hr+F2=v=WPv~1muFKxJ@`!3XmQJWvd z)YKH>QF;LZVT2N9$CJor3s}A~)aZTMbw!jEN;1+8NxYpM!n-Wz7%wH6+~ zF3C5Xu*e+L2!5NVkfAVh1c2M(tQR6s6Or0G~7eziiHiqQN{ zQg4u*j+0#%k@YhR`>7Ecc3baVhCmG*AfoGdX$-wz#0q+q_RxN61B=*R{9sO-1X5Nn z8EM!SUb&tJoYOD8(%L0ufPGKgyKeB@sm|tTq|~=;(-RI?`#Y|GUDsz}4S11CvX}Fi zPs|_|bCLLq5?#jB#4MKgg$?mVB%2|;XuYV*FKi;H_KE1S^?FNb)~l{(PSqa~d+~e+ zU!+AO`HkI%xrirF<#$d8nSjhx;XS4g3n(10MOOCks8r)OUpeiP#W&BNKDuoD{Gr}J zI9zV+SiavC?0Da*_3INk?90C`kqM~7K@`oud~d^S7(s7lq}FEhixixYKVg+V6$W<~x0E0K&Rq z5S=3iA;FC(=#Q9zjH8%Uv@lFC6X=T;V<-yoK6{3{)I_7u@T= z$dewnD;BWGe3x-s8U`>zT!GVVM>>`8kDPn9D;B7osWojT@jE|>+)-GC1OfrMUt|Iv zYnAheG|}CwO3gP2S?o(IsJLcOb#$ zcxmg69i|;GS{A%+iMjTPG6H4wh9}@A5heX5WUTMR2n%FfAZi2ciy0cy-ypc$Kb})1 zW;0A9A~)g$#+I8XpqQjaeygLDFJXRo0<+U;xcqC74DQ5Cy#=kkYthob5oZTRFgrVe z^kfFrQVwP7D9u)pzi}|`^E>~sE!K&3>(@N9as8%`*j@I2X#iAno0nBvk~n}xw4Rt8 zrG(g>yT9|NCl&XCOk*E?rDCv$GQnMNevQuO5WZj-@vNVIF z-rTPUw~!A|BQdpA*~QWpGzWE~0k|2(u%Pm5g~ltHr(V%_QuAt*exp2GybRSiL0)<~ zhp`jqk*%~MviU7InF*m(s9@d34X}G7ICkO`Qi)j-T#P1XqzVU3MVThUIG@BPRikn0 zXm9JlowwYvr@OEFt^8`NanqMiTM`DSR7#khnZ@MDK-<3iKjpvs9UojD4rcC)G|f_a zlJx5n2n*QNgtjY4&1DcVpC#!HqSr}Hli&9|c$4(AyK5w7h3Z~F(WrN+Zk6rMwFD3NR8aXDlG$L-%{+~jqKzc29BRWKDrZaTkgTJ*&2e@46fLDJ;oAs zJhy*83b_oN4ksDZjgT*ZNF>(4qYD7i;?HJNDY~!;6bo6CymIGFci@U0+i&DeKk?$; zxwLI*OaME}@ADurKHv(stf|FX1AkpfA2*#GNf@9+$=kc@J7j>N z(T&&M^r3qB{0f(gDw%fJBD!|DL_7gKs!|f)7ZK2tZf#`uHq^b2A<>OF;3g)iETDWt zbTI>8O$AzcK4k;b#1Ky*Bk&{E14&8wM4Of%c z=do$q1_Dzbk^V9q+4BgG$-?9Dpl{g<^mcWjkk4R#o)R8vL9ojUXDmmMJCBL8r?C4I z-$7UJYP|iuA4J=xEjW7OI39cQVT3}VC)RCR*UFnrT+l_AtSyNN$mQ~Q>hbTAlpfr; zvvRh(;pVuzfpLZQg)Nwt%^r8Klw~O!2$j z58jXQ^Jnpa-}_%^@9o9DXB8{5;XUvE`3Hlc;GGK(c1hb(4+gy+<)^-t7}|%XxZ4C* zWCCn}(A|9yle zC9GJz3J3P=!&m?E&)}q4=?VuBbvlvf{Vl)oCcN{Hejn|vtr#C3Mkqld6%;}+cYhP!X)O+4Iq&`Z~rmH}!r57g67z7CjXmnkAgu@vDK z2VV>W=zdI8X5sU~F2e+RY2bl|3&-<>>Z>^tD38ii7K!sC$jsC*mkpxoZHKdK3#wGr zH8N1T<{(n%ez@RL6pz>>h$KDHy*PBf1aDgugJ~Cbt_J2v?3ICX9kGx0wB-j_a)p6)J;jf`S`b{ASI{}X422Qf=P{BuA1b5Ark$8Y>${eQ7X4;_E}$AA3ty%(YJIRm!RnZLJH zN9;BQc1%28OmKnPZy>rC_C2ruU(!sU$Q0;J8MZ#yM?3Hvu+e-J5$AE4HF=W+DV z5hP~DkWVLw39`J65~W{ZVZ{!J39KA4xg=)k*V{c&tlh8;#Z(EsYqw%DRi~YwK#XcV zarz`&r=P$yLF9K19mQAfeFRp;LXkLnFkKpC%<_Gb)+QnvoB^wU5)lzrCN-e1T#SygycTZa* zT(__-wnbC0xbFf_fQ(U}AII4K5d>EMB90_mFim&s?%S?`BhZD1pW2TR+Tt4BJ(t6S zSaTHNrZD_|Kb&MXi=KhdzmiaMxg5dU91@g%h<(S2rkLrH-ul5?uFDW!w`#-y#V@*ebjq> zx7bNy0KR1BG4tFgf*b!3N9H3)fl7_h58rfIh!P!ne_W_rl7j>93!| zNH&c~$ViyS+7=>u#@6#VLx29! zl(0$?$rH!mSn)v&*4JQe>IgP%U5{{cCr+L^j)8%*=E1sFtbp6&#Fzf=uW)qN6Yvtr zx4H=cBTeYpaSg72>s!#lefxKP7e{x04_DsyX7sOIi*sj>qF9!xa8Syf!~`@Gr2?JU z8e+WOR86Cs4obM6K$38_?m&~*gKWWvJc(I|Hl9O@%A<&(&jXLgkEWpVTxQYH)k!Vj zL9tkf507T}N>At|s(uk1`lv;`UX6=foVHX95VlndU1kXOMZ{+_!*DVIi|Sw7A|psU zEMfrR1Q$;)qBuT)LiIY>dR~vi-~ATuy6pxyd~T}sJofKD$YU(@_OC`NF@sP1_J`10 zo55RF$1#)&BIG5p=zeCOx*uOXd<5_O=tuDO5B?4g@7aw#kNhjPT>BaYn$TJC^&ZoKlzO zH99@S0(n|LCo1d*r_Dk0;Ip;1cPu>LrD+#Wx4gLdP}jWt#Q@F)1i$e8^G*BMa|=Vc z4W7_vo?lKPH(G{w)BCXR**(~>ZaMt17-FF~_CLEHd8&AIYPpcdCw}*Lu(QdI&!0Yn zpa0C4a4=WGu0#c?U zIy&31Y3B}{OBK=I)`Z*oVt8|R0PE@gT^Y3Dj&K#Xc*}@Qp2ODdo3P>(0CM+ zUBt~vZ^c8^Zzm(W+#WF%{a`(&2CKf$wgfKvQZYcSUUd+)N!?#ac)jHx$ue%*%6JrSYyzmj^ z)g5(|N@cw7cYg!xuiJ^!nL65IO<3O@$Gf+-<6WC#@H%ZcaB31Ki+)`3fnVW$5+Bgp zFaT|>cJY66*K6qZec;n zpU=_}!54D&%;=turTmJ_A>^ifplpagEOT z!f=zgC54^M_3bE;FjGYJSM|5zlt}<7!pC#-xjY$b1+~C#R24qvtvRSQ&YnGkzU8;z zr$6w^7(aIsL;Ln3IX8*n|W_9cr282 z)GE2gGZ>4d1QB`$!_VUQ_r8w91GBj6-ET3(kA?gQhQry3v9U+X8qxed%{(~;po1=~ zu*k(~OT~Jmw(MQQmNybNWglr3NEnmJQzhZ6M9JD`_G`Re)3DjORGGGN6@@|^2hUhI zcJu^1lxUZm#Nm1KiKHRE$HjeA?<-dJp_#t6*XcyeWkZv_VupULnn*7I=Ee4&W~%%E zo;;pF`|{<8w^AbIWjY<~6gyhlTB$L}H0*p8k1Cfe96ox=1dgmy9u>Nx)mj>rYLbK} zV=5_yS2t?T;X|2PZT{GUIP=gy;>!>0NB_1RwEw+4&O%R5FPb8eFO+Kp3O}G3w&D%d ze*lC0N42Gk1K5L;X40ipuu0pZO*fet{LT#VHd3@~M(vAHYH*MVOj4*-KrM6|3akDL z{@*8l4Y|z6@P;?N5$)}5$mX*+clao=fS1HlCa)cBU0t~0H8Ko}=8bqZt8+;5_XUwQa6D&Y>Sz2X$zdd0wzyuU8kf9DBN(u^VDn34hHM$RbPdqEi z-Rv?kfS$0I$JtTL6ft~$3_Wju7uq-NK!yli!5EdCsXJXr4xTj8!@8}D3}GXH^qRoV zqr3LP<8`6CtCLTq01bV7nlP)JLTdahCQt3g(7}D!d*nQxIywno>q^}5=AYtq{ODgune1c5_M2Oq z@n`?%ukq=R{Uzp)9)&+ZEFc5G^JbH2j20@`^zL84?Z5D=DA#i2KZS2qh0IAyl*i!V zeJI8INjTyIGF@9oJEGN!8DDtl!KV>%&?A{ULtvVvnl2zWGlRL=IgCvwF*IYL;0$5q zHFsdkRo9Vu0%&fDVcD`iM0`$yP51X+)H#>1EfoU5H=V#W*X+Q70|#KyETj_C z@O%6OW^tr58I89mZVAKXiE$J;4l6HC!X1d$)}&d=-Km_^|-O_=9O4=^J~$$ z@(Qv<&M=^?j*?9rbStM1Jc^@7k6_hJYv86?5uj`%CJ098MtZ$wY=3I1hVfY+hE5&A z?9?OyqXiEcF%;|Pd27+PY9m#B9Dbh<(P$hUUA=ISL8FzU1b3mE>6?7J0doKC_G-}p z*%hl+&hFiKQ|GHR})6jngPpph_H7g1a<<-tMQL z#I|d8BJ2;MLZ5$nauRMzc3U{YPL80EFCbqikvRy#h~5h+s&FFuE!SSl?PfWDycJCW z^Ki5H`vPwkfgH^S@4@Ee{UnEQa`(3}mMCF6wTPV12nladTP0@`ShIF5T4GUZArZ9; zYp=W!g<=+Es{)VHP228;M`H+NGy*-e5L|jfEvRMZ5llP+XMoRH&ToY~{^B0GL~Y4T zz}huyKe=Mf`adm~>PV%tfV)6-Tr!g|6ok<@L6wNN!mY^8)JU5OMlIS&!LkP*cmRF< zs}ZLwHZw6vd@zkxPZtSULOkAr5xddj25&HT9-Kt#OGl5Ncq8BN zFla9HT2(5U-ABS?F#h;g@z~x|h;(!!-c0*X4X}Lq3Viv?U%}@-_eK2f@BTVo|EAX? z*4mD)*(5bjicFU?rD`RuUV0`@mkYsA69VBV>;$0YsYCFM-b?IIM$OYpk0!Ue0XZez zKU@o3%(i3<5cK#yv}ygO_l})A-AnCF*RDo&T{ja(OU06jmX*1cRGO6_j*yz_SHrGO zcBo($@xbUf+NoA|UUdz=_{A?^_3#)~ZUk9&WG8KObDX9imBHxPI6B%|;0p%GP$Y~{ zeE_-5fdBv?07*naRFR#}_d@xm+sRml0qB9)X|HRA1V$eHEFRgl5Bttc;b%Yac0>F) zf6qn9&OZCkSc#MP;wSzTC-yyo*S+~IShac!+G8;BQ+2e=y8z5xbPK zaFwUvDvZEgo}osdR}pNYDRGkcC2AQzL1PlOYGoZcj|}j`IN;TQ0Tv#jB^JN0qqF<1 ziRpQiW3&RE9PMYp1UrlwSQr$N>X!Pi@^eKKJLu}kbVpqkKKn; zPkaZ@9X^Nq_Z~;j>aBR~PrQ{LN)4^u?Fjk9c=qAHrFQWU1cu?_vp70}Bqnh~WdQl( z=TJIH;OY-h#XISdc;iC3&5fs{;KK`Im&=yM5D2tgcBWlHsHb?NGOKbs_Fc8E> zko1qY-gwiEiIH>vt&mBgK&on-r(#iM5(ie4XrTZQ3GZ{)5TJh_4RQUYcsx!x z+zz-Y)tVXXus0cPWwX1Csd5vns=~PdsFP;HZiazn9)xik)7BK_q|Xa`rMQt?(ir-< zgzb_PiAv54{KM(pUw)_DsXTr5dbI#AJId#-BH*bZ?5lGF0)9JHC_CIkJitvhR$~BZ zs~H7H8xlt!K_VAKrtMBl&g8JNFNSqj-hrm(PK*tm!->;pF)}_xhB-zcb`<4wg4lyN zL%=Xsz;w#Oe2!Ws)Q%f&yBphgUWX=M2u-mNdX}$8C7Zy$|MO;eF;A=!CGmA1#3jTe zE-`_s$<=74sAH5GrWk_L=`vwyQ_z|w#_mvg8!-i6-9BzXdIgyzqblZ^8?7_cX(2dT<(v zd=O){H5ix;pm}*euDkL|GM{VxvBHWX7WZ#eX%yQ_pZe1 z{xxWCYlF|{MKm5oSI=sbP_qA1KLc_ZLT#-JOh{(*I;aWw>T@*!pNV42us9V)GPvc1 zjr+s|N&=BaP*#xJk5H%^`%mTZi~swp`0BU*bxTiY`{4^aXDQnyD-&03WCG)PYjjYI&|rdwp45Hnb7P!9Gk@)x@k5(hoKInPvVyT(3(jOa(A?aL zP1|omw0*6q8Jw7(!0b#Ksa)11U{=a1_d*P!#82Xc5bd-ghcP00Z&Mdi<7aUEiyuIB z?kFNHaT48a2=AtiSB{~ZcHZL)&{N^PR5TbMm$HFh%=9&3UNVQx)EI2Ms@NoK#2tKf zAchmiMsfSE{SE%`&p-O@-}$Xyzso%4_o2nBCKUYAX0x~d-+G|)y_&LZqCU1FHy_Dc zB&n(HWh;$%apU)O0>J0<28>t0cibufXj-sQC!sdstp z#P`l}5I~p-CExbN}7^mY)f(8d*b)Jb^~hF5Rxg zOiZyL8SHr#ZFWTLwBK=fV`PNM6sD)1!rZ>caO~*-qN{F0?5dwbfIktBwNNN|F%hqB zAzvsWF*lC+C%=KziLatQdjzp~5Z++iWC*!QbeF*)WCDUihu^_l<2~{g8l`CYS%obu zyJoVpku&rv??s-6Zk5C@s|tFlYBGRlN9Qm#avt4b7g}06^<;12_L;^5Ep59*8bHiI z8S!?1uAUEVQyu{QGVWG{XpvFWi&CEriE2y^ky&V*yPyb2NPQ=QQpy}v0&6?sE8_^n zn-H6sLSk$J*|VR+;P^qR^hw(8C~ToN)a+iG0&0WI1S**^xT`6IgD!Y_I*1P%L^p)j zE15uMz^Nf;5m<$*j9<@t)68U=fl4tCyW3^VM78Fo)lz7i_ogu~X@Rm9t;!=kU%=Gp zI3~yEux!ItgaUDlji!F8t2^?U=at41wo7ILOtXi-3Rl}-p*F_{m*gl;uN;BK(lHGt zSp2(y0aWeFr1j`CH`-wvnV>P4!~KRRb$B&-BhX^<@3YhM2+p2FF`h(W+vB#nZSF;t#TNQt zLDyZBcIg;E^s{5a=I(y1UL3duHcj`|?FcL_X2D21O4l|H7M0}1L?M~eP%Nq{3}MtXH!_e}q{^&Eq|mb%Kofv$Gyy(S21dTW zn5?!?gi1_ME7#!RJ&%o5aqx5wH{B31rC=-tdjw!>sx_=Zrbbpzxl%wOpG9^)iR4@w z&ULS)tGNN`#2f~PE1uceRm;QSz??$Yi%kf}?=zhJ{J#I_wuB7uQr#v_*Ho*vufZ9< z1ty!P|>d!Yj)4~^i7&et1t(86&F8ygcMHEn8s8J|5syX_0Pko6@{%I4_e zS%wMf3phd^f$I7xaN{7@b11dUO{v#y7I882jZrkW zc&Xx*>0~F-m6xD%hzl$dzg$9@0JNA(Bb!YjhY%v0#q()0h6TU9o(qNiXJl?J%nw}( z2W<%%;H6y5&w4<2{xGNUP8C6c&4oL|Nd6 z#W(W8WQ<&OCgYxbg=$f1}mkr>kBip*)yd0~t|8Ndz?+%yF>ngYces+MvRMy?vg`O-BwF*JiW+&F{YLU zF$LVDV$DANS?DaisGp>wjk}2VE0g44;h)vgmACTg8ZB83DtXcle#$&!*5F#$`C`rs%0P%)drUc60ksBA7rt~L9I|8N)ChK; zh+)f>8?d~kf~Y3}morOOUKzc`hOO4PM2V^!QIzX3q-#-Bd_AbPcAK=d)cCVl;rtg| zv0g*TexiCUXRDuVXf0`_8t<)A)d*(+B}#vZ=jpYOp%)NZ4R5>;bppaFL9eqo4e#`> zpGV)@RVa(_t8JE({M`_8^UY93C^g1Babg;Fm*P8fvHwhqBp`8UddxTJe1zSd;%G& zX@4MO5;`0N8dhNr_2N8S^io3h2}C@jXbomeJRn=3TUV?a&%u}vJ;#CxklR|}cexU6 ze<6!ZvVi%S943cS7+LXN1lu-ZVrm{0TM+Af2k`pd0d)V&mwtxk@QWAp%#yTAZvqTo zICsOQN9>Lt{B{Yw5{`@ZA}KH)cv%_RNvJms{9bLZmQ~X4lbf_x0R+Ip=NLt z;flyEirbrOF z9Jcn2n4KQyGkD3zNp!}>h&|?D4c_-**P5UCPsjjj!gkK)@6~P2dmQDAnFnAMDws$I zF`n(kc+!P*IfNv_M9p>-?O_USi74G^O8MKXCHU+XJee$fBNK=@r?E1gz{>6vTv7V& zbmz?EVoOX@;Lio%ZgNxL%4kA{s(&1IYKfW-QYe?dQIqdpauVE86BYR#?f4wu&&=1T z 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 UgbhziTKTzr(=DAj!bYpvhpFm|R@o7!csYfD?SX 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 literal 0 HcmV?d00001 diff --git a/demo/png/despicable-me-2-Minion-icon-2.png b/demo/png/despicable-me-2-Minion-icon-2.png new file mode 100644 index 0000000000000000000000000000000000000000..1cdd51c03667eea3d3840cb9a24c04d967052ea1 GIT binary patch literal 26812 zcmV)TK(W7xP)TKTzr(=DAj!bYpvhpFm|R@o7!csYfD?SX z22>3MmvupAq015gTq&u=$w2xK5XU7K6qPVAFvbAc+~p+&Aa(|jEs~TCX4in&ML-7v z*%LtQbO?J1SPg`|1FR+_$Qj5!17tg-Be9c^*id^xfH~O+%Az7DNv#07nSsI0iGcwW zrVvp?SRuri#emot7#B+rV)=_07%aX5#U~)dl4de6Y;R>?khp~qQ(3^kz~92auq%~`f#tDpvkR(NJ2%d%S(CZH z_VVGE2LJy90Nz1UeUj`h^#A}M07*naRCr$Oy$7HiS9v!4Y?+Qm2Hyv%O!S5jx=|7XJ^lxbKds6?|IJ|SG``x|CIl}#r@J#|5N@umH%OY z|K{a?7~sEo@xJubD=*^{<9Ok@t?+0XTrSs3FZfrAAQ0QOVJj@cL%m8Jb?2>{JX*JS z%EJ$AuFF1ojSFtRwVluMlNu@&1FM!T#)?%-`MHWChmK=U-yru3^58*Vzx(iKe*ZKi~2Mf3J#smgc^~{z^aVhJgz&y%h0y{G}KC zCzp9)fc<;+;KLvJ5W?XoJVLNnPy~clYc?#a>@ZJV=qZPXhrx07p;E7UTy@uJB;XR; zG?yEe*~wR}Zr3A*ZP_lDH}7_PkGZ`1qnUJm+lSx(cKq3@4**sX58nSheCmsL!Ry8A z3#H;MwplsLg<6Kq>~q`o1-j4I>~hsBR^2t^b-BmMXgQaw*5`5Q`(0k`pjY#cc|9J~ zYBh&R)&Dw)Z^P~KkpqRJUfQo;R!q}`K?eBA{rCU+Fo5RM5sM`eiG(Szuap4*qh@eW zd?y${ii`D_h8d|_<%P&Tp3&qlcvT5C1so8&1 z_jtCpq~f2Z)+oR>L$+1(gya4Xty$7_mdADrBM9o@sXjB+pYWj zu#daz)r{_|x4Aw3%`T7DM)lI`)?I^Sg1uy}2@!uXU4sGYWB_WsSI7XCWx?bjO!ZnQ z^TGg9+-|B&QJb$&B}#F*+=_7=25?bL*W7lse2&X3obIZd^>W25Wir!kv1sD{vp1dp z^9>u;8JAyn*}_1mc4l+bv)L{mZ!cA{@q8|e(UE~O&)k3?V)#zd%fvP3x^ex5*Pv@b z8HdEhqhD2-HwKuG;;Or8h|6sx{<$!U z?WSEXPv?sD)?`cHZ@&F^K6l-9H#99=*7`ow2j7fJ-x;V*YpBhjV*3!Mn!ti8mapjm z3OUq_w6ga-Jvv9-1G_RVxA1x?cwVLk8ZFRitU z`E@qT&O*L$plEAj7oB@W?r;A3uexF_+D}k?@>-1l2z9fFQq@aUs$r%S!j1!-{QVHt zE%hrC;?rG-_zgq@CZ)c}>s_EFXaKkdxD)~!l*DS8w;v_E(4%Lpj7I}Ss=Yq+cou4vk43BJj|Ig zbgzbm(UDZSc8?A!`mNhSW;y+Nmpyg0JD9xEg;LPv3T=@A zd<7QZHCJ9$1`vB_QxeTW`hsdPzjR_^vitQ{T>F_zu6bkU#ucvnx>n?uW8x0vOU)>I zu7@YG6p?5OP2$o0JIrV%SHaZe6n6I?g3CCDWgQb_hH=oukYQNKY;pWe<=0g#1DeMT zZ?KHg;fGzpQ0gro{KJjcUvlp9hd%VlulMvH+V@>|W!$YtqE`fo1-<^r({vF|*7aYk zylM;}{k@eX9ZcBx$&rfpvVcjEPEN;S<(xN^aQR(0&zwI4rx z)`N|UVrUM{Ky&91_Ok&(c;XPJG>VC6)XerS2wk@p!Emj#otkxM*jsVtV1s_+X@Dd8+^Tg@5o~ zcxBhmk^YyaYN>>raWO(&mm^3_Cq;rqbKT2adIrab`Y|>i?!+BrG zO~LOgpd;dX?;rm0jf>10-g4`$A1Sxn_Of`YJ#E{b(UYOVmoGKTMvXso>U{OfyfA?3 zGF>fYnEwsq?4mr|W;KzX7>XGPOn>Q%U%d4E%i~|b^O4f-6hpCx|Z z-aUBiu_v&7+cu004WN`8gJtGfqoI83y30d9&yPsF4a-)Yj>}*F23&B#MfBR}22zgA zk^zs`i)2#@Z~d*C@%`IxN7W9(<8Fdo8z4xG@@5SJ&MJXM^iSzI+d{QkMP>W|g2k_2 z@xecO<954dz5f4x?$bx=)=)GQYnxSuzqCjo$f(jg`8OElKda0O14wktDCS{!NZx-7 zow+qnVPt=FJZ<)W{No?{-SaO`dPEu!v_l%I?<^=p_TSAF-0#yWj^cqU}G5Gtwx9~%M z_KwF>EiGsN!T=1U{>YV@xZ@YX05 zOG?A*Gzqyv4)@&m1g_ZJhD7=csC#I4Tt3G=RfU@6gvpk3aue|wgc&sWgE4s9Uq5{R z*23~?Ia^fZ|5s$dnfL-OzW5R(lF64|@Sj}fg#m^J`tjr=kHD*Y|J6{i*kPYPKs$U^ z_rlcCV;=Wm4~$8a%y!J+8gzEHaDXg_iRd1F^IyJ-+rNJYw(r^jy*iDhJz*^Dil8;2 zqrD}7WYmXP(4&YiWmaRztX+kSV3chXsut4eEc*J!(7EOseBdv?fp9E>xjhP2l*NrS0riT4vXQQiUGeRM%SrXr(miYQtzk)mNyc=7#K84nhi4_ZC=xPsP zQD+z}DGiB`kDyP3&*$TB>NFuFyLfJVujZpju&O~OAk$SV7IOJ2cJDci)QW5IfscI) zz5w0Ix{2w@G%Cdc9)0o&Y*@D$ot3Y^XC9?+iz#3|vy9MS0LN31gBnMDr>Ti6Pp}8R zg}?c6cd+>{=5+KmU*^NZdPSvfU{Oy5%NK^w+peQE6+|TJAp`gj33?Ha1QCtsh*BfSYb2~w)9^cC z5)wKR@}n&o#>NdRFnQn}-1(jV126H4xS~P+wpuNrB@w}agMBDA-GXA-gu7Ozxwm)_ zvD!4!eo_UsmX^IPA+$cYrazb*(?P>NlVT?>f=<*KnC16QG1a>BE;leW402}&m?kXUsLj>OT~ z)uE(N2J!KS9-yoDBqqiuu(H>W?he{~N`HHbzCG=II7BrcA@GZ8NXETL#XVHvKDa|6 zc*9Y6LkajoNrJKj$3F&toEjspqq$8-N2?!A31SEScGc2eOb*ZTo^=cdiy6& z9h;XqUL$3G7+@AG{nCTqSC0QBj0p;nL4UoBYB`8}DTG8*R8^6knZ|<;Jb>MM4tGQ##$e5Pj_c556bpi^ts11i||gJmPTE ze!Db389*mq^Tw($Qc;XSjON~P{U-z(%fTjXR33AxVWlbneY{&5N0p&?Z>_C8C zG#WuZn?|g;3s3Ji@Z3QgyC*y8R_bH`2_)4C8Y$_Nc8l6ULc12VfSOX~t5Gvy7RFG| z9etbX*zDBvueAnXhs2$H`GemXnOo}C6yFf|2?NlcPUrj_Y!cAtaL5ZUJdZ>D$5n$` z6G2M72eAY}9{v1az^jNas^1&*!yQbK_$0hXV_h<>tK`_R$+J0HN-NF!>@0#0G-3zZ z`FO;I?)Es6!3stP`-l_dCj^g{LC+$BiODgnUeSv?9-hD_zn#OL$un@UdLDFtjoQnA z!Rt)JK*h9CmB5op2C(Wh5$qmsZ5TyVXZBvnW>6K$%>^sG_;_t_!LQg0XkcOEI2oWw zMyQe;Wi{AUBZL@Hy=97OE#lz81DKkeB=KEz*}RAn-G_+Ubt3*yz(Z!SNqnL{Jw&=v z0|@b7d>>&3m8vC!E2c*RQdCITFHzx6@ISOe6S>+QIrogh`5&)F^!fv z7W7x9u5s&4w~L2zYMGOA{wkMWEdxjg?fMyYV`2rY3I~VMU$0_%+=EO>LkHEi3{7@A zjs9ap>L;yK&&rplz1OMgeLnj8WClMq0g)Zmx~P0gwZ+O+OvV{W!T)M5Pv#<|Qkff& ziCmfM=V-g!BA&`ZupMsNc3T0$s+mW*OyXAz$L;a?S8<86%@6?t3(cXZBU`Mj`^2o5-1}v_$Dk=W^;7Z3KK_ zzY7t%d$N`zqNLwT+7m120ornj;1Pj)#P4s6szhSkmdeys-^r^4ZY+W_OU#Y|o7x9f z38ey&NQtVO_FE&sb9pTk%LJvR0f%8(Y|Ogfw@Ko;K1kd&}oyyAwS(Qnp(??fk6xA^fZQpdE6;+ zHjkfx%ZnDO?p`9TGv51QtUUiR6f+s#%R@qw;1ZGJYh&pbwE#!EG3cTz#9qi%VScGo zOGx60PFwF*vx8YORaG%dK=)zkvZZKk@4(czzoX&=6`F*;!-tVA=4tnJ1@wgFT*MfD zKbeqi3J{#uiBU|$h4hS@Krx2l%s56%5A3|`ipy^Z27~w6!ilQPPMiPQXaE_ElMaQ4 zgrZCIrhR+&e*XyFtda5K7#|tM=;#=7*_?6(i>0DM(jNX!qiXk2)#fU|j1j^3!7^rY z^csp)JVwGNdU`=m4~xhsEkRi^l;kZ_@I{g;RxcrXyG8;MXV|2Um;f)yuDlTWC&3%~ z=PGYch+xQ^ewp8td4IZqL~1AUmuWGPKKiuQY84J3m6KbskMV`NTKiGL6j?H<>P0w1*KNJY?q~3 zGz|husj=vZcytb-Vmc?)t4usIG+5?u^5|VqMO%BT%o{4w&rX%g-`9#om=^{RB8n}a z?VzUlV4KF+(9jSjCZ^ER(uOWdvCQ*N(+rFZk77DIL)WWJ^j%R%f7!C-2>N}{U?7od zLu+*cYd4;TMeyT^A5yhb%C20RLZxUS#P3xh0cnYa@}hRsFsmhIGP)#~Em1o$PBNpX zq|QMO5R*X_tWoRaiSUK^fk1$^KSo5~M2+M}CNrfXe1bAGnQY?E!qE`)vX8c3S8Mxx zB)*S0!AGnj8Aft=$P|8=tRmKMlQ~^vI9BlUnpzWRsAdaR@za}lEtGj-fEp!G?4+xa z4rUmpsNV+{FI@7;NHl>$A&)VdfRV9rGC&5C(^(wrAI9dh&LR_3kWNoywY;CP?D>n)ug3a8du(iI}~T zw}$$a;_dLI^?DHtLTR`QhgDu&Bpg+^ zptENI&b{PH?0@vj&}j=QZ5^1H8lu!C(H7B=>P%ta&?r)8UqOu_;p3B$#@QmaRVHZE zT)nt~YR=xl0&`1^uA%NH<{$_xR|@d^bVL(LglUSrlw8tIIUsR=Kp+(C?n<7g&`T)vzDllX#+v{rD4m_v*I)}`fGd}h%*

qlp6D}^Ia3HXDo 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 literal 0 HcmV?d00001 diff --git a/demo/png/despicable-me-2-Minion-icon-3.png b/demo/png/despicable-me-2-Minion-icon-3.png new file mode 100644 index 0000000000000000000000000000000000000000..f000ea03b5bc27bb3cb7bb706e2c42658c1cb834 GIT binary patch literal 32685 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 literal 0 HcmV?d00001 diff --git a/demo/png/despicable-me-2-Minion-icon-6.png b/demo/png/despicable-me-2-Minion-icon-6.png new file mode 100644 index 0000000000000000000000000000000000000000..b36ec39db770aa29e6b18f61b60516851acd6bf2 GIT binary patch literal 29896 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 LNkvXXu0mjf;0^F~ literal 0 HcmV?d00001 diff --git a/demo/png/despicable-me-2-Minion-icon-7.png b/demo/png/despicable-me-2-Minion-icon-7.png new file mode 100644 index 0000000000000000000000000000000000000000..85a3345b220ccaa76fb2404127a44f3bce256904 GIT binary patch literal 26920 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 literal 0 HcmV?d00001 diff --git a/demo/png/despicable-me-2-Minion-icon-8.png b/demo/png/despicable-me-2-Minion-icon-8.png new file mode 100644 index 0000000000000000000000000000000000000000..c3ad1458e606f870d540d6c8cf004aea2e5c4c2a GIT binary patch literal 21991 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 z z;p9J;F+AWyn@_;R*?A;K+EB07&`FwNC>|iK5kO666GJ2-EJ7ku^g*I1pUQ(vyGS2+ z=v}d^Z~8M?7K<)*^s^cvh+|pJrDo;AZt!EnsYOYJ9H(Fa0Y@x&DA6R8ueFv~vWsMDyl(k*w!BfYywFYr9JF(^1%#kne z9Nhix_DJh}Mt%(W?8KBbS4HKvFl4D z7G_}xu34F>TlN|CrUK7H52?^7H(wc>#puRv^u}bg@*)a(9U|$7w(GA$NO6%P4)*dD zaK##Yi2&k6IbN!ai;GKWlm&D|5-4YCSX^2LHdZjcP{PG;lE5T^xHy(W`UwMVxg^mG zpnG*}a#i>VvIWV4qk9NOB=}=IEQF8Y+!qMMvJweGCS2J7 z(9<6re32-c<>pt|R^0)nm&b8o`7G*`E*0wq6!j9$E}Z&MXQ1Q3_3az}HydtcjjW1E z6bqbDtmN!ccIl1AOb%vy909$Cma>lio^FIm403%P2zIn0Uf0<=0SZjY?H8*U>4?L3 z)pl&ZeiN)l0pB_>hHAyY5pux%I6e3k)UVHg?{py(C3WnUp@n#~e|H3-od(f|jh1vb z2DBt(zlV}qM45C-iA18nxd;R`EENnwA{+6L28Wkm#M>YhzSa>deD`;R_G=#(gYA=S zikK~KX>LBjCPLT_BqaWPK|0qp-~g*X8AJ^r2|kdzZ~jiIADw~juXlxd_A^Q}Sf!2` zfa322S4qFJeyaZ2L>r|{q|&qJENmMbf-8sN3jn#<6+{XGjCv3YloD>6o<&RCPb$;G z)Wr;jdgH{^JSOKUucuV7GZ7|;H}Tla4AxO+zlLwYuBBGUo`yOp^n+Xq(^?Jw!(FHl z1$Z$50WpM{Lb-pJh|CndPT9vuV+!V615nqwz(3v>IlH9Vt7wLG!RGF7j2HI#{v^=eIH9p`>~QajYR7ZWQn}^3fmPJ3btT7*1r#yF{R96p+Su_ zId<JqKA;pzF0Ql5QfbMlq9F#0o6LSArNF6k!mz4sPrOuUDYQI+5&+K{+)}l+mCl z6i{TkfOF6t3c!tbAT*c9Df-@gK8u$T_rCAuQTRssF@H7(r%^(r$JZPJHVyI9u(nh41gJ_VpY_TS)Rt! z_~TF%AGjKiinG){-Yp5bZ9pQL zD_2P@R#P38S>f~Lnrl<`!uB>|k0u|ik?Fuyr+{LGgkPoD+(EOsdnY|xW&=jH0>9FM zNT?evi6Q9o{99)pIL@xQ4)Odq|)W+@34o;KTx2s`Jg=#x7Pe7&Eir{Qam>5J~}|S<7$F)aluVMX2Md z0!+%~g_?ngrem{q9&fnGPnm*>MxY1EF3RCIFTyQ|u*Nx53RT2=>UhcSt@zh{GibYZ z2*p_gOQ=I1bus(koO<|&vwuF?*@=Ai)bIA)y=~B}bS*nXcb2<07LcyG16X_k1$_(} z!cTdX;E+Kg+q#c_v&)9rvvuTu-XP^aCYlFeawHtPY7h(=sf>i+#Rd*8oWx9p^nhU^ zC@CwRp(KKSAM}bxsBme1 zp21PUBLDy(07*naRMm3mlrgaL;5ZYWXyP@yCBz2_6=J&}#&^S+dmLV|2rp0RT-bs` ze_zj-Sl_8p)>1<$ok2VpM$j3+WB;aOaUsQpYa-e@+Aut_RTw@8Ljec+1aM%Xf?c&vyeGO77o{RDkl0(Q z6|qR^;LAsLK@F&=YaF5retcto1_J>sTjZd193T-Xw*wIp zb+$!0dwK?*o1$|eifRx>89dAq2QlnGYSAIk@gwVeIQZ}qibsnmQ%X3{)r$z7Z%B|Z zw0ZXrt3@YUSfJyu{mdN)ZQcD~y9r)tTXhF83zSP=d<;U6ttwUPB`3&)XxiP}m7?Q#fPly+1o@=rPQ zsMKo6QVxHD_`Wu~h<+sunQ&jP(eYK61Q~~V%E6>l!Wp56y8=Ft44@=HYVK3yF{mMW zaLc3>mUvhb3aVj0g4+OJuZ3Wc!x)`sAy>ifbwg+r zcLqoost6nblB5q>DAE$t;q$cujxS8&h25jrGdzOxvvc^Txx?T|W3KZjDbhJ?qt8`! z6JI&Eh=Gubu*e}mJY6J5d#q5#MVUn1fQY_c32a4}onxCimy?@-13?6W;Iuw=xHVZv~&Qc zZ4sZ(jbk^#@_9XnA+8I#QW-O50Xc&7dpftFD;{qak#whKvEL@BHeLLHj+bdQVHRE3 zjUa-91le_ykc5LjK@R69Cnb7tbVdUt+|(dx0MY~0YPQUigRs2JAWCzn*x!vpFa5oW>JC ziu@ncQT}cBv3=w$1pB|q5%k+AP%iJAO=0;=1?d`*0ExCaQs1{x2C$=Z9sI=*PNim0 zB7R?X>(~}-!%pH`Ru528b;OJWarpvfq&yme9}XWx8YJYXqdN*=kTQTjZjyi`XN;Pp zRa~MV4PKW@sy{)Lumtanjv6@-6cZg<1ZQU!k&6|vZO{*Crw-ZSk!Wim*;_`waQvlX z!q%&K_z$w($}cSzaiK*>L#%;BVAW4S3KREIWIgZlc-BU;TypPx(`}8V*&ia7;k?(i zqMH=>kx!h#6CXK>My4N?6$iye275Y__!Vgw-7RrYKw_mgA0tXz(D8Q@^Ozlu;M!iIqyz__pCFzb&SM>Jr{I@YZcoNX53*52c4<7N zfHK>Vat+w3I{@3>#dd4W>CxvjRt4<1s3({V($fggwZ&c6|V55DF=E@?Eb6CZ2d&6jl%l^Kp0X%2{lMvv_=K-tk03JsX z#8;X;_*}*b0xVbO^Ywo?>GfZ1KX}o=(%+uJAOB%DcDm8X_dp7cz0URv~WCJnUO+;0u&4K29=WXR8W zGA7yw+q;q4R>1ZR0qne$xV&-_X5E2dXt@104uX6UM`r|FynhjiaSaAJ$C#KR4I$zD z{0dTb8Lv!?qRt9QqA~P#bl|}g7qGe4!;No`;e^?M#dZW;-@wY_4P;Wws8(GZT55r( z7qQV+5ad)uEdh}Vhtwox5S1Fv#|^yrHVq%&sUjX^oeYf4Tlo5E6OZhZu*D`c*v-*( z0PP+9GhJ=#VOfNH%?qToQ(Ft809U{P%I0Zg%OvcCXU_tdMwS&4Tt;Nmmp(QPUmIJF z6~N8cY==>wqz@!Xg|m7Ag5`#RtF93+vR=oJNOXPa?@wX*IHh_<5VqmqcqxrCXW*B6 zw!=@F;LySprq9pgn%m3xDw7xAd-}e)xa4Z$A&uLv zD&iBLA>5{v&aEY|vnP$$ZJEILAGg6#RF?X>P{}o5Ka@vS2w+}RaFqC;-Fa*Rb$sZT zWc<$EA?OMTP;xFd4o>yJwE6A<(KWm&OYLNOu=?~NPnFt zeLzk^eA;YyQrfyB!|@te*Cyg+FIS++K@4RQNCv_Pw20_vYr*NUY3wV{;QfC=`Fzj^ zGfRrx&QShOxq6F(Ev*$?95+yQ31QlTxa#U4#QW>`7jFg0PCpin27cp45x?`I5K26| zZ5l}q!S)1V8wS{H zakz-8RYjscMpUPs6n*UG6C?(jqg;dlY(2~x**)|MP(U5JSD`j|?g;ScGx0$81n2Bp z(Ukk!Ouf+DJlcgp9j_7+m?XNK<}GOJ^k7@Lv70(tZ2!KTiTjr;2x~=*v~I?O`_CfI zr%<0h)LlaVH6P(nx^zDz z@&fj^Y+KqZf8Wq6-~h6mK%8TD)_U%dK(>phb^Onw~~YMyLAZ#tLjXR=v(q^joM@il~<@lnjbqit4uc?btPV z6&^kG1Wr#+fv3)W&E`EAK@i8!oq?GNBi8$e*!_~%Hh2E0lJhX3m|K{KRjq+nMbd`> z(iJ6i4UQuAjvg%T+K>9zzky>jXAso{q8aLQSpcs+c@1<<&FE*pJ_+r-M9!c_aDM+O zEH3};W8rsvphF7;a&B|0Shk13PcHXL+NwK1CY8tX@&d%?T^Y-wLoOx4&_zzxSmbkT zJv}v=MUhswcvOi~OXV7}r3!K-wqVpoDMvI=$s&LD7<69+$pHz0C)%M7bI8w6qxaSu zu;~we4L4nX3vz`#GQ|qcAAJa82fm5&@&)Jy!8Fl{D?|`!--PvhZbZkx1|)av03rb_ zefw{*e{up>uS-H>y&a%VXWRd=IUZKz%N*cIYG)f#F09l*tb>qqTAq98n_u4es$YMB zNgreg@mwN!wQbdlLfNg_B%T#b`rz{^&;9WGT}8Dw%lw%wmSNK0d7vkh>ozKN52Y$l zH;BtiB;ZKIRf+~IL&BV`Lk-lSX;lP-4&==mbkYzRUlKRH<2P`}oi9O_b$+IR`~T@r zaN+(BBZL)nB{g)hWn@u_xVePI^T%-Tk$ogC4fOO6Lm~R`qMevHc8utzidMhUoYCjl za4(~QCKWt+ks=3)G|IyVJW45Jhy^5)3PO*+bNH{FYQ?G$#mN4^|EC*h|5w?nBS5`S zKz?z)xj6K>jUbZJ!G<3EAIaX4*Qv@Wlt{VPZIhs%M~zZ9y&(~NGZ97~Cq&3vov8W3 zc*)fqI_y01=?X%@3^v?A-|4i$>v<`zzvB+n^g4=_2JZXx@4=q_A#T0t1|&KeBYO_ytsl_zwMo99o>Q2wZD#szxw|`ltpar@*zk_z%jUI zoGv#9{m=^>%Ax`A-pnbVvws~ zYR*BjHG!dxKFCTOPmnI?*|Y-z#gBB=!0{h_0c!dXw%u|kk{u!N0wr!twNXg38&0w9 z;5C07K6xjd$1(id4<1CMr3J5i(>vkrx&g-zJdFFEI7}Ixh+#)UOUQvLkh13mXtIlk z4q5o4eZY7V}OeUMHmsf-eL$3;be};4pw=U=pPN=GibZUi=iqK0_n>&t& z*quy6Pc5AN@3B>PfaXmZS#izta3C8cbWB_DSIU1kb$kV1&-CDiH|>PlI)#Wy}Od8Ceh37dCr zN30_NQL>v`)^gN=EQlGb+spxptDP{9of~^dB^a3zokwm+hDU^#Irpp>6 zKPmrM6xF(knNt+aiiu=bEBurp2$a)H(xnZd*_1!e>c_}QEx~}ql%37v>Mfl(Gd_-Q zedB9*?^S!TYv)e15B1{E%q*5|71ePYYQ~R1HGpO4*b$T>599&li>?$qI+Vbwyd7s^L|4 zfKp=?3*`eO(w=)&46B!Os6!fUg$Z-f-dM?`P^V7L9I;7QjpLqsMzQB=6>c;OmBd>r zs89zBFmxH=NFCK|6&YazzIU|T+#q`M4bkQ_Y?b)GI(HUby=~-xtoT?UXK^939l=$p zIq%Qb>@|1&AWGn(GGa~`l~4)SuMgpY$rG5Loky~}7wbm1U_QHq-YBI3;~KX2ZG~Tv zk#lQUa?1!Baa2-sP&aR^T>b9%?uKjX^D`58;DHB!>%Q-O`yayL5S?=pxy%Ya{g0pe zJjZjNU<2D65z-eMef!n5T3yk!(Y2yc3U_GVa>E7w*y$G+rX7brDki$W|N3E~n7CXPbTJpT2vOEGl#7 z#xLS;{_bz~A3b{XnnWVe+#Di6nUF({$!?2h!}9Ajot#j_?Ck7o+uK^LcmDpnfBo{d z`LDHAcYtc%MtZUVf8hD&!zm)1>_W{!%`8JNj($d#n#%^BMA1*l>j0W}JfE|c9S$l$EzC?n^Z@LU55p-eC+Ls12=0h;Md z4aJ2zWhoBYuYEmwcHW3u!GRK|4yx|MVAmLlMT;~+4m-AO!2Ji>@!+Xh?2QJHT7MF% z)d9aZKr*t@+-O{>atrBHZZ4Bcx5CJM-mlzIFW2S#(_8g;@J0=;bp0 z<+zH;6$9zKh`P=}H-0QCEmHby8zLJ9rCOmt6rvWO#-)g)PT&GDn7oE+W&x4bHe`w- z=FSyyF74u*hh}i_>>{=WW4OsLVq3R}bvN~ZFVE8f_2zVNP?Hg$+`ZAzF+IQ7jNDBl zt>_B0pw^+oD$AHYK1U~GLX$-FZ0kD|Z)rt7SH#%a)4MoHh330--L0)1>1wqa$`^~O zMAyphlN|~~nqy#ve3`C&@Y_#sk^dfBbq5HA0_dYg5r}i2&)9tfJx;KTJ^ki#{=9Pb zF}6&ML;vgUz{#08icFn4xlWlt9d@0bZGv-Z$Ob{NM$oE;5|qwWo2!4yxjeFgAY!Dh zm9{;YD-R&t@j|T3rg8Z5??+2-7tT#pQ8wuKYztYdc4^|tHtE6c`r*JfO++I;D0CdF zQbw(AARKK+Nh_nC&=I?^6AMxW3#Bo%YknuVr|Y26SNm!qUqoCiUjN50mE&JM*@AP+ zE;&#U?|Szid~|T2_kTV9*#37OKXKx&$;qkhi;Ig|fR697{RC@`_~otgUvH~F5Y$K^ zRXz*NBA$I7qa2y|St@%&6<E zKW|Fdc+GV%iOWrsvI{nQXD*<#tGjtaYqp`q=C(2#LoRx*zkAHrSb1>rdke2iSIU9$ z$w|sA62hJD`^`@Wdt3gkvNVPK<9~7A_DwNdw>OTXvo?wy z6vN5S`9q;sk0jd>7Wic!K{Ua`hFDZWn9e>K(2?-FNQOOxNhdJX&s%Qu{y&dT$QWO# zqESi_It;^T7*L6vHCFMvvVfkRcD&@>@53XX{|th~MfmCaGF%Khf9+Qh@9soyaRoKq zK{2004>tyX_Z`UVc5_G3)@lx2ds{JZ^Uc5X;L-D^PZbXD4O-mR1m*Y~+a2UW=FVE8 z>$BM-|M>O()_TyF?1j(Qz&*FV^)EMPHovE{y904bP1#pe4ENna(f!lEnki+gVN6;bSu_k0vAr7)jErnf`)fz;*waZJkr1d+gY>ye zx0z)FOb(ltB{XQ%i|7kiaX1i1u2w*Cg_VPE#>&DRf_^{J=^Pe_N;YiXh?oEFyD@v= zA_=cLcB~skOKS%TD;X52vopl=;q+I*Gvx4+2($TuU>#;-kq{$}QhC{$pI#XmyKr%9 zCl|q%;SJc(-JO=VZ2Z%s-~Hq(c7)HpJl-(?QE{P0H>dcvm%gW!%aPi@)XCyA>jGD~ zT6onRAe%pn^E2Orrv4NJVCIn%NR4#ci`sr)sa`Yf??`-o_tw4G+jij%PW6X-**)JJ z>U>sb;ju7c|75n7j}7o}Xr69jA3o9!{qKF0>xzkX`KZ`o0kXiW!@KI}Z^b7-&A0wsCiaJ~juUj7+n!ytZ zUlLNig0`-fv%5d==1o(_AMGCG4t}*`pc4WKM_I8E9D3tDt}7rBQYhk|p8{9QR^0*E zEm%BOFVF77|5L14Kgl`8a8LLnirIy5JOGtaHbd$-V{^h@He}4|3Osh(4>niK#`4)5 zi^%5YnTX`j-O<28uF@VvrE|b_@V2TSE@&D`Q^J_oPX@>pS5ov z{Vg{2EKh&=RCiwxia$(IUV*RYHJ_4$8y<2RIq+}Qf|0hJ)RNNFHYtr|G;{V!wJ?XSkR zJ-ab+{sPj=^Jt9CA};NR!WF1rA2uiK zCB)iPZ0%3u&_oNIS{A1dJ&cVzuf^z&9q1_aBQw2%)XECx|Q z!x-AU9>eR0o42rK1t22zoT&I1TO?QMP7 zxaCH6`?$;Be1@_63b3u%w{E|kesh}T*sS3>QCs#n<ds8^ijNRvxhWB#~p znK!WVLAJX%aXym*{)hyf%`g&lxA$=HYh}#ME@GOk9h@Z{aFMM=WT~W!L{}fU%6SC1 zDw1&t(Fh68K&-hnJlo>7xwO+EhcaE1%MDb>0eo5*g99--HY@Y;QG65cC%2ysbieFR z9W&qDVdN(#*i7gq=*nzO5v#UHAzA~SB0!8gc9_fMB@2!9j4Gt@A=TuO6U@1bIcCCufgB@ z`nNRCsJSKVGq3f(eU|rUw$*n4YCDhZvGO0Wr$q{Nxy)`f-2s^uX6ioXdhSM!4FXX6 zvKun82yPlZIh=)9YXGnRwGsUNXALZs2XM=-9Km@8a?m9-k%>P1bTo-N*+9f1jlgah zMl|EmYmy>BA?*i5td%ZV%C7CwLnt{DMAwE`z*V0ptWEB zs1#qn&$DZngy?0)PWbXyuY_HJEP!z}^Maoh|DL6#Sf8t{XPuIEHz%`Ou(6{)+4;@G zvTbPDETN6jO>zA72Mj!NNXLCgb|DdUu(5Lnc$a7lBxHf1K1G0auNaFhtqOasxd+|2KJa!y~z?H|^FF%bX& z6m>~NK~yJiARWLCdikUm%Tm??{4={U4&X2+xcr@`8|!7J=9sfQwdR_=MeoTS$7D9U z=axwmuqt8^28(LuFU@1K*H|4Xn^O>R%XKMiNoR3pau^4uMhW)&v1K%lj&L1vYnH@a z3B`N?qNGCdCy_TpIDD#vuYTiexMRJEH@swoEdhk(F!V67n5pAbJ_BWgVlaCQ~$Gj1aJV{7gZ_KPY4VN!<~C2D}5VIYW0M8Y0!*m@dUE2nXGLV;m# z!)$4o)cpVq!@=0}G-Z`c2UxHxXAm$>;G=JF&^yqJQkC5>nsvT_MxlUD9gt9y*FmE1 z>uL2N5o%ECs6*7+&byqDb#%5F#HAGVnZ~Ms6gjviP+-*^fK|SDYygE-Ks=XG)HAgW zw*t?qfUnP^?6x3p2bvp0h-~7=ZPdRsezS9-7!X>EA^7+#)`ur>P2XX3#g<|78p%a+ zgr?6h$Yl#i8F;Ah2V7jY(}bb#r^llxmqcW%E;=J@n3}ClE+NjghKU5>@DWsNHsKFD zA9AXC4WD}0!lUy^j1I|Iu6P)XnFxn?7?w!XlvrS+oF2!vg}dy^ns({x*tGJMw^erl z!IuCuwoB;q7%6nusK61W2d6!Fd+^ilxXMu=25+v(d$P=YVCDJ7KZK*Jxy(aP1B zIWvUa?MHBR*Fk833M^iQ(?kT88!~=p^AQxy>@}hWnN20DHWG0PM}vn|*I>E6=9Vvp z&Grv;DDtVpOb@PJ##avT_{zBsbR}Kn7sm)aV%RZ683Q@A;jkOys`HHh6<>GL*`Liw zMzH@s^W`gIS70uH4Wj&X-)9>|{rG+Y&6UIi>BFrCMr49#br4g_`jUO&uiQ7^oaIw) zFOF1i#|k%yOv8`w&s>l3+#or^quAOtM}m%x7_yZ}Ui0oP4rL6@d-xKkGiLzXx}Cm@ zO)7Z`b$FfaWJaA%DJy&Mwt-T`<{p23)q+WA(CV|XyN5nc$7JIaoD@m1 zn^!aANtdj3Tf1j?8Gf=m2Gh%pJkh`y%uI#5<7U(B+pem8)+{z<{{fFoU5)!I*T4&g za4Oe=$->>3sZOFhIMvMI+u{a#=%M|;?Ol0{8|QWZkweaKhR2f2<#O-UVI9`xwGp{) zf;vhaA4uES@*j-@7%hSpHHsQ_n*)derv-|j2;e$x(G~~_*JzviQqsgt+c<{hGmhX` zK4Qy?v|8=1v|8=OU6R9d4j%ozZ>1u(lGuUUbT;(^2(8HBaJlb&@BMz?_l|A}rq)4+ z;8L=MWzSgHq_99fi-<;-PoO7*ESxehxoqIc$x%FgE{=$_hxO_x+CF@SlYLuFL}MUm@Cncmg4v!4WQ8IK(`u@p1&Qhji&D-+n3{CP{3r3l#$*=LRTkbcWEGq{O?!w z{7*=L4Io4pYB7FS`@8U@OMegfS#ze+ff#>9?!3@rW= z4r?FAaeqIKPtM@A!-p_7JdXYyd*K-aXeUQ;WY$DBy_YP#ie_zX-M>gV7^$1|AF43+ z*ZnRU)w*i$?h({U-CoBqpvwRY2J$A|#>w+dRGkp|V>AHLRwLG54H@rz&Jh#|tN};^ z6|eQ?r{Fz)Kf+a+%}NzXV--=AOx{xgffq8CUtn8p#`9)4iTtRCPi7v+n+vD#Q2%Dk z4{Sm@M>JpUz|z|&mJ2ZT5NeLC>IEd-%yWG-CA*k(Fr7}pVSE>)-loS;O(}d2Mk;}f zWny}26}fyCrLwDrK-PVm262HUgu~J<>Mh?T$P!osXm#d3*lj)XfG~otYhE}*kRE$P zaSR6$=@}G~Y#R=zys1%n96KKF`3nmcb0}87JWCq6(qrzRk2G?nzV0W=? zXnixvsjNC$d=+{kf5~?Wq6F3ev~Z^2dW`Q>c-tonuQcJUm0*`q=thR0roI;wW^5wT zSva6)NxNiXs3C{!>+e^&l@Sx810iI42T`cSuziI+bQv*BZwx4n<3fc z*&q^FUlr1Or^3nGKihRYgrhBJ2@^&p1Ir3qWiLAOCl9t>{_7`Vr(b#_1ZR1XE`!8f zcsDVDV8)IFi8kq)(WDVc305zxn1v|gw5aovjpDHTTGnhe+Y zW1B9StKVxV&mfH@JSs0jmu=Afw_05NWC*!LilM|uWo-qWW*HVehfige>y9cx5#_ht zCR`etG>48^mI?t?G6Yr0)Qw4+e@*MU3_`)k`h6z}@IJu$&RsNr)7@RodbPd!t^3V* zEd?sF*hs>R=dfo-9OvfO@Rk2u!AGtiLD-a>LBR#|0*cdjRqK}>qbZ!N%I+UmXviSo zBTZ8YB7}Krh=bG#8*st~o`2-4XxM99**#dAIgN>r-G<(59vy;2p`_wHjJ5_(whC!T zVa*~vtn%JM6B7kJVlJyA>J1`+4FSrFN<-*&os{|mUkeT0oj&v({fTD}9mfkt)>N0T zVyTS5p)5|G?OWy<}CJDk~RA2=8p&WlU zvC{A{Ikke_SLP6Hn`&1e1hN8g{bUZqLjzczCuo!T!ciZg20wr?JxXMs>P`QI*i@uTHb8t3izNt7J(SK*<7k6yPc z0Ts{frjOYL6N`&c6boH6Z7#@K3+=jx;wnAB@-oJwP*FpIt919SUEh28 z=t~pvc!EgYMY&K!jbJ=$rnmyTXsoVa#f_j~HyEqCsMo5<#6nneMZpE^-#Lb<`Bls= zEg(h=p%MMZqb)RQ3<32b26B1adgte`bmlaS_#PyC(rA=c;LG`bL`O@q(jqbBa!CyL znwXwFM{pQHw^f1f%FaUv*Is?aH~RCrw|||$N?;AZ5Ca&yOy$`r@I^Op@ZiBa`A1$j zJ~{Q9PPH2IH*G#Uv`@dm=@~CUGklRC?S<}5kT?yN3GV%$^b+(#{JUTDylZ=oJ?yl zqFAK+pPpNL^Xb>-cIUTThVuM0<|`f|d{19b1mlBgESAXe`G13euVB}?qE`{)do{@& zlX+E1wSzo^Iq31qr5QQhB3CyijsDug}Dnj}Iwz!hLR+~m6 z#U7-3h6YcQ3FIBL8P}b91ui{7n~WoCX^iy^#&pt1f=!diUz&MD`Cgq~L$HT5gp~dQ zQmI@iH{sJru9?{RnXN;)XY6Y2=iTJvJ;{bM01?HQ#G2Ke2sm=y5q9l5OaXBpcEIL{tr^v~Ocr zkl20mb^ETZJGEyX{m#(?PT4`!)Yb3@S&ec+6QV+81E*T=z^*o+lg{Y`acxq-m~TLj zSqjY;8Dd;dQno#nBPbopJ%$wV267+Qk(J*-%Fs)@FU$PRwxPj4GZR+Zp$Cx?v5h7h z)&MSwbls4Z=eTWr;`(bolFKCT{fEb%`|R?njflAUu*@N(CVj4Ix_p9ocwG&3Dy-2c zQqh`<^LmZ0o37t&N8mHeIF1j8OrT2x(NyMeL%dF5AZb0fb$Iye`E=?rE7jw+=w%!l zM^MJV{j9R#4M0S^fp`LkasIk%_I_^5VBa_Y@}K|xYp))k9r7icClV$zFjUh=VFQ{R z8T(C@6F_r7m&z8kw-_$!9^*gbyEKbPCCu|9y*)2x;?d``y`wMmrj28k5%c3_98EF^ z=?@@t05?z)@FlWw4M2{HWrQqaz3ROqMVpMzl}ZBx`Sg)Ly#1zY@3`l$PM?^XR-Qm6 ze3&t*-E6Qk zBT-LvFWJC)|8EJj0jxKaS_f4Z{}l-{us0hH&Uyv40>uT$`MjhJiV`JPPzy(=d$alT zVeQPYM@rYMmQfAydMWYhc0(hXsBVN{R5}Ru=pBUH)aM_Hh~w zh6@)_VFadmVQ2CeM*?dAA#yL70In)&Dbfs5CXGepIXyS6O=4cNcLzg~Y|Q-=8E@fV@vOZAMb9f9sa#uJYCv&>`PfVWd{Z(AeN&u@ldGVyCI@v)JSFSh6%-Y)Bgwf>V-9GC49%w+O?19-1evu&I_Imy-h zvl)OH)iJlQkU2MdMit`ACQrH2y!i6>`M8UZNh-QbeMzH&(uLQqC%(IhkA9#jDP2TKTzr(=DAj!bYpvhpFm|R@o7!csYfD?SX z22>3MmvupAq015gTq&u=$w2xK5XU7K6qPVAFvbAc+~p+&Aa(|jEs~TCX4in&ML-7v z*%LtQbO?J1SPg`|1FR+_$Qj5!17tg-Be9c^*id^xfH~O+%Az7DNv#07nSsI0iGcwW zrVvp?SRuri#emot7#B+rV)=_07%aX5#U~)dl4de6Y;R>?khp~qQ(3^kz~92auq%~`f#tDpvkR(NJ2%d%S(CZH z_VVGE2LJy90Nz1UeUj`h^#A}M07*naRCr$Gz4xyrNqQv~8Ij)S_4mH}eEI6G_G5cy z$f5Vc6)B1k2&}>G0uluM2_p2f00A<9q#qU%AV2~aqIQ=Yk~>2)%kG{Tw(qX)^6uH| zU3wQ0`tnsbr>ASkM=m+lJyg89RrT)8ycrpBzVn?E85t>X&e7v3)p3N6{QK9Hk8kr~ z9Y1*Qulb6<-16ZzV)ZvesK9@#4*oD#~b#QZ|EkzW?MIqev1o zbguse)a&%nDmp^%-+2vT4EuA8uAKidW{jnX(HynB%jj(TIdp6M zDoU~yY)`&#+y9tSlqJeCioWs9-$744b?MO!9&{;88bUq7Yykj1wYg3$MNyypE|9b;Ko=L!LpFI6ne^nkk08TPCbk4_Ptm@b*Pk%TrapKr{0UaqpsxDC!&+JaU>*NIw zK-Dk9cmUQfN4i=ACBT&|FA~N}(z3Ts_Ab#9S&oMCf}s~Le-*8_&!d;${w8`bx&=bj zMwhpqMt;0NljQ&*RR>xrL8^lCho6!bA1I55b*Thu^%7u}G zi*zZ9R%wtnG>C*;V-3xM`v5E=OGMhzC3^w2nc%;{IKamtQl0b3Iet(Ip@bt8NCbEE zX(*4m7Jzy|LJBuffm8S$R}u_zdKK*udnKbl-=b?<{dA?yAipP)q##~^$Cu59}jF$jLQvF_O7x=xv6ka84^LHOq`uixK01T_hCde^7h){$Qh|Z*pAP37QZJU=# z7ADEC%*8XN)_IWSVG0%xWo3rOlOeh{yiwV}_n+GR{Btw^+i%XpL#j$PUnXOqXo(}t zrCf+n&)U4Gs(RV3cf&ZDwr#^z7t3YgM!DdRL|Gc1a6wVz zsK`o4U)5mKCtp4h9;yb1$On;91qWqOH5QC8F~QnNX#e;|d3*nj2hW`O$umR$=-POB zz^1bqvh^Nvr7qf=y~W0BZ%VAPz_PtXrJXpncOZI z=m<^=5>-xYz>u}tJ*t+~!=SvK-KZ(-tR-P+poL9$Ht#&5skXr0)QofAPQNd)DP zuL#mnS_aU;;r9(deXmsSfmTTuCu0e~NGG7)>2Dz%!#e=-D)YlJ0nC-Q`E-cQ#{_^! zB;N-=4>bS;7&K7j?HvFCK|!zt&pt};jov=$HO^fgFAuL$=txq*Mv}o1=qOHC{@&!l z{+FNqh0907;rl@pv>M)8*>9NMXmv*#&yU#A>=5a9RKy5Jd&663t#(%5>7B=lY{A|O z-1auRclO^ts#zD?<5lqQ{d8*9EJxHJ?NlzJVxDRgaT*>YQ*NHrmU5tPsK>_(28Jj= zuT(G~RkOl>2!?m7lRIIK3i4n)fkCP>iuebYhsyq=9bJjK>Q@d8#vo#_ zfJH!k2}TYM3c3HoyjVGclYI-+bUH}WMPxGzJ$?R5Xt4+vQIc2}`k%RQJiK`yixPa`O4wsFcT3qiV`d5`cGdnO}VzWe>{Kd_^m0CG7x*J z1@1vi5)vN_?xXQ?-)=eUk)v=FK+C;fB&V<#qH1k$~>5UeLg-M8QSjUJmdbx`o`r>d+pCF z3IN?;989mVDDkx@@)uq2Vo5}~1mdfcR?fusgunOX|ifIt2 z0Eo(_{zEILUkrlIuSU?S*AD_f^$v6yYI+SF6n@5XNybEoEv1753{=SkVrZV3CjJP^ z5c`n-m-#*9FBcGG7!gR`x_y>PR6f0)6pB zk_9thgu%&qeY_puTm+VX*dRYL*CICe=ypcq!GW_a9Zf&bAS?%%gJbzvFITp%EWq0SXk~!Y0U%2n z(&Yxy755PURKFE8L84rFWDy*0WChXj3O;d@ES{}-PeAnOSaCN_NcfGte}hEG?-Hbw zwe}U{1-t0be+%8(fA{^iw{c~=apkA>$2a~AET6qr>#Ajp)7yvFZ&rTs-uPX#3LhZH z>Zbfs-5gSHUWe^?Aa1nFcZkBA{CKMnw(bBI`+rUBD5!w1__ zCpf~;&bVY;oyL1<%h@P-nksYf!pragdB#%^jG(1iit5%jw3UJmmft~>)zQ0Wx=%gj z*}WIzG`lAX_KFZ}w!IGB?Op<=Vd&Q3yJ)Sk!Ck|1-#>nvTUu=uCSev7W1y#e=iAqR z{|~-!@fX@(xboxwd>&u?57+O$eEFV}vN+W6-7y$D0IagmtuGN887Xe^V&E7m=$R9>T0McW-M_WV^i8jhB?S1so<8jZqOQS7|yoY5I$aW&Z_F9Og> z0~F`;$_;&A`}`=BQvu*7b2Llup9)=(6K(t%F*QR>^oNV7@-R^V0El`;v2J z}&v%kI~H0~ONsl1eK_?>wz5c&>_eLlAgtr}OkbXDk|K*<|$I-nU<) zJm24HJ@p(Xw0|eq|5HV)qxI%9$dDS5xA`?lFmwI=0##^isCek9dA01-q3aL@`bbK{*%pi?<<<( zb?Z*M*7SOAzkW{ER8>pUFiJO+OqfMmbX*4b+fcp$EH+zE~CrWvBc~9Z8V&ow~Y#Z zAB~fjP|io`;p)13Z~PKEm|aBztp>Ts2Rh(Kubj#N;>p};j3niQ(Yp`J2iNU+b&VX; zJkF+m!|k>(CgUt$OwVjQ`<$z{21&78+Pbq9iRfIK#Ius+2TyE#c5@NUwvxmjYqBT9 z_o|Xqu4G9zs>aOoY;U%DkmqIiyEVJ9RdZd1VD_9MYvT)N-0_VEH` z`a`5D-)j;CP6vRXfX2zHYa8@rrt_!U6r2hGLv>MG-$pgpdk6sdQ~nqh2o>zj=rUXp_Oaow()iDGUd1{{Fs z3KLw~ar^21A_xY{`N{%AkrxF+ zU^#&~{IxKPg1ZM-U+y%%@|(LGyJuE@6pMoDEraOGkgt#8tSDtnbX9VmTP4TeGBo*V z&pH3o*B`v}zj@Z$PqAFOq$=ut*QlS3^O>US2BwTZfhFlUPNN~PTv>0lY&ZurI=qhR z>P8(%CI&5&5T1gkF)U4KRbwHmn$bc^bvgS}Jjd`<0B|8km2gW7@r358vHga-i5g}H zfmN!KA}cAhJ{J&?uFgwTf^ytNfO7oENTX$v`#cx zTXUPuJmo+df|=&&agv8qnzLS*%^yJH?KoCLo%@rOrkbsp&x3I=NwZsTUp=>R@ma@p zYKlbPR26X!_H%f1?*=dlDQvUW>^9^s=nB0o(*>oxO?i>%x^<36^k%Dux9=R?^cgGu zkFD;7-ypc~ixkV-z2|-_Nai{x@ra;yAL?>#5$=y9(frDEez zs9ZNcH(mI{84~z5IHi3E2#T>Zmt<#)6zQtjsDaX{MmImb9B{e|D01lN2wv5F0o6Ev zjttyDeh{M|J3tw*ohlibX`Df_TI8jW-kmLiwyBwUt78_^`5-ery(oh6sm(9<{`|fF=Wdj*_BZOE-GX4ayNVB)$YiQ1x+P;N1mO$)|LFz5 zsmi6I{c38%U%tTlRMs#{7}BM)0E7S~sXyy9`jV_loiAMas{6$GON$`N^y{~7g2LDD zL1Y~s9*u?&>k#eOm5EZX)g8rlt#bv-VncU2HQT)m8d6vVlQ&(nVQsHp{6`8_pCU4M znqK?oRmp3p8k&fNRut_xhg496o!Yx`OQBDg&1aesjn8PRCCs2 z&uR=bdHq_~d*Vq@gK9}rZmP{Q$IGjvQ`4d={r0?Gni?(D$f;=J^i zO?SJ!R@=&+-uj{xM%=%9bZgmkx|a>rR2eN#+OulKPs@1WsQ>_*j%3M%mjN&9WK_^l zwVrL+8v-tzDuFj^HPm!<6hsl5Pog-E=kTfHrD;mfh{VXY+S{9=2%fE2eurZ|(sZ2bs?uhh z=}{iu#DXw`4k;KTzljNoJFc^|wE8Z*=TGOyf86mlo?|%er+Lx3JG!R%=@=1F8?B=0 ztGJN6uF=+y#t-)D?)KTb-IjW_b>z6UnWJ~*xCrfOI7}Du9z+lkV7vGF-Lsb~Hmzm~ zG0;(;mU|D#Z~yjhKl<)R%1eLtK6>M&TPL$`397Ep>d3M>>+Mcsv*zh-OV#?2Fl_)(tS}7$+Jqvbm+^F?6#_|G`r3JL#WsJ%|j07P`r#xE$$+UoA zJVJ=3%4(l8v1jN;lZbdRoljnk;&e_yd8(><2JGTm(`$-FQO*QLZ7z_uqgr}Wqz?`QDml1eYDTZ^tv76|?Zxq8f-o;+NKr?# zJ27UYFwACC;KCGvxovv=HOA3g*DUl~|M)jiyHm|F`ee)LGlIa+78C<=AI^BGCPoCI ze@)=ZHN&K)C>9=zOe=|mzKG?`PO}{^R7@rHd|D#3U$?wgl=_jW*o~EcH1*uB8ie63 z2B8a-`&saCfhd%TWz{-qnjVw|Qqr{SW6TO!5|kt@6-<=pd%f+;d6MZ-6x|^h-%83X zmeu;tce~xUp_4(?GYR^5i)X>BL6YWl_ify zS9V|c#o=stQ#Z8>p^rMY(M^(kJYr0pDWs+|lr}`Jcac&oqkJ~2d%cb2a!TSNr(kg( zZR<~aJBtlDd0y@766&{P#3jHaQg`1=aI34-C)fpfI1_h7`J;m3ckR z=LeTIJ_j*^4bE8b>;L($qE@T^XoElIa;gT1qXTrDzJmsM&KAH3fRzOTmph80?jR9o@OcTAjEOSgOsMWc!E3b4 z1=Et9f(nC1!(9PbpD$?HTLcqq%dKbglABqUzUP?ze+pt=RurXho%&Y?v&2|Nhp%+% zHEp#@ge3Q;l;Rg;WEGwIn%As*7q6WAOq0mPJFWUgU*hWKo#S_oRl%?&!8pC)A5%HC z9`t048v>9+s)jUB<>#)uz1DI!BZ{&kk>Ih$03y5)xn- zI}VaVO%dmn`UW6rtSFbVByMV|_97udO;aU1&x!&98N{OXWnhCBKofLy)u|JK2cS6; z0NnaKKG6JdGIkBE3&K?dBKK?N){9_!6+a#BV*%aLBte}$*`}fx{joX-JWr79qisr6!P2EyvZO)-}9{6 zWnS_r5OJ79WMtOue!ba#P=Zxj>o$K)mo4dFbno@SVt*MVfv~%Nj`mv3HBJ>s>%uun z;%N})_sg=RhNzt7O4&LYepY}@3#1oid0tkX6FqNIU)4s6L-rO!(mc4oV`v2`2?q@;RLQc!|bL;0>QjYoI za0#+Tx<60$rbHd2o1cy=ho@?QcfNZUU4Ltc>TVl3id#() z3vI1A^^?6=QTUo`)}L_Qy56bv62^oGqVrr5XG)pj8$mjo3b=e>vRK}Qbifr!me;$R z&(_R_lV`aQ$LZwG!F!QwwFFr)Hh|h~$F%!7%jQMNHANP4QXv3i7os%780TQztelpf zqL5TTQlN-J4RX6vP5A}~qG}p33|-Zr!zB=V8bstWPLjJ(RBXtSR2PW=!Af;hFs&$o z_%SLZEXqkibHs$RIn9rO8JG;fNps$lh$zUiGKETP$%@_7B-t7TdvA^=olB6WflZK%>VFTR3(QJ1eG!=s z&Zon8Ivw6mR#vDr@~!8$x_viI!w0kZ^c@i^9+i2gpv2!ldT`hC+FP?Z9rau4c@XU1 zFiq#n&$oMDLYyy#v*SaC3w63Y_>N)h{DQ2ar6pLcBraJ|HY|5fkO0pnQB(;+uW@XMV3&2O7Yu}P^dNf+*Phlp$qexoj$mVXzR`>4j55BEK z%Gqf?^_#EV{pSB73Z$Nu$y~(tGf5gCM{|a{*17^fLaT6kAHZa$MW|D%?;p$_G*_!g z`!D{ZnHc=W{#7)KZlJ@1L$ucKKH3pKq;e_%;$nd^Gy)*xsDvQFA~R)) zm|NXTS=QLjEX{nzkJ557o6f~rEL)R3%gs#F+JM}?!C3Ji427Pm3PA~ak5xDN5s(rDPavN=l)@HyDX1D& zG^9lEdkwUJ3DGMv#P$?|Qief%Le6m7Vfb~KMxw`M#HK7>_Sq0vB=_J89n&j%KoKL2ZZxTZX4Z} z-G4I9)3Gkgqaa%yV=VppwZoVG^_8t(DsK;74L!ZjY^|-#R}&*jQx9YMj&2Z=#S%Db zAgafSSl z3C#4vf@_Oa&P`J~qiXcqab8jxv%0G5C2U;Xmkc<=N(rhD zK!FWS+03#W7zo$EWsF2Y^r=8fOYgie@%L`#X!(sb>kGf)M~mC*?I(Zoc>3TK009mB z`+wT7FaL%l3U8GtnU{HPQY9Z0EF+3;c2yuU-Q3QOmTyKJ3~ST6AT9xGND#%X?v-6} zg~ya-@uR))!z-t1fa`BQK=-cCP^;cTb$g?o$7Z1_(iW$t7iGC)8#Si|62Q?V9GAH+ zatZRT45<;%{4fb*QJAZ$Ihf98tBr2|U)Waj3Gl|C@Pz}&$pzS|7ga^0QJyYj0d*Lc z5?R496NEL#G9pnFgtBC=qKHhA#cDX}WC||O3t=Ub;-mn=#szr&YLv=i;PN24<2XJU z|Mwv0a{@Vmak?)M0knkJqFH$?Npc$$!U&v!mt`D>L539taaEOtFr7CBU?8O%ni3F4zUyIh6qh^J7%d z2#uEueRr+fATp1+m_$Mj0hlBA#+|!|imV=AJa^`qvK)+GdgtGLXS?%k+5uYA757(< zCJUyDDs6e4W|)-kHENB^O|Q`x2;Iob?9Zn2(Z9NXeBsQ|Fx~&R&#sv;%9V4TvD9JkYs1FqU@$gf#Wo~TX*$W z-@Nn6@5)#O0i-@J5$W?XF-JA4-l*BubCdb-og^!k&`i5v7&;OVv!qBa*uvZb=YV4BsSz*PI23nZ$(+Ss@3Zw^Bs073Q%;kzj<${0MZ) ze7v~#dehl@A&eKxqR1ACV%VzKJfD^MHBB(aRN!`2uIe?riNR8L;n+)tmai*{o{HG0 zrnFO8uBO4|D9q;QpZtqod#ns_s^2gSQ=QL~)_fMt=h1Xhu+{3F+pisu#zU~})`&>- z?)Fa8Tx<5vCu#PosaW5sTm8=_iFOFX?jpgc|A+yBPZ8wXce%h>#yB%6fs0 zfH71p-3bauLz6{-498#!bWC+EB*~&RNC)5mh=)1vhH0Riit~(uWiQN^_ZZC!)2OXu ztlX2Bq(l95nW%PkLo8>}6s&JQ&7!MqcXvI?l62(ni&1urX7M$YluIO$YO;;=iOd~5 zl>u(Nb>LikeH7|yjmS#b5GC%5NEtFF8DP`gmG7@W{V!^sj*^sK6i{|&9xV4j;Xc)< zc^f4P#W+9@&h0#LzF~KMNyJhLDnIi5>{?!AL6{`|?FYC21EaKt1lcq-orclsMv(eL zUC}P+x)v`M;jymbPLj~f&?K-ClM8ZFqo{75=nSzQgz26v zi?dGK<|1@w33AZ3bg@>~g^U&4U*=_!mSUJ?1?Pez$`F^j%oM_Kk`z%87HX2wA7=$V z5WoroSk{4IaF*u+%UGnTVhIkTT6_`!Bnm((f?=D2s)!uY1OP8LA%8JVRzmRahG(xo zZ>p^`7($`a6Y5@DXjoljnkI_b z3`J~&98W=-YCPHrKg9AkxHBljY37%-EOHDfaJBL!!;p-$3}(~WAg*hjwB6Y5kEi>i zMRZ)WYuoRvwYM(WhWlh*r0HyirFNZIcOG1QO_cR<80W%sPd@X@rmF5Ak4HBOPRv%l zR#zl>UiZ9>$!v0MJRSWTS(LxBTFnbo@;_>|8=r;kcZ!lq5V=qI;5h*V)d)0X1n9ex zWfI0-r{#j5XX0X>P*v6BAWjm^G#UcITD@*b$f=5JBH!%r; z`o(6=s2m1RH|HQW5w{g#vPh9*=x7=G$c7H1v=kGd6b%RqHf)zPy)9w+Ov7q^H7lx# zZN+`gq@-c>YH3_fr7i>eEcSymh(t9V?TrqkqVSVysf-UxmZb2jT@gf&?N~jML#-h_gGgQufhE8SZuNB1St~=`Urdt;#Gu#o+P@6K z>UzI(=JQ2bwz`dW&oV3wB;sPE@AvAh2aetRe4G`V}I#wdVx~ZyMFksKT;*H2Pq`;{lrCr)Qj@bwJ4p7 zVKnq1g`KRh{=HX@SdoGjc)UvBR0hcNB!Uihd^(+|Gd-jH%J8(NgKOM_` z>%0y*Yz)e`>!$$wN%oE`r~6>%IzXTK1jNQ#!~IO0AvG8W5IrdN9NkPaXf+~q zbY03pVF#0OXzB*Uql^U*k*cHsdPPCbuu#H(%6_+@kA}XaYqC{xE=!m!mwtwHy;^`q z80)5bE?uS+*k341_y_!`qDn{sjTZ47S&l{0IHN?Ay)>Loh@^Cr!XMWyPZ=KV{g0F7 z!DiFjdNzvId|mU}@tnSZQSC)S%97FGRS^^LFeQ@7NAD>4AT3c$( z)rLgEdYYCvNRmmv)3-X!HqVPy01lzRTsqXmR?_u$duxre7oIwM{o2~EFs?R55%n8&?^$pi;Qo}hDhie#`Y+$O_uyaUMN-(h zT&6`+09)arOcK z5&e;uC`0~#%wqwkG63W)l%RvTDt)nzsg_#?O;qf8{v624;y{=gTE-J$G&^Ro=Cg@^ zI5JH=tQpOi#Hm2QB7}S%R~!koHy#W5{DV81ZGxb&AcqC z#q4;PM5x)cA^&GpO28lxtEGwsNfoTRSwqA5Z0>1|dJr#$lqZQO@Nve<#^LntD@ieZ z*Him1h-#ir27B)=gDK#NAkW-D50{PnUdc#?pgo}SkM|Da)9(#@xE>Do)5%npw-i~h zW|kva8BMEbA*0y>qJNM>Uz{xYQZt+KYz1Nqp@D03ntQ{8akWxrr?HdN&4#pCEZ^&P znopay*eFs8ErKqCnqQ3<{@Z0i8BxSFT4p!n6#|bg_i8mr43fP&oJR#`)0KS>a`M`56g0P(lVm1iSzO=YbSaLQxvC6tV+R7*Ap32eHk&!(A69B)tF_4|E4AD*2db-&mN3#{_*|6&8&oAsTPa-L3dea82~_%L18>z z5qSEf&<{$rxDzPs47__Lsd6Zi9Ic{3wFVI8xVl11EmSNyCQJ5o9z!A~Zwyv`Q&}GLp?KLh? z+sMUbS&}}`Jx!`X07CRQp%^lT5-uuxaB|xsWa?^lA_m@30a^%^;RuDDrlvvUa&Q5V zCRC~!GBHg}n9fp=ZwNJ-I-X7tNzwq=%t$E0hECMpAV2=Ser@;18R5FXgypUMYk#VUCiC=;jszb6AeooR zIWR!A65^+f0X|+%&|5Wf^$S1Q{bVV`n$|{++^Z}SU+eBtKc3Vfmv?o|N@uIl>%GR# zSEFEg)wbMC5wqUNpS)=o9NAHeitE|XrXy{s< zBeo7wN(1$86h&bsCC3o+ln^8qnV^D)uhe~2H(er_8)YNRDUQ(9u=A9dV{*5R>Gl6MuLcU)JB3qnU zKl|jmp*}+k!AL=*Ns`zU72YL`&*}}3^9hyHf*Xy7^O>a|&lOo-Pid)@Dbpw%P6p5c zWVi;=NkOm`RW%;2zAXR)AsZ}QHJGCbG6xMHCt=BeT@mQ z0lP8;q%TxU$^r!-1-6gNLZpB=Q4$0OxhF|-RE>B-s;Q<(Vq3TQvJAv!u!?QXh-F3B zlPv!FcyahGaIe3$RzJH5)&E0Lk!rwfp=sDcmJ$KJ>Jbtkz^K(z&j|TDcgf$X{6`(xffPx{?3faJTFbM>J8_+J0CzH5<3npojAOROph$apaGy_Tp zZGfspxIye8HLmO%{HcZuA;7Cep9O*i=zr9*4Md@xAxoeYo00cUKY`lzw z^}ffa(}#02Dkm7N;2Z^pOh>Pl{6;!}4i1JZX3$iPE&PQnVpReVo!2$72dx5@S*&xG zb6L`xkVWDk9uCQg|9?~koQOcAqQ`v`>8Swt@Yd#&$G1UCWNCu#9Up=+o}#!2Pad~| zP>6EQ5UC!z0oJMC+(g?OJ*Ts#;e*4&KglNf1ygf8&(S4SVUgFU_i34)na}-sr`ah1 zSVjpj0YO@9OAjS%YUOKx~L%;&Ue4em4D+QKUNe8+fqMR3$2O!LHV1Obm zP{wjp*h^Q~}CA z$OXnI2N4Gd19Jf&08N5iS4VO6DAFQDhGrl`F@z|N!RYXYu9!d|JYT2rRMkWQ z6n(3JrppVeq6nf@#kActs%3?xMUe6^s1_E+TqKydmI4;6B!CD2A<$-Z$&XU#%oI9R zLQUNPFzA$XD(YHwF9Sv^KSAx5h021V1UkRwfcT3aiop3Yf!qrT9nK|-N<@GOWJv;% zU)eHTVFsnJZ8f+6iXTK|B@j_%0!{+CS|kJdJ2O>1W?bxz=fmF*lF^_0;o%IS1jSHS zS+azpOp&Ko{{IIT0>G_qjs>QB^ur%wIei>Jkdcfm6leYkrB-YBKtG(MgOXEdfD)z9 z7*DmHgw&wHNg!rPzjWHWh5{~OkgR^tGj5csT$D9;J=}x3J82p;y~#<3Nz@C0;j0}!cB#IK0|2{ zL1#B5T5w)17G-E6mkdb=;t za|T`9e%fD5qgIeCHf6!y+1lLb z6-|)aL8}P;rVX8i(K3k9TH8VU!xh@yt`@o^5XlrGTY^Z69@YJi54FyG8l2n@ zSv@zPS{Ffu4vLcqybedMuA}jIbh7%7tg1R8g2V)RzbrCq9v#PGL}ZLjRTQzp2%Xu6 zRe=~nrP|}erRBd@3Jhrp>ioDTg`Elj+pME?>oTg# z=2)5tsi1nQIZfh%+m;F`v|2+P(I8H+Dg)<(Apq5nf%zqHd!SE1LShW8APAypBEZYZ z!>nz~2PDPTj8i$4JH-YZM26f8z9b8E#=S-&}W zZCSxfsGdCp?N^PCR;#RksIe*+AcM;&+2ehb%&7n{Bp0>n+aP|-M^For&$J4unkbX% zN|QjatU=5ghlj)I8WaFD?{=JKvu6~sAEl1n_!$Lb5=5nh)qD=$Fo(!?ldN>?x@xn6 zi++^nGU3@`nX9&|#)c_T5PvoU#a&JQsEojB5er#Kxg-J$!7E8Q(ty4pY#}Lw7Xe3C zvmK-ur0Pgstqm|7#SnWG*r5P6NYLK?7@a-S25SdrRb4d#9gxlnRH_BAk5tin71_uS zmT;cH6ksn*6&MCIK=l+53QDkI22^5{vIGJJa$nB2WNdv6v0SKEBFA!>b}9pSWX4NG8?1&gZELb_ew^mnOhQt>D4C||I4v_yLgj8tOSq|jwOMMjPNw3C#fQe z7!5;uaxT@PR+^*;iU!sW@_(9v*fV7gbS@+y6oEQWqhTXem(gmKL6BEh{lMPoA_D7) zhSNDXm^K=WeN^{Euw~UlEg&UH3h06A>7y!A8?db{A{)M|wp7rAgDIF)73I(-Kt-P; zOz&l=x=ogdREUmuI=iTCdc~bFkt^AQ$wXc=5}Po&Kd?Nt39!zdxPKSM%?--P(=S!E{$q zv~@)>Fj%lw&2<;xiC5#l(X%NJRF=zwu)qtd|gw&uB z2$(FRQk+nUNCM5lrfG(V^OQn$N+APXR?V#wz)m$94PiD*c@mX^?ttX*!QKJAClGE%@8`?!e$A-y+4=P=i07hJ#MmhFYyuHpjRc)s_C2}k z^x+DlC%Wp?tMh;Ffn9@+tTl8L zh9~R#Lrg&)2SJE|+Hv~-wf809aopE^Z)SF9W_R{Ju#1xb2=Kl{krG8oR%AuCqJlhrO8~Qj!R);EfA9C+{~b1HYLk=kd&KpiD5!Q3mwA*= zV4_+Nae&$iQh2_K+JoF&y}`pBzqt)oUoFCuk3SA-!+=OU0UH=gX`ab{w zAOJ~3K~#j23hcO}4^l@v;rQ^vTGfyF9my^!B!^em)OvvPBeiHay~WhZiw$VbUicv2 zIeKFaKodMs1){5VkpMX8V~2RD$n#37RG*Lgf)y?mXG(`h4!jVRGmwq-Ah4>X96qS? zL1Sj1d+WwnBGS9GSWQ+N#%9}h#t|m0uT&bzQoUM8C*r6B`RROHAcK%WwOu#XELq!e zg{z_@@ZpGPYYjUQ4MEwoJ-?wjLES`|<2Zy5J{Y=1yOF3_se5T0s+A^{3*#k8jpHh( zrZos%(UAbPZiCzwfOtfNDt?bZjjckO=($vE;_(oAJT9ts5q96P8dmS*;r_q8A8|km zwqLUYx;i@{7K=f(T!s@vLvVWJBurIbfv)Yn(6M1~)xw$fyC;Wh4Gk;$N!lz@FNz67Hqry-`q zpl40Tr+4hy{GA6M*b91~2C7GWqQYR<+O%rdLu+~lB#;pKEt^#X-6KhoSg`5sq&E}* zIjBHf&Ouzc5Cpb}%JFDCoG)}{*GUmEsYT^9^ljRS{(4=ueRGa;BTECTayR8N?Wy_2 z!no%CzoYI0oD$T<`k1lvBc$@ijCSQYq~EXbV4QJD!E@hpP9XcXlHg|yzJEODRj zYEQxJQV~#?D9sBsL;^JQ3KFRhOieXF;?Oi$J`@qG$tdBwZ{7h14*d+ZiwC#eej{|Y z=aJbd#&{xP90hPTZ`lgfY6a>q??;p3Lrv3nE-ak7rLLBqM6|4^W(Be848@J0UaaU( zKKp-R>(-60dY*4Ty`ccqj5(N9kAoIiZWjF-gy75V&aSp%%G#93D+U7flrIQbR|^fh zP^IXGKRvh5Y#NC7AUKjqC6*Efx+%N+lDYxyJ<& z3*gFUX;_qPqv^P+!vLMx6r3EJMq3|&*||k(Esx%W2&>oRX;T=gMFULBL)-5_G!5|d zV?(fI(?(SL9jvia5HU=%s(}y|@b_p34{?hWg8u$Nn3$Z#YtBGjNW$W*`eCp$2Sr6q z1_Qw^&gJJ^*=U#odBE?I$)UJt@PBeo7;t?}qFps~3spqRCMS7fskT@Tg<`V}wc;;S z$G~*eQ>Jb!k(gq3rF%LXM$s?TD%N$I?&z!6wc*7=an6iue_=S$PDKvTn2uX;fjZ+8 zGoztMa4HkeU0q(RqH=Im)B>u+OY7utaHpaKJCM14y>11nHC^&Jzb1u6x4k1Q)XT_3 zROgkF%IEV*JFEn0R1E`$ZJ7|-Zv+xW4eYQC*WZ?dVA6v+x@l9>(;&qy=R+9&2ujLyL)Kk#YTwqpnU$piO7Ac$gvz=FDagi#P^CUOmhsIzC_GYZ%K z2VP4G~c!;x^8=WtQ0aHgO^Te-mWs#!=`;JE`AI^FxtY`| zGo47?fF8oJ(b=;P=TfpI)%tJKj=v?a)7L-46DTo0w@IK2GgKA0SvXQN_cktkTg95Qc@eXY|5xM9_N?aI3m-eJ6Z_r~}psCx?tf1u5^kBnBP11z6Rm#`KM`9nb z4a>0osj*lz6$;DfYFuhl;BBTi27&B8S;ydu-aAJ$2$=%&G+9iw3NT$92GgnYtJ?Zf zZL7LASeBkub?%hyQhG(rotz)iOmw27QkQF6GVcg^ROhCiis!C<>BzxZNepPy#pw#* z^(@Od8&yO<7V~Y(R)4s-q&~z;!C$Y}^_y`KO?a-aW)kuDMpFT5?*hq~Bs3b9A4|yG zT&a#2K!owh61QP(jtf#U0Adyn0j+>M_}BN|3}e#=;KBR%z`~pfgM))`>rFeMy(+YokWqUOig(DZKrMLS$w{a*i|8K8U{-?A zY#=_6_`B}>t=)sEWMuToC!T=kpF5zR8=8G3&>ISX$cgAJiy-n;!TQ>FO&dbA-C5Gc zQA`@_0mLCL>W;O3saR^O)@mn`8ATv~8w#b3N-b@Um!_+^M2c(6=RGkL3>JzDshPR) z(NrSu21ILPKHF}2wtPyrjYkDD=&tYG_VKyGv@kS&_&!5-{&b*c+g@2xe#|Og&1eX;!GPEBdz?Cs!>t^p{NQWgx$ zQ8b&Plh2CR)@o%p0R9HcG>R`AedebF`Kv1AUP*F1Gc-K@-0&);nZUEMA*Z`{5geRYP3<04E&p!7Y$g%_- zon0+|9iPqg*%JKtZw|oO$zjM0IFL-IVf2{A(#Sw*4az=#Z2BXnRsN!g_~5qNZ-SAL zV<1o(^A$jE!URyRj>oovUq55jXR`#@ceHuOayYy~tu_ylP!bTk;~N%KY8u2Nd4RM| zc?H(c)Df#E-*2=hb60zg?oO8`kB-hAIgAgk5e|owv1BOkn!2=9S$u^Tn`bu;4oDmN zHs4ikER+h>+<~whf3z@P+CDKiezd)<#})(1^~n6BAb75U$~Kb@1)HkFD`CzrR!t7Q zFu3aaE*Ks@0=nwK2k*KS)~+3ZOa|`>=?C}ig~^dg_{hJ!4LW<xe{9_ONls1MM7igJie6hAdFgszwi+cw+? z`9uf-mj%?Qw_Y#Gh2q4|1i@WOMRPstySJ|OIadvZ!kVEP^QeZZqDWK6L*Zki$45ib z=u_Qoy_vL<>CR=->)R4(bR_2YHnp;BXmcl0@y?HmqTE+&Xk083vI7BL4g>>SKE}h$ zya7$E2ooct(6K5HU0v;n6JqSH$4*YbegEs*aCGP>SWO51<2UXBB_u&Mn}zX-3Fz+W zgr1HZOrS8JcY&YLg;iH2p{HjPyiBd(T}oARAeB>YIJR%} zIMe*-QrXVC#0~sqi4X8lEG@!hVG2ssB6KFY1>W-ml&KpI$WkJjX!AI`y}KtjXWCl2 zTG0aurEOxqa<<@F2Fw(vm|q=@q$!^+I#oD@&(NnHWW|OYE!H&sNH`P_1U?k6sl|tM zYEC$FdaI)}O-g;kvt)(2coX9@aQx6|xPJEzSi55o0ilPc#fItO65Rjv3s9J^LL%A55<3`h z#?|jTKG3dZx=p!u%eAY%St-&;dc;=LedG$D%PIg&C!i)MYh{oEAwZW7!jTvsODJ)C zHsJ~iglg29ZK=$`dd<})rl%9bvj>(!a-_0h)kZjUW*-XA44@_8yF+=g)R>JmjN*7y zNy1XI!gq?vh$tnvBPU+wCJRHsHLC{>46Yj3XsE%14Yl$=bj#Sap}+SY3(c5jyD&Lj zLq^IVXLS(qeri<}ZM?>iJ*9!=J2LR!|LRLHKUsneyZh0O+t8@1u!veC9Fk#rya12? za6cS^=dKid$R5LYN=Q&ffBhM zHuP^oU)~3`X$Uj3bFoA`Ug&aG;iBVtMU3{ylBA+`uu{pq@XF~Y7A9s580ha9P9{^S zg$2zsol0qVg3I=_b$x_$eJ+5mYQtN)H|wF;sb#)l4`Zd*mebc#OIL#0w} zLKK|IuD1Tq&Mj2}PUaB0a{_GIxE%)jdg1ty!>E~(ux|Z2!~&Eu-b%_SF4f_gA030y z@naCqS|IaDm^r%$sca|2V_A@;G&3JAjgm)ZvLMlNP>7iwN+%=S>u}6taPShV*LFk} zW=i1kRLk@(aRV+XtrB@I5br^1(sXDx$JY z`QwGd6g+~Bt8cofn1bpTDCbW19lcy_p8VOtL;wD&jn-GT-jw>2sRjKL!^ajNk!XWe zXy@0j>4hgAe*&fvXRPX3%@SbdC#rDr;5mj5 zlIT@;+`R6S?n_I%RLxpjoGPPjFT;kxwQ&2b*TeophvD?_FgQ9#A!Gz|GHhPo2k}rI z?*H>2L!n?mM|UrT5F|=Mn9||c$|m(r)ljr$f9Zt|$Ruu>|~I38f)Gee;&pX%JVI6pit&V}}jLEE#&)<^@#0riX4M zWh%YS!$bvRAOP&&mPdThOIqi*7pEIfRhQy{kQ{~=pD04@st61YY=@xi0A=#>XuECH z1S79Zz;jPON6DVh+q)Vh8JRD~(cDm#Hvv3c$IG*SX#G=yC?(Jc?6zB0%TaAH$W6tDk@#`x89132cpsMu8wkGaE({u$=C_d^1$R1m&tRIDUMh zeQ~Za?^1E%6+l;{09;HLKFl{m#Qbn12?HqwWF^F6^3~!3GEIPh3@=Gi?W>tg>OVDV z=$1hkY&6WaAwXqO1J@2iI39vHGL1HZ1aui$A0PZhO8yW<6hPi*#iX_!0NVJvGw3?NZq)49_)aKD&IRAFvF?yE>z%NQ3xUvso7=3cew9}gm zlu`JdLfZjO_8VpWuSL10#8c_ds!L8QAcW_NcoKOjK27;VQ$Xcn0rd9+h&iNS0HiPq zfI=M#kgXO1J5@)p8GtaF6UsJjG+BleUI(!NdI;!z0@W=EmWAJkKuHC=sAll>c30m{ zx-!J@t)%7WDo6++ZJU*nImk>0-L%#VL0ceDL&tG!d~E9XJm1(GLck{mL^dT=5+w*B z$P1yb5sAi;vG}4|09^T!EPxo5@GA;}5}=wzx)ub2K78u)JK>Y}Yyi_RA({xnJ)ggk zX$#j!@JFUf^g%b!Tj0E%BITT4A@qhCfc#sObJorJQrp3=Cguv^KkCv!d+3&Bv!Dny zKVW<62+G)d0{09@sq;c~tRb5o0d+&iGWpEHAC;rXPkU0l87Mv_V= zQ0L=U5t+>+vqj2;WkoR@L?S#;6+877&b5cZh$svA7Ed_U&|fX<;P9<_#{(o3qXi-wcXA)}v;Ok`C9$UN$1 z(i(!zvHc0E!cE5cfN2CR=Z@pwx522JP!v>%MgY=r0UCzCB^VNDx3a?i z$U96_gn9AN^QcrVL$y+8YU~#wD#Ml$G1K}cUzwP}@zkU0gk4G0y*T1OyXco}iy?Sd%ZK|;AhRyKXzkBXLRSpa2X}nqw*D5Nk>TM;dTuxdM0-z`f)M7b^#9GB1=MxzjY8k6F zwC4@SI4w(&HB@Rs3?pB?yikGT$M+*PEI=fABYFgBm>3Jdnr&MdD5kC@v~#H9il^;f zTch%FRQojVIzZLG)V&hVK~Ka(bK~*|PMJjvLZ(yPr8ngvl(GO`izY|>oTye&k}rSS z*oqJUQo$yA2%`PkAD4u{@%-6FxwcoyN7o1r53cROso^1b{-sAz?dx#MO&>-eIY{N- z(AL3&O$~z)a5jqu%O{|4vFD(N5kzLASK=c8q=+VMPqM@i!W|Sgru_r_gXEI(LZAat zh$Hws9=#A_`BXD_Uftm3q7@+k1Re!X1m3&E$Hi4D@LtSuJ%j4~C`?~os6sRzgS$WW z8OWsDnD1{}2J=5`3RUCFB1Thc7e#fM!$SB0!K_Q}D9r<)W)cW0@mLFNlP5)94MX23 zI2=k8Y()3=80w1)ZmAVfd^Iw7>uE&@0NHU`nF8APOA*3=f@j;0p||)s%IiqCCqNFh zq5n@E!yM2wt+k3-pbweI+)iXR^-09lPXa)rbtz6k%%|7{y+=EQES|CKuC`wI2T^E3 zAz>E3J=WSce6^GP>YpzUtq1|2;Y^Jty4|#ge+eR{MXb!zg6L17!1R(rCfn{2gNc!> zbNF&hf`kBnX3S@CCn^kSHJqZr83_WlqoH0!WENP@nq?vITylG9SSTueL8#C*S)s_Q z7{0vSbiuL9K`TN4d|Ztbee+w*tzVO<_Mu*BN-B-}q>i1-IeRS41DQ=x#&f;=eN+)H z+W(eTN5K#TCO|(|^^^=kDxR`}$>y`;%kLowq^Kx$A=7Gg>ahVn%_e%4A3)L3mR-5L zv?2r`8qGi^*@0fbrE2dfx`#;KsB0eYO`?t8%v#J6W}`qBHJ+lCPLQ4oVG&fa$RshJ zlsw`ATKS|M7_%7;Am*R1_VIV|8r0#86I=*Tb4o6F*oP2pPO*D9pF|3VvE!GQR)hcq z1PQ`&lo~}`{N^%|E9g?c2HR^=n3!BP7AGLa&{twEd56^Lk9GS)BToGTDR4w+pJ{kJ zkDW`eRydoz@DjBB&j;BB@I?yV2UYbIx;KiDGHE-HsOI2JZoT|cv?2t6_5+A}v@$P6 zA{1FuU}Q?_RzQ^^!8YXLME ztsFu8yXaD~FgTt|S;IVH1Jkg;6BoLr2*(*ZWh7sy?_FQT-@W`T<5q+KXr=)*a|vAP zAax0%(J-h3mgI0|$aCN>Vw8sVStJ!td3|KV={#l{kdeqSw)=>ypP2@9?oD+6*oM}! z%BSzyW))=zFKYwZ(UkZQlq)4DHILrf(|PkBjSrj4;|~6gT#8V7|6l^%5^6S!u&^)( znsMo=oK(gY3PqJ_vC*xFRJKM@Jdc97>?_+Q{P~tLf z1Z6INYV@g(E9O?{=^n(VgG@tak*h}$ycP?I{XA!iRxCh7p!mJbiU2rJZ^V zlL^3|$Q8u#}b=Igivj4{356-gm*_x13gl031Gi z8lHXZX>rDz2QXJdk(Z>5%T6Wkcfv+9ixh-AU***I+q|H9wT&5 ztDMabI0yR9U5~k!t(AYy%_CE@RG0=SYJp?%Cq~Bh%=uQB1&7Y3TBQ#8jqk;z2JOQ4&(AeGFrs$V7t z%l-HApqO2SqI5P3`E+eJ&%~5jartNheV_siqrO0FYb8-nst@6reQ>KB?zs= zSVw{n-F3k&zvZ+d1fWtfVPUF{%)Sr=QbbRT1R&AD1C4+)n*RG7-D6B74{S}>4Iqn2 z7@2>Vri0+adJ@Xo2&)WMGMPefF} zMv0+};xOMv(^j*0esYs+sxGA{;~kL}qDd@GShFDoeX9p9xZle`D?$J$p))`Q9yC44LpmIKQu@M*TVp6gG@ROuIaNBGq$aZkB>&y>zc#98itEn!~|7US$-gG z4@;pa#FQ`u0wM|`Z36M&TF}%Djrt!1niZq1sd1n-J!mvM&~(xqH2Mxr3H7nR%(OD% z0E0Y?&on?V(C9aT7`k(n+F$kdH9xOxk$ zO)RZo>U3gTEX0GWpF{P|gB*;3fnYD+ol9uCuy^vy-QxTqaQY_RxwDfJh2$Zng+L z-3ps2ux`V8D58&lcBl@+2Mbl7bGd}R>N;IRp-`*Nc>S;%m^0%wrw^H5#@7N!fdGV+ z2&+o6n)dSi1au1pgT(?=%YY37gRpMhYG~r>r*<=E&Wy7JP+sO42B6u7jvBfzo#=R= z9w>eVegD|AdtUB2a%2cyRRcC}?_~g#4Xb(^b^?i3ga8nOTxvndnm3@;L-j3(L(snk zU}X3-%uhC@&d$yOwbp=oV@XY=I{#6zHn~T&7i1mPaWau)vk}3t*+7Xvkoo>@45q_>N;)Cd|$(?Wk)@ zphQEoyUez%sa1_6(!kCOy_U;CD*^+YBl6J$!2qgp3HJW<@h^YtTYvFrG%aP?+dDS; zHs9H-SEw>cTibp6^J!)Ey^e{J!x}nytoD%1hk+|y$JJ^g=+iZwHIty@9BPP{4jzGG zxdi+6?}t-kXVH@&wU4OYH9^<4iBh@t9+p)UfC2*3)3(__7tp+6W@-`o`r9C$h{4qK z%(V~v&4c?-oILt3!iXO(H?0T_aE_<~m_XR!V~4gp^n(ZQeP!qbeDHnEue^WvXHGZK z?lx6w5+Tfb9@n0WZvVrs)zP-;soBq!s%69s=*kHqs&Yi}xKwFqA$0@&}8dHSiRc5dFd={RDFmoNS#Zyl`&0U&c4mSqTsLh#-1e}B)5`}XaoB#~qy zjw`v@jw|)*TD6LPc^Q)F=${u$?ySevAYj@5&Nl5kQGNF{8akd^V(wf-QP==U*I^q( z4JE9U8_gzf+fLT=JXuA}K%Rh&fM=ds%by!Oo8yiLG!er^_?efHUVc3*$PKM24tOVkAN%*5nxJn__1H@x`b3-4DV zQJ``x8rj~P-}ye*lq6kUfI!I7Jv;N`uo!|^y9@DL4t!pC)*5yDLI~meGzm1++!Gk5}S*O6-4cj2s-Z>Ns z2O%g*4524uF_5G%x{0nZ8VJs-alg~T@v$OMGxaGY!{@~D&6Ze@7 zjTNL&+V}XGiSCFJ9=_(9>+XysVA$kss4odioF#v2u6g!LoP^L2wN$fSWw8Ya+IxH2 z+drnNY|h57c3PD6xIW^R)ZUM?>=$Owbw*y zjV6qYj6xH?o}=T(POPif^^?1HUH#>beB!^9qcZq@>fS=pIZ~<5eY#nyO=oiPN88&6 zkLI$8$!s!>8i`!N%S$Ul0MIr=@2akSnx^+3J34f?qA01UxrcuB`GXI|S9NUu{T*xm z$>XM}!Ky(7hB>=y-{GO-i{(X75IAZG7Aa$xB6xC0Vo^TLY=WwreLZprI{SLrDyN-5 zB@%)C2M%>qs}1Py?}52O5q#T%Tt}Yj!l72KLa9{#a(`dXUw!Gn{@z4B*Fm@Uu;beg zQ+#1LIQ_QLig5!e&09AuT9V&VRh=??zRE(mmJcE)LnLRz>a78&lp41z6&InaGYOH1 z0F_FWbsCY7`79u0Xbs- zg1N|C6oNuw4l%;jc_}DPoVzz_iuq2_%FqC)#tmIVRbO2`(yH$xs+5~hQ=7oahhYE9 z0@P}nK0bN|G}^_(f2Mg}i8cqvWJpG_6sO!gffaz0R-`9*QI>{9^U`H4?r?``Lljsp8)TKTzr(=DAj!bYpvhpFm|R@o7!csYfD?SX z22>3MmvupAq015gTq&u=$w2xK5XU7K6qPVAFvbAc+~p+&Aa(|jEs~TCX4in&ML-7v z*%LtQbO?J1SPg`|1FR+_$Qj5!17tg-Be9c^*id^xfH~O+%Az7DNv#07nSsI0iGcwW zrVvp?SRuri#emot7#B+rV)=_07%aX5#U~)dl4de6Y;R>?khp~qQ(3^kz~92auq%~`f#tDpvkR(NJ2%d%S(CZH z_VVGE2LJy90Nz1UeUj`h^#A}M07*naRCr#@z1g!Z$z3j%Sy@?g)tZOB_H^cR`t&Sy zg9J!I2<`>Uy%E>G*Wrj84m-jx{xf*-f8i&;*$=h@!@UTQ1VRJoN-ee2^BMQN_8M!R ztI}VtmVf{v+${!EV)r>`?X^~AWq!YJ$jmCJ5Q2P?{|`sm25_HXnK+Ll^LTH0;d&WS?jt3}A%jyc*t zaIN0Rt%|HV`QXP_szQ|+5$*Q)c0bCp<{my%XiPb28$qZ-9Md)KJ6-L0TeWM7lN4n| zs!EVFE=U|zgfU9Ij^Q~D_g1THQ7FF!~xzicheN!RNM?*809YArx%+N@NKD~PG zqvZ-w@S1`?;2PicMboszME`yEcU~Y)$M~CF{Qt|L{@s`UX%5l0q(TP|1_m)Sjg;t! zXpxZllMPuel8UGzBlP3uNKgV;MO%prIr1vN)Sx5p-WkXrcDc!dJj&0yLz5|<{!$T@ z-0NC-;Aho~ug`ef3gx4B7i7E6MpR+dy%$I6&4+v1+uwQiQ5u)8G>m%VgHDHYepa^i zN71&thZC%YL>hh+1%K|^fxjxs6s;+exI71FZf`e9kwleIR<++5m73ksWkMWBBeuiI z>EpF{{^7FL9aMvgszlFFMIoA@qC8c?@b@szND2T9MmDj!W>Z}TQ5Y7QN|e&`$lFJ^ zyL(p`aezTOS}bCJICAcavVG1pnvs@PdwX`XJlirwWokpoXB&}FCWm^<&dnedrO;w6>g`tfV-XjMQ178EoTHhhOXYO7U zI0+De!Dl4Q3+lT1vFlnFs-qSh*BpXbb`bv;aQyQD0DU6q^x`5Ui+M;)gOk~fJ~4Gv zoUW3*LZ_hGnW>Z6&?K6w?j)sSbCPEcxm?BMVwn&N9VolkFu35RGK#aRYA;iNI&-Zo zDb^pobxGJ~XWQxB-j~bA^WWC>+E^8J+NG-XI4c8@k#=s;ywQoj(=7LkcR>gFkE|4)a3EISA?tD zPAePeE`=|U-hnX=!AExsVb*m^aiks?;@L7ngDF6v60Y;3sA&76kSQeu+gE8SJ@6KIrD7?(tx~iKc{Tq}ZB`A$6a&o>U$2U6U z;9!9MLFeF2>rGD5BqthINw06h%RQj$fmBtONM{9W5LATsFa82Y@`J*6Lhkf+=Q=!E1%6p!cQF+J=-cil{X%sN3R~XuHxdF|J6vKMnyx9P0ws8D_K)F&(1Ewv&qCB-hX+|K0Dn!+-&m`%`xVO zx4c*U$E8&1E5OSunb?Co{Y4Zu%+QsVTUuV`RUIUa;&xfTXqr^D^i07(8|cT`ogq1b zACXetR5bvD_A)wyc?|11kC~?SyPm1`2PV6?@GrK0krV3Ikb-0|F>VVW{OJ!b&nZ)u zoD&cFGQ&V!eC#|Z;W*EF6O$jleMO4b_K5{=R2JwMNXqH+4eKRZxnAO6E{#O=?lN9%o@% zKCp+@e=$wHdwQ~Vmg_X^_w`!Qw3mky^_X$Gdi;3vyv(XS&(mMX3vtoVhJk^EqS0+< zV0S1LtDGrLSu|=8R@1@6eurTYDp@_~z}~0N`~A00sasfK&oNGH_W+ zul4cqj|TvpY$t1!^l)+$Yz6$02rnnHVHBFav(-#>wprz1kk@9y;QCPzr!C|BbQ5NtW%2UC!{Gqt&-H_>Ry8$-Nz`zGEiPz}s^Taw+sd?g zwb>NoZckxO*F3vC4ZJift(&(7PraTwdj4#4(Ca#J92Y-AEY!v$``?CP{s&-}8m!XV zF5*bs^ubDbm=rfX*O+#?_T#23(=0<#0dO+b%2Xl{X)#bk2w3s$Z(Ub)ReHmogGASrrLm*tctq zE8C|}me~fn+w~lx>ohq%4JqSnJm?$kbnMkdQB1)SuIK1i8^8R}bG3*2``u)I6~cKb z_Yo0Ss?JP}v$Y)5vH+&W#_Oh~r*HgXfBB)a%zyIMdAnW2tkW4lF2uK2P4MqEjZa+9 zG!(U+!_WDaK@lH;*0`yPq8vaHsA%b6vgfK#pZT7tv5{seNt%cdI1W%r9F;l2d7~fy zXo*-7k0*QG1)^d1y|=F?r>E=e_^{_`7Qa@gxQ*UA%JbSc4DF6>XwTGvS}qq+mKTk+ z+N8e)OZ35$XG_V==sNV}$D@zR|EEn0KNkQbje{|F8u+sV)jx`oGOjBUf|ZEi6uFm1 zFf>}8fj1lKF|Js7)A&qPXRB3wd3hDlvTQ~w;+gB|_4#F{Tecn^9C+84=b_GM?lM(5 zfDug4Nij;ojzZB2IM`5^5;y5Zjn5qrz{@eWyJ>m*&vaBiq+7YB?97TbrGWIsi;iN9g(`_u8 zTcg1U(vo*v{Xw2oTS&mg<#`}ZPgcY*t-9-Iv**v&$C{=_qoFIdVNyG#rZtqVz+hxF zuzsTy^lQN;wE{G_l>+8t4dvBDCM~(uo7NaAHN?Q)v zwc3XI_>R-25y!L^4mY$COcE|v@#nUS$agz>?6~?hH`IY+>oX*ciD9rd4Du&1Un9iK zHPL1)XWcx-Cw8;36re^M2-Q`gPW^(wXeb;=ftBm!>Aj%(JG(=j6C&Fky9 zJlOBtL)R=e>+E}lD`?l#--H9``(gRq_ITE`jWQg%qaa9r(Q@_3P}TP?uG+?Q=#W0$MbHeuL%MWHNStM=0V0%iyClYhD-( zwg0SZ+TCuiy#>;X(WJk$T#YQRZko0unTflewndfRP17d8`Lw~*v!ke1;xw>qN3Q|28bBGt z?LXdZsv%Q}xwq%0Emf?#Y*Pi*XP9i%H1w9C@k`54zO0#QIzJEI2AJQqZR58Mn_UGb z<+uAiox(ic0)Ppi0Jh6+n%f6(;TkpwRjRH<&o70!?v~0=XvuD&17knHZ_vQ3a=spkA;h$O9HaICi%}A08r2rYKjOdWcBaj zhUjrqwX(P>G(**!R-{17Rg%@eR1~$*w)I~$igE#S%%R=;h%E&uFJ~$(xTZ{>pKP|e z&bv;>@ZroH(^M05+8P6Uyg%#yYXIvy&C6i#pts#DBjxhRW?^^qi?(53gf&0Wxq3xa zHVZbHwcez65EOcls7nlbesLPay}n6Yg?+{G^sQy848YhTrk%d@+T_9fEP6f~+c&~( zshvHUfA{u%gfvUBR?DU~GU+R-y)<41Eut01p>S;Nv#O>=8$U+wpuI3C{x77pOULD8 zGIFk9^6s9WZpCb`n?TB1Fr-ctat(%j9ntc-=Jg)~@%!*VhnmWRBuOKfC%!-Jbc#+% z497BIc$KCWvEk^ft=bgUfH8`IN$L6@>JNS{0LW#Izmk89|4%2G2;uk-005`n0YdXI z$aL7?C8AUxGNCQ!@mr?FU3E)`o1o;#+Xl?g7Dg`|P3#n=(kdEp<#n1Z&ahYJC1jdc zFjXWiy@Cpx`K#>R!N^$`2=P%=T}}_WN$5v9D)#;9%(GA_uY!zTD2vk2b!8hx z&GX6B>a5pEivD^GL&i4iw8I&Fg8>AltttS<0-w3F-Xw2yJQL(w{k~?aPv#flcsO;k zn@66;44tUD5-%@f5%?Ji{8WeGx#dz()(x%dy8h;5=7p+4-q^{YLVA=bhp6Dc)D2}n zOB*@6s768gUC+}~fCXN<=`&5;in{&pdJ|)V4*V8=zeN)2S)O^nteUs4FOwCze7H9i zFN_XcAMtYmS#-;y9&?kuFV{|X10mzKoKF1|$EOB>#G4#!NkKmaf%Gd(&fUss+}-?r z-)7-9A+D|wQ8vq>r7hym4GfxB7S);K=s_!j?bUU*M1}P3-WsHaqbZ?ZDh;}^(=$MH z>?%&Pm+DqPG3pkS*@=7QEd=O>bEYBz+_pXAIrO!e+#HZcZ&fZNXRYr9TgjJ8D# zGj}nXI;Uvs7P$P4?K=ND{6J}%{0MaY7S4UFtdtk)ruj%!m464*Ds-m2qif2-+V4FS zNGXY*e-GDrV{+6J2$lvGMs08l@@&1 zw{k>PmdDjO2H!=TwBoRcRc=Oz#OFfr-|qAnxU;R%?hFj^I?QM_J@9<==luG_zrTOn zy=B>40L&Lf)-F**Hk zNm_ijZD|l|iMHL+sZfYwF(%R);LC~@nomcLYqeWHI|=dlGqXJ=B znx}2qco&QK3A*UYw$wAE4HYsma%=-+RL@5f@4rG9y@kOG4O@SS>wJXNq}OG=sf&80 z=`55C3UFU(y4r`Sd?uNo&Z{XZehqJBfVlz~Qjm>M3`5npu6kM4tmJfWRn?@s7_@eh#1+ASYM}fYS-t`4Z{ni#?K)H7 zjK6F<<}ZSR=Sd<)X}+uUBO=h6llQ zw=F8=B_Wi#p|khU30i}b7FE;arFdu1H)loB{t$ii6k3~PWj*cp%{8veIDNJ$;mU)> zWk7;u*1Pp!WF?!Na*afbRXSiAV8N9`fUi6|-CRHdF9rkeRmk3pR8_(CnKhYo21HX1 zI8!!A9Jw5e(`Rb~gPJK+@#3UhV5pdm%qc;OL<8^C_H+O~%Uj7FTm!p8PM!e_rQ0zo z$J5#@tE{GIidu+Dk+h5f{@b?T9}NI!A1w*|9}2J~=rF=L$KX@wA}czsF+oR{3Rh}m z@!Ssze?0d1(GBMo-r-h7wKW_gMK-SmrAnICw(rLb&VGo-7bxL#8x=5|cuX~vv@EL( z73ig5nZLwjedm*IFm2%}+ngZW;n{hD%*lxg=94eevw#(}z zsC2Ju+^F07?RcFTl(XB2h0kqA?J)pD2wGa6?&JGa$jhuqs&}ofMQocLL7twVWxi#r z9bCUUoVj8>Pb`2|ar%136t!xy^5f~*PXT~W?E%m^B#s-hT&84y-z9B@aHqlnkmjmw zn=Want?9JUOtYa%JI^uae>~7yqUC$ z;zHgAjPu~?GMM%IR-E-JSyso~RJKXns0nf~Rh)NA&O|$QEWW5k zGg7#AXS0rDjVljKO=C$a4!T|50TKP)dXf1}+dKuxw7hB2X8U#5)#-8(eM_muNyFv3 zX#29Fs7Snm2Pco$s%`P{c9WW&fq8}t zQ-dJ>1;f<$S?Y$!xs4Pp% z@OQr~i4Ml#h^#lVAZ_iQl{2dR2uh&=R2>+?k>&Ca;SKhS95Bj-jw(H?O7Rjy=LUZH z1in_<{G@K%#MJqIP1?ilHU~DUH@lws%h35%np8(sB`Q$=J*LRRN{$;HQs53gud?B#0uZKTd6gnm_kq5IPK*zajf~ z2ITGUo|46BOpwiYYtWvnlT84$<{E)ZC0SZTasmfq@Q`Wzd68G&b6r7PkL}e3jXHg+ z5bL-FE%$moV|4o5e;=LG$?|d&2FWWhN7`Uw>ruql$m|iE^b8%}!?k9bp^V}FwT`8H zqqJJ0Mlco{+ebsLqo4@)kG(ta8PDL(kyPlbx~;;6XK$h60~1CwR#}3i@_JS`r#cda zVY1_*CYyn0{7BQ3m&2GJXIb!wv~83`)id2y!!!;jjx^mA@=-RfeTi2Jt|L%3Q^1a!(r^Td3r85kB zL)#+BGr4a-lw|}~^8k#QAoNm>k7hx-Vc@`fgMZk*B)~|1fm|MyYvXBJ>NtB(VQ|oO zW21V>)fL(WBtolG49FR6o7WAE-G;OFm{4E901nPhw;6mQN4DOgu~SByEcUa{1ncCp z@DXogu*Ld1d88ZctLsgSoY8JWKd(+sx389YyX*|@&pca-0U7A z8Gs$D5bW}1QP+=DMVXi$zYU{!1UJ1fZT*$Oo};4bX;ZX&N!Xlf8vR<4wTDq!rO4;A z!<$_L7y2Stz>BxV92x#7jcQ}PifY8N)4{;(UN5qT+fDNQZr6MlM)rEMNbkYB2B(uj&wAABT5d~3B9wNo+qGXx^ZF_atD$A_&mcjS zHn5L0@Ije1qs=m*>qU}~s+s0_8O57etI&C-Z9a#*Um+Uis=+#X&+6>m>?5BUBq>N( zfkGS5aseN}0RXRW+fLs|e+~)wc*~NU?v+(Pvzv7c*~m(fFH{8l%NuNx+> zr&A}pn1_0u*OsoSUxf1&nyKZXpLA?T--9_iE35heX!m@18T}yLW@myaR$Ww{@291p zNp*XzznnPC14!r{ zu!aV(Q!tBxzOe(pYS-(e4a3x0F5>`FP+GPgL+U)pbt+9?QdDwM3ZG+2k(VkGBm)z< zHKF0B1HcCWfK)yyAoxGzSNx|Y2q^vaD((Or0jMS}s|MZ$|7uCkG?a%$)w+27i-=S& z0wjGQ+BrS^{F1kfg&umM7>h|=dXPaH2D1C(qaeWybPxjnf zptcTZ7}is9*2~E0xV%e+vV^zjoIcZ6B2hL(cj|4zo|ipMpVnk<~9{QU2KJnI+_84WHAoTq9H3 zCP|BSI@@y(%ChdDo8Cy0>JahrR}gXUJC0g77z~)Djmmk(ROK-oMKPXu_cuXy3RCxF z?dKomQEmX(BN*Z$jf?*i43s&pIY3dY@Vzg|C26iO5Mdhx+w2_x^o_C-e&}bHl!=qc z#G1n*MOj*PP+*5Dr&C-vlYWYEC_gF?5(3;d6R+zeU||5lfuuo-;eX(WgaPzk)&88k$h6vG)+4=HoqY3PW|r>6i_qrH_s?fZDCwHD1A=3zT&aRiK0WGtlp2eD=7l z+EE5Wo2TXDPT%DIwtUPrrOS1d13-Hg5(X+>-)u4wM5SD_&&Ol?RY=@#USG#wYytVQ zEFU7}4j_R|mNoNUUkC9idT(g_1ic=b>ep#bOy%ki#LN!mf(?b`sT^ z+(!meJC;i{{x-ee?b+U~d%aZ7U@qrTlvj=aDF6_WCMbzqNa^EeJg|1F0HEW}a+NME z+o(AwL%9^-A<)aEeaBEQqPRT0T0}mhB<}W%qH5af(`WvHt`l54yMSr=j$!b3qNutF zO_nQNKSIWrZgvJX2rP$>NJT?Ls@t3^F*I3&o(uq(3EnPu%BiT}4h$R4&m(AhIhr`% zgS&p1rj0%r+85hp`T>gI)@bT}8B8;VYd+@&H{gb!Bga4G8oLXR(owm34%R`3YPD%F zgarCRZ(v=5g6r5%L2GSy>*ph?DhPh9s@eRrwx#{MXV11@*1)c??Z3EKq%G%+!zVa$ zb=&duax!zS(xeU$(;ldXVt~P}0p92MOd6-c^oN8O(Ou4w7i zdXp3}z?!A?fo7_oIl4KxZ|E$%JP!}R&2s5n!65NZ41m>nL@u7Lc1ytW_AW#s_z(eo zsfFhvrK|Wdg&xar0QyT%@yi+=06k+(t4!;oI&c$8#W&$aI-QJxUS+TD#ADl<)6 zEuqVr(={oWL`4U`f)0Gm_VgQ_j+Zq{W0Q_ZTP8o)5# zf-jih{Wriw=ZdO&sO~IxT@p%3mM!aWS5;t>Xf z4Tsht^y^U=X7|7iW1wK>TKZm+HU-xRhvA$iaiQX3;=$PMs+4GQVnj0)7z2|>e%ggr zYNBml#-9(OFng*3rI0VLN}E1|6ts!}Rni%%egpbHL)9H2%^V_X*&0_}T;pc}CcP}% zFUToabYPtotpm^2AkKak#qc6DTZ1*~!ovy-hz4%~7EmgfP1WnEy>L@pp%Q(KlL&=k z!MMGR4jkb7ukrpfRa38uve>V=#87P)?M-!CpRbpR*Vb(U!y1UT`R-<& zEjq5=6>x-;eV2Q#)znozYFcrmYUt#&#?>n`h^9@9wRECT|*rlzbn~IST{W1<`&Ext#QR)(5Lqd{X4} zOPZ~0hN^K4zcH?AQgl4x5lXFSo6(#xPq(=X7Wj>An?Ea>D(SfFWylL`Lvs&~_?BF6 zWU9KVoAO#^>RjaQ25H839OWI_R#P}!%g}geTH61F^S=suT@g_~hUm^%SsL@p<8(F`;2?;@GRCwrEB{+f)4$7A5d(y;g&SdNX8Y7}HBGbh zfug84{B_)A5LFc2Mb$PVw`;u!1ACrF)!S5QnQrP83|BH7yLGStZx_uBPWZ{E0>Ewu z7_LgU7$iU?x?KJd^4`}L1O2nRO_VEC{2>u+YTG=}OK}n>HTtmG#AThp9^CE^toPyA zt;>1r^?J^w!IT5UoX?)0Zoe}cx%uI7_tottTUHhSL!^n`{3=*HcwuHjV;L&$5LsDv z<_yHMXb~gOBqK^nPy($DN1aBX8;r+(Q`eqf=Ty$`qjS}wXiVhlMzS+u$}LpV=TTuf zjAMFv5t>z5JCG5-E$J1c%q`0Xaz+l?R(-9`N)knN#T6x09eM~Fm3J-Y%5LU|>TRn? z*`a=X;me%sCo+y`a+Ih={b;p8CFd|`mj>s*`qJx1Jq*%XdJorCKf79n2vbeP4ShsKYoID1vKRtSm#d2% znVxlvYjDM=!Ys`)#Ra>Rj$=sEis;uEic(AVWN`4dp_2jFWH-kVM){PhY$|iP+=znq z!7`!7bVZmZlfjz6!8dM47ZUVxi8c&MxmF~Sw8|l2a=||D51fshnnk=b7zeGF)ewH5 z*PGaa>wLRL6(WvajQ2g@R^eqS7FAV!Cyv^is;<6>YdCW(bLe{d#rb(~YFYZ$>G0R9 zya`1kcz5D#^FT)C>K@^|>D7laHAn#1l zRAsi<#+OM{nR#A~e8143qn{xSc?M%wx{mdwZr2Q@es+7NgW`G(y8JXv&V~fp&J_AJMbvlUB}y8EV7);G8Kw^Z&4x^yH3dFu|T>YBpRw@F-&4R9@hk`UOJCDWc~+ zMBU#&dMrR`J%uQ5pzor=#atRE5vaf_=o-9N*Ixd3z5m z@zv*#wAq#kM8z#f$M}k)##I}D6Yimvj8$x!#h=%h^5V^^8j-G=V$AP@=r=U zG#18Jfa66B$pZmE7SM5!hn0MTyvqfVjA(`uv@QEFZCc~xbhGlhlb6R6$4;W`nQJ?* z!d1(SArIG^^y{GL3eob{Q1w1!iRv zgB;nvfJxlK*jj;m zqc6zEDgc<(cAY+&Uq%l=H*#;_w%5_*o&hHb%D}M6iD_yNk8kygASg@M(>kQ46F)9~ zT0}J()r3aq`2%S5)6FV2JAJE`q|)cc9nZ7A7KQ08obDEA z^r_|O_iW2Ns719jxTMAA1zG8+8YRt2QB@7So(JOa=1_jWq@oR&rD)*RXUDx)%d9pa z39v1KU@%3N%6k#jLf)7PR-ibyg7XkKaXy~eN|n`Qy(|R!O5Sm(qLP_h@H&5%Ao-x> zxc+Tb3qx0FoDeFB2cjxe70PXZ@KKGbLQWl*S7#?%G1_--9^LF-q-i78^JoQDSs`us zaOiQgL89qsbIUQ7j;B3DmOY1yKgrVanlkz_9RBNIDOe6+4tkb;eH{&2rTx!NM-_Qe zG@Y*bh12KTKX4pv-*$`#eY~&{uVyKO(`rBw8hZP0&7jVKG&0u|vvqKoGO)Kg$3q=*nO$tKM z(yZzv_$0EGfJxD}VaY#u?+O{5>qj>SkM{OE2K38stL7`nmG=<$LdVtbgQoj|U%Xb; zRZrfH)wI2Q7PJ)9jK=c1QFO_4RaKHat);fZhXLK|7-K9*Q8of}ODuy^ zukS#Dh=8Y2EFB-?!re{G^z}(w)z_D2$$NEOP4co@4Ts)swC9QKYOgTfmQhmA>2>%r zjNT1-=aS?m$2ALd@t@>r^$H|u4WBZ=`5&uX@o7nKn4p(lSL@4X5MV&_<#qa#@vGiz zG*c#2$R@Bp%yutJ%I8Q~m$L8xhP;900H9lWPa_2D&tp*>~{s~KJu$lxTud$;f2x-q!DUMGvV%rl%TwN2Ix25t&kl+ms^zX~f=q5Ivg zamzA{HS+KQME(}2uhlK}ULBMiPWfNK*&j*WHBIi+1?Wmuz%VkVNNo&4yFw zUulf#F!*hmiw9ZOrqijbou6-I!6^y>q*}s!`cYQ#PBN!bH(LFGZ5b z9on^410~YQJGN$Ydp4P026QlSWaWyFKA6j$QdF%uF$_ewx>iHKKsz_8PJ_o7K=grv|4CDj1H1+7%m)25qM+9Ic`MJjz(wQL1P zpkXUr-m->{&^bMoku^)}|4qh8+BD-ND!#F}Dssox{}&kH?%vG(v%D}prVyuM)Xm~% z>UPaI*rq>NEaJ*G`NkdC_rq;=+*ah9<6|d1hXsV`YkLDzmDeXXgvl*nkicEZ%WZ>j zY^3L@M8@+^3;?+RsH*h1EE=gdZ&gC+cU<*DjKhn*pZqDRyRbd|Rb=6#AOG-b!`@V? ze%HK@id$bVLK4MU-S4~4(77Z^)2B>nKMS1$XVUrMzV}-f=f1qz@P!;6Ls6AsQ#9Fl zZ0gUSt%P*%vzbTzbwbRp1?u~F@0(n3P!L6vw8R*33b_E%6`?6ijq@6gUIh!c?cTJj z$~KsYfw%7s$ZDR+jTUlSGisCKa}6?nA-b+k!Z>dcliFaL)nFcVdNiONMV^XMq!vj9Q&m#SB}r=eSSv}lV=z|7(zPw9c?&SEv#h?2YrX{x zBVyFg;AfCdiU29<>seAoDq~+*UB_RwJG`O_t&kXATCI{NV9pUYSd8>xpPvNZ$F(77 zs}JL_{5BZ$50j+O>W1dsfz#V8)AbvlpVjjD0kY_&+JEzFPZ9re{7oVIV^bPe@{=U^ z*@Hy>zYoOWslUxSFlGz5&08Ip)lASy80HB&F0(Dxs)GF3vbE&kM(;tqsSYl#d`&ax zaI?+7`~C+DnD*iYnG+Tl5oolnx0{spEZ##lAN5D>o2aX>WkP1+vg2{`sAL&7l;6-(kLl}fx$1Uih4bpfm$)vjPC8ZL{x+> z7opf}AncH}D5;3QjS+}yxr>Q{-DK)l;7K&wHJHCm=*8S8s5lWvl|Wn-v;q1@c5`?< z$ORM0v&ZWIO>0bzD%%y_7p7pBNK<#0WhD=q5lUes93d++4Y}E*%U7W4Ij?20pOr1zk z6g%*vaR2tey!Y}L$qdrQ&|gR&(&yNQd`2H7vw=kvdVa=J|k26^{X4S+{fs8Upod{hdxY=iWAoSZ%lTDPlH&(r8)9oI=*C~_HFu4%}7 z9W`CseHVa(^r+DBKnEjJbX-ADy`)6+(@jQkUPV5(2DD!0d0e6c~Q#f56 zl9rZXg@R#Zu}Vna;-q)mB^KwqoxyVO^9M60+e>veBvUAv~Fais_9 zwWs^8ZH4MhKghe#z`0P1B1@ZiJCEtZ`;*@HzIQs0{M^GDn)IQCXyw3Mq;vx5P+39%FD2QgIco4|-D z$1ONY*TjcmAYf0)yN026;eT4MQ-3cGss*E|V;I{1%r)xEjj3>y1~NNEV)&)l7gr#$ zN07f|u*u%DUB!ZL7(94+Z&)V{4VIZR9NSk8SQDYgP;{1Xm}EJ|RBi~7*MNVxU;{9R zym9-l#`P0R0E#LC^;(^d-8U?5f_srs6^CnlbaA#V*KyIiyxQKlUM38*Bw#|O6tQ{Q z(~~4AgN$&Q5kZ5N2d|KQ6%#mRzG3Pam&W zy}q5oz%@t)U~*~T6wo2^|8+uCA)i(TSqO4Oz?Q^*4$vS1wsKNWKFkV9X!raM>bV^Q zX+u-Ft|%thWH@x2$(~bV(26`MoAoM{pQTw|LVL4jc^!3^^XR3vB@dufcXg8W++(H_mO z7703B6aBtV#COwPBU0!uL-cL<^t_!({=0FWz%ahgeb1zQR-zfO10Qh^jf zpF`5^f+ghM^hQW?h(1yH)m7N43TO+y(ht%Sc0so~1~s_Ka=1TqkhpcbN02s%+(rgt zwe!vLW=mK&qFa0iCNL|JGk$3Ve;}W~gu2Pl7HL3Hp^6HLhiyQ35!&fVppJ$%pG+MA z5bd6nlx1>8QE8Dt>?Fv&IIrFq4(y8}uWiF@)x=l6Fq(K;Rae1gQyglHzN6V(?h+bV zj&WO4m8&Ey=2TUd-GL?dUEVxD_fOKKz8;R9!DwW$B+TV*=*8LdHLUkEJ3 z7}{mS=zj!AbSX@7c@H$MA=0a!ZHS^Q>16DXNIM35Tp!}B9bI0H*XDhPc*@Rz~IP)q%@#W z4K7_yK9M-i=nhb2wYvvWPKK>E0l+42j+J}j6%oM;%G=Em8xeK$0{MMgR!yg>>SVo6 zytb;C)3bKBXZb;?IP&R-tWK~>3N*~D*q9?w;keKF6guh_c!r|9oD^1Qr1=-MbE(H0E?6%iUbQcOVqDnjPgt| z>2++l`ie{jF7Z5b_q5EOoLK|Sg+VGt6PL~}e4-+Bfi}rt1ePdkm_@Y#@fAf~S!r1F zs;Q}p{FuiwCNk3R+dEy%^G3djngaxW#B#MpRA@sU$0SEUb@C!t z^Hk5=j$SK*el=*tU*<{W5Bql0A3H1yi$9FEg_9Psqbh0_Dd3r<^K`k6&)4&$dG!~x z+b_Jj&sOswnlHkYrYoLm@l>)C4Ek=b2BZ+9_zwVp&UG@~v&m%Q*5~IT2c7!IvkuTJ z$mzLH!nmBvN+|?6PoQnIq2uf8@Q-dE_kK$pDz}oT`ZLvR-=S6eB~Uq-f!)^)*1}4v z@ft%Q8a+Zh14x?|^o^KEL5;+)G*n_v9K@JD;$D(f@=hb-x*jM$fgg|)+u+yT>SRk{ zIpkayKHs8JnW7oYio%i>RRx(=P_6QTP+*U~t$_B)2k&1CL`y_OU7+$>IWdGFiR=cj zQ2AgxgaDWa={)4BVAnM%%$+byL@pRn2_7LD+Qs*67pW-gQZSXX*-^(lP>0WeoFdPf z`%#=JV3u?E9X*dL8wpD0^AgOmf|~?gQ^=0~{mm-=QPH#}OmBd+wT#oM$damt;WS)V zo9i0?bNHSACXDhBP13tVn8i|@AKmU|d7N)Rq{rwZ&!Wn1s#8V)`S^P|Ew~&1pVtJw z@cNWIyx%2fCn0(CWL;NCOiWjo@(JH?{_<8MUDvf16dWmO%XM3sc5UM`(5F9{?YnRI zLG|YO+4}!5b?$e&ws(GsxUYh|;ke|4NnO>v%!*c4TwXTvZc~H_vYYFVAf&cu$&C!; z;tG{6Z_q<7Isp^hxHTYhsTQGG&Nd1Mnl6_GvjPJ_N!w`*4mxfz$Vd#HvRx+?&dG1w z?34LbKrSw}DCkm!A@mSWV#Lkw0l>@g#Cy3a+ff{*=en)S$Y{9}L&=i-0)FB2 z;IQjLsvui*VOfT&Ay%)~@voYuwz6GyD<}0;rmpv9-Y`nb%j>In-@>)RSYOUBVof*K zDdM+4zlb!cwC7JZFvA}kK{@sN!krF!<)?GOf8+SX06=w+;4&p||KJK8mna8&PN=9x zBd2z|9UUiQa+Sy?+t$|{YJ0YICoRfHx9<(ae(wT$XuNT4YF{iUzF1fx8pDE>X(3D}qAyZr-pYqM$lbyCyo$k^z+2?wvDFMGJ!84>Texfnwoz4s>6WFff-qk| zU4Bv3*ptb$lP>1L09-($zkfnvx$k!EhlrH#!I&-kePggy=oRHkGMuHyr2=a;^MIQZW?4xLZ;yybQk{+C>Edv@r21%3DXj%~=tH1yWn zU@aeL-SUrPAI|sjT*lvXd}07xJom{v-+T%qrjdi0TNsEY2CA??nJqS{j7_Cz1rX7W z1XnXelAmnj=3sdpziQi>c=~kxJ=0(>AlhAWp8gwX(;hO4oHuX$s9=a`D0ykQsC@Px zx+E8dZGZ{d-P6U>s3y8;l3riMc&j8UQqmu~Gzc?<1STX9<-EENGv@mlIXv`W3K_hj z+^f=1O)-evp4RO)q^m{phmOamH*fCkB}ws(rl=Db-k0EHK7`v1hC>(O zM)^`0WZwpJYIhz^2TZiTe{qq1sXs8@Il47I00Z;uv-tAprctPohoU!lX(a zgT<9aFIQ6kuKvs869d4pR5BgdL_@X6$H2&$E;*kJ>%QA6j!u^U?@&SsI7nt|Tk7hz z+kddwBs%Eo*>(|T(EP1R;lnh&r>N~QI;jG)h!S+2$7R*&gVYRYewYiji|ksI#B~f( zQkXDOl0ny@s3;7woKrO*J8xLgII%2@KeL5*m7&w?%xWso!qxv%EzbRy$8n@ zd3GLP@J+%E04uF!Zk8rZ3@0|MiAo+nS_*#^QLk$>uB|tIkaZ4^1{&Jh=qgQh%Y=(> z`DPte9vZhT4@TDWrfq+;+lOeVkztjO zs9=k%s5I#GkHKhNe9w2e-n^@c*05bZdN7r^Yx67 zEetZ&#bEQzujlsd+g(*%C;k8DJKy=xF6(4Cln=z~0TI6!Ew1>+@$#pG30hHfC7}~% zVv^=CZer{-(N!bYr2e*4c5kFLaPWO%BB~;ar)EuuqBz`uZc6YH!f6C?K_;(}qF}rX z6L@0HscnkOdDI0R{q}-}^ z24p4EvGBUuZA&kgqfD`696=hVATBs93X+DrZM$VT=Q3HXi5T`VyWv22*}E*~28(7x zZ0RZKcrLGv;JsIyRf~Ed_u;*oxiz^d;k4ULO8+5CXl5YlV%%&&RRy%}BImdPz=#hpj z&tFEZMHh&{9X}kh{Qx3FzY;evkQP#Tm6e_ucsz`w^c+Kf%sfq|AcJeifZQ5%bkjr^ z9Q=aRH=okN2(Z9GZ-k)yn(oTgAy_-g21gi`e5-~6{uLA^5|4g zgVv1~0468!191>!Jjb2VH0@?l;Rb!0-bLKR^AY|KAYamXs_{5V@$iqW9a{Y0u-imS=mG==#P#3gj%R{=TaYRFtNd<96NSKs%1PU;O2WHC_ zmzUb2@1O@sNf>oF4_&>~vArHz3=$v`v+dYH+#^Y7H6g0s!Y4@|hrzVcn-1{5Y-wWg0R{&xbsQXEDsdRT}RX7!o zBqE}@cw-bfE|#D*wboWrX?-`M?g?aEC3L^BW7#5lG9V0#a(AR|boRM64=Q)d!%kBmwRMB-6gG%Kf}SD~WM zWK!d(e7xNzwjZN~V|YLXtRi?sPsG>SK37D1L189~KOHZMk)E;rj%?HS1(}!8dWEHx zs9wxaV1s}l(5T@VlZ5i*7Z(Yj9E;ypKRrwbZ2veZ&} zWm3_l4U)k1m~E#Q1MCW_$pg~!(!Hoq3W*Ssh z+MwbM3sD^i5F?c`i0UI)J2u{<4`egOpzQ=oDx<|MQ{rm1HUc<-a_b-{JeOy5jbmt@ z+R>*G^^a`I!Puq(9#=>38Nupo1CAbCq}4{Sw$cF^!v&&istoFG#)R?P#aNG^2^{ne z)MP3~6LOIHWe^WguVWdNP8P+uUb9)E36&4wjR0w61vG&o(ds`uKY?EwXz84;i`3;S zMmh#|J5G7_sc)0>-oi@iWELMZ0A)AsS#)|CLP`L_-VKi#@R;!qV zje2`}quoNwruu}Bq%sEbdak#+;x$DL(E!J92+5TSa)kJx*lAmhdevP+DtbEb!feO# zx6xVzc_5QbC?E!&kV}Y>KC&S#H&(3^p6Pf7#z7uI0=xPX`o!hdPkMzMG4%_3{BoW%77*x>QnQ2R7|Y!xcA;!HGjtu>XN` z_>u}%$Hu?1P3I8QS>0xqoB(Oe)nodGW2x2lN(q07}3hZV0&*I zC(g{?Q=e(Ed^ys31ZCp+f#KYhZ~q_HemuR&y6)kJ|ABkz@dvocsZ)sW9Ik&b!)@QU znH!qO!jTgPV1A~Gz9Ru|`-L5_{qn77mKHqr$P@6;0}sOC!v~?=YG7PWQFSs5jSnH3 z2bf3fvAXQigjIK69|U%}ya66QPa<|`p*Jv_E_D}0*5JcXZyH^`#WIMBB5^&v2C{`V zdIFER`Vc)3C7J4LHg)afN`+Lsy3*h}Rv51?*Q3RSS{R|nN~X{$6AHrbnMx}%-qGa3 zd~FHc`D#j68%X@q?(WB&ExH z`%-5`iErU&O$?45gu)&oPytEuPT%w0b|6vX49#o1uSrJsL4XY zqNQ+}F6cp=(2=!?oes@D_%S}fM&M2>-W;0hekB!vMzWwmaVQO=yLw=FD?WDiYB&AF zuCGol9vS(Q_x~w8^yndIc0_2j60k5|hgxM73Koe!uaMfc>IA! z;RAng2OK(b5@WIiywe9u(=n_rwqRrrhRLkhrsv%-WE{sx^ zO~4GDFIzl?0-%09VXPZEbu5o!q_0A~X3Z3O4Lm`d!m!qx?=w(AlNv81a(M3p^sE~Y z!;F*{T1(ZHmRuT4_38=X;iMr>`$4!NnN}kNu9Lp&wL%YEL4rKuk}|3(>!?YLisq)# zJA;j(?iC3EFCL|#EPK3YeEHas{e6G=|Nb>{suH~G-9HRHg+6f6@!Dnw=I3YO>8FpN z+cjX@#CGtkHf);chtGcM@8Pfi?rxZv7=zt|*TGiEgwL0Pj0VyqYb`I>0E4Z#loRG-8A&Cj3fTD@GRg7r7ZV<*&77-+J$>q2 zqwXJ<8un&Qm2=1>mYYq>Lyv{5LE5Amazdk~7q)knm=cD!KEx2)BG2DnU3S|M$E#l8 zW@8_!RL94VISy9hhTrcM1%dy}__0=P`T9FQaTl1N!5e?z^>FP~R{=FF3lNaeN}pD9 z6waSN4O5fTuw{o1!()AL{Ma- zJ-rZgA_Sm1?EL-^%C$LY)dX_MAR_;@Y!fkn0rfh@a)D=x;30)n(DIYW_t&frdZQLT zPtsfu%?P5GkiZ5XudPF!(BkE}MzkNs_?4ANP7R+4zVU3aSJeGeN+QMMfSDytLLLdRcH zG_jaM5NmpI1*4hAl=|Yhv?T1(SO*2Tba*;x^jl9q`2;MK8*t4Hx4`w+T!k*zV6#)9 zOey3DQbvlcI9{GP4=!4NA)A9w{OyB?!bKR8#$h18g(`g5PNPH?DZ58=`J@iVo?3)0 zyNiemny_cj<*>Lg1t&L6!rB=RnS{aS>{Ya6N>EW+IE{D!T_RMg9;Dc;Bc;X=0!AXM z3bt$)L17phs7x(X7%?Hl?YbQ;F4Yr*V}+D}CR(YQp^DtDMu32pXrgzw%*eMB{1nE; zqxhjE)P+ZrhPFdX3$L-7;r%0H*}L2z*jcMs|HbNn=pht z-anAON-(5f$tDvYM^Cqio@ubqmwE<|ccp4d>A^v62ANMsk%eW1sXYs4*E$GXYnfDU z9+`5bTxlN_RIaUtJm)$Ils(Oh{?iGdOXFM41irk%PP)%`nj4>e_IW7uj>3)CT>*t+ z4sipm>Oo7S8h>=rl%+EiME?p}reni$xe2EyFF^e)L&G7n$;Cn!+}&b`a$|s89*?283T~YaIlY zq%00}8ZP7tX%4NCea3P;8<|4f)05#Lq$X5cl*{T?x!PJ;UaqY+Tb6=(vAk_8Kki%>3?A)w8i zBOV@o<}TR%I;46-DX=@V+c3`xN~pk~(dhu~#Kyc3T0d>eCevaQGXf(oqtbZD8XVA7 ziK>yrbUKLvGhq8(nr7ghKfh>JDs2RQF^D|ZNP> zOcWuB;I&?Bcnz~(z+I&_rly{ZN_d`(`;{J>T-dDP5o0D3p%-g zb_)F_j$l1Qz!tO7LMsZOP{_ci|NQf?=jv^+2dNzuf3l)`6o7!3l=8k5o9GLe$l+_{ z71(0zfwlS?ROc(O?aIwCv1=SsNd@#|cg0Ji*@7lA2+G*4tyPitYv9^8Yh<~&FartM z1uioU=MPn2AUlC^Jp&;s4Hb{(QdHF*Bdb70pbF>_FqUIj5z&uQe*?A*t?3|mRB1!$ zFaZiWCr`R?VV;&Ew$Qz&f-sbP)2Bs*4Ix1tMTA}qX&FOCJ6E_#I!@?^Q6{CQ?Y6aI zq>~rwrrkR*kUhHy!53&YrVsUlQLAh=3DcLcI;6CE<};Lf>OaI>aa>j~B`2AIB@= z0lq%Y&~x^CnwD2n(k1p?xZ`~vfpbUBz36@2Dpk5*no{ONHg6A9YGtI75V-*RpZp4( zS$G6C?I|xW+3$sl)@c1Nr?k}H1HsGTkg&5Pzuyy+cY}&jD(L81KBshP13eH_P z2GgxC!;JM6m@YpJ4YLZ0V6bEpqDeOENM49$6e+>4=n|w+IjEpA3WK;&go*0F^lj9^hf0vx z!U_DA87$_xoN2=gv>E67kdL&LX|+h3e`mWOGPGdrENN z;C`5!T7WeS4+Z?ah=0!nBaroxQu-xy|1^KW0n&d^5OivqKv)B#Lxi7Cam8YaJ9%O` zo}Vte63>NFMwWQf@5Ar4)@fPGsieFXIMJ1e{_C;NMMwdMdP>F>d?F$DQrl-kaTH0o zFJI8EQWW8eLx-lPdP=!YASYH-C2^=!N)Gs5&?6|4?>k=DZh10>hFjyT2t1)vEWip%v{mF;p#E{7^nqtKg{RSm{BjKI{XS@^Ga{3^)k4eCvkt-xVe4yoPT z;F?}zakhDC%dWo5q5vj+*H_DH<{Jaof6i(-wH>>Mq?E1-s2GRm zk<64=OzLrbHQu)jqKFh#A}11&f>`DDjup)xcxJwl&Zgk28e>Dc5QguUn-%0etg@RKw7msd!Y`QL3A~e3(Z;+5qS#{y$iMK+B=h(B%D5U z0iOT-8eBMBfuj#k!{H~U;Mk)VVE=s=;Nbm}P#iU3=ha)`zArz*Jl5-9cME*(^PhpZ zA;DnZ2#eP=O-xCf`N<0Oj;Qd>q}^ zKX)&B5(j$F`p3t|K-W_Y`7bZ8K&`S27QYIdQAKKKp(5*$Rttz7VlJC8;LO?8nXi2D z+0QkbodI1_V#f=pI2dm}h$wVo6&kXDm5m#FUCofkBR9gIVo6q&7QU^lYeK)ONC#s? zrG}xtO4j62MHX`ibLP-C$80~eYc+F0mL(sLJC0tXN;{Xf+Ac;HN%Vtolro5x<&Fsn z&PS> @@=c}_#G-=w-mQ4xDl3IhQI)C|f-P)S>jz69>ErdL!Rgri%?Lk}M8S0WWm z3a~oYU^(}#`-Xsv5i-d#NV+zC`q=TGsZ>^z{i8i_`qXJa#tOa@(@YvtF7&mW4gHsy zaP1qm!NEi4;REmg-;AE!ddq9!+V8&#?!W&&aPWOHmjtuchDx;s+pf;T&;8DgV7n&V zefRy)v8a`cz;X)n3-b_r0%X&}poxPJmV3Z&E3mv$fmNi6f*L_je*wmZM?upyXja=$ z#*op8*Feo69V}%)j`DE+-13F}kDdI7mf4{k#c;lq@sYC^WkuqBKQyBt77E3bts8P~ zrQGzhIjyay1CPdN|@wRB&*zrWH7fGEGRX2R-%1>3F|fI)Q22|-3TY=D|d zPJQLxd*7BoiyYrt04r!B1yevaP^iTwh<%IrnI5ox4gS~v{4+Rm{5e=9fmj`Q?ai-& zcl^xlP#8)>X*2~BdwSrOAKeMBee-stmTPd=XC8oar|Xc2(#Z8?IDYO~C}xLXsCXqv z_BcdV3I>NZ!KTq2ux0RS7|iX$_?SlC--eay3M3SO;o*K59Yv*$WLQAuN%a8aGyUHE zcbz&|tJe=@bII>Rl9xdrTSJb|>zbO?lX93XraaejU6XcDwVeS;luTV$lX&N84s=;o zL}cWCRZGbsT5khgxRXk$h#G^iT5A`gh+h~ONMBHOp*1(xP$Vg_;5lB+vAmUZMr$dW zIOww+Ai>Xe-y(QvZ@T?3fhpP<=NpZ2XWPLe4g?aR0e^Vj5ZEJiTz^| zh^&8I6`)$_09E*`%$Ts}h7CxmG}bpTo5`O+ha}wd>AS8c-Y#W*h?FvTD!N{!0llLo za6Jv~{OBX_%wvxu8)!jL_h4zV0msiDLPns#Wmj#1ExS>$Tk;45T#V~S;qFgA0|%bG z02=<|5=~YQZgks%(i{VaiV8G&*f>9zE}x zVJtd|8*2i1=bAGWYdWO zHB*Fk!-g~XH-emI-GNPe`{7-`b^XOp(Mbik@7~Y9{f-ZR_|F~7L<>@(x334|@(?uJ z2{`!J6ilB#0fD&+7==NEJQb7R#{wvAlVQic2^gQ)1j$qeR_B{AGg$?%l}1IXpcVU2 zUaW#44lwJN`5dTf3aE86rI#s*Bv9s&HvM2r`S5qN1}ZS6Dj-_PG`DaDj$U{edWJ%H z^AFz!r@rR>)bo$7UY;9H4aHC;}ld*_jZ)X?p;P_HdjSKAT?ZBFF; zlq$Kof*!`S{EKBw35a)RK?zvW8cBMv?c>Nzp;3_Rs!sSyCW5Gkun5(qHc~d!LZ)%F zOqqjgue<)vMzwxt!#1xg&zfI6d;UW1^r3UGcp5!{?La!#K^3n+K~Xk?gq6UH<-t7G zfk%#=g$I=bz~v=KW^#~HGQd;c0AB>rSCH~;g0x-$T_}O9>!|sJq*3^!=6F9Y?Y%EB zY(&iwV(`Jm<9i?=?c2I_H*DLy8=gLVKRo`}VYvB6KfGec8RX9XErJ zgJ#1WLwAeRKYTKm&tBhZSjj?f+KS>(3Ikb^WHCakOjOodv8u~E$2a$j*=jR0ztEJP zKQJ>lJX&bYonM_g*K9kPoU#MM!=a_w)@$sxlis|c_iMfV=?!Pktu{Ly&&(H%<&6_P z302{<2`N!~ZvRY-7~ojofv-y<9|W=Q(@OdnJV_BaqsKtmMtD!U-<2$%aw{)qyyBTa zydXvcFIhjSq}go2jy*eJ*PeY(-22JH)9sbVa?)TKbg$yqIJ*D3#J!szyq3$5qRpw;;SBKy}k z4iA>)n}#9ksw{7BHrk6wPKQOQBV_ZMO>2|Ron8<(Z|y_f6XJHY14#YGGMS{YWs5Re zF1I&ZZRfr{SByQk`Lh10=?hhDU@*HapVwz5&nJH1nFBL7_4F7Iw_9#&WF$YRDLl6{ zx26?))2BKeH(M+uCG;Ah@A<8{(`(SCg*fyz(3(Z6tfuewA{o3qpWYqoG97#=F}QHP z4m~3o=p7h_{t;>biasH5s=S~gQb$YPq=3^xYUR?Vvq)npHW9a_#yuQmWJ1uhsP+M^ zH=qqFB}DJ204Oj?QbAD^q-~VzCzsbnyDtn9Jb59!Ni59K&+fWWy236xW}gIb(F@5L z1>W&v@BGc?stKij4F;$4Us-Ck{78rnCX@1ysaoQ4G;`arUEZ++4T(yaFm8j{qNLkxIXrgTeP8C1aj~ z#2?UeDgkpNT6D64XF8ScF`zV%g_E7Lb&XU0A&$5kCnky?o|&p%xw2A!9iD$gOR6aT z&^9fnRVjD!#gZY5y9Q#b6S<2Etx(s+NWpLz1d;4`-j$tI>#>cSdu`7OD@RVwjBMLG zbaHq&*K!;;>3GrN*oMM>S(QeThEk5a&`D{6WF)mK=jJ;P_YI_0LZ9k+LWO!{mip3g z*)=>o`M_DWwEf#1>#6`&!-LQMfBV5mip=n+{=Z^2=Vj`?5lbknka-KTM2h+30uW7i zX9@8+rIeY1GsEr9Xpz7~D%-+PLqHEvGIWrMu!iB3md3Y}A7F-l>Hb_i2pxl7rx~&s zfge=H*=Pp}bZhZ{B%>7~Dzs2cey}I=VbNQ=vwGASyhh3mP=b zor_=aUq9AW0ch9Mwdp!^GBVRv3C%jWQ9T$fbNF0jXq?CJPnoI!g+dded&}rMyv%Lq2NC+VxPqwP|B>J8SbUl_AM|W7RH;O)F4CBDCk`i_& z6?tM|t}=(fD_QEzNP;XG9n%Rj8I`XihBbi8qHl5QI9(s^c)>Ez@i&7%7u+W-I#Br~bS35!?QITXR$P}d{=SO{$7ix2^f6-tl)gIyZ`6dfKzm>5r z3UKkh!p7~raQ475o&>EI1&5IwoSJ_!2wjZd8d|c1!bLfwnRtvb2+X<(1JH(49Pw22 z1ZqYFT6-1Ya|ZHIh_o&+FatpF%@&978B~NeQf5*DbnO%px);N2|DqFkQFtJaLce1O zk*JAc6h40ZIlNY$(U!tIPF4q{vqxrAwg#IPIpVih`(!vN(@duFlR?+rAZc#>R_fHw^pRO*^ctbt*_% z-L<7=O3%n;WJ5O@x;UVxgf&&*bAm2aG)-*LHC^(8w4`mR{_ora3~ud(T)%-zumt$U zAc0peIKnh)_c;Xn6S}TJ+jlS)M}T(-Sd$q1T#TTP7xAX!7nRZ4IZ0$d(P^Wam`&QP z3Eg0lEffi~2&fSgYa?eMsKgsX!JbwJF?Zk90ML~4Ui-x|Hg zp)e3V(!WrF)tn@(xqgH??=yx)O`h4Nov*-HR|TMP%a2|T8@80t#mB6$Gg~y^$SLuj zQ_oj^BZKjtx?GTOsAQX_h{@_>hAfjGsve1|*dU z1Z>wswzmX=6tZPwpriM|I8L2D*qXSDai3Vi3%>v2;L%+WeU#P217G}`1AMb)YkE>P z8G|OJk$6ZU)1X$Xowfti?CFJ~N`fq?OsJ$6xX8cY`qoS~ox2`!tkt&M2Lz5wAx^j^ zilV@>;(D#tp+=D9Oj^xYb`<#`wI#(P34&Z*ZJNEMv{xKSCtWuz;R)uJ%gw}4UnUWV zVTT|qOX9EzKg7m#0pIex-#z!$fuD0h4}m+EKWa->|hkFzZa4OWC?a5S5b*Pa7u?*@s=Aq!<{N8c&yfQ#4W>FSdrp z($LqR;gg1dm&Lcx9g+(BR5ytf6ljS&?eIZ^&g!$7XLt{c@45nvR1B&lfQ?_ATFcW0#w_mBoH?~jp(`Q*Ud#z_d{mPK{ct8redy8U zhE!G=BOCCbf6#z@FKr17@CSFj6AnK)2~XU622LEBg_XG~*tQLFS^_1RV)OG6$F*%2 z>Vf0T>seVqYUj$b^b@)+chFWGUKAQ@%k^peeJz`nuBp_mDN6`eD11?svTKuefvYK^ zFffn`h~cozCDK&zsQfEN?1MtXbCJiSCYIC+hPKT?K=}eKBn2T>M133r{6cKC6Fyii zCcVyX0v-cn=PRxNWcL)izi|wX7vY`%<2Cp!dJja-TjnP_%ZiE@-)KQ1Bf{ogC3y6{ z8R#u(@Qc5F6a4x+eje6l?}nM>GALROHtxC%EVBjT$36+qKm82j^BtcSdv1VAZ55t< z>Vu%B{t!0pm_YB~L4vB$DCXlCN%-VD$pUEqBC>q;2LvKk(?97to+!zJimy48M-QDC z@&z4kfA^K_+No5Ha_f7q9cK?>C5uxvIDT*j?z-bSR&*k%2y&^x7#>|w5+({^s?*|@ zGFkNp8;y>g(lu9+5;I;T=tIL9VmSw+klT(7p)Z-ygSf`Zk&1UbR4(|kX@fVDY1i@cC$Qv?^|GHPd z%|S6YVmG>b0heCIZ?+8|Kab@7y>_McYBeRn^x0E=#?B(FttiloaaiGOIPvu3@aA{^ z2>aCd_B?#%Q>#EY_m4mDA@~hM>icf`euz~W7R@%K@b#puF#1=no6to5eeki5LH~x| zLzkFflrh1hIWwP!LT8yJy0-2GGIxj;{Bsw_^kG~~rFVFxa3+0&2VjJ(r}d@B1+ zv}K+Eqljzhp(7so+yDI-zDnogs5g&eAQuz2P) zqI;n`3yATYVk0#QqL{}@(Gl2ni{_~okoPgJK1U5BL>bZb#RpFbrWbhRH;#)6adEu* zO}pW(KX)B1_5*?I<}YZ~V1)5ULt)}2KBg&&3NP@TlqN^AlxR^;>P$|#1wmcX52Gd8 zbPh3c8kL-U23=9Dj-${ef-Y~%8XHaId)2Ct6t{sS>x*#>dcQ;95DPu^Rv zFb19a9C_}gTmfD)2J)8%v2Q+JecMiW;=WTTvlxLWHKoAA2#H9Qr8X+s`Gk}>p)2BO z$M#NXhT*3)_2yP9uzBwf z;^zaHT>@CChS2B~p>M}+fZz~DH<7<|)td=+Dg5 z7)~HC^(|Gpa(%RNA2$C2g4#j*-4YL|e({T}6 zoXY2oJUWoJZ3P{(gG4ZhT!f+tav#)nWj)8Y-~nh-1#b*Kct(TJmgw3pX4kr_eaJN@ z*ecvp&n?{h>_ZoRpj>gt9YRFKQq;FyknjczfS#81{gcooix}TWdv@aIFN1Qm4y(_% zK+atYZ}{=+;qkkkfkTfUh4=paFTv{ZlW_YR-wHqX%fAdazV;Td@$_jzvYZIw#rrg} zWhV+>Mg-gy1__&G2Z>%%7`P}~s+6&9?}VYsw9gF23qt?wtDq*)##Ap~1E~IB!$c7d zSCN*{N~f;Z?ucTnS87p5;`s|f5HwvUl98r9gEVtbHpiDbu6m|zdTWa83A!%gJ>|H1 z)n#X<1u5M=pX)nbwgU8TE<$lE%i?D@hfWBSj4*~9-OHI}k+l(zzW>f6TfXq={XalE zZ8|0`?4&oM&~@rsjn;N3s+R=9lM)$qkH{5^d6u}2s#xb4+H2bbTl4{WOqmP1u9lsLh2 zqqdRfx^%r%HWea+K)FkzDlW5x(M6M|_XHBFv;Mm8|1XW**KL3k&&}hr?mfWK5;(43 z*YGT2;v5%52cppLkG<%6fsdPQ)30ZAsVT*r7KWjfDdu4BEt?pYxOA;-${It;dXAT^ z00i*p@lTC!M5vjPwlI0$bUg^XEZ%M40+|wCpau#k7y?`y6#>5(+XM@f4r;Y6kQUX4wRd?fCH2i7Kdk34Zn${wJ~k0fq*)K}jyc_|DhB$hKEO zd3g;wrp1zMml7VVQ8o&N6qK4u5J2=P6d+&;!)O~~f>YhZRX0qqX``1{Q1il|RdV^ghP@?MG)$}QG#tmR%PJ)& z{tZ$yFB`-zI6uv;#odYTC8@_fQ8w1^Z59V!G0 zUqq`!luj+?sAE>DCp8(bww`AjDbU{t$D)$hz6WDli!d~v!*BAf#b9fJ(n8+ep1yXg3j-+NBvl#_uV3;_-#<3Sc(-hcB^EprSYM5Cc$Nwq@m=wl{&w zaE=l}GzcG1+I83EBkcE=YyFo70b#0BAS`nUMB@J~jOyn!UFmhgC~5G}$mHa-V}%2X z%CALH)M(U$xYG)NdZGPWk9AQ1r(>}a@zQAF15LaAmJm5V+A-~6%Qk@m#P2MT<5|QT zS*@Qaia)2Q&C}l* zTcOf9dOyA~fs~C&rEM+xQPAKKYhN-~&-P*OHN&uJS5Nnaf5l*O$H$Ay6VWF$xG3r% zLNGdQpSSt2y=6~dLog&K@B-?P8nG?ZzXM}k6oB^jrAE)814sMx(tn+8EPWX7E?Tn0 zC>a%E1RRC|Sq2xan5W_ns`wQYmPMmxP(BrjqHCsx&Sb(2rK5#XpC7jPffNDXo1lab z-aP8o)YSo=nn2z0nOz)ygX>I?8Eflul~?74P35QH)-B)w?q)N;N!@X91zU+g@X z2jcMyM^L8_NS#Z@_x6L4rBw5GcC3p6s41j&Ioe^1gMq%@zZw|Jcb+_W{1XtMpeR0* zQSt)YgegYKMK^@>-$P*~&_$5UsCx$&2;gB%<^`I(p<)OD-F?Ue8PcQ!sRhwbn&HBK z)I*rss3<68vVGQf0F{6!6P9DyYsg8(J^3KTjueni2O z8Bzule^5nDEC?-GQ4xQJv;{S)AeDxp@_h>lpnuKyjv&2%W~_?>gfX=y38`ym;?QH0 z;lSQRZzQ!;$5g?<*iXe4wC?~_<5HzCT?7?5lBwFZg&$aSr;;%AB#0k~nsq01 zPysH+SxQBdOP8r=f?A_951@jsOKhH;Rtb^25O`!Ctbj!VK0>@9AtSNO%|sLNIqmw? z1(F&MNh)Fg9vbVS026zM!JyqmBr%*iwT9Tv9`U>mC<5&^VzY8Dnu(@4ZE7itX39Ks zM3#<2KrBEDL3oR^U9UVZNKa8$A3xZ3+Me2tFj?tPa2}8-e1Try_H#MOq z;LZw{Li7YQ{p=BdX90vD4q(nK*h6Q>t^U^Q$T|CxB0jx5HfgThvrEL+- zzwY&~z2nZ$?0vsuTNy{LLpxZ;xUGT`(|a;#wMmpR#b*s9S}YQ_LFQ$A50blpX6^7Y zsi+ZLRG0u7und*@2^RMyv~W!$j}ahqNJ3;~A!-#M$(JBy=%D0OR6rS$B~%bp%!Cm^ zcDeu$9rzMF{`h14J9l1j#I`yt4Ad4)=q(Mr^b36#k9ARi=e~9l-1Gv7NrizsLr(?! zuGo9eQ%^tpQvvM?=0(u4R#3QeY|=)P4dnc^`I7>2tf3Im%~Oegq_bp?B*<(>ux7gg z+js7OnR6Fl^85^J-nXAmNUIuI5o`Fcctc@Q_}{c7&8NfXMd2lsK@_`V~?(^cD%(flkYzkuiWur2^S(76t};0NP`~b+&;{ zn>r~G$O_98ffNbgAr`P|9@NTJP*}t0kk#zzs00U2J_uu@{SWNB`s!2N{=yhQ5PW8< zJ71up-z#H%@&H#3L+@CQSv65HLgf!Ud}5@toC2}fq)G{}9op2;g3+;Y$fnTBJ0{G{ z&okOa3m#}IIqxpWCLFADl zI!$B;Z5KUAz$l)@xln6Q!AJQ#TMdtZ-7iV!j?-3CeOA*q4@%udKOe2O!O{x%Yv}S zU~J=cH@)HD{KD*?uQjO z`vP-NZ#H1=@ma_rZ5!%sqQaa5BQb!WPhmL%$|raT0_%-3B>Wr9 zM`A(E_5~qYJY|+?DY(nK`0PIuLEqlMyLs^83vl7k5=h9)`v%f*>(A^JJ54Lg)Bd#; z36zy$ogb^E>#HVDA@{&@&!Jb)Ac=sluTWr_!2ppS^#-!gdNoZ4O;M>?1Jr6Yh69Xb z61HvM4pTF;Ft<1hmPTT* zAL^{N?qQot;$_qFFIv$?3q8M=#=2mDp3xk5C^*`?ck;vSu3wyNhx`9^E6?zvbY2sdJUS&t=Fmlf7d0q?G8{QfDkn%oz21U z;2=y-&!GodfT7`GD3|L{uU6S?UZZUxh?JmhS*$s=&0m0pg=sMITR=~XAW07Fd)>xO z`#*aeF@Vp!6lDy3%VEpYzn8|kD8TD}@`@LpAAfirzV`Qr^6hF{U`w##1k}9xk?mu< zkKOhoe{=hX|K|Vv&67_&v*+xE^LcX5imbA!U8*9YcrPOZpal{X0%D|xD#m`QDL8WM zShwK>3Yzv2?nSFFcG(V*xn{#`ZwAf4x@W{rem*DqMQSN8uBH_wl<8f)1~8$Nl63#bo)fU%!e z6j4dJh>GAMJ=9TI2sk?UzQwtDIC=IoTsU_D&Ye9Ei!*ajsnMQ<6&6Y^+j05YP1jxf z-j#(FsI8i8W64(A)e57zUrP6;SWg1W^bxBhAekWr_}=jX>*4_dMD-v4*d6cxlRx>h zw_JYtcF1PV{d;( zq$~VyRur>!JYn-g`HE^dlb&&{&b9dvNEcKPl}Qdlv|_rl0D!V%n99wruN; z7RKpkAA4x=r+?}vpxJ2t^xdET;xxTZLZW04J)pzN_Ad^ObrS3AEp;(F#(mXLLF7a* zQV1qh17uZVjiRW56h6s}UYp}ywKDqCAOGyZw>JxEwuobKo`Vz5&E8dOIahn0AEydb z4DwRpQ*VIp*0C-sEw~Q6`s!W3*=o1X-TB#nU^{a8tp)L7K&{zgtz+|r4C_Fe z%BI;Yq$;Bl&^m-5ki5{_bn`FVV7>lFE_>hfsadF(TPz$LI=He=GUSg5iUixP9D}D0 zJob)1`2F8GFgrc{7Rq6;-A|%0xw5iw`3K+sflvO{Z~XVAxw)C!zu_yhYy6Km*2M#i zj}1Utxvsg=Xl?%TgZKSuv*P_?qf&;b(}Z@ohIFn2=!NgOYVVF;>K)yD?Xi>R|NPUR z|LuvdI|x1}0BUH|G}|C^23)`8#$P%&yXKslzVH7|3Td+it6$CQ{s-T1%PmKg z-0%kI_C2+XBT!DOU0p9bTU%2aQ z4?bF0SzWnKlJFR8Z7ua04De@!p`uulAhB01CJ(PwUAXy8m)-n#fA#2Wc>z+PSAw~y z44bx%eDXr${LEUpndmL_!Q9+3{L(M{@_p3pqtMfb*OGuzsTVBAh6f*d1pj`1Y}@wB z<}LJUx*@W~uKy9ox`cqEkMr=%JsRXXuZC@@pM4h*1BF-B9~pHj(qyl#ij7oC648`B7#l~H6G0{3eY>y3(0H-4n4acwoYt3j>3POj;&LR zdO-TBQH!Dfcw>D$fP*~Vl95-d2;(D~Y>9vThX1GifzO`?NLuhmfB6x}=L^9{|N0|V zqaA3rw*t#6s}NIx=S5*tj~@x+Dz$&PI6vd_JpTl~^acF68{;}n-5smcs`uS>=jYZ? z@bAv%GSJ`O1Cx_8s0c2U5G0Nc593E;`0VFC2f0%2YuE04V}?seemWt1@`vAk^ZxzM z9KQeDeYt1x>`PoZ@*GOddK7A z(l)ZJ14$Iprb=x{1T&hX9Li)fA6#Buo~1+&?Ep@hLYnlU@-Ru008Ds1j^pcli~VfH z(cJVb^!N6_#KZ)fKE5zD4Zru>zps7Z57oEb_|EZ9JaWfb*f26MdFxwuZ~T)Fe*6

S~=`VDg74cT1&4`$|OevRIfK(~Ev>O8vtRp{;QW#wt6 z>B8dlLjLmGFN02Ji0wbDN=f*&|Mi|9d*|&xtA6q;AG*Du_e0$(gQzt_g(eC_A?_*l zAKt!g`yc)E&%Ea|rQYwZlCkv(0SJh!7PVRF{!UBuB8h`qtq#p*1G#ycHfMxZs}VV# zKZ_PO+eWL?y?|NYi$^u6b~A$LOnkQ8J1wH8S-bA=eH*^-+V2BRRv-xd-}~Cv9(w&+ zrM$z(*iFM~Ik2)^1}ZD;@9T$?Cr|a(Dm7@kZ5S*L!{%x~6gC#%iW@e+`R@BZ^_sRf zw+}ydekhgPUn=yZ6hUn1sq_MY)ON=N56>rwFRdD)HGht2X%w%$ZTKTzr(=DAj!bYpvhpFm|R@o7!csYfD?SX z22>3MmvupAq015gTq&u=$w2xK5XU7K6qPVAFvbAc+~p+&Aa(|jEs~TCX4in&ML-7v z*%LtQbO?J1SPg`|1FR+_$Qj5!17tg-Be9c^*id^xfH~O+%Az7DNv#07nSsI0iGcwW zrVvp?SRuri#emot7#B+rV)=_07%aX5#U~)dl4de6Y;R>?khp~qQ(3^kz~92auq%~`f#tDpvkR(NJ2%d%S(CZH z_VVGE2LJy90Nz1UeUj`h^#A}M07*naRCr$OeFvCbS9R`x+U;fLPH)mkqb^ypELrZ@ zfN2JT9b+&ULMSODAup7dmxL4`;qj6@9!Yo!AqfctLQ81D*kFu}t6Z^q*GL+TrqA5o zPJRE{_g-198q4Cr_r166qkHGvbN1PLueJX5uicIo1Ofhk`hPc>&ph=k$@k!#JOt=2 z|Iixe3?3d3_@Y2Or}T*b=o+!tY7iJ#KXTo6~^2y&D&uToE597h-%BSD>Q?3X+9h%M?G(MBp*;OBw zF8AoLeFK*1^Q+veH>$zwS#WnM8(s>hR7U2nFkeCglTr^D4wto z%jo#x-6xT9HN54LPB=VIbw`l(;oC~n`Ro9Cn&n|$-U+EZ^EX{8auvOQc`riCH=b_e zpH*5E0*JP2dI-7|rnRv`v_wrThK;Gyf?!ZmmZ&h15pD8Ma8_;^|UCj#5^fnF;#z_ z&kPxsZbtf9oOW7YdpP9Tz7ts*)G+QF!2_CUc`k(!GAT&If))u-tpzZnjcWKouvQCc zAy&N8uez>Z!6Rk@RYdpn`m4+elsi-a^UE#pnV>_m$F$Y@1%}=RN&=Du6Vg zvi9adlIV>&(CTdD4x&m`dj-A9pVw;k=E{OY*f!}~+44jdpOEa7$QdHywgS{`A9guF zIHDt#q+n|<3gj-NCKr|5;M>DdYu2{)0bfvtM6*b=D9@D;37cq75dug!YeX88LKh00 zC;Lo?byQ03Wzk6JGCiuzCd1|zy{i9d+xCys#fvM_G*THw2!B41{yCHA>(5P+!UW=k zg-i-Z5c(|&K$afF$0 z1ugiXG9lG=R-2q>gT^UfAGcUe@OLvu3aRm|jZjp>^1&ElF$1*|fkMFT7pJyeMQ zy^ZBu(2nF9VfDQbgD*k_0dmd*))*E6{{0i zJ&;1NC%}Qx0(Op7Fw`DKS9h4`;-bz-CProHYzv`AS#KXNp>Ls*ST~&doS(9;tCzjs z30vN{7S=TqUlj@eyduHRP5~6WvsGF!&m*A4*5|~E`CS+^p`RgM$cS1WhwFdn_^B+) zBI_YzP7)i68cK8vb95)SF3jVupX9OaNDkMn$YAS06blsmQ7Xw32Xg3USl8Fi z=Mt}6x|2ReJ>7$8jMr>Dd^nHQeeoMJnaHag&v>^}bH7fMA%HdOd1g`_9zXl^e@6kD zoi-|oTNG;`QS)ua<%*m)8Yu8xM7n70F8?1^IeNEi{K!RVf8+&Z~{!(kUaTe|Slq4h|04w3`35gjtvH`j@-bQZmR z6~weE+CxP~cv;oYF*{SlzTdR2o-~q_AaK9P^nd_7O==&Q`E&AdK#0 znDIm{H zMNI$U%MdtuhGX=CjA>QR9^qDXdPo>pYM8MWr2r$0>wCiRPBx$wA>JT8eZ15s)0P-q zB1Aozg4tfi)b2Xk;`I9xGE=}-hXyZ8!q*l3U+zNn{j(Dc!3p)!*%u-?vq<=|3pOUQ zWyGiyBTFMlB`nO*Y9Ah(!NbWU+SXl!p_LaQ(YAuIK?1hwvD9HQf5We%&d9Ms&fq%y zUN1qfSJ0WtVnu2OLy1#xDwEi8Xb!s$R*;#}a1E7bus@Cx0GLyz24L%eEt`D!W&tEY9J!G2q%eB%) zDpXsTH>v$+wW-ptj!jbd(MBI}oIcvM+4xilAqgu+GU!OLVdl%&yYCbpjV57VcMC2Y zxfH2Xzi1QPi9;)I08lKJ0GYc&5Q)njmyEw$Mx6w(P^qF=7{CLwC1?{_tj&z!%8SRa zb@d56awLn}_Y|=1P!-#T(&+25kc_1;J?CKmWDzNbBqN=15>B94sl#MhZAZiGL=Nql z%)0_NmiE2M8#QXUVUdF{HZARV2-=LMjKMecR48wZ=pEW7Mj{p8^++v(y{H6715p_1 zqNb4_TY)4By{LKtQ_m=lkcd$ku=W-1%y`>o+gxMrt_)*(%GW=TbTT^ z^wgO{hHrk3Lis^-@N!~c{PRI6^u`bf+) zes%B3f@+}dj6o35kuTIRn~Q+Di zz`Z+WaNvd`=b)YE1a>ljUR;e_sgmoQC!JFypZt#;@(ydb(SC?-#HFAa9nteJ5ryOAL()r1v}6Mli5beACB1kBXn7FPQlajIKhMxpM%MqN zSJU6)RV$b)xG0vr6P23(lU&umtvhASCTK8>uQ#W{_HRaF{wB-7CKKUzYT?kGZPC!L z?>;<>C#LIo{RN$f5HhB-gg>Ig@_`5v=`f7Eja@skxS!URyz%{5x#lWZo`ZBejG>{G z^zVHP2L%hCOtoqawK|!l@57>73PmDRqNqB0d%Een>zF(-iBpp&5u?IQ&BgGYeM#&| zC-K%xPhi1~@@hYyS zKoiN1cT~#Oaoux1V#UMPg`xj-VZmPEle3Vo!VUDt>UF>3x^55&>jNE0V})hfFNtMB zFA0aDzhm@y|0}3!|3+e5HOV2wqn?j+?i@e{g9;Mkh}F}Fu_6zzT>mn=XutlY<41oX zSGJc6Jvcfa+!ND-50vcs4jE-RHCZEpN}@LtL7_-x@q_MEI(|#w)cztF4b0B=B(C%Fv8>s zl8VI=j-NPzQ)4GEKR1nXp@_QeD0g5|0pjr((y0`M*oUDdOVlCBbsQWxd>AK2kD^$r z;0PlLzkHOI?Blf?>xj7f@#XIwL*c#xZd}@d<;$a(VqJ3CfR^u~?05_tV`?z!CzE+h z7OQyEnjVy_a4=h`-_c|Eukt+`Ig;SAt9^lb^3k?b;@EK#*KDcEdRmAl%?n%y*F_M# zZ_SeMfM*H{Mjtc1-~$sy|GtD#MYv`%L?!}svd}t7^8)2TE}|s`0g4EXT!OCO`PykY zK3h6B1USuTY4W}f%QAXhBm6rL+WY?7ak6QLzAaS<&CFH&4=z+HUyJ#kGtwV}%lJGL zH4$TBlZ4~C;lc^DnOeE>DckpUhT7A2dakGK7%SlyFYM(t9wv%5Iuc>D4a8x&9-eq$ z3J=s~(f@|4uzJNdaw?mGX~((^>yd5~Hbl3OE8w9A9>nOu-I$pe#n{9oviUN~b-ExP zzHkGgO4N+NidyJu>m*|IV(r?sxcHK7ShH?DHmqBRBtymn`}boF>pMPa;L-h4Sl;L0 zRh!%Jn{V5MdpFGB^Z#}Pmpo9$%h$If)@xyMfh4wW;MjZ}9po&R4YcFVF#~s;Sioyn z_h}~#yy`Zsh{0^=L9gWe#?n4(XK%znm0YD*u~{ENyk=o4TihMk!EVEd{B8CCKDxA1 ze}9)*-FmP)b?+TlcTQh%#QoT|V^e>pGZHZfbe{00b4bQVKJt-go_$&h92@1kzQ8Ya zXqHfQo+JhZzNTqr?7gn9e4{339yOB4<>ecTQtB#+mxLTZ$YBFXP ztC#R8({3R_0@K|=2q&6!b|p5qo93GjoGM^te;Q%ULy6Xu>4+jT7$Ng5;am5eqA%9) zhWEV=*1*lEmK`h^=)=YfHxXi!s;u|l_aJWl=9ls4J>SA(KY1AYk4`FxjV9XA(b0?k z!2$I3_M(&AAQX$jAg!KUn8Ses2k`Ktk7NIyohTFvSh{2>m7&p@_V z!^R;pcC(7*gKb!QQ5yHn6|i$x7E7trLtSB%=?is|Kn6UtatCWWqbSh7&l8c>grhiV zGNg2^-&o?5?h8@)F}6#T_a2=qu}yutF;So@Tyk9!WBbr_>5hyM`{KhP^R2h_j>ol$ zg~YaE=(T;RM7M7Qk1>`hgJCly(xF^5x+EEyGBSgRUwYG1Wcl>8Xay+V`7g8@vKNcY zOXdLR)=hdS_B9ficWSPkU_p>3tG>WaptBMh?+^LEn~oXoeBME|ZWGoBR}#O|`nRl$ zA(GI*woqWgC}2?Y!{0eIUrt2W5HiGT6I}Xw(nv7OnLU!nzwMq!_v`!d&fmNWhpX3P za#p91`mmmsAC1Kr$~pMjSHFh)Z~qc@JoFbcGF-;e?v^|cw3fqEtEYoQqQDba4 zrTs_@x9S-1cx{#KYO0}Q9rIQVDTF||)k?&*$$ zc8^CNo56!Y6|Z>zW?cHxW!OJ)DUMErFxV5uz>-14;&GH2dVS$@|A1Zh{yX*^n?$5* zHMVYCh2bRwM3ycj$6tNK7OE%wM(f`?YmHu&MZBIYp+>>k&!gM`Gvz6eQX-9U*Cf? z!^N?AM+hDcEtJqs8y}Wp*jm0M1Hm4SnoYHouh(KQ6eS=dSeI^0)FuL6!!M&c*_T_#06WIAzxjA zUE>?*BWqYPv;-?gRwz+^?(aW??ce`L9GWbnZ)7XBZM_id*RN6*JhXHOgZ+c(V^ok% zr_tWtj!dSL?x2I88MKi%$ajJIR4R#nUN^FQM4jKYdpCAG{y5gHU(c{_HFAYKiurlW z=W;07M4zEDG|i@wnO2|kqv%M)be?=#ADw}FaVLK59hacJn-E)bFKU^|u2!&aF5qv3)K>4VV7oP{;>nJpA(Z)Y>sJCHAxkYr@g zMdT1y@!kLYPkiRnpT-~m*~gS3%}>u`dS)Jnj?Ci7+7(#W@gRMEOu64Gg&YdS@JqLB z#T`oy;j3Rhh^z8dY+KQeXoh6X)alzxYy%ySO%|}(uu#fm{tI>f3$?(@N%ywQm=f+# zWgAHctITH*A*G|%n?s~c;-+Rw9#RUO%kCSr_PAvGCF9h+iyb}$vQkSpmMqgVTClBTERfb)OR}J7@?|KQ6 z?ftNA7X@z+rFt(LMPmIVp*=(5wIBC<>+f-#3bSPGHe9;xBCI2O7r#AB>lZ(tNFf-wXb}g2$euO z)22Q>CyN6oI|+tuMBHX)zsx`MVvKAec+Hh-al`vIlbzG376XiA61bqhokn4( zX?ELB%wo1!Uq)iRg^?62LU))-Vudt>=n740fE*rCK{NFAWx8L}@GwuJC%vI*Mo~5T z`vvkWnR<3=rT|kWUY5dNb?sqtzn|1W9Q)leZP(j z)$;Dq0%1zDdsMZK;gvA)4I$x;Zd;jry96hib$)O8z z*|sfMwQ4m6gynbjDZ$6d4@Bs4f6E;{n_HCme3Aqe!sH2EnJ%RST~vmZD_7#W*Iq|g z@EAsqA43~qJ{l#7jf60pW$a&DLJO5Czidh>flNa2m`@pDY$EA==esXO?xHBZeC!l< z9+^i6`O-D3`>?u)VPiB*w@@P@gs&}?d>RgrCq<~%O*#+Z7E}W1IdrrniSoKKd5Xhm zBup3a8M10-U;&(){Fy16^h>Jbzjo0+6fCluOQBrSh_6 z!--e-F)km=)zO=ZVfW!Y9y(UV*1j0!uHoRkjReCGksC=&YKBB{I$y(hp$d~wEBCe$ z^V(#NA0MAghIh?WHGE zi6^l4{%@li8N%ffyRTk@p`ku>682-sn6hd^&CwE}FMd5Ewxz8VXn4Rxe*!oSDhm=-Cc+Y+rlx!80s6u+um>q)?Pn^dqO#U zdDkRHr>nSNs2c-xGc`7DsZ_l06iMa;kCWsNHO7C@h=+tlBcY*C=}q16J0;R7kaREW z4CBCzjf2Naj0Pe&Lh}8iol}@2r+WMp(KY8B&E^*F)9muoYxaz^Ce$d1$KHtwjuDR1afVH-NXXD)U8x8<+oI^s&`+8s#%Ai6 zATyp^U}boJsjfwC-!qBZ#!uo6w`{^ymu!L;PQnqZ6hBBbDf%5Gj$yL(B1|^CjO^`Y zs5d?_gXJ49#>NZQDnX^w9ZGP*_FKX~*Cc2lM@L5&k!1xoUv!ZgD<~9lGS3+S^RL&- zn9C=H8zHLKX#k@2qO>xCM{YqE>`}l%I{plXazHNp!-hOEwPcDPv}=OP}Xy9a8sM679bB7=|+;+<&lyxojQF86M7-Tr5kO zSlN^LSSlJ>QK*!^nk$#i+6apxfebE@A-hjH8gkR#L!J@7S=01i?re*^`gpC3ek#Lb z#|k*MU?VCGQ>AYrT+v$Qlc@wPnH6c~Wr}~3MI%CbdA3rm?wy>^;W}E$H59%h80bE8)4qg7B@N<|7cgIqq3(cRnOr-!iR!VR?4e#P1oiMaCZixIwr=n`T*UlP|K zFf8t5%a$!9e>0evm>`c}voV93TS1wAc67{Q_?lxI$uwdKZ50G4MNo@j=(bF{jnzw+ z(h%C<8wc>OUp$Prh1TQZ-slh0nq5th*vfhcnQlH;EihaZ9wiY#AjG<-&2u7Yw%vF4 z3+YQ>d3y*|vg>-WjxL7TRT@Z$(6g-Ftk>9P3w9^wOM$oY>6Lm~T9g7veWW1*#;clF z&n`=7UmJ*r9-DWJBZsEy*hy<%*%MO<+cMLVd-2rrR9&4Q*DE21OA z+roHdeB8|~Jh*YVYvGk|c}*tJr6;TrzlsbaN|9u+&IZviH+d4{Cy!!y z#U)rayd0gKok~a|d^w&gEo2vP@3+2*BXl3-d=4>Q+cB~nS6=@{tRi`QdTK=qlH&0M z)~;EDlVd00IBa+IrPbVra{>mVzFWc-?fjG4hvJB&Yw#-jgy zSPzXRBcZ|GkP%8p{gYYG{D&OOcLll9{tA^se4@xzmV+6d!LUp!CNM{GS*stq=K3o? z+%wqynSgGC#1IB~n@@jt_x5o-zPF5*U7v(oFQ7^vNrFQJAggBlyMFb0LUe{?Dyl~J zOuCroN_XA*UHr$V{|Y7r-%lQrVY#MCb>#OwfhTVN9xl827QFR0fBPBtH5PnOal;1M z8B$J1Ch3Z#)g3jqQDNA);lj-f3n%c{5ep~woy4ZK-AHwW;Y)Wg-KR_~_teZ~x&@c~ zr=uM=zv^EgvCiUx!5&=Hm;T0J!uT6ca~Pr6no-LK-SM+~_!l-9B(N>rj8p)ZhpuYT%Hd7<=(QRrfgYFNUju17+TZE&@n~Lm60oQ<#pSz z?B=&_4p$zPIl7ph&tv=jIXt+xfO{XGLZ#;5<<}dG07^uGI{l)LQg#|vv<*W817yK% z2$AVq%4a`&b-w@YZ{Uj`{S$2L&!Bf*Crnyr%<>U-lWZ&xs|dF{{{FAv(!c-G@Bi`X z`=ozB)&i;#Q(9u2p<;w_zHQIYE!nD1LPTU&^QaWY8O6l#&;POu*Iuy-FW;QOWgB8x zHW)`d6o+flWz-w|#jaOz@g*aOZ6A7fyfXWZG+meU`UwKm2%Cj!osScDpese6F4S!g z+S^j`*qeJo*5*V^zuYZ_aZ$|pL9J>piH7y;+L-aiP*;@3#+ZaKEbA{@b2FYVy)Xq3 zNRv4g%vsvRB=q!0{O?Z?rsoRf3BwFu;=A6?DU!907zs@?HWmvi%@xpp;YMuypZ`E> z)tVo!HUI!107*naRMn8HXnd-F0B-rnEAD@24EO9B!|oFdWoooI-fPjyE?Bcvjq6JY zSaa%BA|gSp&QP!e8Ct)L1BAu$Wden&@lzf9^yDPI@`;aQOK%b@m$zY|SjMAsMa(kX zGE5um+f4KjmXq-)zW1q5Vg1!F#g@yjQum7BeJYE%0YR5Akw%7^ONA0G+a}aklxxf9 zr~uW9R27M26vrohd}*PGuiaC`aIcQdBS~ytmBfm{7}6wuGASmUG_hpk#@YGre-|O5 zqPSR{nc2QeftML+gvbG0M&KISQx-a7)_qg?!hL1Kx_&5<`PSB`enYWff4d$JCqllP zmeE8vE6wdRI=iI&XEwxhq!*|FObt|0?d;Qf1QlX*TvaMTI^;hh-TTt7ogZj^wFM|LWQ~MGMmp+dr)hybRgE(+%8n++KG1Ovc$;&+8qb}XDadfq3 zFflW!_$z}TwGc&S_KeQ~$4=$(t^2a*NdX&IrLc8f4_1#XV9ncq`4z<*e*L@EN`dXk z>v^*kiDB|D{t(CSyAv@+ATq1YlF2q~gCco?R|>veiq%)PhqWV7OQ)~bO6jCtib`a{ zGAjK)3%NZry>JCMGx0&93(CJYAF6aibz=&X_uy7#Hg6JFe&U~CGiJ>lI-nXR%24gV zfkU7E!k54FTh&qpJ>9*i*J_Nd%e1gE0xE$+h`sAacj9%gdo7F*q0RMBFISPY!s`AI z{k}X)q7;w+i4r_L0yzA@0}72Iq@)K%=WuYL%4>KXty>7?QU1Mu+QO^XcjJm>87!PQ zq^3GZF47Gl71HEdqJVAJU{mPg%3AmuCb65JAH}}I2Qb4hQKrSYR2ql%wy5ACy0uiB zEMzoLpn&dpERP>OR>acoaa?yp=Ji*;=EmPUdUUknQjt`<5gppz^y`S79ECm2h$GJE zK#C#JCEHDwrI95ZsRtGjR8yg%P6ZLG7o}dD-9MRLoC2IJNi19QaoKNu5bYzYP?;L% z$%fWQ4_`K)dt)cHJg?2;_=yQ*7v|s+0!><3Dv@TTsw8+a_b)=L*HNw#IVik%SBl|a zObMmci>Lf`^Jtx`3xt#O>AH_9g_5Hubv;>1ChT5{K@v(7%N4|uJy?WVo61-xGQ_BG zt#JZh4t{s(4odkV%JsTJKlv>|>z|sP!O+kWg-lZ?Pf>9^R4YUYUN1-&p`u0^Ma1bs z+S^j(L^`e6z_-48?{K9aI&|UYO=~?ZTvX-v>qxCwi?%=cEFS)^x6ptpFk?^ON1)NQ z)#~YQf%3VepQ-}X32kjl2J!Ou%hY7r6j^iwp5z}LM~;o=Pn|f?yMNySMg+DBwR*a` zDcmSaMqkU&FG35FhLJ&?8r@1jQq zV*M4Ds{52xHS=tIx2hQW^iLuE zR1`o2P$OIqY}tzbSKWZogL@Q|wURWh4AJ_wo7uW`E3&x~^7MhZQh@?4Fgz^5^eRaD zGibAhvHRdLY`f?JT1*d)A3KI(zNAL_DilJwSY$)f#@&WH@Toj9E2hN-Uj3eTOPy+D^M=NmrsH7J-c?J zK*4#<9Zc4)U5Oo!?;=u_kZ9{bt+bm~UqK-|Pk;--BiUK$ck3!2vaQ#>Bh7(G_ zrXN<_y3Hivj;!z*pPJetUA&XCWAFHXaos0SKnZa zeP+^SLWW_9uOBPSP7GYpJ&$W%zYa?WIuMJ~hnv#N)}Y|NT}5YdKjsR%(AK$){y&W} z6>MRCzA>ApTvk)MWQw=M>XzyZVq7imrs)P=|CYD&w=i!1r_W%;{2Z2bC2(pyK#DQe zG();cBaK&m^nc)rSG`7EFA8v`@M}bapFH#!ilw4r+ZGXL>54U&qu;oB!!*jP6Sz3} z2-a^NAO{%aHPYiJBSAC<63-H4H#c9y;fX2^jpuRVq=x)l55nu#(CtNsmk$q-Ec2O9 za{+<^p{1`y;dM7*>U&?|8R_qM$|Wy4op%Kg$dvtX{6q@Jjvazs$e$L(85gNAF%}B_ z(i`7+!`H7EE^RjT68&U>(Lsej%d+4)uQSwI!8I2y!PLTjJX%8kRwtfWRM|u!U zO)>MQt!{de>HI4ID|JjlfKJSw*>>u5EHy(WOK{YC8Fy8JU_mFu4Gt*i0mmfv6ryY(J zrD7QL`I;K-6rmf2$;Z>}slDxFXqQiv@>q;?mUQ7wtF~d~ar4nrW5?e$F+0~7MSQj- z<&dsolIDP%2jR0X_j)1e{3?LV2h7i7$;Df+_9dHDBoI(I&y@nTD}-aZ(tW0ST-XS* z!W?B}*NskdiTDbt3 zWA9538yoTIAoN_qFOj9oAWuLyaNC`C;(>eafh(Ma7Tng6K~HxViWNo#r*`0_%gQif zj9#o5!%Z2Bpzx_QGL1_fAPS&H1f@TeAF}O*FLMPP7Zob^=1Z^q{Q65@S#fP5-qQ=% zN<1GSaoz7kad6Lv*7Fhy+`HqhyYR$A52>!^Fkv`NM&3!qE7z;o zzxOa+GrW%omZXBmY4r_ZOW+~?zcD+kQ4giesy@;wF3DgOS#F-Ax2lBbDnrrdi}P7H zK4ATOejiW#_;$=ayd7Hi`3nioj{>lamAPqj5}L36*k8d&4Z^L=vN0R0b)GYcWd^e3 zQ`nYt=1VB2erR4GK;5t)`K=a2an;%>OwLCzm0OL@Os9&w^MwBSxg56NcOT|vW^nOE z7o&f;pCMKam1jk#&kxjMk3jnNJzXizfhV581BCojV`GTZ^5Q8n zcDfZ=dF1&njvO7sQ0x>oFD=6lcf*n`?_{YNxr+2Ssx56AbHWE)AN6xGH@L`@& zi)nM7SiktJ=S#fCh*`Mg-S5Y(58SWzG(cE-2hR)~&n>-Z1rY1;y*e_hH(}j-f1ko1 zW_?P^*PS)7;k3YYWR?K`B2=^*PCfer!>1nkBXvN4X^!9h4J?5hSBVSR8}vC)U8?e zR-H%y8;O6jx)K)qe#O^o^82$8z%!F-;}TY0eL1fA;O}DmpZ=DdN4V9C4+$2p018H1 z$CJq|<`7=C7O(j0Z&0U0@T;eqe($*<_jD2tKn0*RP}*na-%}Ej^h)$hOd)ZbP-R6UFR24j(*%!-o%%-Di+W#nIcDWT*%VRA%%M z@)@e;^A2VTRm>7Sa`SnjiK!-)CgOA-2?}0zMkR9O=n@VdJWQmh)k!*~ zuR$!|kTnis{bKQ|)I3^>+*AOC1kI!r!+>8eQnw}Ad20CgY)R&2nr;~v{>poxPmE&W z&f8$c=?YYcy@YtBx z_oKV3mjaeqL`6(bFW~s`3Fd0bIz;M`PA(+_HH00KM~i}9HoOEe!o7^(2?EG29#ukb zVP-$}9Tc)*1jAP9}6}Hx)<{(H+9*a@j`nUibQc!OAlBPOWkAr$XV6{L>#F-#tW@AyCSPi_;KujH z+&@{urSq9CzvmZDV&=p_EX-FC;qR|oz8mWXXb4t@3KCMnmtkdL{xXYKDXoxNQ{cX- z1kKW`qjimJ6)Q=`ER3*eSfaRR;Q(i(K)R7b5v={w&+#uE`~K`baPIjg2!;In>`3zT zv^WKbMbP*5KY8X4%@oi-=_Y-?s^kkuY^1<9oxsp#EA2CXXnu-s6ibrtjm8uKN;oB3 zsHEFt=p?Ks;#u7KU=ec*8MJqG!i{9;$1 z1VAHnOBK`#3#jGCFgrVsxk4BN9WLImaRN)ai5f;5A|iB47QQrQ@hHM4gHPiBl_#TO zwa|e7H0DD$h2E-H!vpYB=6$n{jeYbNpX@5{XFZG{%0NvV5bKl+ zThD#&v`7~~0#=*mw=)>+=^s!3a}G%w(C{>0vl~ROb-rm48ku`DggUJtf)ENq4LD@( zHI0_u3B2Xyb=>*bG#)veMU;(`Xip=Vp(4=2YO-95haiDX1}(jd>OBOq8G~%LRIS3z z&tPV14EbCU^JNPmD#}Y%%;Ksw1rok6d^4`b@nwGmiS-+#uT`E#5fukeL{R;4Mzb_I zZVL@grxr@Q@b(Klwvm^E)iHpf4}B67AG{Hs?NK?|W>gTrG*5*tJ@dw=rNxmzYPe?? zSX}W{FVxJRFG=Hx;HB@kg#ZofY&=KcRD5US+SV+b)_n}(D2Nzj4Wtp$@VYDN*f3ni zojWufJYIx%ViH{`3(0th)*)da*}P6+G6&tI&>4S}%T*L}HOvYE@Dcu1$R{g+1Oa4XqxuvCXm&q82>}fnAZs1epJxhMLBJV*pG#u- z+#({Yx1jGY{+-OWhJXs-jP8OneG1{BRnNTTX=zakAamiYNW4i_&$9xMaCrqXOX)z7 zmo%K_GOFdCe4P4h{@6U%SU5sBwjyfoUftHv*KOeK*V>qxcChnU6$eh~I5w%FT$K$N zGz=_XfgH(UVR}lzxOCjaA|6)tI#|``V0o{N&Xn}%MEH1FXCR@TsT4qFBT2~D^8F2= zx8%*Tn*!&e(6mn8+mL><{H=mZ*%dK-fw2EvNzGTV5nX>}^8_Eb@tUVx@_cEL2tdCp zdy%PaJp>5j2o;N?imk1@@c%;j|`*(ny_JZ28<=z*CZRd)tiATInGaR6#-P@U!Hvv7bHmBeaf=ukF@u*g19#!k1@>&u{%rHxQAH9I1E}m*r7Whm^1R$`jRhBI!w&@XVyN{26CoRC)pWv^WHi zx-jf|k$U>nLaZOB|=S%0U7u%#nMF?bopL5wJoJj&DHR`G!BpW;aG+I{mIh;M;MY;efsLV-gu7f|1 zDUe}P$x~WedQ(n!BuM9m2v#Z~WKc$2q#*@f�J+xf>&XYTQNo=GDAF`CDGl#5))* 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 TS66xg00000NkvXXu0mjf{R=SX literal 0 HcmV?d00001 diff --git a/demo/png/gru-icon-2.png b/demo/png/gru-icon-2.png new file mode 100644 index 0000000000000000000000000000000000000000..25b5c08139f6e5c2644e3505bf85f2f573803fc8 GIT binary patch literal 17768 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

${-4l{ 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 literal 0 HcmV?d00001 diff --git a/demo/png/kungfu-Minion.png b/demo/png/kungfu-Minion.png new file mode 100644 index 0000000000000000000000000000000000000000..6500ae1e423d0c86f7c486d0ddeee5c480e2dada GIT binary patch literal 25070 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 urVKrda?ta|& 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 ViY>tdfffJ&002ovPDHLkV1kI)Dh&Vt literal 0 HcmV?d00001 diff --git a/demo/png/superman-minion-icon.png b/demo/png/superman-minion-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf6a8006d3155a44c5654e5b7338a01ff591da6 GIT binary patch literal 21109 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≪Z(aS>k=&qo=k0`DUxN`S!QJg}lhm9Y22jf4y-2+`ov@ zCWEoTdO@fHWE|rwO|CVo2&|$`sS7}rizSq(pq1W3Z?LPXLVKT zRMV+7Rsua@z!$PSOBffE9}3(T6^m>FTY#iiK1Yq zNaUfY@J3Ko)kWv*3)*Og!(lBVU6#@T($Z)&J~|o= z^Dqo~_q)Fp?;RT(>-ooi^;gWw=rGrrXY9Zb)-wmJLn8X2-~&>KUsFmEs8_Ga zZLMRb+2D>N`@s7@;I;)}c+zV9*Nf@s`!@Td(XKtagHo5@pJf?F8-(z6M^g~dOcI=R zZ1;zsb=IE?!{BOJ{2LztWuCnf0HPwB-jwILu+9>N0ZABPtYtE-i#X1?Ur5u2>2$ih zGgIHLLw zESXZu#&P@$p;Eslg>d`!?Mud!@xBu$PQE$IN|3^bL12Qwhgzfwi%)j$+@w&FPLV9)kgnDl0+YgqR?GeM}Tww6?_06YGa#aRUxIMkwip+VzVkR*0O79 z=@;TSo_OaG0)FVP{*|jYZgji7CnwYCtsW3c(GVVy4ajxHc9jl=l(zE~FPUxj`Rr$= z+zH5@{*z`Ny6YIod1|J)_7m%?e{J(&{Pf5AnZ4I(8h>zkY3`@5tZm84a!sYet|6y=uYJBthpn9f*we(v|V``(8TQsQ5SOq~BRIq=%9YbzAlNMCLNq^vqKy??WN z&z=XeqWES}l^9RoTK7ZF`%l#lSiM1a-E-%ct%y>A-`v`S69R1<#uESsW~ z;@WC>UncG5IVXegFUl}_#m!h)THx&2b6=T290>3Kd9&GkpAzg3ghK(n`Pq|m z^NatJ41&oYx~oD^+IUS{Kx7Lz5#%*$3lFSO{>$u@;~$+PUl7blUr*mKN?Bb zOwz{VvkSZafkvKwrI7QLvXDwCuBRpZ^ Date: Wed, 13 May 2015 00:18:08 +0300 Subject: [PATCH 03/23] ASSERT removed (code cleanup) --- src/rgbquant.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/rgbquant.js b/src/rgbquant.js index f277f37..f57e644 100644 --- a/src/rgbquant.js +++ b/src/rgbquant.js @@ -255,8 +255,6 @@ b1 = (i32 >>> 16) & 0xff, a1 = (i32 >>> 24) & 0xff; - ASSERT(i32 > 0, "negative color. use >>> 0 to avoid it"); - // Reduced pixel var i32x = this.nearestColor(i32), r2 = (i32x & 0xff), From ed5151ecb21c47ce5b9663aa88957b22f455c0b0 Mon Sep 17 00:00:00 2001 From: igorbz Date: Wed, 13 May 2015 16:44:06 +0300 Subject: [PATCH 04/23] typescript migration started --- demo/index.html | 8 +- demo/js/demo.js | 4 +- src/build.cmd | 3 + src/colorQuant.ts | 1076 +++++++++++++++++++++++++++++++++++++++++++++ src/rgbquant.js | 289 +++++++----- 5 files changed, 1263 insertions(+), 117 deletions(-) create mode 100644 src/build.cmd create mode 100644 src/colorQuant.ts diff --git a/demo/index.html b/demo/index.html index 99b8126..d6c0fc3 100644 --- a/demo/index.html +++ b/demo/index.html @@ -7,7 +7,7 @@ - + @@ -143,9 +143,9 @@

Config

             var opts = {
                 colors: ,
-                minHueCols: ,
-                dithKern: ,
-                ,
+                
+                dithKern: 
+                
             };
 		
diff --git a/demo/js/demo.js b/demo/js/demo.js index 9ea45bd..526ce4e 100644 --- a/demo/js/demo.js +++ b/demo/js/demo.js @@ -93,7 +93,7 @@ function process(srcs) { }); var opts = (srcs.length == 1) ? getOpts(baseName(srcs[0])[0]) : dflt_opts, - quant = new RgbQuant(opts); + quant = new ColorQuantization.RgbQuant(opts); $.each(imgs, function() { var img = this, id = baseName(img.src)[0]; @@ -157,4 +157,4 @@ $(document).on("click", "img.th", function() { // process(["img/grad_default.png"]); }).on("change", "input, textarea, select", function() { cfg_edited = true; -}); \ No newline at end of file +}); diff --git a/src/build.cmd b/src/build.cmd new file mode 100644 index 0000000..ba9abf4 --- /dev/null +++ b/src/build.cmd @@ -0,0 +1,3 @@ +pushd %~dp0 +tsc colorQuant.ts --out colorQuant.js +popd diff --git a/src/colorQuant.ts b/src/colorQuant.ts new file mode 100644 index 0000000..fc288bc --- /dev/null +++ b/src/colorQuant.ts @@ -0,0 +1,1076 @@ +/* +* Copyright (c) 2015, Leon Sorokin +* All rights reserved. (MIT Licensed) +* +* RgbQuant.js - an image quantization lib +*/ + +module ColorQuantization { + + // Rec. 709 (sRGB) luma coef + var Pr = .2126, + Pg = .7152, + Pb = .0722, + Pa = 1; // TODO: (igor-bezkrovny) what should be here? + + // http://alienryderflex.com/hsp.html + function rgb2lum(r, g, b) { + return Math.sqrt( + Pr * r * r + + Pg * g * g + + Pb * b * b + ); + } + + + // http://rgb2hsl.nichabi.com/javascript-function.php + function rgb2hsl(r, g, b) { + var max, min, h, s, l, d; + r /= 255; + g /= 255; + b /= 255; + max = Math.max(r, g, b); + min = Math.min(r, g, b); + l = (max + min) / 2; + if (max == min) { + h = s = 0; + } else { + d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break + } + h /= 6; + } +// h = Math.floor(h * 360) +// s = Math.floor(s * 100) +// l = Math.floor(l * 100) + return { + h: h, + s: s, + l: rgb2lum(r, g, b) + }; + } + + function hueGroup(hue, segs) { + var seg = 1 / segs, + haf = seg / 2; + + if (hue >= 1 - haf || hue <= haf) + return 0; + + for (var i = 1; i < segs; i++) { + var mid = i * seg; + if (hue >= mid - haf && hue <= mid + haf) + return i; + } + } + + function satGroup(sat) { + return sat; + } + + function lumGroup(lum) { + return lum; + } + + function typeOf(val) { + return Object.prototype.toString.call(val).slice(8, -1); + } + + var sort = isArrSortStable() ? Array.prototype.sort : stableSort; + + // must be used via stableSort.call(arr, fn) + function stableSort(fn) { + var type = typeOf(this[ 0 ]); + + if (type == "Number" || type == "String") { + var ord = {}, len = this.length, val; + + for (var i = 0; i < len; i++) { + val = this[ i ]; + if (ord[ val ] || ord[ val ] === 0) continue; + ord[ val ] = i; + } + + return this.sort(function (a, b) { + return fn(a, b) || ord[ a ] - ord[ b ]; + }); + } + else { + var ord2 = this.map(function (v) { + return v + }); + + return this.sort(function (a, b) { + return fn(a, b) || ord2.indexOf(a) - ord2.indexOf(b); + }); + } + } + + // test if js engine's Array#sort implementation is stable + function isArrSortStable() { + var str = "abcdefghijklmnopqrstuvwxyz"; + + return "xyzvwtursopqmnklhijfgdeabc" == str.split("").sort(function (a, b) { + return ~~(str.indexOf(b) / 2.3) - ~~(str.indexOf(a) / 2.3); + }).join(""); + } + + // returns uniform pixel data from various img + // TODO?: if array is passed, createimagedata, createlement canvas? take a pxlen? + function getImageData(img, width?) { + var can, ctx, imgd, buf8, buf32, height; + + switch (typeOf(img)) { + case "HTMLImageElement": + can = document.createElement("canvas"); + can.width = img.naturalWidth; + can.height = img.naturalHeight; + ctx = can.getContext("2d"); + ctx.drawImage(img, 0, 0); + case "Canvas": + case "HTMLCanvasElement": + can = can || img; + ctx = ctx || can.getContext("2d"); + case "CanvasRenderingContext2D": + ctx = ctx || img; + can = can || ctx.canvas; + imgd = ctx.getImageData(0, 0, can.width, can.height); + case "ImageData": + imgd = imgd || img; + width = imgd.width; + if (typeOf(imgd.data) == "CanvasPixelArray") + buf8 = new Uint8Array(imgd.data); + else + buf8 = imgd.data; + case "Array": + case "CanvasPixelArray": + buf8 = buf8 || new Uint8Array(img); + case "Uint8Array": + case "Uint8ClampedArray": + buf8 = buf8 || img; + buf32 = new Uint32Array(buf8.buffer); + case "Uint32Array": + buf32 = buf32 || img; + buf8 = buf8 || new Uint8Array(buf32.buffer); + width = width || buf32.length; + height = buf32.length / width; + } + + return { + can : can, + ctx : ctx, + imgd : imgd, + buf8 : buf8, + buf32 : buf32, + width : width, + height: height + }; + } + + // partitions a rect of wid x hgt into + // array of bboxes of w0 x h0 (or less) + function makeBoxes(wid, hgt, w0, h0) { + var wnum = ~~(wid / w0), wrem = wid % w0, + hnum = ~~(hgt / h0), hrem = hgt % h0, + xend = wid - wrem, yend = hgt - hrem; + + var bxs = []; + for (var y = 0; y < hgt; y += h0) + for (var x = 0; x < wid; x += w0) + bxs.push({x: x, y: y, w: (x == xend ? wrem : w0), h: (y == yend ? hrem : h0)}); + + return bxs; + } + + // returns array of hash keys sorted by their values + function sortedHashKeys(obj, desc) { + var keys = []; + + for (var key in obj) + keys.push(key); + + return sort.call(keys, function (a, b) { + return desc ? obj[ b ] - obj[ a ] : obj[ a ] - obj[ b ]; + }); + } + + var rd = 255, + gd = 255, + bd = 255, + ad = 255; + + var euclMax = Math.sqrt(Pr * rd * rd + Pg * gd * gd + Pb * bd * bd + Pa * ad * ad); + // perceptual Euclidean color distance + function distEuclidean(rgb0, rgb1) { + var rd = rgb1[ 0 ] - rgb0[ 0 ], + gd = rgb1[ 1 ] - rgb0[ 1 ], + bd = rgb1[ 2 ] - rgb0[ 2 ], + ad = rgb1[ 3 ] - rgb0[ 3 ]; + + return Math.sqrt(Pr * rd * rd + Pg * gd * gd + Pb * bd * bd + Pa * ad * ad) / euclMax; + } + + var manhMax = Pr * rd + Pg * gd + Pb * bd + Pa * ad; + // perceptual Manhattan color distance + function distManhattan(rgb0, rgb1) { + var rd = Math.abs(rgb1[ 0 ] - rgb0[ 0 ]), + gd = Math.abs(rgb1[ 1 ] - rgb0[ 1 ]), + bd = Math.abs(rgb1[ 2 ] - rgb0[ 2 ]), + ad = Math.abs(rgb1[ 3 ] - rgb0[ 3 ]); + + return (Pr * rd + Pg * gd + Pb * bd + Pa * ad) / manhMax; + } + + /* + Finally, I've found it! After thorough testing and experimentation my conclusions are: + + The correct way is to calculate maximum possible difference between the two colors. + Formulas with any kind of estimated average/typical difference had room for non-linearities. + + I was unable to find correct formula that calculates the distance without blending RGBA colors with backgrounds. + + There is no need to take every possible background color into account, only extremes per R/G/B channel, i.e. for red channel: + + blend both colors with 0 red as background, measure squared difference + blend both colors with max red background, measure squared difference + take higher of the two. + Fortunately blending with "white" and "black" is trivial when you use premultiplied alpha (r = r×a). + + The complete formula is: + max((r?-r?)², (r?-r? - a?+a?)²) + + max((g?-g?)², (g?-g? - a?+a?)²) + + max((b?-b?)², (b?-b? - a?+a?)²) + */ + function colordifference_ch(x, y, alphas) { + // maximum of channel blended on white, and blended on black + // premultiplied alpha and backgrounds 0/1 shorten the formula + var black = x - y, // [-255; 255] + white = black + alphas; // [-255; 255*2] + + return Math.max(black * black, white * white); // [0; 255^2 + (255*2)^2] + } + + //var rgbaMax = (255*255 + (255*2) * (255*2)) * 3; + var rgbaMax = Math.pow(255 << 1, 2) * 3; + + function distRGBA(rgb0, rgb1) { + /* + var r1 = rgb0[0], + g1 = rgb0[1], + b1 = rgb0[2], + a1 = rgb0[3]; + + var r2 = rgb1[0], + g2 = rgb1[1], + b2 = rgb1[2], + a2 = rgb1[3]; + + var dr = r1 - r2, + dg = g1 - g2, + db = b1 - b2, + da = a1 - a2; + + return (Math.max(dr << 1, dr - da << 1) + + Math.max(dg << 1, dg - da << 1) + + Math.max(db << 1, db - da << 1)) / rgbaMax; + + */ + var alphas = rgb1[ 3 ] - rgb0[ 3 ], + dist = colordifference_ch(rgb0[ 0 ], rgb1[ 0 ], alphas) + + colordifference_ch(rgb0[ 1 ], rgb1[ 1 ], alphas) + + colordifference_ch(rgb0[ 2 ], rgb1[ 2 ], alphas); + + if (dist > rgbaMax) { + console.log(dist); + } + + return dist / rgbaMax; + } + + // http://www.tannerhelland.com/4660/dithering-eleven-algorithms-source-code/ + var kernels = { + FloydSteinberg : [ + [ 7 / 16, 1, 0 ], + [ 3 / 16, -1, 1 ], + [ 5 / 16, 0, 1 ], + [ 1 / 16, 1, 1 ] + ], + FalseFloydSteinberg: [ + [ 3 / 8, 1, 0 ], + [ 3 / 8, 0, 1 ], + [ 2 / 8, 1, 1 ] + ], + Stucki : [ + [ 8 / 42, 1, 0 ], + [ 4 / 42, 2, 0 ], + [ 2 / 42, -2, 1 ], + [ 4 / 42, -1, 1 ], + [ 8 / 42, 0, 1 ], + [ 4 / 42, 1, 1 ], + [ 2 / 42, 2, 1 ], + [ 1 / 42, -2, 2 ], + [ 2 / 42, -1, 2 ], + [ 4 / 42, 0, 2 ], + [ 2 / 42, 1, 2 ], + [ 1 / 42, 2, 2 ] + ], + Atkinson : [ + [ 1 / 8, 1, 0 ], + [ 1 / 8, 2, 0 ], + [ 1 / 8, -1, 1 ], + [ 1 / 8, 0, 1 ], + [ 1 / 8, 1, 1 ], + [ 1 / 8, 0, 2 ] + ], + Jarvis : [ // Jarvis, Judice, and Ninke / JJN? + [ 7 / 48, 1, 0 ], + [ 5 / 48, 2, 0 ], + [ 3 / 48, -2, 1 ], + [ 5 / 48, -1, 1 ], + [ 7 / 48, 0, 1 ], + [ 5 / 48, 1, 1 ], + [ 3 / 48, 2, 1 ], + [ 1 / 48, -2, 2 ], + [ 3 / 48, -1, 2 ], + [ 5 / 48, 0, 2 ], + [ 3 / 48, 1, 2 ], + [ 1 / 48, 2, 2 ] + ], + Burkes : [ + [ 8 / 32, 1, 0 ], + [ 4 / 32, 2, 0 ], + [ 2 / 32, -2, 1 ], + [ 4 / 32, -1, 1 ], + [ 8 / 32, 0, 1 ], + [ 4 / 32, 1, 1 ], + [ 2 / 32, 2, 1 ], + ], + Sierra : [ + [ 5 / 32, 1, 0 ], + [ 3 / 32, 2, 0 ], + [ 2 / 32, -2, 1 ], + [ 4 / 32, -1, 1 ], + [ 5 / 32, 0, 1 ], + [ 4 / 32, 1, 1 ], + [ 2 / 32, 2, 1 ], + [ 2 / 32, -1, 2 ], + [ 3 / 32, 0, 2 ], + [ 2 / 32, 1, 2 ] + ], + TwoSierra : [ + [ 4 / 16, 1, 0 ], + [ 3 / 16, 2, 0 ], + [ 1 / 16, -2, 1 ], + [ 2 / 16, -1, 1 ], + [ 3 / 16, 0, 1 ], + [ 2 / 16, 1, 1 ], + [ 1 / 16, 2, 1 ] + ], + SierraLite : [ + [ 2 / 4, 1, 0 ], + [ 1 / 4, -1, 1 ], + [ 1 / 4, 0, 1 ] + ] + }; + + + export enum RgbQuantDitheringKernel { + NONE = 0 + } + export class RgbQuant { + // 1 = by global population, 2 = subregion population threshold + private method : number = 2; + + // desired final palette size + private colors : number = 256; + + // # of highest-frequency colors to start with for palette reduction + private initColors : number; + + // color-distance threshold for initial reduction pass + private initDist = 0.01; + + // subsequent passes threshold + private distIncr : number = 0.005; + + // palette grouping + private hueGroups : number = 10; + private satGroups : number = 10; + private lumGroups : number = 10; + + // if > 0, enables hues stats and min-color retention per group + private minHueCols : number; + + // HueStats instance + private hueStats : HueStats; + + // subregion partitioning box size + private boxSize = [ 64, 64 ]; + + // number of same pixels required within box for histogram inclusion + private boxPxls = 2; + + // palette locked indicator + private palLocked = false; + + // palette sort order +// this.sortPal = ['hue-','lum-','sat-']; + + // dithering/error diffusion kernel name + private dithKern : RgbQuantDitheringKernel = RgbQuantDitheringKernel.NONE; + + // dither serpentine pattern + private dithSerp = true; + + // minimum color difference (0-1) needed to dither + private dithDelta = 0; + + // accumulated histogram + private histogram = {}; + + // palette - rgb triplets + private idxrgb = []; + + // palette - int32 vals + private idxi32 = []; + + // reverse lookup {i32:idx} + private i32idx = {}; + + // {i32:rgb} + private i32rgb = {}; + + // enable color caching (also incurs overhead of cache misses and cache building) + private useCache = true; + + // min color occurance count needed to qualify for caching + private cacheFreq = 10; + + // allows pre-defined palettes to be re-indexed (enabling palette compacting and sorting) + private reIndex = true; + + constructor(opts) { + opts = opts || {}; + + // 1 = by global population, 2 = subregion population threshold + if (typeof opts.method === "number") this.method = opts.method; + + // desired final palette size + if (typeof opts.colors === "number") this.colors = opts.colors; + + // # of highest-frequency colors to start with for palette reduction + this.initColors = this.colors << 2;//opts.initColors || 65536; //4096; + // if > 0, enables hues stats and min-color retention per group + this.minHueCols = this.colors << 2;//opts.minHueCols || 0; + + // HueStats instance + this.hueStats = this.minHueCols ? new HueStats(this.hueGroups, this.minHueCols) : null; + + // dithering/error diffusion kernel name + if (typeof this.dithKern === "number") this.dithKern = opts.dithKern; + + // accumulated histogram + this.histogram = {}; + // palette - rgb triplets + if (Object.prototype.toString.call(opts.palette) === "[object Array]") this.idxrgb = opts.palette.slice(0); + + // if pre-defined palette, build lookups + if (this.idxrgb.length > 0) { + this.idxrgb.forEach(function (rgb, i) { + var alpha = rgb.length >= 4 ? rgb[ 3 ] : 255, + i32 = ( + (alpha << 24) | // alpha + (rgb[ 2 ] << 16) | // blue + (rgb[ 1 ] << 8) | // green + rgb[ 0 ] // red + ) >>> 0; + + this.idxi32[ i ] = i32; + this.i32idx[ i32 ] = i; + this.i32rgb[ i32 ] = rgb; + }, this); + } + } + + // gathers histogram info + public sample(img, width) { + if (this.palLocked) + throw "Cannot sample additional images, palette already assembled."; + + var data = getImageData(img, width); + + switch (this.method) { + case 1: + this.colorStats1D(data.buf32); + break; + case 2: + this.colorStats2D(data.buf32, data.width); + break; + } + } + + // image quantizer + // todo: memoize colors here also + // @retType: 1 - Uint8Array (default), 2 - Indexed array, 3 - Match @img type (unimplemented, todo) + public reduce(img, retType, dithKern, dithSerp) : any { + if (!this.palLocked) + this.buildPal(); + + dithKern = dithKern || this.dithKern; + dithSerp = typeof dithSerp != "undefined" ? dithSerp : this.dithSerp; + + retType = retType || 1; + + // reduce w/dither + var buf32; + if (dithKern) + buf32 = this.dither(img, dithKern, dithSerp); + else { + var data = getImageData(img); + buf32 = data.buf32; + } + + var len : number = buf32.length, + out32 = new Uint32Array(len); + + for (var i = 0; i < len; i++) { + var i32 : number = buf32[ i ]; + out32[ i ] = this.nearestColor(i32); + } + + if (retType == 1) + return new Uint8Array(out32.buffer); + + if (retType == 2) { + var out = [], + len : number = out32.length; + + for (var i = 0; i < len; i++) { + var i32 : number = out32[ i ]; + out[ i ] = this.i32idx[ i32 ]; + } + + return out; + } + } + + // adapted from http://jsbin.com/iXofIji/2/edit by PAEz + public dither(img, kernel, serpentine) { + if (!kernel || !kernels[ kernel ]) { + throw 'Unknown dithering kernel: ' + kernel; + } + + var ds = kernels[ kernel ]; + + var data = getImageData(img), +// buf8 = data.buf8, + buf32 = data.buf32, + width = data.width, + height = data.height, + len = buf32.length; + + var dir = serpentine ? -1 : 1; + + //(console).profile("dither"); + for (var y = 0; y < height; y++) { + if (serpentine) + dir = dir * -1; + + var lni = y * width; + + for (var x = (dir == 1 ? 0 : width - 1), xend = (dir == 1 ? width : 0); x !== xend; x += dir) { + // Image pixel + var idx = lni + x, + i32 = buf32[ idx ], + r1 = (i32 & 0xff), + g1 = (i32 >>> 8) & 0xff, + b1 = (i32 >>> 16) & 0xff, + a1 = (i32 >>> 24) & 0xff; + + // Reduced pixel + var i32x = this.nearestColor(i32), + r2 = (i32x & 0xff), + g2 = (i32x >>> 8) & 0xff, + b2 = (i32x >>> 16) & 0xff, + a2 = (i32x >>> 24) & 0xff; + + buf32[ idx ] = i32x; + + // dithering strength + if (this.dithDelta) { + var dist = distEuclidean([ r1, g1, b1, a1 ], [ r2, g2, b2, a2 ]); + if (dist < this.dithDelta) + continue; + } + + // Component distance + var er = r1 - r2, + eg = g1 - g2, + eb = b1 - b2, + ea = a1 - a2; + + for (var i = (dir == 1 ? 0 : ds.length - 1), end = (dir == 1 ? ds.length : 0); i !== end; i += dir) { + var x1 = ds[ i ][ 1 ] * dir, + y1 = ds[ i ][ 2 ]; + + var lni2 = y1 * width; + + if (x1 + x >= 0 && x1 + x < width && y1 + y >= 0 && y1 + y < height) { + var d = ds[ i ][ 0 ]; + var idx2 = idx + (lni2 + x1), + i32y = buf32[ idx2 ]; + + var r3 = (i32y & 0xff), + g3 = (i32y >>> 8) & 0xff, + b3 = (i32y >>> 16) & 0xff, + a3 = (i32y >>> 24) & 0xff; + + var r4 = Math.max(0, Math.min(255, r3 + er * d)), + g4 = Math.max(0, Math.min(255, g3 + eg * d)), + b4 = Math.max(0, Math.min(255, b3 + eb * d)), + a4 = Math.max(0, Math.min(255, a3 + ea * d)); + + buf32[ idx2 ] = ( + (a4 << 24) | // alpha + (b4 << 16) | // blue + (g4 << 8) | // green + r4 // red + ) >>> 0; + + //if(this.idxi32.indexOf(buf32[idx2]) < 0) throw new Error("no palette entry!"); + } + } + } + } + + //(console).profileEnd("dither"); + return buf32; + } + + // reduces histogram to palette, remaps & memoizes reduced colors + public buildPal(noSort?) { + if (this.palLocked || this.idxrgb.length > 0 && this.idxrgb.length <= this.colors) return; + + var histG = this.histogram, + sorted = sortedHashKeys(histG, true); + + if (sorted.length == 0) + throw "Nothing has been sampled, palette cannot be built."; + + switch (this.method) { + case 1: + var cols = this.initColors, + last = sorted[ cols - 1 ], + freq = histG[ last ]; + + var idxi32 = sorted.slice(0, cols); + + // add any cut off colors with same freq as last + var pos = cols, len = sorted.length; + while (pos < len && histG[ sorted[ pos ] ] == freq) + idxi32.push(sorted[ pos++ ]); + + // inject min huegroup colors + if (this.hueStats) + this.hueStats.inject(idxi32); + + break; + case 2: + var idxi32 = sorted; + break; + } + + // int32-ify values + idxi32 = idxi32.map(function (v) { + return +v; + }); + + this.reducePal(idxi32); + + if (!noSort && this.reIndex) + this.sortPal(); + + // build cache of top histogram colors + if (this.useCache) + this.cacheHistogram(idxi32); + + this.palLocked = true; + } + + public palette(tuples, noSort) : any { + this.buildPal(noSort); + return tuples ? this.idxrgb : new Uint8Array((new Uint32Array(this.idxi32)).buffer); + } + + public prunePal(keep) { + var i32; + + for (var j = 0; j < this.idxrgb.length; j++) { + if (!keep[ j ]) { + i32 = this.idxi32[ j ]; + this.idxrgb[ j ] = null; + this.idxi32[ j ] = null; + delete this.i32idx[ i32 ]; + } + } + + // compact + if (this.reIndex) { + var idxrgb = [], + idxi32 = [], + i32idx = {}; + + for (var j = 0, i = 0; j < this.idxrgb.length; j++) { + if (this.idxrgb[ j ]) { + i32 = this.idxi32[ j ]; + idxrgb[ i ] = this.idxrgb[ j ]; + i32idx[ i32 ] = i; + idxi32[ i ] = i32; + i++; + } + } + + this.idxrgb = idxrgb; + this.idxi32 = idxi32; + this.i32idx = i32idx; + } + } + + // reduces similar colors from an importance-sorted Uint32 rgba array + public reducePal(idxi32) { + // if pre-defined palette's length exceeds target + if (this.idxrgb.length > this.colors) { + // quantize histogram to existing palette + var len = idxi32.length, keep = {}, uniques = 0, idx, pruned = false; + + for (var i = 0; i < len; i++) { + // palette length reached, unset all remaining colors (sparse palette) + if (uniques == this.colors && !pruned) { + this.prunePal(keep); + pruned = true; + } + + idx = this.nearestIndex(idxi32[ i ]); + + if (uniques < this.colors && !keep[ idx ]) { + keep[ idx ] = true; + uniques++; + } + } + + if (!pruned) { + this.prunePal(keep); + pruned = true; + } + } + // reduce histogram to create initial palette + else { + // build full rgb palette + var idxrgb = idxi32.map(function (i32) { + return [ + (i32 & 0xff), + (i32 >>> 8) & 0xff, + (i32 >>> 16) & 0xff, + (i32 >>> 24) & 0xff + ]; + }); + + var len = idxrgb.length, + palLen = len, + thold = this.initDist; + + // palette already at or below desired length + if (palLen > this.colors) { + while (palLen > this.colors) { + var memDist = []; + + // iterate palette + for (var i = 0; i < len; i++) { + var pxi = idxrgb[ i ], i32i = idxi32[ i ]; + if (!pxi) continue; + + for (var j = i + 1; j < len; j++) { + var pxj = idxrgb[ j ], i32j = idxi32[ j ]; + if (!pxj) continue; + + var dist = distEuclidean(pxi, pxj); + + if (dist < thold) { + // store index,rgb,dist + memDist.push([ j, pxj, i32j, dist ]); + + // kill squashed value + delete(idxrgb[ j ]); + palLen--; + } + } + } + + // palette reduction pass + // console.log("palette length: " + palLen); + + // if palette is still much larger than target, increment by larger initDist + thold += (palLen > this.colors * 3) ? this.initDist : this.distIncr; + } + + // if palette is over-reduced, re-add removed colors with largest distances from last round + if (palLen < this.colors) { + // sort descending + sort.call(memDist, function (a, b) { + return b[ 3 ] - a[ 3 ]; + }); + + var k = 0; + while (palLen < this.colors) { + // re-inject rgb into final palette + idxrgb[ memDist[ k ][ 0 ] ] = memDist[ k ][ 1 ]; + + palLen++; + k++; + } + } + } + + var len = idxrgb.length; + for (var i = 0; i < len; i++) { + if (!idxrgb[ i ]) continue; + + this.idxrgb.push(idxrgb[ i ]); + this.idxi32.push(idxi32[ i ]); + + this.i32idx[ idxi32[ i ] ] = this.idxi32.length - 1; + this.i32rgb[ idxi32[ i ] ] = idxrgb[ i ]; + } + } + } + + // global top-population + public colorStats1D(buf32) { + var histG = this.histogram, + num = 0, col, + len = buf32.length; + + for (var i = 0; i < len; i++) { + col = buf32[ i ]; + + // skip transparent + if ((col & 0xff000000) >> 24 == 0) continue; + + // collect hue stats + if (this.hueStats) + this.hueStats.check(col); + + if (col in histG) + histG[ col ]++; + else + histG[ col ] = 1; + } + } + + // population threshold within subregions + // FIXME: this can over-reduce (few/no colors same?), need a way to keep + // important colors that dont ever reach local thresholds (gradients?) + public colorStats2D(buf32, width) { + var boxW = this.boxSize[ 0 ], + boxH = this.boxSize[ 1 ], + area = boxW * boxH, + boxes = makeBoxes(width, buf32.length / width, boxW, boxH), + histG = this.histogram; + + boxes.forEach(function (box) { + var effc = Math.max(Math.round((box.w * box.h) / area) * this.boxPxls, 2), + histL = {}, col; + + this.iterBox(box, width, function (i) { + col = buf32[ i ]; + + // skip transparent + if ((col & 0xff000000) >> 24 == 0) return; + + // collect hue stats + if (this.hueStats) + this.hueStats.check(col); + + if (col in histG) + histG[ col ]++; + else if (col in histL) { + if (++histL[ col ] >= effc) + histG[ col ] = histL[ col ]; + } + else + histL[ col ] = 1; + }); + }, this); + + if (this.hueStats) + this.hueStats.inject(histG); + } + + // TODO: group very low lum and very high lum colors + // TODO: pass custom sort order + public sortPal() { + var self = this; + + this.idxi32.sort(function (a, b) { + var idxA = self.i32idx[ a ], + idxB = self.i32idx[ b ], + rgbA = self.idxrgb[ idxA ], + rgbB = self.idxrgb[ idxB ]; + + var hslA = rgb2hsl(rgbA[ 0 ], rgbA[ 1 ], rgbA[ 2 ]), + hslB = rgb2hsl(rgbB[ 0 ], rgbB[ 1 ], rgbB[ 2 ]); + + // sort all grays + whites together + var hueA = (rgbA[ 0 ] == rgbA[ 1 ] && rgbA[ 1 ] == rgbA[ 2 ]) ? -1 : hueGroup(hslA.h, self.hueGroups); + var hueB = (rgbB[ 0 ] == rgbB[ 1 ] && rgbB[ 1 ] == rgbB[ 2 ]) ? -1 : hueGroup(hslB.h, self.hueGroups); + + var hueDiff = hueB - hueA; + if (hueDiff) return -hueDiff; + + var lumDiff = lumGroup(+hslB.l.toFixed(2)) - lumGroup(+hslA.l.toFixed(2)); + if (lumDiff) return -lumDiff; + + var satDiff = satGroup(+hslB.s.toFixed(2)) - satGroup(+hslA.s.toFixed(2)); + if (satDiff) return -satDiff; + }); + + // sync idxrgb & i32idx + this.idxi32.forEach(function (i32, i) { + this.idxrgb[ i ] = this.i32rgb[ i32 ]; + this.i32idx[ i32 ] = i; + }, this); + } + + // iterates @bbox within a parent rect of width @wid; calls @fn, passing index within parent + public iterBox(bbox, wid, fn) { + var b = bbox, + i0 = b.y * wid + b.x, + i1 = (b.y + b.h - 1) * wid + (b.x + b.w - 1), + cnt = 0, incr = wid - b.w + 1, i = i0; + + do { + fn.call(this, i); + i += (++cnt % b.w == 0) ? incr : 1; + } while (i <= i1); + } + + // TOTRY: use HUSL - http://boronine.com/husl/ + public nearestColor(i32) { + var idx = this.nearestIndex(i32); + return idx === null ? 0 : this.idxi32[ idx ]; + } + + // TOTRY: use HUSL - http://boronine.com/husl/ + public nearestIndex(i32) { + // alpha 0 returns null index + if ((i32 & 0xff000000) >> 24 == 0) + return null; + + if (this.useCache && ("" + i32) in this.i32idx) + return this.i32idx[ i32 ]; + + var min = 1000, + idx, + rgb = [ + (i32 & 0xff), + (i32 >>> 8) & 0xff, + (i32 >>> 16) & 0xff, + (i32 >>> 24) & 0xff + ], + len = this.idxrgb.length; + + for (var i = 0; i < len; i++) { + if (!this.idxrgb[ i ]) continue; // sparse palettes + + var dist = distEuclidean(rgb, this.idxrgb[ i ]); + + if (dist < min) { + min = dist; + idx = i; + } + } + + return idx; + } + + public cacheHistogram(idxi32) { + for (var i = 0, i32 = idxi32[ i ]; i < idxi32.length && this.histogram[ i32 ] >= this.cacheFreq; i32 = idxi32[ i++ ]) + this.i32idx[ i32 ] = this.nearestIndex(i32); + } + } + + class HueStats { + private numGroups; + private minCols; + private stats; + private groupsFull; + + constructor(numGroups, minCols) { + this.numGroups = numGroups; + this.minCols = minCols; + this.stats = {}; + + for (var i = -1; i < numGroups; i++) + this.stats[ i ] = {num: 0, cols: []}; + + this.groupsFull = 0; + } + + public check(i32) { + if (this.groupsFull == this.numGroups + 1) + this.check = function () { + }; + + var r = (i32 & 0xff), + g = (i32 >>> 8) & 0xff, + b = (i32 >>> 16) & 0xff, + a = (i32 >>> 24) & 0xff, + hg = (r == g && g == b) ? -1 : hueGroup(rgb2hsl(r, g, b).h, this.numGroups), + gr = this.stats[ hg ], + min = this.minCols; + + gr.num++; + + if (gr.num > min) + return; + if (gr.num == min) + this.groupsFull++; + + if (gr.num <= min) + this.stats[ hg ].cols.push(i32); + } + + public inject(histG) { + for (var i = -1; i < this.numGroups; i++) { + if (this.stats[ i ].num <= this.minCols) { + switch (typeOf(histG)) { + case "Array": + this.stats[ i ].cols.forEach(function (col) { + if (histG.indexOf(col) == -1) + histG.push(col); + }); + break; + case "Object": + this.stats[ i ].cols.forEach(function (col) { + if (!histG[ col ]) + histG[ col ] = 1; + else + histG[ col ]++; + }); + break; + } + } + } + } + } +} diff --git a/src/rgbquant.js b/src/rgbquant.js index f57e644..cff0e8d 100644 --- a/src/rgbquant.js +++ b/src/rgbquant.js @@ -14,7 +14,7 @@ // desired final palette size this.colors = opts.colors || 256; // # of highest-frequency colors to start with for palette reduction - this.initColors = opts.initColors || 4096; + this.initColors = this.colors << 2;//opts.initColors || 65536; //4096; // color-distance threshold for initial reduction pass this.initDist = opts.initDist || 0.01; // subsequent passes threshold @@ -24,7 +24,7 @@ this.satGroups = opts.satGroups || 10; this.lumGroups = opts.lumGroups || 10; // if > 0, enables hues stats and min-color retention per group - this.minHueCols = opts.minHueCols || 0; + this.minHueCols = this.colors << 2;//opts.minHueCols || 0; // HueStats instance this.hueStats = this.minHueCols ? new HueStats(this.hueGroups, this.minHueCols) : null; @@ -40,7 +40,7 @@ // dithering/error diffusion kernel name this.dithKern = opts.dithKern || null; // dither serpentine pattern - this.dithSerp = opts.dithSerp || false; + this.dithSerp = true; //opts.dithSerp || false; // minimum color difference (0-1) needed to dither this.dithDelta = opts.dithDelta || 0; @@ -107,18 +107,20 @@ retType = retType || 1; // reduce w/dither + var buf32; if (dithKern) - var out32 = this.dither(img, dithKern, dithSerp); + buf32 = this.dither(img, dithKern, dithSerp); else { - var data = getImageData(img), - buf32 = data.buf32, - len = buf32.length, - out32 = new Uint32Array(len); + var data = getImageData(img); + buf32 = data.buf32; + } - for (var i = 0; i < len; i++) { - var i32 = buf32[i]; - out32[i] = this.nearestColor(i32); - } + var len = buf32.length, + out32 = new Uint32Array(len); + + for (var i = 0; i < len; i++) { + var i32 = buf32[i]; + out32[i] = this.nearestColor(i32); } if (retType == 1) @@ -137,94 +139,94 @@ } }; + // http://www.tannerhelland.com/4660/dithering-eleven-algorithms-source-code/ + var kernels = { + FloydSteinberg: [ + [7 / 16, 1, 0], + [3 / 16, -1, 1], + [5 / 16, 0, 1], + [1 / 16, 1, 1] + ], + FalseFloydSteinberg: [ + [3 / 8, 1, 0], + [3 / 8, 0, 1], + [2 / 8, 1, 1] + ], + Stucki: [ + [8 / 42, 1, 0], + [4 / 42, 2, 0], + [2 / 42, -2, 1], + [4 / 42, -1, 1], + [8 / 42, 0, 1], + [4 / 42, 1, 1], + [2 / 42, 2, 1], + [1 / 42, -2, 2], + [2 / 42, -1, 2], + [4 / 42, 0, 2], + [2 / 42, 1, 2], + [1 / 42, 2, 2] + ], + Atkinson: [ + [1 / 8, 1, 0], + [1 / 8, 2, 0], + [1 / 8, -1, 1], + [1 / 8, 0, 1], + [1 / 8, 1, 1], + [1 / 8, 0, 2] + ], + Jarvis: [ // Jarvis, Judice, and Ninke / JJN? + [7 / 48, 1, 0], + [5 / 48, 2, 0], + [3 / 48, -2, 1], + [5 / 48, -1, 1], + [7 / 48, 0, 1], + [5 / 48, 1, 1], + [3 / 48, 2, 1], + [1 / 48, -2, 2], + [3 / 48, -1, 2], + [5 / 48, 0, 2], + [3 / 48, 1, 2], + [1 / 48, 2, 2] + ], + Burkes: [ + [8 / 32, 1, 0], + [4 / 32, 2, 0], + [2 / 32, -2, 1], + [4 / 32, -1, 1], + [8 / 32, 0, 1], + [4 / 32, 1, 1], + [2 / 32, 2, 1], + ], + Sierra: [ + [5 / 32, 1, 0], + [3 / 32, 2, 0], + [2 / 32, -2, 1], + [4 / 32, -1, 1], + [5 / 32, 0, 1], + [4 / 32, 1, 1], + [2 / 32, 2, 1], + [2 / 32, -1, 2], + [3 / 32, 0, 2], + [2 / 32, 1, 2] + ], + TwoSierra: [ + [4 / 16, 1, 0], + [3 / 16, 2, 0], + [1 / 16, -2, 1], + [2 / 16, -1, 1], + [3 / 16, 0, 1], + [2 / 16, 1, 1], + [1 / 16, 2, 1] + ], + SierraLite: [ + [2 / 4, 1, 0], + [1 / 4, -1, 1], + [1 / 4, 0, 1] + ] + }; + // adapted from http://jsbin.com/iXofIji/2/edit by PAEz RgbQuant.prototype.dither = function(img, kernel, serpentine) { - // http://www.tannerhelland.com/4660/dithering-eleven-algorithms-source-code/ - var kernels = { - FloydSteinberg: [ - [7 / 16, 1, 0], - [3 / 16, -1, 1], - [5 / 16, 0, 1], - [1 / 16, 1, 1] - ], - FalseFloydSteinberg: [ - [3 / 8, 1, 0], - [3 / 8, 0, 1], - [2 / 8, 1, 1] - ], - Stucki: [ - [8 / 42, 1, 0], - [4 / 42, 2, 0], - [2 / 42, -2, 1], - [4 / 42, -1, 1], - [8 / 42, 0, 1], - [4 / 42, 1, 1], - [2 / 42, 2, 1], - [1 / 42, -2, 2], - [2 / 42, -1, 2], - [4 / 42, 0, 2], - [2 / 42, 1, 2], - [1 / 42, 2, 2] - ], - Atkinson: [ - [1 / 8, 1, 0], - [1 / 8, 2, 0], - [1 / 8, -1, 1], - [1 / 8, 0, 1], - [1 / 8, 1, 1], - [1 / 8, 0, 2] - ], - Jarvis: [ // Jarvis, Judice, and Ninke / JJN? - [7 / 48, 1, 0], - [5 / 48, 2, 0], - [3 / 48, -2, 1], - [5 / 48, -1, 1], - [7 / 48, 0, 1], - [5 / 48, 1, 1], - [3 / 48, 2, 1], - [1 / 48, -2, 2], - [3 / 48, -1, 2], - [5 / 48, 0, 2], - [3 / 48, 1, 2], - [1 / 48, 2, 2] - ], - Burkes: [ - [8 / 32, 1, 0], - [4 / 32, 2, 0], - [2 / 32, -2, 1], - [4 / 32, -1, 1], - [8 / 32, 0, 1], - [4 / 32, 1, 1], - [2 / 32, 2, 1], - ], - Sierra: [ - [5 / 32, 1, 0], - [3 / 32, 2, 0], - [2 / 32, -2, 1], - [4 / 32, -1, 1], - [5 / 32, 0, 1], - [4 / 32, 1, 1], - [2 / 32, 2, 1], - [2 / 32, -1, 2], - [3 / 32, 0, 2], - [2 / 32, 1, 2], - ], - TwoSierra: [ - [4 / 16, 1, 0], - [3 / 16, 2, 0], - [1 / 16, -2, 1], - [2 / 16, -1, 1], - [3 / 16, 0, 1], - [2 / 16, 1, 1], - [1 / 16, 2, 1], - ], - SierraLite: [ - [2 / 4, 1, 0], - [1 / 4, -1, 1], - [1 / 4, 0, 1], - ] - }; - if (!kernel || !kernels[kernel]) { throw 'Unknown dithering kernel: ' + kernel; } @@ -240,6 +242,7 @@ var dir = serpentine ? -1 : 1; + console.profile("dither"); for (var y = 0; y < height; y++) { if (serpentine) dir = dir * -1; @@ -262,12 +265,7 @@ b2 = (i32x >>> 16) & 0xff, a2 = (i32x >>> 24) & 0xff; - buf32[idx] = ( - (a2 << 24) | // alpha - (b2 << 16) | // blue - (g2 << 8) | // green - r2 // red - ) >>> 0; + buf32[idx] = i32x; // dithering strength if (this.dithDelta) { @@ -290,12 +288,13 @@ if (x1 + x >= 0 && x1 + x < width && y1 + y >= 0 && y1 + y < height) { var d = ds[i][0]; - var idx2 = idx + (lni2 + x1); + var idx2 = idx + (lni2 + x1), + i32y = buf32[idx2]; - var r3 = (buf32[idx2] & 0xff), - g3 = (buf32[idx2] >>> 8) & 0xff, - b3 = (buf32[idx2] >>> 16) & 0xff, - a3 = (buf32[idx2] >>> 24) & 0xff; + var r3 = (i32y & 0xff), + g3 = (i32y >>> 8) & 0xff, + b3 = (i32y >>> 16) & 0xff, + a3 = (i32y >>> 24) & 0xff; var r4 = Math.max(0, Math.min(255, r3 + er * d)), g4 = Math.max(0, Math.min(255, g3 + eg * d)), @@ -308,11 +307,13 @@ (g4 << 8) | // green r4 // red ) >>> 0; + + //if(this.idxi32.indexOf(buf32[idx2]) < 0) throw new Error("no palette entry!"); } } } } - + console.profileEnd("dither"); return buf32; }; @@ -678,7 +679,7 @@ HueStats.prototype.check = function checkHue(i32) { if (this.groupsFull == this.numGroups + 1) - this.check = function() {return;}; + this.check = function() {}; var r = (i32 & 0xff), g = (i32 >>> 8) & 0xff, @@ -764,6 +765,72 @@ return (Pr*rd + Pg*gd + Pb*bd + Pa*ad) / manhMax; } + /* + Finally, I've found it! After thorough testing and experimentation my conclusions are: + +The correct way is to calculate maximum possible difference between the two colors. +Formulas with any kind of estimated average/typical difference had room for non-linearities. + +I was unable to find correct formula that calculates the distance without blending RGBA colors with backgrounds. + +There is no need to take every possible background color into account, only extremes per R/G/B channel, i.e. for red channel: + +blend both colors with 0 red as background, measure squared difference +blend both colors with max red background, measure squared difference +take higher of the two. +Fortunately blending with "white" and "black" is trivial when you use premultiplied alpha (r = r×a). + +The complete formula is: + max((r?-r?)², (r?-r? - a?+a?)²) + +max((g?-g?)², (g?-g? - a?+a?)²) + +max((b?-b?)², (b?-b? - a?+a?)²) + */ + function colordifference_ch(x, y, alphas) { + // maximum of channel blended on white, and blended on black + // premultiplied alpha and backgrounds 0/1 shorten the formula + var black = x - y, // [-255; 255] + white = black + alphas; // [-255; 255*2] + + return Math.max(black*black, white*white); // [0; 255^2 + (255*2)^2] + } + + //var rgbaMax = (255*255 + (255*2) * (255*2)) * 3; + var rgbaMax = Math.pow(255<<1, 2) * 3; + + function distRGBA(rgb0, rgb1) { +/* + var r1 = rgb0[0], + g1 = rgb0[1], + b1 = rgb0[2], + a1 = rgb0[3]; + + var r2 = rgb1[0], + g2 = rgb1[1], + b2 = rgb1[2], + a2 = rgb1[3]; + + var dr = r1 - r2, + dg = g1 - g2, + db = b1 - b2, + da = a1 - a2; + + return (Math.max(dr << 1, dr - da << 1) + + Math.max(dg << 1, dg - da << 1) + + Math.max(db << 1, db - da << 1)) / rgbaMax; + +*/ + var alphas = rgb1[3] - rgb0[3], + dist = colordifference_ch(rgb0[0], rgb1[0], alphas) + + colordifference_ch(rgb0[1], rgb1[1], alphas) + + colordifference_ch(rgb0[2], rgb1[2], alphas); + + if(dist > rgbaMax) { + console.log(dist); + } + + return dist / rgbaMax; + } + // http://rgb2hsl.nichabi.com/javascript-function.php function rgb2hsl(r, g, b) { var max, min, h, s, l, d; From e9d329f1e9e974cc92fc626f72089237156639ee Mon Sep 17 00:00:00 2001 From: igorbz Date: Wed, 13 May 2015 19:03:46 +0300 Subject: [PATCH 05/23] hueStatistics refactoring started --- {src => ts}/build.cmd | 0 {src => ts}/colorQuant.ts | 74 +++------------------------------------ ts/hueStatistics.ts | 69 ++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 69 deletions(-) rename {src => ts}/build.cmd (100%) rename {src => ts}/colorQuant.ts (94%) create mode 100644 ts/hueStatistics.ts diff --git a/src/build.cmd b/ts/build.cmd similarity index 100% rename from src/build.cmd rename to ts/build.cmd diff --git a/src/colorQuant.ts b/ts/colorQuant.ts similarity index 94% rename from src/colorQuant.ts rename to ts/colorQuant.ts index fc288bc..38f5ada 100644 --- a/src/colorQuant.ts +++ b/ts/colorQuant.ts @@ -5,6 +5,7 @@ * RgbQuant.js - an image quantization lib */ +/// module ColorQuantization { // Rec. 709 (sRGB) luma coef @@ -22,7 +23,6 @@ module ColorQuantization { ); } - // http://rgb2hsl.nichabi.com/javascript-function.php function rgb2hsl(r, g, b) { var max, min, h, s, l, d; @@ -411,8 +411,8 @@ module ColorQuantization { // if > 0, enables hues stats and min-color retention per group private minHueCols : number; - // HueStats instance - private hueStats : HueStats; + // HueStatistics instance + private hueStats : HueStatistics; // subregion partitioning box size private boxSize = [ 64, 64 ]; @@ -473,8 +473,8 @@ module ColorQuantization { // if > 0, enables hues stats and min-color retention per group this.minHueCols = this.colors << 2;//opts.minHueCols || 0; - // HueStats instance - this.hueStats = this.minHueCols ? new HueStats(this.hueGroups, this.minHueCols) : null; + // HueStatistics instance + this.hueStats = this.minHueCols ? new HueStatistics(this.hueGroups, this.minHueCols) : null; // dithering/error diffusion kernel name if (typeof this.dithKern === "number") this.dithKern = opts.dithKern; @@ -1009,68 +1009,4 @@ module ColorQuantization { } } - class HueStats { - private numGroups; - private minCols; - private stats; - private groupsFull; - - constructor(numGroups, minCols) { - this.numGroups = numGroups; - this.minCols = minCols; - this.stats = {}; - - for (var i = -1; i < numGroups; i++) - this.stats[ i ] = {num: 0, cols: []}; - - this.groupsFull = 0; - } - - public check(i32) { - if (this.groupsFull == this.numGroups + 1) - this.check = function () { - }; - - var r = (i32 & 0xff), - g = (i32 >>> 8) & 0xff, - b = (i32 >>> 16) & 0xff, - a = (i32 >>> 24) & 0xff, - hg = (r == g && g == b) ? -1 : hueGroup(rgb2hsl(r, g, b).h, this.numGroups), - gr = this.stats[ hg ], - min = this.minCols; - - gr.num++; - - if (gr.num > min) - return; - if (gr.num == min) - this.groupsFull++; - - if (gr.num <= min) - this.stats[ hg ].cols.push(i32); - } - - public inject(histG) { - for (var i = -1; i < this.numGroups; i++) { - if (this.stats[ i ].num <= this.minCols) { - switch (typeOf(histG)) { - case "Array": - this.stats[ i ].cols.forEach(function (col) { - if (histG.indexOf(col) == -1) - histG.push(col); - }); - break; - case "Object": - this.stats[ i ].cols.forEach(function (col) { - if (!histG[ col ]) - histG[ col ] = 1; - else - histG[ col ]++; - }); - break; - } - } - } - } - } } diff --git a/ts/hueStatistics.ts b/ts/hueStatistics.ts new file mode 100644 index 0000000..dc7052d --- /dev/null +++ b/ts/hueStatistics.ts @@ -0,0 +1,69 @@ +module ColorQuantization { + + export class HueStatistics { + private _numGroups; + private _minCols; + private _stats; + private _groupsFull; + + constructor(numGroups, minCols) { + this._numGroups = numGroups; + this._minCols = minCols; + this._stats = {}; + + for (var i = -1; i < numGroups; i++) + this._stats[ i ] = {num: 0, cols: []}; + + this._groupsFull = 0; + } + + public check(i32) { + if (this._groupsFull == this._numGroups + 1) { + this.check = function () { + }; + } + + var r = (i32 & 0xff), + g = (i32 >>> 8) & 0xff, + b = (i32 >>> 16) & 0xff, + a = (i32 >>> 24) & 0xff, + hg = (r == g && g == b) ? -1 : hueGroup(rgb2hsl(r, g, b).h, this._numGroups), + gr = this._stats[ hg ], + min = this._minCols; + + gr.num++; + + if (gr.num > min) + return; + if (gr.num == min) + this._groupsFull++; + + if (gr.num <= min) + this._stats[ hg ].cols.push(i32); + } + + public inject(histG) { + for (var i = -1; i < this._numGroups; i++) { + if (this._stats[ i ].num <= this._minCols) { + switch (typeOf(histG)) { + case "Array": + this._stats[ i ].cols.forEach(function (col) { + if (histG.indexOf(col) == -1) + histG.push(col); + }); + break; + case "Object": + this._stats[ i ].cols.forEach(function (col) { + if (!histG[ col ]) + histG[ col ] = 1; + else + histG[ col ]++; + }); + break; + } + } + } + } + } + +} From 4a738b2656a419adf980780b02e75f47139ee90c Mon Sep 17 00:00:00 2001 From: Igor Date: Wed, 13 May 2015 22:30:43 +0300 Subject: [PATCH 06/23] stable --- demo/index.html | 2 +- ts/colorQuant.ts | 625 +++++++++----------------------------------- ts/dither.ts | 90 +++++++ ts/hueStatistics.ts | 19 +- ts/point.ts | 52 ++++ ts/utils.ts | 297 +++++++++++++++++++++ 6 files changed, 579 insertions(+), 506 deletions(-) create mode 100644 ts/dither.ts create mode 100644 ts/point.ts create mode 100644 ts/utils.ts diff --git a/demo/index.html b/demo/index.html index d6c0fc3..b41649d 100644 --- a/demo/index.html +++ b/demo/index.html @@ -7,7 +7,7 @@ - + diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index 38f5ada..fc8dd43 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -6,487 +6,114 @@ */ /// +/// +/// module ColorQuantization { - // Rec. 709 (sRGB) luma coef - var Pr = .2126, - Pg = .7152, - Pb = .0722, - Pa = 1; // TODO: (igor-bezkrovny) what should be here? - - // http://alienryderflex.com/hsp.html - function rgb2lum(r, g, b) { - return Math.sqrt( - Pr * r * r + - Pg * g * g + - Pb * b * b - ); - } - - // http://rgb2hsl.nichabi.com/javascript-function.php - function rgb2hsl(r, g, b) { - var max, min, h, s, l, d; - r /= 255; - g /= 255; - b /= 255; - max = Math.max(r, g, b); - min = Math.min(r, g, b); - l = (max + min) / 2; - if (max == min) { - h = s = 0; - } else { - d = max - min; - s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - switch (max) { - case r: - h = (g - b) / d + (g < b ? 6 : 0); - break; - case g: - h = (b - r) / d + 2; - break; - case b: - h = (r - g) / d + 4; - break - } - h /= 6; - } -// h = Math.floor(h * 360) -// s = Math.floor(s * 100) -// l = Math.floor(l * 100) - return { - h: h, - s: s, - l: rgb2lum(r, g, b) - }; - } - - function hueGroup(hue, segs) { - var seg = 1 / segs, - haf = seg / 2; - - if (hue >= 1 - haf || hue <= haf) - return 0; - - for (var i = 1; i < segs; i++) { - var mid = i * seg; - if (hue >= mid - haf && hue <= mid + haf) - return i; - } - } - - function satGroup(sat) { - return sat; - } - - function lumGroup(lum) { - return lum; - } - - function typeOf(val) { - return Object.prototype.toString.call(val).slice(8, -1); - } - - var sort = isArrSortStable() ? Array.prototype.sort : stableSort; - - // must be used via stableSort.call(arr, fn) - function stableSort(fn) { - var type = typeOf(this[ 0 ]); - - if (type == "Number" || type == "String") { - var ord = {}, len = this.length, val; - - for (var i = 0; i < len; i++) { - val = this[ i ]; - if (ord[ val ] || ord[ val ] === 0) continue; - ord[ val ] = i; - } - - return this.sort(function (a, b) { - return fn(a, b) || ord[ a ] - ord[ b ]; - }); - } - else { - var ord2 = this.map(function (v) { - return v - }); - - return this.sort(function (a, b) { - return fn(a, b) || ord2.indexOf(a) - ord2.indexOf(b); - }); - } - } - - // test if js engine's Array#sort implementation is stable - function isArrSortStable() { - var str = "abcdefghijklmnopqrstuvwxyz"; - - return "xyzvwtursopqmnklhijfgdeabc" == str.split("").sort(function (a, b) { - return ~~(str.indexOf(b) / 2.3) - ~~(str.indexOf(a) / 2.3); - }).join(""); - } - - // returns uniform pixel data from various img - // TODO?: if array is passed, createimagedata, createlement canvas? take a pxlen? - function getImageData(img, width?) { - var can, ctx, imgd, buf8, buf32, height; - - switch (typeOf(img)) { - case "HTMLImageElement": - can = document.createElement("canvas"); - can.width = img.naturalWidth; - can.height = img.naturalHeight; - ctx = can.getContext("2d"); - ctx.drawImage(img, 0, 0); - case "Canvas": - case "HTMLCanvasElement": - can = can || img; - ctx = ctx || can.getContext("2d"); - case "CanvasRenderingContext2D": - ctx = ctx || img; - can = can || ctx.canvas; - imgd = ctx.getImageData(0, 0, can.width, can.height); - case "ImageData": - imgd = imgd || img; - width = imgd.width; - if (typeOf(imgd.data) == "CanvasPixelArray") - buf8 = new Uint8Array(imgd.data); - else - buf8 = imgd.data; - case "Array": - case "CanvasPixelArray": - buf8 = buf8 || new Uint8Array(img); - case "Uint8Array": - case "Uint8ClampedArray": - buf8 = buf8 || img; - buf32 = new Uint32Array(buf8.buffer); - case "Uint32Array": - buf32 = buf32 || img; - buf8 = buf8 || new Uint8Array(buf32.buffer); - width = width || buf32.length; - height = buf32.length / width; - } - - return { - can : can, - ctx : ctx, - imgd : imgd, - buf8 : buf8, - buf32 : buf32, - width : width, - height: height - }; - } - - // partitions a rect of wid x hgt into - // array of bboxes of w0 x h0 (or less) - function makeBoxes(wid, hgt, w0, h0) { - var wnum = ~~(wid / w0), wrem = wid % w0, - hnum = ~~(hgt / h0), hrem = hgt % h0, - xend = wid - wrem, yend = hgt - hrem; - - var bxs = []; - for (var y = 0; y < hgt; y += h0) - for (var x = 0; x < wid; x += w0) - bxs.push({x: x, y: y, w: (x == xend ? wrem : w0), h: (y == yend ? hrem : h0)}); - - return bxs; - } - - // returns array of hash keys sorted by their values - function sortedHashKeys(obj, desc) { - var keys = []; - - for (var key in obj) - keys.push(key); - - return sort.call(keys, function (a, b) { - return desc ? obj[ b ] - obj[ a ] : obj[ a ] - obj[ b ]; - }); - } - - var rd = 255, - gd = 255, - bd = 255, - ad = 255; - - var euclMax = Math.sqrt(Pr * rd * rd + Pg * gd * gd + Pb * bd * bd + Pa * ad * ad); - // perceptual Euclidean color distance - function distEuclidean(rgb0, rgb1) { - var rd = rgb1[ 0 ] - rgb0[ 0 ], - gd = rgb1[ 1 ] - rgb0[ 1 ], - bd = rgb1[ 2 ] - rgb0[ 2 ], - ad = rgb1[ 3 ] - rgb0[ 3 ]; - - return Math.sqrt(Pr * rd * rd + Pg * gd * gd + Pb * bd * bd + Pa * ad * ad) / euclMax; - } - - var manhMax = Pr * rd + Pg * gd + Pb * bd + Pa * ad; - // perceptual Manhattan color distance - function distManhattan(rgb0, rgb1) { - var rd = Math.abs(rgb1[ 0 ] - rgb0[ 0 ]), - gd = Math.abs(rgb1[ 1 ] - rgb0[ 1 ]), - bd = Math.abs(rgb1[ 2 ] - rgb0[ 2 ]), - ad = Math.abs(rgb1[ 3 ] - rgb0[ 3 ]); - - return (Pr * rd + Pg * gd + Pb * bd + Pa * ad) / manhMax; - } - - /* - Finally, I've found it! After thorough testing and experimentation my conclusions are: - - The correct way is to calculate maximum possible difference between the two colors. - Formulas with any kind of estimated average/typical difference had room for non-linearities. - - I was unable to find correct formula that calculates the distance without blending RGBA colors with backgrounds. - - There is no need to take every possible background color into account, only extremes per R/G/B channel, i.e. for red channel: - - blend both colors with 0 red as background, measure squared difference - blend both colors with max red background, measure squared difference - take higher of the two. - Fortunately blending with "white" and "black" is trivial when you use premultiplied alpha (r = r×a). - - The complete formula is: - max((r?-r?)², (r?-r? - a?+a?)²) + - max((g?-g?)², (g?-g? - a?+a?)²) + - max((b?-b?)², (b?-b? - a?+a?)²) - */ - function colordifference_ch(x, y, alphas) { - // maximum of channel blended on white, and blended on black - // premultiplied alpha and backgrounds 0/1 shorten the formula - var black = x - y, // [-255; 255] - white = black + alphas; // [-255; 255*2] - - return Math.max(black * black, white * white); // [0; 255^2 + (255*2)^2] - } - - //var rgbaMax = (255*255 + (255*2) * (255*2)) * 3; - var rgbaMax = Math.pow(255 << 1, 2) * 3; - - function distRGBA(rgb0, rgb1) { - /* - var r1 = rgb0[0], - g1 = rgb0[1], - b1 = rgb0[2], - a1 = rgb0[3]; - - var r2 = rgb1[0], - g2 = rgb1[1], - b2 = rgb1[2], - a2 = rgb1[3]; - - var dr = r1 - r2, - dg = g1 - g2, - db = b1 - b2, - da = a1 - a2; - - return (Math.max(dr << 1, dr - da << 1) + - Math.max(dg << 1, dg - da << 1) + - Math.max(db << 1, db - da << 1)) / rgbaMax; - - */ - var alphas = rgb1[ 3 ] - rgb0[ 3 ], - dist = colordifference_ch(rgb0[ 0 ], rgb1[ 0 ], alphas) + - colordifference_ch(rgb0[ 1 ], rgb1[ 1 ], alphas) + - colordifference_ch(rgb0[ 2 ], rgb1[ 2 ], alphas); - - if (dist > rgbaMax) { - console.log(dist); - } - - return dist / rgbaMax; - } - - // http://www.tannerhelland.com/4660/dithering-eleven-algorithms-source-code/ - var kernels = { - FloydSteinberg : [ - [ 7 / 16, 1, 0 ], - [ 3 / 16, -1, 1 ], - [ 5 / 16, 0, 1 ], - [ 1 / 16, 1, 1 ] - ], - FalseFloydSteinberg: [ - [ 3 / 8, 1, 0 ], - [ 3 / 8, 0, 1 ], - [ 2 / 8, 1, 1 ] - ], - Stucki : [ - [ 8 / 42, 1, 0 ], - [ 4 / 42, 2, 0 ], - [ 2 / 42, -2, 1 ], - [ 4 / 42, -1, 1 ], - [ 8 / 42, 0, 1 ], - [ 4 / 42, 1, 1 ], - [ 2 / 42, 2, 1 ], - [ 1 / 42, -2, 2 ], - [ 2 / 42, -1, 2 ], - [ 4 / 42, 0, 2 ], - [ 2 / 42, 1, 2 ], - [ 1 / 42, 2, 2 ] - ], - Atkinson : [ - [ 1 / 8, 1, 0 ], - [ 1 / 8, 2, 0 ], - [ 1 / 8, -1, 1 ], - [ 1 / 8, 0, 1 ], - [ 1 / 8, 1, 1 ], - [ 1 / 8, 0, 2 ] - ], - Jarvis : [ // Jarvis, Judice, and Ninke / JJN? - [ 7 / 48, 1, 0 ], - [ 5 / 48, 2, 0 ], - [ 3 / 48, -2, 1 ], - [ 5 / 48, -1, 1 ], - [ 7 / 48, 0, 1 ], - [ 5 / 48, 1, 1 ], - [ 3 / 48, 2, 1 ], - [ 1 / 48, -2, 2 ], - [ 3 / 48, -1, 2 ], - [ 5 / 48, 0, 2 ], - [ 3 / 48, 1, 2 ], - [ 1 / 48, 2, 2 ] - ], - Burkes : [ - [ 8 / 32, 1, 0 ], - [ 4 / 32, 2, 0 ], - [ 2 / 32, -2, 1 ], - [ 4 / 32, -1, 1 ], - [ 8 / 32, 0, 1 ], - [ 4 / 32, 1, 1 ], - [ 2 / 32, 2, 1 ], - ], - Sierra : [ - [ 5 / 32, 1, 0 ], - [ 3 / 32, 2, 0 ], - [ 2 / 32, -2, 1 ], - [ 4 / 32, -1, 1 ], - [ 5 / 32, 0, 1 ], - [ 4 / 32, 1, 1 ], - [ 2 / 32, 2, 1 ], - [ 2 / 32, -1, 2 ], - [ 3 / 32, 0, 2 ], - [ 2 / 32, 1, 2 ] - ], - TwoSierra : [ - [ 4 / 16, 1, 0 ], - [ 3 / 16, 2, 0 ], - [ 1 / 16, -2, 1 ], - [ 2 / 16, -1, 1 ], - [ 3 / 16, 0, 1 ], - [ 2 / 16, 1, 1 ], - [ 1 / 16, 2, 1 ] - ], - SierraLite : [ - [ 2 / 4, 1, 0 ], - [ 1 / 4, -1, 1 ], - [ 1 / 4, 0, 1 ] - ] - }; - - export enum RgbQuantDitheringKernel { NONE = 0 } export class RgbQuant { // 1 = by global population, 2 = subregion population threshold - private method : number = 2; + private _method : number = 2; // desired final palette size - private colors : number = 256; + private _colors : number = 256; // # of highest-frequency colors to start with for palette reduction - private initColors : number; + private _initColors : number; // color-distance threshold for initial reduction pass - private initDist = 0.01; + private _initDist = 0.01; // subsequent passes threshold - private distIncr : number = 0.005; + private _distIncr : number = 0.005; // palette grouping - private hueGroups : number = 10; - private satGroups : number = 10; - private lumGroups : number = 10; + private _hueGroups : number = 10; + private _satGroups : number = 10; + private _lumGroups : number = 10; // if > 0, enables hues stats and min-color retention per group - private minHueCols : number; + private _minHueCols : number; // HueStatistics instance - private hueStats : HueStatistics; + private _hueStats : HueStatistics; // subregion partitioning box size - private boxSize = [ 64, 64 ]; + private _boxSize = [ 64, 64 ]; // number of same pixels required within box for histogram inclusion - private boxPxls = 2; + private _boxPxls = 2; // palette locked indicator - private palLocked = false; + private _palLocked = false; // palette sort order // this.sortPal = ['hue-','lum-','sat-']; // dithering/error diffusion kernel name - private dithKern : RgbQuantDitheringKernel = RgbQuantDitheringKernel.NONE; + private _dithKern : RgbQuantDitheringKernel = RgbQuantDitheringKernel.NONE; // dither serpentine pattern - private dithSerp = true; + private _dithSerp = true; // minimum color difference (0-1) needed to dither - private dithDelta = 0; + private _dithDelta = 0; // accumulated histogram - private histogram = {}; + private _histogram = {}; // palette - rgb triplets - private idxrgb = []; + private _idxrgb = []; // palette - int32 vals - private idxi32 = []; + private _idxi32 = []; // reverse lookup {i32:idx} - private i32idx = {}; + private _i32idx = {}; // {i32:rgb} - private i32rgb = {}; + private _i32rgb = {}; // enable color caching (also incurs overhead of cache misses and cache building) - private useCache = true; + private _useCache = true; // min color occurance count needed to qualify for caching - private cacheFreq = 10; + private _cacheFreq = 10; // allows pre-defined palettes to be re-indexed (enabling palette compacting and sorting) - private reIndex = true; + private _reIndex = true; - constructor(opts) { + // TODO: make interface for options + constructor(opts : any) { opts = opts || {}; // 1 = by global population, 2 = subregion population threshold - if (typeof opts.method === "number") this.method = opts.method; + if (typeof opts.method === "number") this._method = opts.method; // desired final palette size - if (typeof opts.colors === "number") this.colors = opts.colors; + if (typeof opts.colors === "number") this._colors = opts.colors; // # of highest-frequency colors to start with for palette reduction - this.initColors = this.colors << 2;//opts.initColors || 65536; //4096; + this._initColors = this._colors << 2;//opts.initColors || 65536; //4096; // if > 0, enables hues stats and min-color retention per group - this.minHueCols = this.colors << 2;//opts.minHueCols || 0; + this._minHueCols = this._colors << 2;//opts.minHueCols || 0; // HueStatistics instance - this.hueStats = this.minHueCols ? new HueStatistics(this.hueGroups, this.minHueCols) : null; + this._hueStats = this._minHueCols ? new HueStatistics(this._hueGroups, this._minHueCols) : null; // dithering/error diffusion kernel name - if (typeof this.dithKern === "number") this.dithKern = opts.dithKern; + if (typeof this._dithKern === "number") this._dithKern = opts.dithKern; // accumulated histogram - this.histogram = {}; + this._histogram = {}; // palette - rgb triplets - if (Object.prototype.toString.call(opts.palette) === "[object Array]") this.idxrgb = opts.palette.slice(0); + if (Object.prototype.toString.call(opts.palette) === "[object Array]") this._idxrgb = opts.palette.slice(0); // if pre-defined palette, build lookups - if (this.idxrgb.length > 0) { - this.idxrgb.forEach(function (rgb, i) { + if (this._idxrgb.length > 0) { + this._idxrgb.forEach(function (rgb, i) { var alpha = rgb.length >= 4 ? rgb[ 3 ] : 255, i32 = ( (alpha << 24) | // alpha @@ -495,21 +122,21 @@ module ColorQuantization { rgb[ 0 ] // red ) >>> 0; - this.idxi32[ i ] = i32; - this.i32idx[ i32 ] = i; - this.i32rgb[ i32 ] = rgb; + this._idxi32[ i ] = i32; + this._i32idx[ i32 ] = i; + this._i32rgb[ i32 ] = rgb; }, this); } } // gathers histogram info public sample(img, width) { - if (this.palLocked) + if (this._palLocked) throw "Cannot sample additional images, palette already assembled."; - var data = getImageData(img, width); + var data = Utils.getImageData(img, width); - switch (this.method) { + switch (this._method) { case 1: this.colorStats1D(data.buf32); break; @@ -523,11 +150,11 @@ module ColorQuantization { // todo: memoize colors here also // @retType: 1 - Uint8Array (default), 2 - Indexed array, 3 - Match @img type (unimplemented, todo) public reduce(img, retType, dithKern, dithSerp) : any { - if (!this.palLocked) + if (!this._palLocked) this.buildPal(); - dithKern = dithKern || this.dithKern; - dithSerp = typeof dithSerp != "undefined" ? dithSerp : this.dithSerp; + dithKern = dithKern || this._dithKern; + dithSerp = typeof dithSerp != "undefined" ? dithSerp : this._dithSerp; retType = retType || 1; @@ -536,7 +163,7 @@ module ColorQuantization { if (dithKern) buf32 = this.dither(img, dithKern, dithSerp); else { - var data = getImageData(img); + var data = Utils.getImageData(img); buf32 = data.buf32; } @@ -557,7 +184,7 @@ module ColorQuantization { for (var i = 0; i < len; i++) { var i32 : number = out32[ i ]; - out[ i ] = this.i32idx[ i32 ]; + out[ i ] = this._i32idx[ i32 ]; } return out; @@ -572,7 +199,7 @@ module ColorQuantization { var ds = kernels[ kernel ]; - var data = getImageData(img), + var data = Utils.getImageData(img), // buf8 = data.buf8, buf32 = data.buf32, width = data.width, @@ -607,9 +234,9 @@ module ColorQuantization { buf32[ idx ] = i32x; // dithering strength - if (this.dithDelta) { - var dist = distEuclidean([ r1, g1, b1, a1 ], [ r2, g2, b2, a2 ]); - if (dist < this.dithDelta) + if (this._dithDelta) { + var dist = Utils.distEuclidean([ r1, g1, b1, a1 ], [ r2, g2, b2, a2 ]); + if (dist < this._dithDelta) continue; } @@ -659,17 +286,17 @@ module ColorQuantization { // reduces histogram to palette, remaps & memoizes reduced colors public buildPal(noSort?) { - if (this.palLocked || this.idxrgb.length > 0 && this.idxrgb.length <= this.colors) return; + if (this._palLocked || this._idxrgb.length > 0 && this._idxrgb.length <= this._colors) return; - var histG = this.histogram, - sorted = sortedHashKeys(histG, true); + var histG = this._histogram, + sorted = Utils.sortedHashKeys(histG, true); if (sorted.length == 0) throw "Nothing has been sampled, palette cannot be built."; - switch (this.method) { + switch (this._method) { case 1: - var cols = this.initColors, + var cols = this._initColors, last = sorted[ cols - 1 ], freq = histG[ last ]; @@ -681,8 +308,8 @@ module ColorQuantization { idxi32.push(sorted[ pos++ ]); // inject min huegroup colors - if (this.hueStats) - this.hueStats.inject(idxi32); + if (this._hueStats) + this._hueStats.inject(idxi32); break; case 2: @@ -697,72 +324,72 @@ module ColorQuantization { this.reducePal(idxi32); - if (!noSort && this.reIndex) + if (!noSort && this._reIndex) this.sortPal(); // build cache of top histogram colors - if (this.useCache) + if (this._useCache) this.cacheHistogram(idxi32); - this.palLocked = true; + this._palLocked = true; } public palette(tuples, noSort) : any { this.buildPal(noSort); - return tuples ? this.idxrgb : new Uint8Array((new Uint32Array(this.idxi32)).buffer); + return tuples ? this._idxrgb : new Uint8Array((new Uint32Array(this._idxi32)).buffer); } public prunePal(keep) { var i32; - for (var j = 0; j < this.idxrgb.length; j++) { + for (var j = 0; j < this._idxrgb.length; j++) { if (!keep[ j ]) { - i32 = this.idxi32[ j ]; - this.idxrgb[ j ] = null; - this.idxi32[ j ] = null; - delete this.i32idx[ i32 ]; + i32 = this._idxi32[ j ]; + this._idxrgb[ j ] = null; + this._idxi32[ j ] = null; + delete this._i32idx[ i32 ]; } } // compact - if (this.reIndex) { + if (this._reIndex) { var idxrgb = [], idxi32 = [], i32idx = {}; - for (var j = 0, i = 0; j < this.idxrgb.length; j++) { - if (this.idxrgb[ j ]) { - i32 = this.idxi32[ j ]; - idxrgb[ i ] = this.idxrgb[ j ]; + for (var j = 0, i = 0; j < this._idxrgb.length; j++) { + if (this._idxrgb[ j ]) { + i32 = this._idxi32[ j ]; + idxrgb[ i ] = this._idxrgb[ j ]; i32idx[ i32 ] = i; idxi32[ i ] = i32; i++; } } - this.idxrgb = idxrgb; - this.idxi32 = idxi32; - this.i32idx = i32idx; + this._idxrgb = idxrgb; + this._idxi32 = idxi32; + this._i32idx = i32idx; } } // reduces similar colors from an importance-sorted Uint32 rgba array public reducePal(idxi32) { // if pre-defined palette's length exceeds target - if (this.idxrgb.length > this.colors) { + if (this._idxrgb.length > this._colors) { // quantize histogram to existing palette var len = idxi32.length, keep = {}, uniques = 0, idx, pruned = false; for (var i = 0; i < len; i++) { // palette length reached, unset all remaining colors (sparse palette) - if (uniques == this.colors && !pruned) { + if (uniques == this._colors && !pruned) { this.prunePal(keep); pruned = true; } idx = this.nearestIndex(idxi32[ i ]); - if (uniques < this.colors && !keep[ idx ]) { + if (uniques < this._colors && !keep[ idx ]) { keep[ idx ] = true; uniques++; } @@ -787,11 +414,11 @@ module ColorQuantization { var len = idxrgb.length, palLen = len, - thold = this.initDist; + thold = this._initDist; // palette already at or below desired length - if (palLen > this.colors) { - while (palLen > this.colors) { + if (palLen > this._colors) { + while (palLen > this._colors) { var memDist = []; // iterate palette @@ -803,7 +430,7 @@ module ColorQuantization { var pxj = idxrgb[ j ], i32j = idxi32[ j ]; if (!pxj) continue; - var dist = distEuclidean(pxi, pxj); + var dist = Utils.distEuclidean(pxi, pxj); if (dist < thold) { // store index,rgb,dist @@ -820,18 +447,18 @@ module ColorQuantization { // console.log("palette length: " + palLen); // if palette is still much larger than target, increment by larger initDist - thold += (palLen > this.colors * 3) ? this.initDist : this.distIncr; + thold += (palLen > this._colors * 3) ? this._initDist : this._distIncr; } // if palette is over-reduced, re-add removed colors with largest distances from last round - if (palLen < this.colors) { + if (palLen < this._colors) { // sort descending - sort.call(memDist, function (a, b) { + Utils.sort.call(memDist, function (a, b) { return b[ 3 ] - a[ 3 ]; }); var k = 0; - while (palLen < this.colors) { + while (palLen < this._colors) { // re-inject rgb into final palette idxrgb[ memDist[ k ][ 0 ] ] = memDist[ k ][ 1 ]; @@ -845,18 +472,18 @@ module ColorQuantization { for (var i = 0; i < len; i++) { if (!idxrgb[ i ]) continue; - this.idxrgb.push(idxrgb[ i ]); - this.idxi32.push(idxi32[ i ]); + this._idxrgb.push(idxrgb[ i ]); + this._idxi32.push(idxi32[ i ]); - this.i32idx[ idxi32[ i ] ] = this.idxi32.length - 1; - this.i32rgb[ idxi32[ i ] ] = idxrgb[ i ]; + this._i32idx[ idxi32[ i ] ] = this._idxi32.length - 1; + this._i32rgb[ idxi32[ i ] ] = idxrgb[ i ]; } } } // global top-population public colorStats1D(buf32) { - var histG = this.histogram, + var histG = this._histogram, num = 0, col, len = buf32.length; @@ -867,8 +494,8 @@ module ColorQuantization { if ((col & 0xff000000) >> 24 == 0) continue; // collect hue stats - if (this.hueStats) - this.hueStats.check(col); + if (this._hueStats) + this._hueStats.check(col); if (col in histG) histG[ col ]++; @@ -881,14 +508,14 @@ module ColorQuantization { // FIXME: this can over-reduce (few/no colors same?), need a way to keep // important colors that dont ever reach local thresholds (gradients?) public colorStats2D(buf32, width) { - var boxW = this.boxSize[ 0 ], - boxH = this.boxSize[ 1 ], + var boxW = this._boxSize[ 0 ], + boxH = this._boxSize[ 1 ], area = boxW * boxH, - boxes = makeBoxes(width, buf32.length / width, boxW, boxH), - histG = this.histogram; + boxes = Utils.makeBoxes(width, buf32.length / width, boxW, boxH), + histG = this._histogram; boxes.forEach(function (box) { - var effc = Math.max(Math.round((box.w * box.h) / area) * this.boxPxls, 2), + var effc = Math.max(Math.round((box.w * box.h) / area) * this._boxPxls, 2), histL = {}, col; this.iterBox(box, width, function (i) { @@ -898,8 +525,8 @@ module ColorQuantization { if ((col & 0xff000000) >> 24 == 0) return; // collect hue stats - if (this.hueStats) - this.hueStats.check(col); + if (this._hueStats) + this._hueStats.check(col); if (col in histG) histG[ col ]++; @@ -912,8 +539,8 @@ module ColorQuantization { }); }, this); - if (this.hueStats) - this.hueStats.inject(histG); + if (this._hueStats) + this._hueStats.inject(histG); } // TODO: group very low lum and very high lum colors @@ -921,33 +548,33 @@ module ColorQuantization { public sortPal() { var self = this; - this.idxi32.sort(function (a, b) { - var idxA = self.i32idx[ a ], - idxB = self.i32idx[ b ], - rgbA = self.idxrgb[ idxA ], - rgbB = self.idxrgb[ idxB ]; + this._idxi32.sort(function (a, b) { + var idxA = self._i32idx[ a ], + idxB = self._i32idx[ b ], + rgbA = self._idxrgb[ idxA ], + rgbB = self._idxrgb[ idxB ]; - var hslA = rgb2hsl(rgbA[ 0 ], rgbA[ 1 ], rgbA[ 2 ]), - hslB = rgb2hsl(rgbB[ 0 ], rgbB[ 1 ], rgbB[ 2 ]); + var hslA = Utils.rgb2hsl(rgbA[ 0 ], rgbA[ 1 ], rgbA[ 2 ]), + hslB = Utils.rgb2hsl(rgbB[ 0 ], rgbB[ 1 ], rgbB[ 2 ]); // sort all grays + whites together - var hueA = (rgbA[ 0 ] == rgbA[ 1 ] && rgbA[ 1 ] == rgbA[ 2 ]) ? -1 : hueGroup(hslA.h, self.hueGroups); - var hueB = (rgbB[ 0 ] == rgbB[ 1 ] && rgbB[ 1 ] == rgbB[ 2 ]) ? -1 : hueGroup(hslB.h, self.hueGroups); + var hueA = (rgbA[ 0 ] == rgbA[ 1 ] && rgbA[ 1 ] == rgbA[ 2 ]) ? -1 : Utils.hueGroup(hslA.h, self._hueGroups); + var hueB = (rgbB[ 0 ] == rgbB[ 1 ] && rgbB[ 1 ] == rgbB[ 2 ]) ? -1 : Utils.hueGroup(hslB.h, self._hueGroups); var hueDiff = hueB - hueA; if (hueDiff) return -hueDiff; - var lumDiff = lumGroup(+hslB.l.toFixed(2)) - lumGroup(+hslA.l.toFixed(2)); + var lumDiff = Utils.lumGroup(+hslB.l.toFixed(2)) - Utils.lumGroup(+hslA.l.toFixed(2)); if (lumDiff) return -lumDiff; - var satDiff = satGroup(+hslB.s.toFixed(2)) - satGroup(+hslA.s.toFixed(2)); + var satDiff = Utils.satGroup(+hslB.s.toFixed(2)) - Utils.satGroup(+hslA.s.toFixed(2)); if (satDiff) return -satDiff; }); // sync idxrgb & i32idx - this.idxi32.forEach(function (i32, i) { - this.idxrgb[ i ] = this.i32rgb[ i32 ]; - this.i32idx[ i32 ] = i; + this._idxi32.forEach(function (i32, i) { + this._idxrgb[ i ] = this._i32rgb[ i32 ]; + this._i32idx[ i32 ] = i; }, this); } @@ -967,7 +594,7 @@ module ColorQuantization { // TOTRY: use HUSL - http://boronine.com/husl/ public nearestColor(i32) { var idx = this.nearestIndex(i32); - return idx === null ? 0 : this.idxi32[ idx ]; + return idx === null ? 0 : this._idxi32[ idx ]; } // TOTRY: use HUSL - http://boronine.com/husl/ @@ -976,8 +603,8 @@ module ColorQuantization { if ((i32 & 0xff000000) >> 24 == 0) return null; - if (this.useCache && ("" + i32) in this.i32idx) - return this.i32idx[ i32 ]; + if (this._useCache && ("" + i32) in this._i32idx) + return this._i32idx[ i32 ]; var min = 1000, idx, @@ -987,12 +614,12 @@ module ColorQuantization { (i32 >>> 16) & 0xff, (i32 >>> 24) & 0xff ], - len = this.idxrgb.length; + len = this._idxrgb.length; for (var i = 0; i < len; i++) { - if (!this.idxrgb[ i ]) continue; // sparse palettes + if (!this._idxrgb[ i ]) continue; // sparse palettes - var dist = distEuclidean(rgb, this.idxrgb[ i ]); + var dist = Utils.distEuclidean(rgb, this._idxrgb[ i ]); if (dist < min) { min = dist; @@ -1004,8 +631,8 @@ module ColorQuantization { } public cacheHistogram(idxi32) { - for (var i = 0, i32 = idxi32[ i ]; i < idxi32.length && this.histogram[ i32 ] >= this.cacheFreq; i32 = idxi32[ i++ ]) - this.i32idx[ i32 ] = this.nearestIndex(i32); + for (var i = 0, i32 = idxi32[ i ]; i < idxi32.length && this._histogram[ i32 ] >= this._cacheFreq; i32 = idxi32[ i++ ]) + this._i32idx[ i32 ] = this.nearestIndex(i32); } } diff --git a/ts/dither.ts b/ts/dither.ts new file mode 100644 index 0000000..74ee792 --- /dev/null +++ b/ts/dither.ts @@ -0,0 +1,90 @@ +module ColorQuantization { + + // http://www.tannerhelland.com/4660/dithering-eleven-algorithms-source-code/ + export var kernels = { + FloydSteinberg : [ + [ 7 / 16, 1, 0 ], + [ 3 / 16, -1, 1 ], + [ 5 / 16, 0, 1 ], + [ 1 / 16, 1, 1 ] + ], + FalseFloydSteinberg: [ + [ 3 / 8, 1, 0 ], + [ 3 / 8, 0, 1 ], + [ 2 / 8, 1, 1 ] + ], + Stucki : [ + [ 8 / 42, 1, 0 ], + [ 4 / 42, 2, 0 ], + [ 2 / 42, -2, 1 ], + [ 4 / 42, -1, 1 ], + [ 8 / 42, 0, 1 ], + [ 4 / 42, 1, 1 ], + [ 2 / 42, 2, 1 ], + [ 1 / 42, -2, 2 ], + [ 2 / 42, -1, 2 ], + [ 4 / 42, 0, 2 ], + [ 2 / 42, 1, 2 ], + [ 1 / 42, 2, 2 ] + ], + Atkinson : [ + [ 1 / 8, 1, 0 ], + [ 1 / 8, 2, 0 ], + [ 1 / 8, -1, 1 ], + [ 1 / 8, 0, 1 ], + [ 1 / 8, 1, 1 ], + [ 1 / 8, 0, 2 ] + ], + Jarvis : [ // Jarvis, Judice, and Ninke / JJN? + [ 7 / 48, 1, 0 ], + [ 5 / 48, 2, 0 ], + [ 3 / 48, -2, 1 ], + [ 5 / 48, -1, 1 ], + [ 7 / 48, 0, 1 ], + [ 5 / 48, 1, 1 ], + [ 3 / 48, 2, 1 ], + [ 1 / 48, -2, 2 ], + [ 3 / 48, -1, 2 ], + [ 5 / 48, 0, 2 ], + [ 3 / 48, 1, 2 ], + [ 1 / 48, 2, 2 ] + ], + Burkes : [ + [ 8 / 32, 1, 0 ], + [ 4 / 32, 2, 0 ], + [ 2 / 32, -2, 1 ], + [ 4 / 32, -1, 1 ], + [ 8 / 32, 0, 1 ], + [ 4 / 32, 1, 1 ], + [ 2 / 32, 2, 1 ], + ], + Sierra : [ + [ 5 / 32, 1, 0 ], + [ 3 / 32, 2, 0 ], + [ 2 / 32, -2, 1 ], + [ 4 / 32, -1, 1 ], + [ 5 / 32, 0, 1 ], + [ 4 / 32, 1, 1 ], + [ 2 / 32, 2, 1 ], + [ 2 / 32, -1, 2 ], + [ 3 / 32, 0, 2 ], + [ 2 / 32, 1, 2 ] + ], + TwoSierra : [ + [ 4 / 16, 1, 0 ], + [ 3 / 16, 2, 0 ], + [ 1 / 16, -2, 1 ], + [ 2 / 16, -1, 1 ], + [ 3 / 16, 0, 1 ], + [ 2 / 16, 1, 1 ], + [ 1 / 16, 2, 1 ] + ], + SierraLite : [ + [ 2 / 4, 1, 0 ], + [ 1 / 4, -1, 1 ], + [ 1 / 4, 0, 1 ] + ] + }; + + +} diff --git a/ts/hueStatistics.ts b/ts/hueStatistics.ts index dc7052d..bd8489f 100644 --- a/ts/hueStatistics.ts +++ b/ts/hueStatistics.ts @@ -1,18 +1,25 @@ +/// module ColorQuantization { + class HueGroup { + public num : number = 0; + public cols : number[] = []; + } + export class HueStatistics { private _numGroups; private _minCols; private _stats; private _groupsFull; - constructor(numGroups, minCols) { + constructor(numGroups : number, minCols : number) { this._numGroups = numGroups; this._minCols = minCols; this._stats = {}; - for (var i = -1; i < numGroups; i++) - this._stats[ i ] = {num: 0, cols: []}; + for (var i = -1; i < numGroups; i++) { + this._stats[i] = new HueGroup(); + } this._groupsFull = 0; } @@ -27,8 +34,8 @@ module ColorQuantization { g = (i32 >>> 8) & 0xff, b = (i32 >>> 16) & 0xff, a = (i32 >>> 24) & 0xff, - hg = (r == g && g == b) ? -1 : hueGroup(rgb2hsl(r, g, b).h, this._numGroups), - gr = this._stats[ hg ], + hg = (r == g && g == b) ? -1 : Utils.hueGroup(Utils.rgb2hsl(r, g, b).h, this._numGroups), + gr : HueGroup = this._stats[ hg ], min = this._minCols; gr.num++; @@ -45,7 +52,7 @@ module ColorQuantization { public inject(histG) { for (var i = -1; i < this._numGroups; i++) { if (this._stats[ i ].num <= this._minCols) { - switch (typeOf(histG)) { + switch (Utils.typeOf(histG)) { case "Array": this._stats[ i ].cols.forEach(function (col) { if (histG.indexOf(col) == -1) diff --git a/ts/point.ts b/ts/point.ts new file mode 100644 index 0000000..fec3fc9 --- /dev/null +++ b/ts/point.ts @@ -0,0 +1,52 @@ +module ColorQuantization { + + export class Point { + public r : number; + public g : number; + public b : number; + public a : number; + public uint32 : number; + + constructor(...args : number[]) { + this.set(args); + } + + public set(...args) { + switch(args.length) { + case 1: + this.uint32 = args[0]; + + this._loadRGBA(); + break; + + case 4: + this.r = args[0]; + this.g = args[1]; + this.b = args[2]; + this.a = args[3]; + this._loadUINT32(); + break; + + default: + throw new Error("Point.constructor/set should have parameter/s"); + } + } + + private _loadUINT32() { + this.uint32 = ( + (this.a << 24) | // alpha + (this.b << 16) | // blue + (this.g << 8) | // green + this.r // red + ) >>> 0; + } + + private _loadRGBA() { + this.r = this.uint32 & 0xff; + this.g = (this.uint32 >>> 8) & 0xff; + this.b = (this.uint32 >>> 16) & 0xff; + this.a = (this.uint32 >>> 24) & 0xff; + } + } + +} diff --git a/ts/utils.ts b/ts/utils.ts new file mode 100644 index 0000000..ac3c3d2 --- /dev/null +++ b/ts/utils.ts @@ -0,0 +1,297 @@ +module ColorQuantization.Utils { + + // Rec. 709 (sRGB) luma coef + var Pr = .2126, + Pg = .7152, + Pb = .0722, + Pa = 1; // TODO: (igor-bezkrovny) what should be here? + + // test if js engine's Array#sort implementation is stable + function isArrSortStable() { + var str = "abcdefghijklmnopqrstuvwxyz"; + + return "xyzvwtursopqmnklhijfgdeabc" == str.split("").sort(function (a, b) { + return ~~(str.indexOf(b) / 2.3) - ~~(str.indexOf(a) / 2.3); + }).join(""); + } + + // TODO: move to separate file like "utils.ts" - it is used by colorQuant too! + export function typeOf(val) { + return Object.prototype.toString.call(val).slice(8, -1); + } + + // http://alienryderflex.com/hsp.html + export function rgb2lum(r, g, b) { + return Math.sqrt( + Pr * r * r + + Pg * g * g + + Pb * b * b + ); + } + + // http://rgb2hsl.nichabi.com/javascript-function.php + export function rgb2hsl(r, g, b) { + var max, min, h, s, l, d; + r /= 255; + g /= 255; + b /= 255; + max = Math.max(r, g, b); + min = Math.min(r, g, b); + l = (max + min) / 2; + if (max == min) { + h = s = 0; + } else { + d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break + } + h /= 6; + } +// h = Math.floor(h * 360) +// s = Math.floor(s * 100) +// l = Math.floor(l * 100) + return { + h: h, + s: s, + l: rgb2lum(r, g, b) + }; + } + + export function hueGroup(hue, segs) { + var seg = 1 / segs, + haf = seg / 2; + + if (hue >= 1 - haf || hue <= haf) + return 0; + + for (var i = 1; i < segs; i++) { + var mid = i * seg; + if (hue >= mid - haf && hue <= mid + haf) + return i; + } + } + + export function satGroup(sat) { + return sat; + } + + export function lumGroup(lum) { + return lum; + } + + export var sort = isArrSortStable() ? Array.prototype.sort : stableSort; + + // must be used via stableSort.call(arr, fn) + export function stableSort(fn) { + var type = typeOf(this[ 0 ]); + + if (type == "Number" || type == "String") { + var ord = {}, len = this.length, val; + + for (var i = 0; i < len; i++) { + val = this[ i ]; + if (ord[ val ] || ord[ val ] === 0) continue; + ord[ val ] = i; + } + + return this.sort(function (a, b) { + return fn(a, b) || ord[ a ] - ord[ b ]; + }); + } + else { + var ord2 = this.map(function (v) { + return v + }); + + return this.sort(function (a, b) { + return fn(a, b) || ord2.indexOf(a) - ord2.indexOf(b); + }); + } + } + + // returns uniform pixel data from various img + // TODO?: if array is passed, createimagedata, createlement canvas? take a pxlen? + export function getImageData(img, width?) { + var can, ctx, imgd, buf8, buf32, height; + + switch (typeOf(img)) { + case "HTMLImageElement": + can = document.createElement("canvas"); + can.width = img.naturalWidth; + can.height = img.naturalHeight; + ctx = can.getContext("2d"); + ctx.drawImage(img, 0, 0); + case "Canvas": + case "HTMLCanvasElement": + can = can || img; + ctx = ctx || can.getContext("2d"); + case "CanvasRenderingContext2D": + ctx = ctx || img; + can = can || ctx.canvas; + imgd = ctx.getImageData(0, 0, can.width, can.height); + case "ImageData": + imgd = imgd || img; + width = imgd.width; + if (typeOf(imgd.data) == "CanvasPixelArray") + buf8 = new Uint8Array(imgd.data); + else + buf8 = imgd.data; + case "Array": + case "CanvasPixelArray": + buf8 = buf8 || new Uint8Array(img); + case "Uint8Array": + case "Uint8ClampedArray": + buf8 = buf8 || img; + buf32 = new Uint32Array(buf8.buffer); + case "Uint32Array": + buf32 = buf32 || img; + buf8 = buf8 || new Uint8Array(buf32.buffer); + width = width || buf32.length; + height = buf32.length / width; + } + + return { + can : can, + ctx : ctx, + imgd : imgd, + buf8 : buf8, + buf32 : buf32, + width : width, + height: height + }; + } + + // partitions a rect of wid x hgt into + // array of bboxes of w0 x h0 (or less) + export function makeBoxes(wid, hgt, w0, h0) { + var wnum = ~~(wid / w0), wrem = wid % w0, + hnum = ~~(hgt / h0), hrem = hgt % h0, + xend = wid - wrem, yend = hgt - hrem; + + var bxs = []; + for (var y = 0; y < hgt; y += h0) + for (var x = 0; x < wid; x += w0) + bxs.push({x: x, y: y, w: (x == xend ? wrem : w0), h: (y == yend ? hrem : h0)}); + + return bxs; + } + + // returns array of hash keys sorted by their values + export function sortedHashKeys(obj, desc) { + var keys = []; + + for (var key in obj) + keys.push(key); + + return sort.call(keys, function (a, b) { + return desc ? obj[ b ] - obj[ a ] : obj[ a ] - obj[ b ]; + }); + } + + var rd = 255, + gd = 255, + bd = 255, + ad = 255; + + var euclMax = Math.sqrt(Pr * rd * rd + Pg * gd * gd + Pb * bd * bd + Pa * ad * ad); + // perceptual Euclidean color distance + export function distEuclidean(rgb0, rgb1) { + var rd = rgb1[ 0 ] - rgb0[ 0 ], + gd = rgb1[ 1 ] - rgb0[ 1 ], + bd = rgb1[ 2 ] - rgb0[ 2 ], + ad = rgb1[ 3 ] - rgb0[ 3 ]; + + return Math.sqrt(Pr * rd * rd + Pg * gd * gd + Pb * bd * bd + Pa * ad * ad) / euclMax; + } + +/* + var manhMax = Pr * rd + Pg * gd + Pb * bd + Pa * ad; + // perceptual Manhattan color distance + function distManhattan(rgb0, rgb1) { + var rd = Math.abs(rgb1[ 0 ] - rgb0[ 0 ]), + gd = Math.abs(rgb1[ 1 ] - rgb0[ 1 ]), + bd = Math.abs(rgb1[ 2 ] - rgb0[ 2 ]), + ad = Math.abs(rgb1[ 3 ] - rgb0[ 3 ]); + + return (Pr * rd + Pg * gd + Pb * bd + Pa * ad) / manhMax; + } +*/ + + /* + Finally, I've found it! After thorough testing and experimentation my conclusions are: + + The correct way is to calculate maximum possible difference between the two colors. + Formulas with any kind of estimated average/typical difference had room for non-linearities. + + I was unable to find correct formula that calculates the distance without blending RGBA colors with backgrounds. + + There is no need to take every possible background color into account, only extremes per R/G/B channel, i.e. for red channel: + + blend both colors with 0 red as background, measure squared difference + blend both colors with max red background, measure squared difference + take higher of the two. + Fortunately blending with "white" and "black" is trivial when you use premultiplied alpha (r = r×a). + + The complete formula is: + max((r?-r?)², (r?-r? - a?+a?)²) + + max((g?-g?)², (g?-g? - a?+a?)²) + + max((b?-b?)², (b?-b? - a?+a?)²) + */ +/* + function colordifference_ch(x, y, alphas) { + // maximum of channel blended on white, and blended on black + // premultiplied alpha and backgrounds 0/1 shorten the formula + var black = x - y, // [-255; 255] + white = black + alphas; // [-255; 255*2] + + return Math.max(black * black, white * white); // [0; 255^2 + (255*2)^2] + } + + //var rgbaMax = (255*255 + (255*2) * (255*2)) * 3; + var rgbaMax = Math.pow(255 << 1, 2) * 3; + + function distRGBA(rgb0, rgb1) { + /!* + var r1 = rgb0[0], + g1 = rgb0[1], + b1 = rgb0[2], + a1 = rgb0[3]; + + var r2 = rgb1[0], + g2 = rgb1[1], + b2 = rgb1[2], + a2 = rgb1[3]; + + var dr = r1 - r2, + dg = g1 - g2, + db = b1 - b2, + da = a1 - a2; + + return (Math.max(dr << 1, dr - da << 1) + + Math.max(dg << 1, dg - da << 1) + + Math.max(db << 1, db - da << 1)) / rgbaMax; + + *!/ + var alphas = rgb1[ 3 ] - rgb0[ 3 ], + dist = colordifference_ch(rgb0[ 0 ], rgb1[ 0 ], alphas) + + colordifference_ch(rgb0[ 1 ], rgb1[ 1 ], alphas) + + colordifference_ch(rgb0[ 2 ], rgb1[ 2 ], alphas); + + if (dist > rgbaMax) { + console.log(dist); + } + + return dist / rgbaMax; + } +*/ + +} From 72d64f22f8c9af1d25354d409ddb845e8d976c96 Mon Sep 17 00:00:00 2001 From: Igor Date: Wed, 13 May 2015 23:33:35 +0300 Subject: [PATCH 07/23] point added --- ts/build.cmd | 2 +- ts/colorQuant.ts | 139 ++++++++++++++++++++++------------------------- ts/point.ts | 31 +++++++++-- 3 files changed, 91 insertions(+), 81 deletions(-) diff --git a/ts/build.cmd b/ts/build.cmd index ba9abf4..b67f5aa 100644 --- a/ts/build.cmd +++ b/ts/build.cmd @@ -1,3 +1,3 @@ pushd %~dp0 -tsc colorQuant.ts --out colorQuant.js +tsc colorQuant.ts --sourcemap --out colorQuant.js popd diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index fc8dd43..d75458b 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -5,11 +5,13 @@ * RgbQuant.js - an image quantization lib */ +/// /// /// /// module ColorQuantization { + // TODO: make input/output image and input/output palettes with instances of class Point only! export enum RgbQuantDitheringKernel { NONE = 0 } @@ -64,11 +66,7 @@ module ColorQuantization { // accumulated histogram private _histogram = {}; - // palette - rgb triplets - private _idxrgb = []; - - // palette - int32 vals - private _idxi32 = []; + private _paletteArray : Point[] = []; // reverse lookup {i32:idx} private _i32idx = {}; @@ -109,22 +107,13 @@ module ColorQuantization { // accumulated histogram this._histogram = {}; // palette - rgb triplets - if (Object.prototype.toString.call(opts.palette) === "[object Array]") this._idxrgb = opts.palette.slice(0); + if (Object.prototype.toString.call(opts.palette) === "[object Array]") this._paletteArray = opts.palette.map(quadruplet => new Point(quadruplet)); // if pre-defined palette, build lookups - if (this._idxrgb.length > 0) { - this._idxrgb.forEach(function (rgb, i) { - var alpha = rgb.length >= 4 ? rgb[ 3 ] : 255, - i32 = ( - (alpha << 24) | // alpha - (rgb[ 2 ] << 16) | // blue - (rgb[ 1 ] << 8) | // green - rgb[ 0 ] // red - ) >>> 0; - - this._idxi32[ i ] = i32; - this._i32idx[ i32 ] = i; - this._i32rgb[ i32 ] = rgb; + if (this._paletteArray.length > 0) { + this._paletteArray.forEach(function (point : Point, i) { + this._i32idx[ point.uint32 ] = i; + this._i32rgb[ point.uint32 ] = point.rgba; }, this); } } @@ -172,7 +161,7 @@ module ColorQuantization { for (var i = 0; i < len; i++) { var i32 : number = buf32[ i ]; - out32[ i ] = this.nearestColor(i32); + out32[ i ] = this.nearestColor(i32).uint32; } if (retType == 1) @@ -208,7 +197,7 @@ module ColorQuantization { var dir = serpentine ? -1 : 1; - //(console).profile("dither"); + (console).profile("dither"); for (var y = 0; y < height; y++) { if (serpentine) dir = dir * -1; @@ -225,26 +214,22 @@ module ColorQuantization { a1 = (i32 >>> 24) & 0xff; // Reduced pixel - var i32x = this.nearestColor(i32), - r2 = (i32x & 0xff), - g2 = (i32x >>> 8) & 0xff, - b2 = (i32x >>> 16) & 0xff, - a2 = (i32x >>> 24) & 0xff; + var point = this.nearestColor(i32); - buf32[ idx ] = i32x; + buf32[ idx ] = point.uint32; // dithering strength if (this._dithDelta) { - var dist = Utils.distEuclidean([ r1, g1, b1, a1 ], [ r2, g2, b2, a2 ]); + var dist = Utils.distEuclidean([ r1, g1, b1, a1 ], point.rgba); if (dist < this._dithDelta) continue; } // Component distance - var er = r1 - r2, - eg = g1 - g2, - eb = b1 - b2, - ea = a1 - a2; + var er = r1 - point.r, + eg = g1 - point.g, + eb = b1 - point.b, + ea = a1 - point.a; for (var i = (dir == 1 ? 0 : ds.length - 1), end = (dir == 1 ? ds.length : 0); i !== end; i += dir) { var x1 = ds[ i ][ 1 ] * dir, @@ -280,13 +265,13 @@ module ColorQuantization { } } - //(console).profileEnd("dither"); + (console).profileEnd("dither"); return buf32; } // reduces histogram to palette, remaps & memoizes reduced colors public buildPal(noSort?) { - if (this._palLocked || this._idxrgb.length > 0 && this._idxrgb.length <= this._colors) return; + if (this._palLocked || this._paletteArray.length > 0 && this._paletteArray.length <= this._colors) return; var histG = this._histogram, sorted = Utils.sortedHashKeys(histG, true); @@ -336,18 +321,22 @@ module ColorQuantization { public palette(tuples, noSort) : any { this.buildPal(noSort); - return tuples ? this._idxrgb : new Uint8Array((new Uint32Array(this._idxi32)).buffer); + + var uint32Array = this._paletteArray.map(point => point.uint32); + return tuples ? this._paletteArray : new Uint8Array((new Uint32Array(uint32Array)).buffer); } public prunePal(keep) { - var i32; + var /*i32,*/ + point : Point; - for (var j = 0; j < this._idxrgb.length; j++) { + for (var j = 0; j < this._paletteArray.length; j++) { if (!keep[ j ]) { - i32 = this._idxi32[ j ]; - this._idxrgb[ j ] = null; - this._idxi32[ j ] = null; - delete this._i32idx[ i32 ]; + point = this._paletteArray[ j ]; + this._paletteArray[j] = null; + + // TODO: check if we need to delete also this._i32rgb ???? + delete this._i32idx[ point.uint32 ];// TODO: delete is forbidden operator!!! } } @@ -355,20 +344,19 @@ module ColorQuantization { if (this._reIndex) { var idxrgb = [], idxi32 = [], - i32idx = {}; - - for (var j = 0, i = 0; j < this._idxrgb.length; j++) { - if (this._idxrgb[ j ]) { - i32 = this._idxi32[ j ]; - idxrgb[ i ] = this._idxrgb[ j ]; - i32idx[ i32 ] = i; - idxi32[ i ] = i32; + i32idx = {}, + compactedPaletteArray : Point[] = []; + + for (var j = 0, i = 0; j < this._paletteArray.length; j++) { + if (this._paletteArray[ j ]) { + point = this._paletteArray[j]; + compactedPaletteArray[i] = point; + i32idx[ point.uint32 ] = i; i++; } } - this._idxrgb = idxrgb; - this._idxi32 = idxi32; + this._paletteArray = compactedPaletteArray; this._i32idx = i32idx; } } @@ -376,7 +364,7 @@ module ColorQuantization { // reduces similar colors from an importance-sorted Uint32 rgba array public reducePal(idxi32) { // if pre-defined palette's length exceeds target - if (this._idxrgb.length > this._colors) { + if (this._paletteArray.length > this._colors) { // quantize histogram to existing palette var len = idxi32.length, keep = {}, uniques = 0, idx, pruned = false; @@ -472,11 +460,11 @@ module ColorQuantization { for (var i = 0; i < len; i++) { if (!idxrgb[ i ]) continue; - this._idxrgb.push(idxrgb[ i ]); - this._idxi32.push(idxi32[ i ]); + var point : Point = new Point(idxrgb[i]); + this._paletteArray.push(point); - this._i32idx[ idxi32[ i ] ] = this._idxi32.length - 1; - this._i32rgb[ idxi32[ i ] ] = idxrgb[ i ]; + this._i32idx[ point.uint32 ] = this._paletteArray.length - 1; + this._i32rgb[ point.uint32 ] = idxrgb[ i ]; } } } @@ -546,20 +534,16 @@ module ColorQuantization { // TODO: group very low lum and very high lum colors // TODO: pass custom sort order public sortPal() { - var self = this; - - this._idxi32.sort(function (a, b) { - var idxA = self._i32idx[ a ], - idxB = self._i32idx[ b ], - rgbA = self._idxrgb[ idxA ], - rgbB = self._idxrgb[ idxB ]; + this._paletteArray.sort((a : Point, b : Point) => { + var rgbA = a.rgba, + rgbB = b.rgba; var hslA = Utils.rgb2hsl(rgbA[ 0 ], rgbA[ 1 ], rgbA[ 2 ]), hslB = Utils.rgb2hsl(rgbB[ 0 ], rgbB[ 1 ], rgbB[ 2 ]); // sort all grays + whites together - var hueA = (rgbA[ 0 ] == rgbA[ 1 ] && rgbA[ 1 ] == rgbA[ 2 ]) ? -1 : Utils.hueGroup(hslA.h, self._hueGroups); - var hueB = (rgbB[ 0 ] == rgbB[ 1 ] && rgbB[ 1 ] == rgbB[ 2 ]) ? -1 : Utils.hueGroup(hslB.h, self._hueGroups); + var hueA = (rgbA[ 0 ] == rgbA[ 1 ] && rgbA[ 1 ] == rgbA[ 2 ]) ? -1 : Utils.hueGroup(hslA.h, this._hueGroups); + var hueB = (rgbB[ 0 ] == rgbB[ 1 ] && rgbB[ 1 ] == rgbB[ 2 ]) ? -1 : Utils.hueGroup(hslB.h, this._hueGroups); var hueDiff = hueB - hueA; if (hueDiff) return -hueDiff; @@ -572,9 +556,8 @@ module ColorQuantization { }); // sync idxrgb & i32idx - this._idxi32.forEach(function (i32, i) { - this._idxrgb[ i ] = this._i32rgb[ i32 ]; - this._i32idx[ i32 ] = i; + this._paletteArray.forEach(function (point : Point, i) { + this._i32idx[ point.uint32 ] = i; }, this); } @@ -592,19 +575,23 @@ module ColorQuantization { } // TOTRY: use HUSL - http://boronine.com/husl/ - public nearestColor(i32) { + public nearestColor(i32) : Point { var idx = this.nearestIndex(i32); - return idx === null ? 0 : this._idxi32[ idx ]; + if(idx === null) throw new Error("color i32 should be 0, but why null?"); + return this._paletteArray[ idx ]; } // TOTRY: use HUSL - http://boronine.com/husl/ public nearestIndex(i32) { +/* // alpha 0 returns null index if ((i32 & 0xff000000) >> 24 == 0) return null; +*/ - if (this._useCache && ("" + i32) in this._i32idx) - return this._i32idx[ i32 ]; + if (this._useCache && ("" + i32) in this._i32idx) { + return this._i32idx[i32]; + } var min = 1000, idx, @@ -614,12 +601,12 @@ module ColorQuantization { (i32 >>> 16) & 0xff, (i32 >>> 24) & 0xff ], - len = this._idxrgb.length; + len = this._paletteArray.length; for (var i = 0; i < len; i++) { - if (!this._idxrgb[ i ]) continue; // sparse palettes + if (!this._paletteArray[ i ]) continue; // sparse palettes - var dist = Utils.distEuclidean(rgb, this._idxrgb[ i ]); + var dist = Utils.distEuclidean(rgb, this._paletteArray[ i ].rgba); if (dist < min) { min = dist; @@ -627,6 +614,8 @@ module ColorQuantization { } } + if(typeof idx === "undefined") throw new Error("x"); + return idx; } diff --git a/ts/point.ts b/ts/point.ts index fec3fc9..5ce5eed 100644 --- a/ts/point.ts +++ b/ts/point.ts @@ -6,17 +6,27 @@ module ColorQuantization { public b : number; public a : number; public uint32 : number; + public rgba : number[]; // TODO: better name is quadruplet or quad may be? constructor(...args : number[]) { - this.set(args); + this.set(...args); } - public set(...args) { + public set(...args : number[]) { switch(args.length) { case 1: - this.uint32 = args[0]; - - this._loadRGBA(); + if(typeof args[0] === "number") { + this.uint32 = args[0]; + this._loadRGBA(); + } else if(Utils.typeOf(args[0]) === "Array") { + this.r = args[0][0]; + this.g = args[0][1]; + this.b = args[0][2]; + this.a = args[0][3]; + this._loadUINT32(); + } else { + throw new Error("Point.constructor/set: unsupported single parameter"); + } break; case 4: @@ -30,6 +40,8 @@ module ColorQuantization { default: throw new Error("Point.constructor/set should have parameter/s"); } + + this._loadQuadruplet(); } private _loadUINT32() { @@ -47,6 +59,15 @@ module ColorQuantization { this.b = (this.uint32 >>> 16) & 0xff; this.a = (this.uint32 >>> 24) & 0xff; } + + private _loadQuadruplet() { + this.rgba = [ + this.r, + this.g, + this.b, + this.a + ]; + } } } From b418e5e0a954e843fc5873629ab18f7225bb6cbb Mon Sep 17 00:00:00 2001 From: Igor Date: Wed, 13 May 2015 23:33:35 +0300 Subject: [PATCH 08/23] point added --- ts/build.cmd | 2 +- ts/colorQuant.ts | 139 ++++++++++++++++++++++------------------------- ts/point.js | 69 +++++++++++++++++++++++ ts/point.ts | 31 +++++++++-- 4 files changed, 160 insertions(+), 81 deletions(-) create mode 100644 ts/point.js diff --git a/ts/build.cmd b/ts/build.cmd index ba9abf4..b67f5aa 100644 --- a/ts/build.cmd +++ b/ts/build.cmd @@ -1,3 +1,3 @@ pushd %~dp0 -tsc colorQuant.ts --out colorQuant.js +tsc colorQuant.ts --sourcemap --out colorQuant.js popd diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index fc8dd43..d75458b 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -5,11 +5,13 @@ * RgbQuant.js - an image quantization lib */ +/// /// /// /// module ColorQuantization { + // TODO: make input/output image and input/output palettes with instances of class Point only! export enum RgbQuantDitheringKernel { NONE = 0 } @@ -64,11 +66,7 @@ module ColorQuantization { // accumulated histogram private _histogram = {}; - // palette - rgb triplets - private _idxrgb = []; - - // palette - int32 vals - private _idxi32 = []; + private _paletteArray : Point[] = []; // reverse lookup {i32:idx} private _i32idx = {}; @@ -109,22 +107,13 @@ module ColorQuantization { // accumulated histogram this._histogram = {}; // palette - rgb triplets - if (Object.prototype.toString.call(opts.palette) === "[object Array]") this._idxrgb = opts.palette.slice(0); + if (Object.prototype.toString.call(opts.palette) === "[object Array]") this._paletteArray = opts.palette.map(quadruplet => new Point(quadruplet)); // if pre-defined palette, build lookups - if (this._idxrgb.length > 0) { - this._idxrgb.forEach(function (rgb, i) { - var alpha = rgb.length >= 4 ? rgb[ 3 ] : 255, - i32 = ( - (alpha << 24) | // alpha - (rgb[ 2 ] << 16) | // blue - (rgb[ 1 ] << 8) | // green - rgb[ 0 ] // red - ) >>> 0; - - this._idxi32[ i ] = i32; - this._i32idx[ i32 ] = i; - this._i32rgb[ i32 ] = rgb; + if (this._paletteArray.length > 0) { + this._paletteArray.forEach(function (point : Point, i) { + this._i32idx[ point.uint32 ] = i; + this._i32rgb[ point.uint32 ] = point.rgba; }, this); } } @@ -172,7 +161,7 @@ module ColorQuantization { for (var i = 0; i < len; i++) { var i32 : number = buf32[ i ]; - out32[ i ] = this.nearestColor(i32); + out32[ i ] = this.nearestColor(i32).uint32; } if (retType == 1) @@ -208,7 +197,7 @@ module ColorQuantization { var dir = serpentine ? -1 : 1; - //(console).profile("dither"); + (console).profile("dither"); for (var y = 0; y < height; y++) { if (serpentine) dir = dir * -1; @@ -225,26 +214,22 @@ module ColorQuantization { a1 = (i32 >>> 24) & 0xff; // Reduced pixel - var i32x = this.nearestColor(i32), - r2 = (i32x & 0xff), - g2 = (i32x >>> 8) & 0xff, - b2 = (i32x >>> 16) & 0xff, - a2 = (i32x >>> 24) & 0xff; + var point = this.nearestColor(i32); - buf32[ idx ] = i32x; + buf32[ idx ] = point.uint32; // dithering strength if (this._dithDelta) { - var dist = Utils.distEuclidean([ r1, g1, b1, a1 ], [ r2, g2, b2, a2 ]); + var dist = Utils.distEuclidean([ r1, g1, b1, a1 ], point.rgba); if (dist < this._dithDelta) continue; } // Component distance - var er = r1 - r2, - eg = g1 - g2, - eb = b1 - b2, - ea = a1 - a2; + var er = r1 - point.r, + eg = g1 - point.g, + eb = b1 - point.b, + ea = a1 - point.a; for (var i = (dir == 1 ? 0 : ds.length - 1), end = (dir == 1 ? ds.length : 0); i !== end; i += dir) { var x1 = ds[ i ][ 1 ] * dir, @@ -280,13 +265,13 @@ module ColorQuantization { } } - //(console).profileEnd("dither"); + (console).profileEnd("dither"); return buf32; } // reduces histogram to palette, remaps & memoizes reduced colors public buildPal(noSort?) { - if (this._palLocked || this._idxrgb.length > 0 && this._idxrgb.length <= this._colors) return; + if (this._palLocked || this._paletteArray.length > 0 && this._paletteArray.length <= this._colors) return; var histG = this._histogram, sorted = Utils.sortedHashKeys(histG, true); @@ -336,18 +321,22 @@ module ColorQuantization { public palette(tuples, noSort) : any { this.buildPal(noSort); - return tuples ? this._idxrgb : new Uint8Array((new Uint32Array(this._idxi32)).buffer); + + var uint32Array = this._paletteArray.map(point => point.uint32); + return tuples ? this._paletteArray : new Uint8Array((new Uint32Array(uint32Array)).buffer); } public prunePal(keep) { - var i32; + var /*i32,*/ + point : Point; - for (var j = 0; j < this._idxrgb.length; j++) { + for (var j = 0; j < this._paletteArray.length; j++) { if (!keep[ j ]) { - i32 = this._idxi32[ j ]; - this._idxrgb[ j ] = null; - this._idxi32[ j ] = null; - delete this._i32idx[ i32 ]; + point = this._paletteArray[ j ]; + this._paletteArray[j] = null; + + // TODO: check if we need to delete also this._i32rgb ???? + delete this._i32idx[ point.uint32 ];// TODO: delete is forbidden operator!!! } } @@ -355,20 +344,19 @@ module ColorQuantization { if (this._reIndex) { var idxrgb = [], idxi32 = [], - i32idx = {}; - - for (var j = 0, i = 0; j < this._idxrgb.length; j++) { - if (this._idxrgb[ j ]) { - i32 = this._idxi32[ j ]; - idxrgb[ i ] = this._idxrgb[ j ]; - i32idx[ i32 ] = i; - idxi32[ i ] = i32; + i32idx = {}, + compactedPaletteArray : Point[] = []; + + for (var j = 0, i = 0; j < this._paletteArray.length; j++) { + if (this._paletteArray[ j ]) { + point = this._paletteArray[j]; + compactedPaletteArray[i] = point; + i32idx[ point.uint32 ] = i; i++; } } - this._idxrgb = idxrgb; - this._idxi32 = idxi32; + this._paletteArray = compactedPaletteArray; this._i32idx = i32idx; } } @@ -376,7 +364,7 @@ module ColorQuantization { // reduces similar colors from an importance-sorted Uint32 rgba array public reducePal(idxi32) { // if pre-defined palette's length exceeds target - if (this._idxrgb.length > this._colors) { + if (this._paletteArray.length > this._colors) { // quantize histogram to existing palette var len = idxi32.length, keep = {}, uniques = 0, idx, pruned = false; @@ -472,11 +460,11 @@ module ColorQuantization { for (var i = 0; i < len; i++) { if (!idxrgb[ i ]) continue; - this._idxrgb.push(idxrgb[ i ]); - this._idxi32.push(idxi32[ i ]); + var point : Point = new Point(idxrgb[i]); + this._paletteArray.push(point); - this._i32idx[ idxi32[ i ] ] = this._idxi32.length - 1; - this._i32rgb[ idxi32[ i ] ] = idxrgb[ i ]; + this._i32idx[ point.uint32 ] = this._paletteArray.length - 1; + this._i32rgb[ point.uint32 ] = idxrgb[ i ]; } } } @@ -546,20 +534,16 @@ module ColorQuantization { // TODO: group very low lum and very high lum colors // TODO: pass custom sort order public sortPal() { - var self = this; - - this._idxi32.sort(function (a, b) { - var idxA = self._i32idx[ a ], - idxB = self._i32idx[ b ], - rgbA = self._idxrgb[ idxA ], - rgbB = self._idxrgb[ idxB ]; + this._paletteArray.sort((a : Point, b : Point) => { + var rgbA = a.rgba, + rgbB = b.rgba; var hslA = Utils.rgb2hsl(rgbA[ 0 ], rgbA[ 1 ], rgbA[ 2 ]), hslB = Utils.rgb2hsl(rgbB[ 0 ], rgbB[ 1 ], rgbB[ 2 ]); // sort all grays + whites together - var hueA = (rgbA[ 0 ] == rgbA[ 1 ] && rgbA[ 1 ] == rgbA[ 2 ]) ? -1 : Utils.hueGroup(hslA.h, self._hueGroups); - var hueB = (rgbB[ 0 ] == rgbB[ 1 ] && rgbB[ 1 ] == rgbB[ 2 ]) ? -1 : Utils.hueGroup(hslB.h, self._hueGroups); + var hueA = (rgbA[ 0 ] == rgbA[ 1 ] && rgbA[ 1 ] == rgbA[ 2 ]) ? -1 : Utils.hueGroup(hslA.h, this._hueGroups); + var hueB = (rgbB[ 0 ] == rgbB[ 1 ] && rgbB[ 1 ] == rgbB[ 2 ]) ? -1 : Utils.hueGroup(hslB.h, this._hueGroups); var hueDiff = hueB - hueA; if (hueDiff) return -hueDiff; @@ -572,9 +556,8 @@ module ColorQuantization { }); // sync idxrgb & i32idx - this._idxi32.forEach(function (i32, i) { - this._idxrgb[ i ] = this._i32rgb[ i32 ]; - this._i32idx[ i32 ] = i; + this._paletteArray.forEach(function (point : Point, i) { + this._i32idx[ point.uint32 ] = i; }, this); } @@ -592,19 +575,23 @@ module ColorQuantization { } // TOTRY: use HUSL - http://boronine.com/husl/ - public nearestColor(i32) { + public nearestColor(i32) : Point { var idx = this.nearestIndex(i32); - return idx === null ? 0 : this._idxi32[ idx ]; + if(idx === null) throw new Error("color i32 should be 0, but why null?"); + return this._paletteArray[ idx ]; } // TOTRY: use HUSL - http://boronine.com/husl/ public nearestIndex(i32) { +/* // alpha 0 returns null index if ((i32 & 0xff000000) >> 24 == 0) return null; +*/ - if (this._useCache && ("" + i32) in this._i32idx) - return this._i32idx[ i32 ]; + if (this._useCache && ("" + i32) in this._i32idx) { + return this._i32idx[i32]; + } var min = 1000, idx, @@ -614,12 +601,12 @@ module ColorQuantization { (i32 >>> 16) & 0xff, (i32 >>> 24) & 0xff ], - len = this._idxrgb.length; + len = this._paletteArray.length; for (var i = 0; i < len; i++) { - if (!this._idxrgb[ i ]) continue; // sparse palettes + if (!this._paletteArray[ i ]) continue; // sparse palettes - var dist = Utils.distEuclidean(rgb, this._idxrgb[ i ]); + var dist = Utils.distEuclidean(rgb, this._paletteArray[ i ].rgba); if (dist < min) { min = dist; @@ -627,6 +614,8 @@ module ColorQuantization { } } + if(typeof idx === "undefined") throw new Error("x"); + return idx; } diff --git a/ts/point.js b/ts/point.js new file mode 100644 index 0000000..4e308a9 --- /dev/null +++ b/ts/point.js @@ -0,0 +1,69 @@ +var ColorQuantization; +(function (ColorQuantization) { + var Point = (function () { + function Point() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i - 0] = arguments[_i]; + } + this.set.apply(this, args); + } + Point.prototype.set = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i - 0] = arguments[_i]; + } + switch (args.length) { + case 1: + if (typeof args[0] === "number") { + this.uint32 = args[0]; + this._loadRGBA(); + } + else if (Utils.typeOf(args[0]) === "Array") { + this.r = args[0][0]; + this.g = args[0][1]; + this.b = args[0][2]; + this.a = args[0][3]; + this._loadUINT32(); + } + else { + throw new Error("Point.constructor/set: unsupported single parameter"); + } + break; + case 4: + this.r = args[0]; + this.g = args[1]; + this.b = args[2]; + this.a = args[3]; + this._loadUINT32(); + break; + default: + throw new Error("Point.constructor/set should have parameter/s"); + } + this._loadQuadruplet(); + }; + Point.prototype._loadUINT32 = function () { + this.uint32 = ((this.a << 24) | + (this.b << 16) | + (this.g << 8) | + this.r // red + ) >>> 0; + }; + Point.prototype._loadRGBA = function () { + this.r = this.uint32 & 0xff; + this.g = (this.uint32 >>> 8) & 0xff; + this.b = (this.uint32 >>> 16) & 0xff; + this.a = (this.uint32 >>> 24) & 0xff; + }; + Point.prototype._loadQuadruplet = function () { + this.rgba = [ + this.r, + this.g, + this.b, + this.a + ]; + }; + return Point; + })(); + ColorQuantization.Point = Point; +})(ColorQuantization || (ColorQuantization = {})); diff --git a/ts/point.ts b/ts/point.ts index fec3fc9..5ce5eed 100644 --- a/ts/point.ts +++ b/ts/point.ts @@ -6,17 +6,27 @@ module ColorQuantization { public b : number; public a : number; public uint32 : number; + public rgba : number[]; // TODO: better name is quadruplet or quad may be? constructor(...args : number[]) { - this.set(args); + this.set(...args); } - public set(...args) { + public set(...args : number[]) { switch(args.length) { case 1: - this.uint32 = args[0]; - - this._loadRGBA(); + if(typeof args[0] === "number") { + this.uint32 = args[0]; + this._loadRGBA(); + } else if(Utils.typeOf(args[0]) === "Array") { + this.r = args[0][0]; + this.g = args[0][1]; + this.b = args[0][2]; + this.a = args[0][3]; + this._loadUINT32(); + } else { + throw new Error("Point.constructor/set: unsupported single parameter"); + } break; case 4: @@ -30,6 +40,8 @@ module ColorQuantization { default: throw new Error("Point.constructor/set should have parameter/s"); } + + this._loadQuadruplet(); } private _loadUINT32() { @@ -47,6 +59,15 @@ module ColorQuantization { this.b = (this.uint32 >>> 16) & 0xff; this.a = (this.uint32 >>> 24) & 0xff; } + + private _loadQuadruplet() { + this.rgba = [ + this.r, + this.g, + this.b, + this.a + ]; + } } } From 4f2ff26a6d9c627f50db484894cc5ece1c6d85fb Mon Sep 17 00:00:00 2001 From: Igor Date: Thu, 14 May 2015 00:21:42 +0300 Subject: [PATCH 09/23] useCache/i32idx usage fixed --- ts/colorQuant.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index d75458b..7312e56 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -614,7 +614,7 @@ module ColorQuantization { } } - if(typeof idx === "undefined") throw new Error("x"); + this._i32idx[i32] = idx; return idx; } From a92ca67b64b982228720b865fe43088d55a3cb49 Mon Sep 17 00:00:00 2001 From: igorbz Date: Thu, 14 May 2015 11:42:21 +0300 Subject: [PATCH 10/23] code cleanup, deletion of js/js.map added to force WebStorm to reread newly built --- ts/build.cmd | 2 ++ ts/point.js | 69 ---------------------------------------------------- 2 files changed, 2 insertions(+), 69 deletions(-) delete mode 100644 ts/point.js diff --git a/ts/build.cmd b/ts/build.cmd index b67f5aa..e8583c0 100644 --- a/ts/build.cmd +++ b/ts/build.cmd @@ -1,3 +1,5 @@ pushd %~dp0 +del /f/q colorQuant.js +del /f/q colorQuant.js.map tsc colorQuant.ts --sourcemap --out colorQuant.js popd diff --git a/ts/point.js b/ts/point.js deleted file mode 100644 index 4e308a9..0000000 --- a/ts/point.js +++ /dev/null @@ -1,69 +0,0 @@ -var ColorQuantization; -(function (ColorQuantization) { - var Point = (function () { - function Point() { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - this.set.apply(this, args); - } - Point.prototype.set = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - switch (args.length) { - case 1: - if (typeof args[0] === "number") { - this.uint32 = args[0]; - this._loadRGBA(); - } - else if (Utils.typeOf(args[0]) === "Array") { - this.r = args[0][0]; - this.g = args[0][1]; - this.b = args[0][2]; - this.a = args[0][3]; - this._loadUINT32(); - } - else { - throw new Error("Point.constructor/set: unsupported single parameter"); - } - break; - case 4: - this.r = args[0]; - this.g = args[1]; - this.b = args[2]; - this.a = args[3]; - this._loadUINT32(); - break; - default: - throw new Error("Point.constructor/set should have parameter/s"); - } - this._loadQuadruplet(); - }; - Point.prototype._loadUINT32 = function () { - this.uint32 = ((this.a << 24) | - (this.b << 16) | - (this.g << 8) | - this.r // red - ) >>> 0; - }; - Point.prototype._loadRGBA = function () { - this.r = this.uint32 & 0xff; - this.g = (this.uint32 >>> 8) & 0xff; - this.b = (this.uint32 >>> 16) & 0xff; - this.a = (this.uint32 >>> 24) & 0xff; - }; - Point.prototype._loadQuadruplet = function () { - this.rgba = [ - this.r, - this.g, - this.b, - this.a - ]; - }; - return Point; - })(); - ColorQuantization.Point = Point; -})(ColorQuantization || (ColorQuantization = {})); From 41c6e821d0cab00443f4ea3209d05c86b1ff4a19 Mon Sep 17 00:00:00 2001 From: igorbz Date: Thu, 14 May 2015 11:43:39 +0300 Subject: [PATCH 11/23] code cleanup, sort optimization, colors with alpha=0 fix --- ts/colorQuant.ts | 19 ++++++------------- ts/utils.ts | 18 ++++++++++-------- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index 7312e56..9300095 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -71,9 +71,6 @@ module ColorQuantization { // reverse lookup {i32:idx} private _i32idx = {}; - // {i32:rgb} - private _i32rgb = {}; - // enable color caching (also incurs overhead of cache misses and cache building) private _useCache = true; @@ -113,7 +110,6 @@ module ColorQuantization { if (this._paletteArray.length > 0) { this._paletteArray.forEach(function (point : Point, i) { this._i32idx[ point.uint32 ] = i; - this._i32rgb[ point.uint32 ] = point.rgba; }, this); } } @@ -411,18 +407,18 @@ module ColorQuantization { // iterate palette for (var i = 0; i < len; i++) { - var pxi = idxrgb[ i ], i32i = idxi32[ i ]; + var pxi = idxrgb[ i ]; if (!pxi) continue; for (var j = i + 1; j < len; j++) { - var pxj = idxrgb[ j ], i32j = idxi32[ j ]; + var pxj = idxrgb[ j ]; if (!pxj) continue; var dist = Utils.distEuclidean(pxi, pxj); if (dist < thold) { // store index,rgb,dist - memDist.push([ j, pxj, i32j, dist ]); + memDist.push([ j, pxj, dist ]); // kill squashed value delete(idxrgb[ j ]); @@ -442,7 +438,7 @@ module ColorQuantization { if (palLen < this._colors) { // sort descending Utils.sort.call(memDist, function (a, b) { - return b[ 3 ] - a[ 3 ]; + return b[ 2 ] - a[ 2 ]; }); var k = 0; @@ -464,7 +460,6 @@ module ColorQuantization { this._paletteArray.push(point); this._i32idx[ point.uint32 ] = this._paletteArray.length - 1; - this._i32rgb[ point.uint32 ] = idxrgb[ i ]; } } } @@ -479,7 +474,7 @@ module ColorQuantization { col = buf32[ i ]; // skip transparent - if ((col & 0xff000000) >> 24 == 0) continue; + //if ((col & 0xff000000) >> 24 == 0) continue; // collect hue stats if (this._hueStats) @@ -510,7 +505,7 @@ module ColorQuantization { col = buf32[ i ]; // skip transparent - if ((col & 0xff000000) >> 24 == 0) return; + //if ((col & 0xff000000) >> 24 == 0) return; // collect hue stats if (this._hueStats) @@ -577,7 +572,6 @@ module ColorQuantization { // TOTRY: use HUSL - http://boronine.com/husl/ public nearestColor(i32) : Point { var idx = this.nearestIndex(i32); - if(idx === null) throw new Error("color i32 should be 0, but why null?"); return this._paletteArray[ idx ]; } @@ -615,7 +609,6 @@ module ColorQuantization { } this._i32idx[i32] = idx; - return idx; } diff --git a/ts/utils.ts b/ts/utils.ts index ac3c3d2..42b6352 100644 --- a/ts/utils.ts +++ b/ts/utils.ts @@ -187,14 +187,16 @@ module ColorQuantization.Utils { // returns array of hash keys sorted by their values export function sortedHashKeys(obj, desc) { - var keys = []; - - for (var key in obj) - keys.push(key); - - return sort.call(keys, function (a, b) { - return desc ? obj[ b ] - obj[ a ] : obj[ a ] - obj[ b ]; - }); + var keys = Object.keys(obj); + if(desc) { + return sort.call(keys, function (a, b) { + return obj[ b ] - obj[ a ]; + }); + } else { + return sort.call(keys, function (a, b) { + return obj[ a ] - obj[ b ]; + }); + } } var rd = 255, From 25bd9d5b175fc6b5f52612ce1e2e1dcf39a82df7 Mon Sep 17 00:00:00 2001 From: igorbz Date: Thu, 14 May 2015 13:26:20 +0300 Subject: [PATCH 12/23] pointBuffer class created (import = 100%, export = 0%), not integrated with colorQuangt yet, need more work --- ts/colorQuant.ts | 1 + ts/pointBuffer.ts | 95 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 ts/pointBuffer.ts diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index 9300095..d642ad7 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -6,6 +6,7 @@ */ /// +/// /// /// /// diff --git a/ts/pointBuffer.ts b/ts/pointBuffer.ts new file mode 100644 index 0000000..6845479 --- /dev/null +++ b/ts/pointBuffer.ts @@ -0,0 +1,95 @@ +/// +module ColorQuantization { + + // TODO: http://www.javascripture.com/Uint8ClampedArray + // TODO: Uint8ClampedArray is better than Uint8Array to avoid checking for out of bounds + // TODO: check performance (it seems identical) http://jsperf.com/uint8-typed-array-vs-imagedata/4 + /* + + TODO: Examples: + + var x = new Uint8ClampedArray([17, -45.3]); + console.log(x[0]); // 17 + console.log(x[1]); // 0 + console.log(x.length); // 2 + + var x = new Uint8Array([17, -45.3]); + console.log(x[0]); // 17 + console.log(x[1]); // 211 + console.log(x.length); // 2 + + */ + + export class PointHolder { + private _pointArray : Point[]; + private _width : number; + private _height : number; + + constructor() { + } + + public importHTMLImageElement(img : HTMLImageElement) : void { + var width = img.naturalWidth, + height = img.naturalHeight; + + var canvas = document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + + var ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0, width,height, 0, 0, width, height); + + this.importHTMLCanvasElement(canvas); + } + + public importHTMLCanvasElement(canvas : HTMLCanvasElement) : void { + var width = canvas.width, + height = canvas.height; + + var ctx = canvas.getContext("2d"), + imgData = ctx.getImageData(0, 0, width, height); + + this.importImageData(imgData); + } + + public importNodeCanvas(canvas : any) : void { + this.importHTMLCanvasElement(canvas); + } + + public importImageData(imageData : ImageData) : void { + var width = imageData.width, + height = imageData.height; + + this.importCanvasPixelArray(imageData.data, width, height); +/* + var buf8; + if (Utils.typeOf(imageData.data) == "CanvasPixelArray") + buf8 = new Uint8Array(imageData.data); + else + buf8 = imageData.data; + + this.importUint32Array(new Uint32Array(buf8.buffer), width, height); +*/ + } + + public importArray(data : Array, width : number, height : number) : void { + var uint8array = new Uint8Array(data); + this.importUint32Array(new Uint32Array(uint8array.buffer), width, height); + } + + public importCanvasPixelArray(data : any, width : number, height : number) { + this.importArray(data, width, height); + } + + public importUint32Array(uint32array : Uint32Array, width : number, height : number) : void { + this._width = width; + this._height = height; + + this._pointArray = [];//new Array(uint32array.length); + for(var i = 0, l = uint32array.length; i < l; i++) { + this._pointArray[i] = new Point(uint32array[i]); + } + } + } + +} From 20a44fe2a8cf9a2bf63490f74684f65fdf70e8bf Mon Sep 17 00:00:00 2001 From: igorbz Date: Thu, 14 May 2015 18:20:17 +0300 Subject: [PATCH 13/23] pointBuffer: used in dither, 2 usage left to rewrite --- ts/colorQuant.ts | 103 +++++++++++++++++++++++++++------------------- ts/pointBuffer.ts | 31 ++++++++++++-- 2 files changed, 88 insertions(+), 46 deletions(-) diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index d642ad7..8a86026 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -185,16 +185,15 @@ module ColorQuantization { var ds = kernels[ kernel ]; - var data = Utils.getImageData(img), -// buf8 = data.buf8, - buf32 = data.buf32, - width = data.width, - height = data.height, - len = buf32.length; + var pointBuffer = new PointBuffer(); + pointBuffer.importHTMLImageElement(img); - var dir = serpentine ? -1 : 1; + var pointArray = pointBuffer.getPointArray(), + width = pointBuffer.getWidth(), + height = pointBuffer.getHeight(), + dir = serpentine ? -1 : 1; - (console).profile("dither"); + //(console).profile("dither"); for (var y = 0; y < height; y++) { if (serpentine) dir = dir * -1; @@ -204,29 +203,25 @@ module ColorQuantization { for (var x = (dir == 1 ? 0 : width - 1), xend = (dir == 1 ? width : 0); x !== xend; x += dir) { // Image pixel var idx = lni + x, - i32 = buf32[ idx ], - r1 = (i32 & 0xff), - g1 = (i32 >>> 8) & 0xff, - b1 = (i32 >>> 16) & 0xff, - a1 = (i32 >>> 24) & 0xff; + p1 = pointArray[ idx ]; // Reduced pixel - var point = this.nearestColor(i32); + var point = this.nearestColor_Point(p1); - buf32[ idx ] = point.uint32; + pointArray[ idx ] = point; // dithering strength if (this._dithDelta) { - var dist = Utils.distEuclidean([ r1, g1, b1, a1 ], point.rgba); + var dist = Utils.distEuclidean(p1.rgba, point.rgba); if (dist < this._dithDelta) continue; } // Component distance - var er = r1 - point.r, - eg = g1 - point.g, - eb = b1 - point.b, - ea = a1 - point.a; + var er = p1.r - point.r, + eg = p1.g - point.g, + eb = p1.b - point.b, + ea = p1.a - point.a; for (var i = (dir == 1 ? 0 : ds.length - 1), end = (dir == 1 ? ds.length : 0); i !== end; i += dir) { var x1 = ds[ i ][ 1 ] * dir, @@ -237,33 +232,22 @@ module ColorQuantization { if (x1 + x >= 0 && x1 + x < width && y1 + y >= 0 && y1 + y < height) { var d = ds[ i ][ 0 ]; var idx2 = idx + (lni2 + x1), - i32y = buf32[ idx2 ]; - - var r3 = (i32y & 0xff), - g3 = (i32y >>> 8) & 0xff, - b3 = (i32y >>> 16) & 0xff, - a3 = (i32y >>> 24) & 0xff; - - var r4 = Math.max(0, Math.min(255, r3 + er * d)), - g4 = Math.max(0, Math.min(255, g3 + eg * d)), - b4 = Math.max(0, Math.min(255, b3 + eb * d)), - a4 = Math.max(0, Math.min(255, a3 + ea * d)); - - buf32[ idx2 ] = ( - (a4 << 24) | // alpha - (b4 << 16) | // blue - (g4 << 8) | // green - r4 // red - ) >>> 0; - - //if(this.idxi32.indexOf(buf32[idx2]) < 0) throw new Error("no palette entry!"); + p3 = pointArray[ idx2 ]; + + var r4 = Math.max(0, Math.min(255, p3.r + er * d)), + g4 = Math.max(0, Math.min(255, p3.g + eg * d)), + b4 = Math.max(0, Math.min(255, p3.b + eb * d)), + a4 = Math.max(0, Math.min(255, p3.a + ea * d)); + + pointArray[ idx2 ].set(r4, g4, b4, a4); } } } } - (console).profileEnd("dither"); - return buf32; + //(console).profileEnd("dither"); + + return pointBuffer.exportUint32Array(); } // reduces histogram to palette, remaps & memoizes reduced colors @@ -576,6 +560,11 @@ module ColorQuantization { return this._paletteArray[ idx ]; } + public nearestColor_Point(point : Point) : Point { + var idx = this.nearestIndex_Point(point); + return this._paletteArray[ idx ]; + } + // TOTRY: use HUSL - http://boronine.com/husl/ public nearestIndex(i32) { /* @@ -613,6 +602,36 @@ module ColorQuantization { return idx; } + public nearestIndex_Point(point : Point) : number { + /* + // alpha 0 returns null index + if ((i32 & 0xff000000) >> 24 == 0) + return null; + */ + + if (this._useCache && ("" + point.uint32) in this._i32idx) { + return this._i32idx[point.uint32]; + } + + var min = 1000, + idx, + len = this._paletteArray.length; + + for (var i = 0; i < len; i++) { + if (!this._paletteArray[ i ]) continue; // sparse palettes + + var dist = Utils.distEuclidean(point.rgba, this._paletteArray[ i ].rgba); + + if (dist < min) { + min = dist; + idx = i; + } + } + + this._i32idx[point.uint32] = idx; + return idx; + } + public cacheHistogram(idxi32) { for (var i = 0, i32 = idxi32[ i ]; i < idxi32.length && this._histogram[ i32 ] >= this._cacheFreq; i32 = idxi32[ i++ ]) this._i32idx[ i32 ] = this.nearestIndex(i32); diff --git a/ts/pointBuffer.ts b/ts/pointBuffer.ts index 6845479..4de2a57 100644 --- a/ts/pointBuffer.ts +++ b/ts/pointBuffer.ts @@ -20,7 +20,7 @@ module ColorQuantization { */ - export class PointHolder { + export class PointBuffer { private _pointArray : Point[]; private _width : number; private _height : number; @@ -28,6 +28,18 @@ module ColorQuantization { constructor() { } + public getWidth() : number { + return this._width; + } + + public getHeight() : number { + return this._height; + } + + public getPointArray() : Point[] { + return this._pointArray; + } + public importHTMLImageElement(img : HTMLImageElement) : void { var width = img.naturalWidth, height = img.naturalHeight; @@ -36,7 +48,7 @@ module ColorQuantization { canvas.width = width; canvas.height = height; - var ctx = canvas.getContext("2d"); + var ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0, width,height, 0, 0, width, height); this.importHTMLCanvasElement(canvas); @@ -46,7 +58,7 @@ module ColorQuantization { var width = canvas.width, height = canvas.height; - var ctx = canvas.getContext("2d"), + var ctx = canvas.getContext("2d"), imgData = ctx.getImageData(0, 0, width, height); this.importImageData(imgData); @@ -72,7 +84,7 @@ module ColorQuantization { */ } - public importArray(data : Array, width : number, height : number) : void { + public importArray(data : number[], width : number, height : number) : void { var uint8array = new Uint8Array(data); this.importUint32Array(new Uint32Array(uint8array.buffer), width, height); } @@ -90,6 +102,17 @@ module ColorQuantization { this._pointArray[i] = new Point(uint32array[i]); } } + + public exportUint32Array() : Uint32Array { + var l = this._pointArray.length, + uint32Array = new Uint32Array(l); + + for(var i = 0; i < l; i++) { + uint32Array[i] = this._pointArray[i].uint32; + } + + return uint32Array; + } } } From e4d22eec2f502c5a653129a833ee013d1b873b78 Mon Sep 17 00:00:00 2001 From: igorbz Date: Thu, 14 May 2015 18:31:20 +0300 Subject: [PATCH 14/23] pointBuffer: used in sample, 1 usage left to rewrite --- demo/js/demo.js | 4 +++- ts/colorQuant.ts | 26 ++++++++++++++------------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/demo/js/demo.js b/demo/js/demo.js index 526ce4e..276b10e 100644 --- a/demo/js/demo.js +++ b/demo/js/demo.js @@ -99,7 +99,9 @@ function process(srcs) { var img = this, id = baseName(img.src)[0]; ti.mark("sample '" + id + "'", function(){ - quant.sample(img); + var pointBuffer = new ColorQuantization.PointBuffer(); + pointBuffer.importHTMLImageElement(img); + quant.sample(pointBuffer); }); }); diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index 8a86026..e18f23c 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -116,18 +116,16 @@ module ColorQuantization { } // gathers histogram info - public sample(img, width) { + public sample(pointBuffer : PointBuffer) { if (this._palLocked) throw "Cannot sample additional images, palette already assembled."; - var data = Utils.getImageData(img, width); - switch (this._method) { case 1: - this.colorStats1D(data.buf32); + this.colorStats1D(pointBuffer); break; case 2: - this.colorStats2D(data.buf32, data.width); + this.colorStats2D(pointBuffer); break; } } @@ -450,13 +448,13 @@ module ColorQuantization { } // global top-population - public colorStats1D(buf32) { + public colorStats1D(pointBuffer : PointBuffer) { var histG = this._histogram, - num = 0, col, - len = buf32.length; + pointArray = pointBuffer.getPointArray(), + len = pointArray.length; for (var i = 0; i < len; i++) { - col = buf32[ i ]; + var col = pointArray[i].uint32; // skip transparent //if ((col & 0xff000000) >> 24 == 0) continue; @@ -475,11 +473,15 @@ module ColorQuantization { // population threshold within subregions // FIXME: this can over-reduce (few/no colors same?), need a way to keep // important colors that dont ever reach local thresholds (gradients?) - public colorStats2D(buf32, width) { + public colorStats2D(pointBuffer : PointBuffer) { + var width = pointBuffer.getWidth(), + height = pointBuffer.getHeight(), + pointArray = pointBuffer.getPointArray(); + var boxW = this._boxSize[ 0 ], boxH = this._boxSize[ 1 ], area = boxW * boxH, - boxes = Utils.makeBoxes(width, buf32.length / width, boxW, boxH), + boxes = Utils.makeBoxes(width, height, boxW, boxH), histG = this._histogram; boxes.forEach(function (box) { @@ -487,7 +489,7 @@ module ColorQuantization { histL = {}, col; this.iterBox(box, width, function (i) { - col = buf32[ i ]; + col = pointArray[i].uint32; // skip transparent //if ((col & 0xff000000) >> 24 == 0) return; From eacbb0e2359072aac44671017e4f495b1cf29fef Mon Sep 17 00:00:00 2001 From: igorbz Date: Thu, 14 May 2015 18:53:52 +0300 Subject: [PATCH 15/23] pointBuffer: 100% --- demo/js/demo.js | 28 ++++++++++++++++++---------- ts/colorQuant.ts | 37 ++++++++++++++----------------------- ts/point.ts | 9 +++++++++ ts/pointBuffer.ts | 5 +++++ 4 files changed, 46 insertions(+), 33 deletions(-) diff --git a/demo/js/demo.js b/demo/js/demo.js index 276b10e..453ec58 100644 --- a/demo/js/demo.js +++ b/demo/js/demo.js @@ -80,7 +80,8 @@ function process(srcs) { ti.start(); $.getImgs(srcs, function() { - var imgs = arguments; + var imgs = []; + for(var i = 0, l = arguments.length; i < l; i++) imgs[i] = arguments[i]; ti.mark("image(s) loaded"); @@ -93,15 +94,22 @@ function process(srcs) { }); var opts = (srcs.length == 1) ? getOpts(baseName(srcs[0])[0]) : dflt_opts, - quant = new ColorQuantization.RgbQuant(opts); + quant = new ColorQuantization.RgbQuant(opts), + pointBuffers = []; - $.each(imgs, function() { - var img = this, id = baseName(img.src)[0]; + + ti.mark("create pointBuffers", function() { + imgs.forEach(function (img, index) { + pointBuffers[index] = new ColorQuantization.PointBuffer(); + pointBuffers[index].importHTMLImageElement(img); + }); + }); + + imgs.forEach(function (img, index) { + var id = baseName(img.src)[0]; ti.mark("sample '" + id + "'", function(){ - var pointBuffer = new ColorQuantization.PointBuffer(); - pointBuffer.importHTMLImageElement(img); - quant.sample(pointBuffer); + quant.sample(pointBuffers[index]); }); }); @@ -115,12 +123,12 @@ function process(srcs) { $palt.empty().append(pcan); $redu.empty(); - $(imgs).each(function() { - var img = this, id = baseName(img.src)[0]; + imgs.forEach(function (img, index) { + var id = baseName(img.src)[0]; var img8; ti.mark("reduce '" + id + "'", function() { - img8 = quant.reduce(img); + img8 = quant.reduce(pointBuffers[index]).exportUint8Array(); }); ti.mark("reduced -> DOM", function() { diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index e18f23c..80d9417 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -133,7 +133,7 @@ module ColorQuantization { // image quantizer // todo: memoize colors here also // @retType: 1 - Uint8Array (default), 2 - Indexed array, 3 - Match @img type (unimplemented, todo) - public reduce(img, retType, dithKern, dithSerp) : any { + public reduce(pointBuffer : PointBuffer, retType, dithKern, dithSerp) : any { if (!this._palLocked) this.buildPal(); @@ -143,22 +143,21 @@ module ColorQuantization { retType = retType || 1; // reduce w/dither - var buf32; - if (dithKern) - buf32 = this.dither(img, dithKern, dithSerp); - else { - var data = Utils.getImageData(img); - buf32 = data.buf32; + if (dithKern) { + pointBuffer = this.dither(pointBuffer, dithKern, dithSerp); } - var len : number = buf32.length, + var pointArray = pointBuffer.getPointArray(), + len : number = pointArray.length, out32 = new Uint32Array(len); for (var i = 0; i < len; i++) { - var i32 : number = buf32[ i ]; - out32[ i ] = this.nearestColor(i32).uint32; + pointArray[ i ].from(this.nearestColor(pointArray[ i ])); } + return pointBuffer; + +/* if (retType == 1) return new Uint8Array(out32.buffer); @@ -173,19 +172,17 @@ module ColorQuantization { return out; } +*/ } // adapted from http://jsbin.com/iXofIji/2/edit by PAEz - public dither(img, kernel, serpentine) { + public dither(pointBuffer : PointBuffer, kernel, serpentine) : PointBuffer { if (!kernel || !kernels[ kernel ]) { throw 'Unknown dithering kernel: ' + kernel; } var ds = kernels[ kernel ]; - var pointBuffer = new PointBuffer(); - pointBuffer.importHTMLImageElement(img); - var pointArray = pointBuffer.getPointArray(), width = pointBuffer.getWidth(), height = pointBuffer.getHeight(), @@ -204,7 +201,7 @@ module ColorQuantization { p1 = pointArray[ idx ]; // Reduced pixel - var point = this.nearestColor_Point(p1); + var point = this.nearestColor(p1); pointArray[ idx ] = point; @@ -244,8 +241,7 @@ module ColorQuantization { } //(console).profileEnd("dither"); - - return pointBuffer.exportUint32Array(); + return pointBuffer; } // reduces histogram to palette, remaps & memoizes reduced colors @@ -557,12 +553,7 @@ module ColorQuantization { } // TOTRY: use HUSL - http://boronine.com/husl/ - public nearestColor(i32) : Point { - var idx = this.nearestIndex(i32); - return this._paletteArray[ idx ]; - } - - public nearestColor_Point(point : Point) : Point { + public nearestColor(point : Point) : Point { var idx = this.nearestIndex_Point(point); return this._paletteArray[ idx ]; } diff --git a/ts/point.ts b/ts/point.ts index 5ce5eed..cf3fcee 100644 --- a/ts/point.ts +++ b/ts/point.ts @@ -12,6 +12,15 @@ module ColorQuantization { this.set(...args); } + public from(point : Point) { + this.r = point.r; + this.g = point.g; + this.b = point.b; + this.a = point.a; + this.uint32 = point.uint32; + this.rgba = point.rgba.slice(0); + } + public set(...args : number[]) { switch(args.length) { case 1: diff --git a/ts/pointBuffer.ts b/ts/pointBuffer.ts index 4de2a57..6e6ae06 100644 --- a/ts/pointBuffer.ts +++ b/ts/pointBuffer.ts @@ -113,6 +113,11 @@ module ColorQuantization { return uint32Array; } + + public exportUint8Array() : Uint8Array { + return new Uint8Array(this.exportUint32Array().buffer); + } + } } From bebd39a9c7f37cc09b9c089e6c4f005834f94cc2 Mon Sep 17 00:00:00 2001 From: Igor Date: Fri, 15 May 2015 00:32:00 +0300 Subject: [PATCH 16/23] refactoring --- ts/colorQuant.ts | 63 +++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 35 deletions(-) diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index 80d9417..51ae55e 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -18,7 +18,7 @@ module ColorQuantization { } export class RgbQuant { // 1 = by global population, 2 = subregion population threshold - private _method : number = 2; + private _method : number = 1; // desired final palette size private _colors : number = 256; @@ -148,8 +148,7 @@ module ColorQuantization { } var pointArray = pointBuffer.getPointArray(), - len : number = pointArray.length, - out32 = new Uint32Array(len); + len : number = pointArray.length; for (var i = 0; i < len; i++) { pointArray[ i ].from(this.nearestColor(pointArray[ i ])); @@ -248,23 +247,22 @@ module ColorQuantization { public buildPal(noSort?) { if (this._palLocked || this._paletteArray.length > 0 && this._paletteArray.length <= this._colors) return; - var histG = this._histogram, - sorted = Utils.sortedHashKeys(histG, true); + var sorted = Utils.sortedHashKeys(this._histogram, true); if (sorted.length == 0) throw "Nothing has been sampled, palette cannot be built."; switch (this._method) { case 1: - var cols = this._initColors, - last = sorted[ cols - 1 ], - freq = histG[ last ]; + var initialColorsLimit = Math.min(sorted.length, this._initColors ), + last = sorted[ initialColorsLimit - 1 ], + freq = this._histogram[ last ]; - var idxi32 = sorted.slice(0, cols); + var idxi32 = sorted.slice(0, initialColorsLimit); // add any cut off colors with same freq as last - var pos = cols, len = sorted.length; - while (pos < len && histG[ sorted[ pos ] ] == freq) + var pos = initialColorsLimit, len = sorted.length; + while (pos < len && this._histogram[ sorted[ pos ] ] == freq) idxi32.push(sorted[ pos++ ]); // inject min huegroup colors @@ -301,25 +299,19 @@ module ColorQuantization { return tuples ? this._paletteArray : new Uint8Array((new Uint32Array(uint32Array)).buffer); } - public prunePal(keep) { - var /*i32,*/ - point : Point; + // TODO: check usage, not tested! + public prunePal(keep : number[]) { + var point : Point; for (var j = 0; j < this._paletteArray.length; j++) { - if (!keep[ j ]) { - point = this._paletteArray[ j ]; + if (keep.indexOf(j) < 0) { this._paletteArray[j] = null; - - // TODO: check if we need to delete also this._i32rgb ???? - delete this._i32idx[ point.uint32 ];// TODO: delete is forbidden operator!!! } } // compact if (this._reIndex) { - var idxrgb = [], - idxi32 = [], - i32idx = {}, + var i32idx = {}, compactedPaletteArray : Point[] = []; for (var j = 0, i = 0; j < this._paletteArray.length; j++) { @@ -341,20 +333,22 @@ module ColorQuantization { // if pre-defined palette's length exceeds target if (this._paletteArray.length > this._colors) { // quantize histogram to existing palette - var len = idxi32.length, keep = {}, uniques = 0, idx, pruned = false; - for (var i = 0; i < len; i++) { + // TODO: not tested code + var keep = [], uniqueColors = 0, idx, pruned = false; + + for (var i = 0, len = idxi32.length; i < len; i++) { // palette length reached, unset all remaining colors (sparse palette) - if (uniques == this._colors && !pruned) { + if (uniqueColors >= this._colors) { this.prunePal(keep); pruned = true; - } - - idx = this.nearestIndex(idxi32[ i ]); - - if (uniques < this._colors && !keep[ idx ]) { - keep[ idx ] = true; - uniques++; + break; + } else { + idx = this.nearestIndex(idxi32[i]); + if (keep.indexOf(idx) < 0) { + keep.push(idx); + uniqueColors++; + } } } @@ -401,6 +395,7 @@ module ColorQuantization { // kill squashed value delete(idxrgb[ j ]); + //idxrgb[ j ] = null; palLen--; } } @@ -431,13 +426,11 @@ module ColorQuantization { } } - var len = idxrgb.length; - for (var i = 0; i < len; i++) { + for (var i = 0, len = idxrgb.length; i < len; i++) { if (!idxrgb[ i ]) continue; var point : Point = new Point(idxrgb[i]); this._paletteArray.push(point); - this._i32idx[ point.uint32 ] = this._paletteArray.length - 1; } } From c8ac0264035660551e1a4fabe2adbb013ba2f6fd Mon Sep 17 00:00:00 2001 From: Igor Date: Fri, 15 May 2015 17:04:16 +0300 Subject: [PATCH 17/23] refactoring, "Point" + "importUint32Array" v8-optimized --- demo/js/demo.js | 7 ++----- ts/colorQuant.ts | 31 ++++++++-------------------- ts/point.ts | 26 ++++++++++++++++-------- ts/pointBuffer.ts | 2 +- ts/utils.ts | 52 ----------------------------------------------- 5 files changed, 28 insertions(+), 90 deletions(-) diff --git a/demo/js/demo.js b/demo/js/demo.js index 453ec58..1d5cb90 100644 --- a/demo/js/demo.js +++ b/demo/js/demo.js @@ -1,12 +1,9 @@ var cfg_edited = false; var dflt_opts = { - colors: 256, + colors: 1024, method: 2, - initColors: 4096, - minHueCols: 0, - dithKern: null, - dithSerp: false, + dithKern: "SierraLite" }; var cfgs = { diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index 51ae55e..e97c106 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -133,7 +133,7 @@ module ColorQuantization { // image quantizer // todo: memoize colors here also // @retType: 1 - Uint8Array (default), 2 - Indexed array, 3 - Match @img type (unimplemented, todo) - public reduce(pointBuffer : PointBuffer, retType, dithKern, dithSerp) : any { + public reduce(pointBuffer : PointBuffer, retType?, dithKern?, dithSerp?) : any { if (!this._palLocked) this.buildPal(); @@ -143,9 +143,11 @@ module ColorQuantization { retType = retType || 1; // reduce w/dither + var start = Date.now(); if (dithKern) { pointBuffer = this.dither(pointBuffer, dithKern, dithSerp); } + console.log("[dither]: " + (Date.now() - start)); var pointArray = pointBuffer.getPointArray(), len : number = pointArray.length; @@ -155,23 +157,6 @@ module ColorQuantization { } return pointBuffer; - -/* - if (retType == 1) - return new Uint8Array(out32.buffer); - - if (retType == 2) { - var out = [], - len : number = out32.length; - - for (var i = 0; i < len; i++) { - var i32 : number = out32[ i ]; - out[ i ] = this._i32idx[ i32 ]; - } - - return out; - } -*/ } // adapted from http://jsbin.com/iXofIji/2/edit by PAEz @@ -226,14 +211,14 @@ module ColorQuantization { if (x1 + x >= 0 && x1 + x < width && y1 + y >= 0 && y1 + y < height) { var d = ds[ i ][ 0 ]; var idx2 = idx + (lni2 + x1), - p3 = pointArray[ idx2 ]; + p3 = pointArray[idx2]; var r4 = Math.max(0, Math.min(255, p3.r + er * d)), g4 = Math.max(0, Math.min(255, p3.g + eg * d)), b4 = Math.max(0, Math.min(255, p3.b + eb * d)), a4 = Math.max(0, Math.min(255, p3.a + ea * d)); - pointArray[ idx2 ].set(r4, g4, b4, a4); + pointArray[idx2].set(r4, g4, b4, a4); } } } @@ -292,7 +277,7 @@ module ColorQuantization { this._palLocked = true; } - public palette(tuples, noSort) : any { + public palette(tuples?, noSort?) : any { this.buildPal(noSort); var uint32Array = this._paletteArray.map(point => point.uint32); @@ -394,8 +379,8 @@ module ColorQuantization { memDist.push([ j, pxj, dist ]); // kill squashed value - delete(idxrgb[ j ]); - //idxrgb[ j ] = null; + //delete(idxrgb[ j ]); + idxrgb[ j ] = null; palLen--; } } diff --git a/ts/point.ts b/ts/point.ts index cf3fcee..8607053 100644 --- a/ts/point.ts +++ b/ts/point.ts @@ -1,5 +1,10 @@ module ColorQuantization { + /** + * v8 optimized class + * 1) "constructor" should have initialization with worst types + * 2) "set" should have |0 / >>> 0 + */ export class Point { public r : number; public g : number; @@ -9,6 +14,9 @@ module ColorQuantization { public rgba : number[]; // TODO: better name is quadruplet or quad may be? constructor(...args : number[]) { + this.r = this.g = this.b = this.a = 0; + this.rgba = [ this.r , this.g , this.b , this.a ]; + this.uint32 = -1 >>> 0; this.set(...args); } @@ -25,13 +33,13 @@ module ColorQuantization { switch(args.length) { case 1: if(typeof args[0] === "number") { - this.uint32 = args[0]; + this.uint32 = args[0] >>> 0; this._loadRGBA(); } else if(Utils.typeOf(args[0]) === "Array") { - this.r = args[0][0]; - this.g = args[0][1]; - this.b = args[0][2]; - this.a = args[0][3]; + this.r = args[0][0] | 0; + this.g = args[0][1] | 0; + this.b = args[0][2] | 0; + this.a = args[0][3] | 0; this._loadUINT32(); } else { throw new Error("Point.constructor/set: unsupported single parameter"); @@ -39,10 +47,10 @@ module ColorQuantization { break; case 4: - this.r = args[0]; - this.g = args[1]; - this.b = args[2]; - this.a = args[3]; + this.r = args[0] | 0; + this.g = args[1] | 0; + this.b = args[2] | 0; + this.a = args[3] | 0; this._loadUINT32(); break; diff --git a/ts/pointBuffer.ts b/ts/pointBuffer.ts index 6e6ae06..a451dbd 100644 --- a/ts/pointBuffer.ts +++ b/ts/pointBuffer.ts @@ -99,7 +99,7 @@ module ColorQuantization { this._pointArray = [];//new Array(uint32array.length); for(var i = 0, l = uint32array.length; i < l; i++) { - this._pointArray[i] = new Point(uint32array[i]); + this._pointArray[i] = new Point(uint32array[i] | 0); // "| 0" is added for v8 optimization } } diff --git a/ts/utils.ts b/ts/utils.ts index 42b6352..eee548a 100644 --- a/ts/utils.ts +++ b/ts/utils.ts @@ -118,58 +118,6 @@ module ColorQuantization.Utils { } } - // returns uniform pixel data from various img - // TODO?: if array is passed, createimagedata, createlement canvas? take a pxlen? - export function getImageData(img, width?) { - var can, ctx, imgd, buf8, buf32, height; - - switch (typeOf(img)) { - case "HTMLImageElement": - can = document.createElement("canvas"); - can.width = img.naturalWidth; - can.height = img.naturalHeight; - ctx = can.getContext("2d"); - ctx.drawImage(img, 0, 0); - case "Canvas": - case "HTMLCanvasElement": - can = can || img; - ctx = ctx || can.getContext("2d"); - case "CanvasRenderingContext2D": - ctx = ctx || img; - can = can || ctx.canvas; - imgd = ctx.getImageData(0, 0, can.width, can.height); - case "ImageData": - imgd = imgd || img; - width = imgd.width; - if (typeOf(imgd.data) == "CanvasPixelArray") - buf8 = new Uint8Array(imgd.data); - else - buf8 = imgd.data; - case "Array": - case "CanvasPixelArray": - buf8 = buf8 || new Uint8Array(img); - case "Uint8Array": - case "Uint8ClampedArray": - buf8 = buf8 || img; - buf32 = new Uint32Array(buf8.buffer); - case "Uint32Array": - buf32 = buf32 || img; - buf8 = buf8 || new Uint8Array(buf32.buffer); - width = width || buf32.length; - height = buf32.length / width; - } - - return { - can : can, - ctx : ctx, - imgd : imgd, - buf8 : buf8, - buf32 : buf32, - width : width, - height: height - }; - } - // partitions a rect of wid x hgt into // array of bboxes of w0 x h0 (or less) export function makeBoxes(wid, hgt, w0, h0) { From ee671ee587329328248e90f8d2e76255a31eacc2 Mon Sep 17 00:00:00 2001 From: Igor Date: Fri, 15 May 2015 20:58:46 +0300 Subject: [PATCH 18/23] refactoring, nearestPoint v8-optimized --- ts/colorQuant.ts | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index e97c106..ec8b758 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -144,9 +144,12 @@ module ColorQuantization { // reduce w/dither var start = Date.now(); + + console.profile("__!dither"); if (dithKern) { pointBuffer = this.dither(pointBuffer, dithKern, dithSerp); } + (console).profileEnd("__!dither"); console.log("[dither]: " + (Date.now() - start)); var pointArray = pointBuffer.getPointArray(), @@ -532,8 +535,7 @@ module ColorQuantization { // TOTRY: use HUSL - http://boronine.com/husl/ public nearestColor(point : Point) : Point { - var idx = this.nearestIndex_Point(point); - return this._paletteArray[ idx ]; + return this._paletteArray[ this.nearestIndex_Point(point) | 0 ]; } // TOTRY: use HUSL - http://boronine.com/husl/ @@ -573,6 +575,10 @@ module ColorQuantization { return idx; } + private _nearestPointFromCache(key) { + return typeof this._i32idx[key] === "number" ? this._i32idx[key] : -1; + } + public nearestIndex_Point(point : Point) : number { /* // alpha 0 returns null index @@ -580,21 +586,31 @@ module ColorQuantization { return null; */ + if(this._useCache) { + var idx2 = this._nearestPointFromCache("" + point.uint32); + if(idx2 >= 0) return idx2; + } +/* + if (this._useCache && typeof this._i32idx["" + point.uint32] === "number") { + return this._i32idx[ "" + point.uint32]; + } +*/ +/* if (this._useCache && ("" + point.uint32) in this._i32idx) { - return this._i32idx[point.uint32]; + return this._i32idx[ "" + point.uint32]; } +*/ - var min = 1000, - idx, - len = this._paletteArray.length; + var minimalDistance = 1000, + idx = 0; - for (var i = 0; i < len; i++) { + for (var i = 0, l = this._paletteArray.length; i < l; i++) { if (!this._paletteArray[ i ]) continue; // sparse palettes - var dist = Utils.distEuclidean(point.rgba, this._paletteArray[ i ].rgba); + var distance = Utils.distEuclidean(point.rgba, this._paletteArray[ i ].rgba); - if (dist < min) { - min = dist; + if (distance < minimalDistance) { + minimalDistance = distance; idx = i; } } From 21daead594b30f0eb26474d99c66ec5bed695be3 Mon Sep 17 00:00:00 2001 From: Igor Date: Fri, 15 May 2015 23:48:20 +0300 Subject: [PATCH 19/23] refactoring --- demo/js/demo.js | 8 +- ts/colorQuant.ts | 348 +++++++++++++---------------------------------- ts/palette.ts | 119 ++++++++++++++++ 3 files changed, 217 insertions(+), 258 deletions(-) create mode 100644 ts/palette.ts diff --git a/demo/js/demo.js b/demo/js/demo.js index 1d5cb90..ae9937c 100644 --- a/demo/js/demo.js +++ b/demo/js/demo.js @@ -115,7 +115,11 @@ function process(srcs) { pal8 = quant.palette(); }); - var pcan = drawPixels(pal8, 16, 128); + // TODO: temporary solution. see Palette class todo + var uint32Array = pal8._paletteArray.map(function(point) { return point.uint32 }); + var uint8array = new Uint8Array((new Uint32Array(uint32Array)).buffer); + + var pcan = drawPixels(uint8array, 16, 128); $palt.empty().append(pcan); @@ -125,7 +129,7 @@ function process(srcs) { var img8; ti.mark("reduce '" + id + "'", function() { - img8 = quant.reduce(pointBuffers[index]).exportUint8Array(); + img8 = quant.reduce(pointBuffers[index], pal8).exportUint8Array(); }); ti.mark("reduced -> DOM", function() { diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index ec8b758..485deb0 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -6,6 +6,7 @@ */ /// +/// /// /// /// @@ -67,10 +68,8 @@ module ColorQuantization { // accumulated histogram private _histogram = {}; - private _paletteArray : Point[] = []; - - // reverse lookup {i32:idx} - private _i32idx = {}; + //private _paletteArray : Point[] = []; + private _palette : Palette; // enable color caching (also incurs overhead of cache misses and cache building) private _useCache = true; @@ -78,9 +77,6 @@ module ColorQuantization { // min color occurance count needed to qualify for caching private _cacheFreq = 10; - // allows pre-defined palettes to be re-indexed (enabling palette compacting and sorting) - private _reIndex = true; - // TODO: make interface for options constructor(opts : any) { opts = opts || {}; @@ -104,22 +100,10 @@ module ColorQuantization { // accumulated histogram this._histogram = {}; - // palette - rgb triplets - if (Object.prototype.toString.call(opts.palette) === "[object Array]") this._paletteArray = opts.palette.map(quadruplet => new Point(quadruplet)); - - // if pre-defined palette, build lookups - if (this._paletteArray.length > 0) { - this._paletteArray.forEach(function (point : Point, i) { - this._i32idx[ point.uint32 ] = i; - }, this); - } } // gathers histogram info public sample(pointBuffer : PointBuffer) { - if (this._palLocked) - throw "Cannot sample additional images, palette already assembled."; - switch (this._method) { case 1: this.colorStats1D(pointBuffer); @@ -133,21 +117,18 @@ module ColorQuantization { // image quantizer // todo: memoize colors here also // @retType: 1 - Uint8Array (default), 2 - Indexed array, 3 - Match @img type (unimplemented, todo) - public reduce(pointBuffer : PointBuffer, retType?, dithKern?, dithSerp?) : any { - if (!this._palLocked) - this.buildPal(); + public reduce(pointBuffer : PointBuffer, palette : Palette, dithKern?, dithSerp?) : any { + this._reducePalette(palette, this._colors); dithKern = dithKern || this._dithKern; dithSerp = typeof dithSerp != "undefined" ? dithSerp : this._dithSerp; - retType = retType || 1; - // reduce w/dither var start = Date.now(); console.profile("__!dither"); if (dithKern) { - pointBuffer = this.dither(pointBuffer, dithKern, dithSerp); + pointBuffer = this.dither(pointBuffer, palette, dithKern, dithSerp); } (console).profileEnd("__!dither"); console.log("[dither]: " + (Date.now() - start)); @@ -156,14 +137,14 @@ module ColorQuantization { len : number = pointArray.length; for (var i = 0; i < len; i++) { - pointArray[ i ].from(this.nearestColor(pointArray[ i ])); + pointArray[ i ].from(palette.nearestColor(pointArray[ i ])); } return pointBuffer; } // adapted from http://jsbin.com/iXofIji/2/edit by PAEz - public dither(pointBuffer : PointBuffer, kernel, serpentine) : PointBuffer { + public dither(pointBuffer : PointBuffer, palette : Palette, kernel, serpentine) : PointBuffer { if (!kernel || !kernels[ kernel ]) { throw 'Unknown dithering kernel: ' + kernel; } @@ -188,7 +169,7 @@ module ColorQuantization { p1 = pointArray[ idx ]; // Reduced pixel - var point = this.nearestColor(p1); + var point = palette.nearestColor(p1); pointArray[ idx ] = point; @@ -231,10 +212,7 @@ module ColorQuantization { return pointBuffer; } - // reduces histogram to palette, remaps & memoizes reduced colors - public buildPal(noSort?) { - if (this._palLocked || this._paletteArray.length > 0 && this._paletteArray.length <= this._colors) return; - + public getImportanceSortedColorsIDXI32() { var sorted = Utils.sortedHashKeys(this._histogram, true); if (sorted.length == 0) @@ -268,71 +246,38 @@ module ColorQuantization { return +v; }); - this.reducePal(idxi32); - - if (!noSort && this._reIndex) - this.sortPal(); - - // build cache of top histogram colors - if (this._useCache) - this.cacheHistogram(idxi32); - - this._palLocked = true; + return idxi32; } - public palette(tuples?, noSort?) : any { - this.buildPal(noSort); + // reduces histogram to palette, remaps & memoizes reduced colors + public palette() : Palette { + var idxi32 = this.getImportanceSortedColorsIDXI32(), + palette : Palette = this._buildPalette(idxi32); - var uint32Array = this._paletteArray.map(point => point.uint32); - return tuples ? this._paletteArray : new Uint8Array((new Uint32Array(uint32Array)).buffer); + palette.sort(this._hueGroups); + return palette; +/* + var uint32Array = this._palette._paletteArray.map(point => point.uint32); + return tuples ? this._palette._paletteArray : new Uint8Array((new Uint32Array(uint32Array)).buffer); +*/ } - // TODO: check usage, not tested! - public prunePal(keep : number[]) { - var point : Point; - - for (var j = 0; j < this._paletteArray.length; j++) { - if (keep.indexOf(j) < 0) { - this._paletteArray[j] = null; - } - } + // TODO: not tested method + private _reducePalette(palette : Palette, colors : number) { + if (palette._paletteArray.length > colors) { + var idxi32 = this.getImportanceSortedColorsIDXI32(); - // compact - if (this._reIndex) { - var i32idx = {}, - compactedPaletteArray : Point[] = []; - - for (var j = 0, i = 0; j < this._paletteArray.length; j++) { - if (this._paletteArray[ j ]) { - point = this._paletteArray[j]; - compactedPaletteArray[i] = point; - i32idx[ point.uint32 ] = i; - i++; - } - } - - this._paletteArray = compactedPaletteArray; - this._i32idx = i32idx; - } - } - - // reduces similar colors from an importance-sorted Uint32 rgba array - public reducePal(idxi32) { - // if pre-defined palette's length exceeds target - if (this._paletteArray.length > this._colors) { // quantize histogram to existing palette - - // TODO: not tested code var keep = [], uniqueColors = 0, idx, pruned = false; for (var i = 0, len = idxi32.length; i < len; i++) { // palette length reached, unset all remaining colors (sparse palette) - if (uniqueColors >= this._colors) { - this.prunePal(keep); + if (uniqueColors >= colors) { + palette.prunePal(keep); pruned = true; break; } else { - idx = this.nearestIndex(idxi32[i]); + idx = palette.nearestIndex(idxi32[i]); if (keep.indexOf(idx) < 0) { keep.push(idx); uniqueColors++; @@ -341,87 +286,90 @@ module ColorQuantization { } if (!pruned) { - this.prunePal(keep); + palette.prunePal(keep); pruned = true; } } + } + + // reduces similar colors from an importance-sorted Uint32 rgba array + private _buildPalette(idxi32) { + var palette : Palette = new Palette(); + // reduce histogram to create initial palette - else { - // build full rgb palette - var idxrgb = idxi32.map(function (i32) { - return [ - (i32 & 0xff), - (i32 >>> 8) & 0xff, - (i32 >>> 16) & 0xff, - (i32 >>> 24) & 0xff - ]; - }); + // build full rgb palette + var idxrgb = idxi32.map(function (i32) { + return [ + (i32 & 0xff), + (i32 >>> 8) & 0xff, + (i32 >>> 16) & 0xff, + (i32 >>> 24) & 0xff + ]; + }); - var len = idxrgb.length, - palLen = len, - thold = this._initDist; + var len = idxrgb.length, + palLen = len, + thold = this._initDist; - // palette already at or below desired length - if (palLen > this._colors) { - while (palLen > this._colors) { - var memDist = []; + // palette already at or below desired length + if (palLen > this._colors) { + while (palLen > this._colors) { + var memDist = []; - // iterate palette - for (var i = 0; i < len; i++) { - var pxi = idxrgb[ i ]; - if (!pxi) continue; + // iterate palette + for (var i = 0; i < len; i++) { + var pxi = idxrgb[i]; + if (!pxi) continue; - for (var j = i + 1; j < len; j++) { - var pxj = idxrgb[ j ]; - if (!pxj) continue; + for (var j = i + 1; j < len; j++) { + var pxj = idxrgb[j]; + if (!pxj) continue; - var dist = Utils.distEuclidean(pxi, pxj); + var dist = Utils.distEuclidean(pxi, pxj); - if (dist < thold) { - // store index,rgb,dist - memDist.push([ j, pxj, dist ]); + if (dist < thold) { + // store index,rgb,dist + memDist.push([j, pxj, dist]); - // kill squashed value - //delete(idxrgb[ j ]); - idxrgb[ j ] = null; - palLen--; - } + idxrgb[j] = null; + palLen--; } } + } - // palette reduction pass - // console.log("palette length: " + palLen); + // palette reduction pass + // console.log("palette length: " + palLen); - // if palette is still much larger than target, increment by larger initDist - thold += (palLen > this._colors * 3) ? this._initDist : this._distIncr; - } + // if palette is still much larger than target, increment by larger initDist + thold += (palLen > this._colors * 3) ? this._initDist : this._distIncr; + } - // if palette is over-reduced, re-add removed colors with largest distances from last round - if (palLen < this._colors) { - // sort descending - Utils.sort.call(memDist, function (a, b) { - return b[ 2 ] - a[ 2 ]; - }); + // if palette is over-reduced, re-add removed colors with largest distances from last round + if (palLen < this._colors) { + // sort descending + Utils.sort.call(memDist, function (a, b) { + return b[2] - a[2]; + }); - var k = 0; - while (palLen < this._colors) { - // re-inject rgb into final palette - idxrgb[ memDist[ k ][ 0 ] ] = memDist[ k ][ 1 ]; + var k = 0; + while (palLen < this._colors) { + // re-inject rgb into final palette + idxrgb[memDist[k][0]] = memDist[k][1]; - palLen++; - k++; - } + palLen++; + k++; } } + } - for (var i = 0, len = idxrgb.length; i < len; i++) { - if (!idxrgb[ i ]) continue; + for (var i = 0, len = idxrgb.length; i < len; i++) { + if (!idxrgb[i]) continue; - var point : Point = new Point(idxrgb[i]); - this._paletteArray.push(point); - this._i32idx[ point.uint32 ] = this._paletteArray.length - 1; - } + var point : Point = new Point(idxrgb[i]); + palette._paletteArray.push(point); } + + return palette; } // global top-population @@ -490,36 +438,6 @@ module ColorQuantization { this._hueStats.inject(histG); } - // TODO: group very low lum and very high lum colors - // TODO: pass custom sort order - public sortPal() { - this._paletteArray.sort((a : Point, b : Point) => { - var rgbA = a.rgba, - rgbB = b.rgba; - - var hslA = Utils.rgb2hsl(rgbA[ 0 ], rgbA[ 1 ], rgbA[ 2 ]), - hslB = Utils.rgb2hsl(rgbB[ 0 ], rgbB[ 1 ], rgbB[ 2 ]); - - // sort all grays + whites together - var hueA = (rgbA[ 0 ] == rgbA[ 1 ] && rgbA[ 1 ] == rgbA[ 2 ]) ? -1 : Utils.hueGroup(hslA.h, this._hueGroups); - var hueB = (rgbB[ 0 ] == rgbB[ 1 ] && rgbB[ 1 ] == rgbB[ 2 ]) ? -1 : Utils.hueGroup(hslB.h, this._hueGroups); - - var hueDiff = hueB - hueA; - if (hueDiff) return -hueDiff; - - var lumDiff = Utils.lumGroup(+hslB.l.toFixed(2)) - Utils.lumGroup(+hslA.l.toFixed(2)); - if (lumDiff) return -lumDiff; - - var satDiff = Utils.satGroup(+hslB.s.toFixed(2)) - Utils.satGroup(+hslA.s.toFixed(2)); - if (satDiff) return -satDiff; - }); - - // sync idxrgb & i32idx - this._paletteArray.forEach(function (point : Point, i) { - this._i32idx[ point.uint32 ] = i; - }, this); - } - // iterates @bbox within a parent rect of width @wid; calls @fn, passing index within parent public iterBox(bbox, wid, fn) { var b = bbox, @@ -533,95 +451,13 @@ module ColorQuantization { } while (i <= i1); } - // TOTRY: use HUSL - http://boronine.com/husl/ - public nearestColor(point : Point) : Point { - return this._paletteArray[ this.nearestIndex_Point(point) | 0 ]; - } - - // TOTRY: use HUSL - http://boronine.com/husl/ - public nearestIndex(i32) { -/* - // alpha 0 returns null index - if ((i32 & 0xff000000) >> 24 == 0) - return null; -*/ - - if (this._useCache && ("" + i32) in this._i32idx) { - return this._i32idx[i32]; - } - - var min = 1000, - idx, - rgb = [ - (i32 & 0xff), - (i32 >>> 8) & 0xff, - (i32 >>> 16) & 0xff, - (i32 >>> 24) & 0xff - ], - len = this._paletteArray.length; - - for (var i = 0; i < len; i++) { - if (!this._paletteArray[ i ]) continue; // sparse palettes - - var dist = Utils.distEuclidean(rgb, this._paletteArray[ i ].rgba); - - if (dist < min) { - min = dist; - idx = i; - } - } - - this._i32idx[i32] = idx; - return idx; - } - - private _nearestPointFromCache(key) { - return typeof this._i32idx[key] === "number" ? this._i32idx[key] : -1; - } - - public nearestIndex_Point(point : Point) : number { - /* - // alpha 0 returns null index - if ((i32 & 0xff000000) >> 24 == 0) - return null; - */ - - if(this._useCache) { - var idx2 = this._nearestPointFromCache("" + point.uint32); - if(idx2 >= 0) return idx2; - } -/* - if (this._useCache && typeof this._i32idx["" + point.uint32] === "number") { - return this._i32idx[ "" + point.uint32]; - } -*/ -/* - if (this._useCache && ("" + point.uint32) in this._i32idx) { - return this._i32idx[ "" + point.uint32]; - } -*/ - - var minimalDistance = 1000, - idx = 0; - - for (var i = 0, l = this._paletteArray.length; i < l; i++) { - if (!this._paletteArray[ i ]) continue; // sparse palettes - - var distance = Utils.distEuclidean(point.rgba, this._paletteArray[ i ].rgba); - - if (distance < minimalDistance) { - minimalDistance = distance; - idx = i; - } - } - - this._i32idx[point.uint32] = idx; - return idx; - } + // TODO: do we need this caching? we will build cache during first usage of each color. disabled for now public cacheHistogram(idxi32) { +/* for (var i = 0, i32 = idxi32[ i ]; i < idxi32.length && this._histogram[ i32 ] >= this._cacheFreq; i32 = idxi32[ i++ ]) this._i32idx[ i32 ] = this.nearestIndex(i32); +*/ } } diff --git a/ts/palette.ts b/ts/palette.ts new file mode 100644 index 0000000..4ca5385 --- /dev/null +++ b/ts/palette.ts @@ -0,0 +1,119 @@ +/// +// TODO: make paletteArray via pointBuffer, so, export will be available via pointBuffer.exportXXX +module ColorQuantization { + + export class Palette { + public _paletteArray : Point[] = []; + private _i32idx : { [ key: string ] : number } = {}; + + // TOTRY: use HUSL - http://boronine.com/husl/ + public nearestColor(point : Point) : Point { + return this._paletteArray[this.nearestIndex_Point(point) | 0]; + } + + // TOTRY: use HUSL - http://boronine.com/husl/ + public nearestIndex(i32) { + var idx : number = this._nearestPointFromCache("" + i32); + if (idx >= 0) return idx; + + var min = 1000, + rgb = [ + (i32 & 0xff), + (i32 >>> 8) & 0xff, + (i32 >>> 16) & 0xff, + (i32 >>> 24) & 0xff + ], + len = this._paletteArray.length; + + idx = 0; + for (var i = 0; i < len; i++) { + if (!this._paletteArray[i]) continue; // sparse palettes + + var dist = Utils.distEuclidean(rgb, this._paletteArray[i].rgba); + + if (dist < min) { + min = dist; + idx = i; + } + } + + this._i32idx[i32] = idx; + return idx; + } + + private _nearestPointFromCache(key) { + return typeof this._i32idx[key] === "number" ? this._i32idx[key] : -1; + } + + public nearestIndex_Point(point : Point) : number { + var idx : number = this._nearestPointFromCache("" + point.uint32); + if (idx >= 0) return idx; + + var minimalDistance : number = 1000.0; + + for (var idx = 0, i = 0, l = this._paletteArray.length; i < l; i++) { + if (!this._paletteArray[i]) continue; // sparse palettes + + var distance = Utils.distEuclidean(point.rgba, this._paletteArray[i].rgba); + + if (distance < minimalDistance) { + minimalDistance = distance; + idx = i; + } + } + + this._i32idx[point.uint32] = idx; + return idx; + } + + // TODO: check usage, not tested! + public prunePal(keep : number[]) { + var point : Point; + + for (var j = 0; j < this._paletteArray.length; j++) { + if (keep.indexOf(j) < 0) { + this._paletteArray[j] = null; + } + } + + // compact + var compactedPaletteArray : Point[] = []; + + for (var j = 0, i = 0; j < this._paletteArray.length; j++) { + if (this._paletteArray[j]) { + point = this._paletteArray[j]; + compactedPaletteArray[i] = point; + i++; + } + } + + this._paletteArray = compactedPaletteArray; + } + + // TODO: group very low lum and very high lum colors + // TODO: pass custom sort order + public sort(hueGroups : number) { + this._paletteArray.sort((a : Point, b : Point) => { + var rgbA = a.rgba, + rgbB = b.rgba; + + var hslA = Utils.rgb2hsl(rgbA[ 0 ], rgbA[ 1 ], rgbA[ 2 ]), + hslB = Utils.rgb2hsl(rgbB[ 0 ], rgbB[ 1 ], rgbB[ 2 ]); + + // sort all grays + whites together + var hueA = (rgbA[ 0 ] == rgbA[ 1 ] && rgbA[ 1 ] == rgbA[ 2 ]) ? -1 : Utils.hueGroup(hslA.h, hueGroups); + var hueB = (rgbB[ 0 ] == rgbB[ 1 ] && rgbB[ 1 ] == rgbB[ 2 ]) ? -1 : Utils.hueGroup(hslB.h, hueGroups); + + var hueDiff = hueB - hueA; + if (hueDiff) return -hueDiff; + + var lumDiff = Utils.lumGroup(+hslB.l.toFixed(2)) - Utils.lumGroup(+hslA.l.toFixed(2)); + if (lumDiff) return -lumDiff; + + var satDiff = Utils.satGroup(+hslB.s.toFixed(2)) - Utils.satGroup(+hslA.s.toFixed(2)); + if (satDiff) return -satDiff; + }); + } + + } +} From 123de11a51326a760761f4b03f457ca57d2cfdc5 Mon Sep 17 00:00:00 2001 From: Igor Date: Sat, 16 May 2015 11:07:31 +0300 Subject: [PATCH 20/23] refactoring --- ts/colorQuant.ts | 125 ++++++++++++++++++++------------------------ ts/hueStatistics.ts | 8 +-- ts/palette.ts | 5 +- 3 files changed, 64 insertions(+), 74 deletions(-) diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index 485deb0..8a13b4d 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -93,7 +93,7 @@ module ColorQuantization { this._minHueCols = this._colors << 2;//opts.minHueCols || 0; // HueStatistics instance - this._hueStats = this._minHueCols ? new HueStatistics(this._hueGroups, this._minHueCols) : null; + this._hueStats = new HueStatistics(this._hueGroups, this._minHueCols); // dithering/error diffusion kernel name if (typeof this._dithKern === "number") this._dithKern = opts.dithKern; @@ -106,10 +106,10 @@ module ColorQuantization { public sample(pointBuffer : PointBuffer) { switch (this._method) { case 1: - this.colorStats1D(pointBuffer); + this._colorStats1D(pointBuffer); break; case 2: - this.colorStats2D(pointBuffer); + this._colorStats2D(pointBuffer); break; } } @@ -212,7 +212,21 @@ module ColorQuantization { return pointBuffer; } - public getImportanceSortedColorsIDXI32() { + + // reduces histogram to palette, remaps & memoizes reduced colors + public palette() : Palette { + var idxi32 = this._getImportanceSortedColorsIDXI32(), + palette : Palette = this._buildPalette(idxi32); + + palette.sort(this._hueGroups); + return palette; +/* + var uint32Array = this._palette._paletteArray.map(point => point.uint32); + return tuples ? this._palette._paletteArray : new Uint8Array((new Uint32Array(uint32Array)).buffer); +*/ + } + + private _getImportanceSortedColorsIDXI32() { var sorted = Utils.sortedHashKeys(this._histogram, true); if (sorted.length == 0) @@ -232,8 +246,7 @@ module ColorQuantization { idxi32.push(sorted[ pos++ ]); // inject min huegroup colors - if (this._hueStats) - this._hueStats.inject(idxi32); + this._hueStats.inject(idxi32); break; case 2: @@ -249,49 +262,6 @@ module ColorQuantization { return idxi32; } - // reduces histogram to palette, remaps & memoizes reduced colors - public palette() : Palette { - var idxi32 = this.getImportanceSortedColorsIDXI32(), - palette : Palette = this._buildPalette(idxi32); - - palette.sort(this._hueGroups); - return palette; -/* - var uint32Array = this._palette._paletteArray.map(point => point.uint32); - return tuples ? this._palette._paletteArray : new Uint8Array((new Uint32Array(uint32Array)).buffer); -*/ - } - - // TODO: not tested method - private _reducePalette(palette : Palette, colors : number) { - if (palette._paletteArray.length > colors) { - var idxi32 = this.getImportanceSortedColorsIDXI32(); - - // quantize histogram to existing palette - var keep = [], uniqueColors = 0, idx, pruned = false; - - for (var i = 0, len = idxi32.length; i < len; i++) { - // palette length reached, unset all remaining colors (sparse palette) - if (uniqueColors >= colors) { - palette.prunePal(keep); - pruned = true; - break; - } else { - idx = palette.nearestIndex(idxi32[i]); - if (keep.indexOf(idx) < 0) { - keep.push(idx); - uniqueColors++; - } - } - } - - if (!pruned) { - palette.prunePal(keep); - pruned = true; - } - } - } - // reduces similar colors from an importance-sorted Uint32 rgba array private _buildPalette(idxi32) { var palette : Palette = new Palette(); @@ -372,8 +342,38 @@ module ColorQuantization { return palette; } + // TODO: not tested method + private _reducePalette(palette : Palette, colors : number) { + if (palette._paletteArray.length > colors) { + var idxi32 = this._getImportanceSortedColorsIDXI32(); + + // quantize histogram to existing palette + var keep = [], uniqueColors = 0, idx, pruned = false; + + for (var i = 0, len = idxi32.length; i < len; i++) { + // palette length reached, unset all remaining colors (sparse palette) + if (uniqueColors >= colors) { + palette.prunePal(keep); + pruned = true; + break; + } else { + idx = palette.nearestIndex(idxi32[i]); + if (keep.indexOf(idx) < 0) { + keep.push(idx); + uniqueColors++; + } + } + } + + if (!pruned) { + palette.prunePal(keep); + pruned = true; + } + } + } + // global top-population - public colorStats1D(pointBuffer : PointBuffer) { + private _colorStats1D(pointBuffer : PointBuffer) { var histG = this._histogram, pointArray = pointBuffer.getPointArray(), len = pointArray.length; @@ -385,8 +385,7 @@ module ColorQuantization { //if ((col & 0xff000000) >> 24 == 0) continue; // collect hue stats - if (this._hueStats) - this._hueStats.check(col); + this._hueStats.check(col); if (col in histG) histG[ col ]++; @@ -398,7 +397,7 @@ module ColorQuantization { // population threshold within subregions // FIXME: this can over-reduce (few/no colors same?), need a way to keep // important colors that dont ever reach local thresholds (gradients?) - public colorStats2D(pointBuffer : PointBuffer) { + private _colorStats2D(pointBuffer : PointBuffer) { var width = pointBuffer.getWidth(), height = pointBuffer.getHeight(), pointArray = pointBuffer.getPointArray(); @@ -413,15 +412,14 @@ module ColorQuantization { var effc = Math.max(Math.round((box.w * box.h) / area) * this._boxPxls, 2), histL = {}, col; - this.iterBox(box, width, function (i) { + this._iterBox(box, width, function (i) { col = pointArray[i].uint32; // skip transparent //if ((col & 0xff000000) >> 24 == 0) return; // collect hue stats - if (this._hueStats) - this._hueStats.check(col); + this._hueStats.check(col); if (col in histG) histG[ col ]++; @@ -434,12 +432,12 @@ module ColorQuantization { }); }, this); - if (this._hueStats) - this._hueStats.inject(histG); + // inject min huegroup colors + this._hueStats.inject(histG); } // iterates @bbox within a parent rect of width @wid; calls @fn, passing index within parent - public iterBox(bbox, wid, fn) { + private _iterBox(bbox, wid, fn) { var b = bbox, i0 = b.y * wid + b.x, i1 = (b.y + b.h - 1) * wid + (b.x + b.w - 1), @@ -450,15 +448,6 @@ module ColorQuantization { i += (++cnt % b.w == 0) ? incr : 1; } while (i <= i1); } - - - // TODO: do we need this caching? we will build cache during first usage of each color. disabled for now - public cacheHistogram(idxi32) { -/* - for (var i = 0, i32 = idxi32[ i ]; i < idxi32.length && this._histogram[ i32 ] >= this._cacheFreq; i32 = idxi32[ i++ ]) - this._i32idx[ i32 ] = this.nearestIndex(i32); -*/ - } } } diff --git a/ts/hueStatistics.ts b/ts/hueStatistics.ts index bd8489f..ef50ca1 100644 --- a/ts/hueStatistics.ts +++ b/ts/hueStatistics.ts @@ -15,9 +15,9 @@ module ColorQuantization { constructor(numGroups : number, minCols : number) { this._numGroups = numGroups; this._minCols = minCols; - this._stats = {}; + this._stats = []; - for (var i = -1; i < numGroups; i++) { + for (var i = 0; i <= numGroups; i++) { this._stats[i] = new HueGroup(); } @@ -34,7 +34,7 @@ module ColorQuantization { g = (i32 >>> 8) & 0xff, b = (i32 >>> 16) & 0xff, a = (i32 >>> 24) & 0xff, - hg = (r == g && g == b) ? -1 : Utils.hueGroup(Utils.rgb2hsl(r, g, b).h, this._numGroups), + hg = (r == g && g == b) ? 0 : 1 + Utils.hueGroup(Utils.rgb2hsl(r, g, b).h, this._numGroups), gr : HueGroup = this._stats[ hg ], min = this._minCols; @@ -50,7 +50,7 @@ module ColorQuantization { } public inject(histG) { - for (var i = -1; i < this._numGroups; i++) { + for (var i = 0; i <= this._numGroups; i++) { if (this._stats[ i ].num <= this._minCols) { switch (Utils.typeOf(histG)) { case "Array": diff --git a/ts/palette.ts b/ts/palette.ts index 4ca5385..e9af532 100644 --- a/ts/palette.ts +++ b/ts/palette.ts @@ -92,6 +92,7 @@ module ColorQuantization { // TODO: group very low lum and very high lum colors // TODO: pass custom sort order + // TODO: sort criteria function should be placed to HueStats class public sort(hueGroups : number) { this._paletteArray.sort((a : Point, b : Point) => { var rgbA = a.rgba, @@ -101,8 +102,8 @@ module ColorQuantization { hslB = Utils.rgb2hsl(rgbB[ 0 ], rgbB[ 1 ], rgbB[ 2 ]); // sort all grays + whites together - var hueA = (rgbA[ 0 ] == rgbA[ 1 ] && rgbA[ 1 ] == rgbA[ 2 ]) ? -1 : Utils.hueGroup(hslA.h, hueGroups); - var hueB = (rgbB[ 0 ] == rgbB[ 1 ] && rgbB[ 1 ] == rgbB[ 2 ]) ? -1 : Utils.hueGroup(hslB.h, hueGroups); + var hueA = (rgbA[ 0 ] == rgbA[ 1 ] && rgbA[ 1 ] == rgbA[ 2 ]) ? 0 : 1 + Utils.hueGroup(hslA.h, hueGroups); + var hueB = (rgbB[ 0 ] == rgbB[ 1 ] && rgbB[ 1 ] == rgbB[ 2 ]) ? 0 : 1 + Utils.hueGroup(hslB.h, hueGroups); var hueDiff = hueB - hueA; if (hueDiff) return -hueDiff; From e8de6604c0b2dd19e3c7d89a8cee8d562e71c737 Mon Sep 17 00:00:00 2001 From: Igor Date: Sat, 16 May 2015 15:37:12 +0300 Subject: [PATCH 21/23] refactoring --- ts/colorQuant.ts | 245 +++++++++++++++++++++++++++++++--------------- ts/palette.ts | 7 +- ts/point.ts | 40 +++++++- ts/pointBuffer.ts | 2 +- 4 files changed, 206 insertions(+), 88 deletions(-) diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index 8a13b4d..b95af43 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -1,9 +1,9 @@ /* -* Copyright (c) 2015, Leon Sorokin -* All rights reserved. (MIT Licensed) -* -* RgbQuant.js - an image quantization lib -*/ + * Copyright (c) 2015, Leon Sorokin + * All rights reserved. (MIT Licensed) + * + * RgbQuant.js - an image quantization lib + */ /// /// @@ -45,7 +45,7 @@ module ColorQuantization { private _hueStats : HueStatistics; // subregion partitioning box size - private _boxSize = [ 64, 64 ]; + private _boxSize = [64, 64]; // number of same pixels required within box for histogram inclusion private _boxPxls = 2; @@ -68,12 +68,6 @@ module ColorQuantization { // accumulated histogram private _histogram = {}; - //private _paletteArray : Point[] = []; - private _palette : Palette; - - // enable color caching (also incurs overhead of cache misses and cache building) - private _useCache = true; - // min color occurance count needed to qualify for caching private _cacheFreq = 10; @@ -92,14 +86,14 @@ module ColorQuantization { // if > 0, enables hues stats and min-color retention per group this._minHueCols = this._colors << 2;//opts.minHueCols || 0; - // HueStatistics instance - this._hueStats = new HueStatistics(this._hueGroups, this._minHueCols); - // dithering/error diffusion kernel name if (typeof this._dithKern === "number") this._dithKern = opts.dithKern; // accumulated histogram this._histogram = {}; + + // HueStatistics instance + this._hueStats = new HueStatistics(this._hueGroups, this._minHueCols); } // gathers histogram info @@ -126,52 +120,67 @@ module ColorQuantization { // reduce w/dither var start = Date.now(); - console.profile("__!dither"); + //console.profile("__!dither"); if (dithKern) { - pointBuffer = this.dither(pointBuffer, palette, dithKern, dithSerp); + //pointBuffer = this.ditherRiemer(pointBuffer, palette); + pointBuffer = this.dither(pointBuffer, palette, dithKern); + } else { + var pointArray = pointBuffer.getPointArray(); + for (var i = 0, len = pointArray.length; i < len; i++) { + pointArray[ i ].from(palette.nearestColor(pointArray[ i ])); + } } - (console).profileEnd("__!dither"); + //(console).profileEnd("__!dither"); console.log("[dither]: " + (Date.now() - start)); - var pointArray = pointBuffer.getPointArray(), - len : number = pointArray.length; - - for (var i = 0; i < len; i++) { - pointArray[ i ].from(palette.nearestColor(pointArray[ i ])); - } - + /* + var pointArray = pointBuffer.getPointArray(), + len : number = pointArray.length; + + for (var i = 0; i < len; i++) { + for(var p = 0, found = false; p < palette._paletteArray.length; p++) { + if(palette._paletteArray[p].uint32 === pointArray[i].uint32) { + found = true; + } + } + if(!found) throw new Error("x"); + //pointArray[ i ].from(palette.nearestColor(pointArray[ i ])); + } + + */ return pointBuffer; } // adapted from http://jsbin.com/iXofIji/2/edit by PAEz - public dither(pointBuffer : PointBuffer, palette : Palette, kernel, serpentine) : PointBuffer { - if (!kernel || !kernels[ kernel ]) { + public dither(pointBuffer : PointBuffer, palette : Palette, kernel) : PointBuffer { + if (!kernel || !kernels[kernel]) { throw 'Unknown dithering kernel: ' + kernel; } - var ds = kernels[ kernel ]; + var ds = kernels[kernel]; var pointArray = pointBuffer.getPointArray(), - width = pointBuffer.getWidth(), - height = pointBuffer.getHeight(), - dir = serpentine ? -1 : 1; + width = pointBuffer.getWidth(), + height = pointBuffer.getHeight(), + dir = 1; //(console).profile("dither"); for (var y = 0; y < height; y++) { - if (serpentine) - dir = dir * -1; + // always serpentine + if (true) dir = dir * -1; - var lni = y * width; + var lni = y * width, + xStart = dir == 1 ? 0 : width - 1, + xEnd = dir == 1 ? width : -1; - for (var x = (dir == 1 ? 0 : width - 1), xend = (dir == 1 ? width : 0); x !== xend; x += dir) { + for (var x = xStart, idx = lni + xStart; x !== xEnd; x += dir, idx += dir) { // Image pixel - var idx = lni + x, - p1 = pointArray[ idx ]; + var p1 = pointArray[idx]; // Reduced pixel var point = palette.nearestColor(p1); - pointArray[ idx ] = point; + pointArray[idx] = point; // dithering strength if (this._dithDelta) { @@ -186,16 +195,19 @@ module ColorQuantization { eb = p1.b - point.b, ea = p1.a - point.a; - for (var i = (dir == 1 ? 0 : ds.length - 1), end = (dir == 1 ? ds.length : 0); i !== end; i += dir) { - var x1 = ds[ i ][ 1 ] * dir, - y1 = ds[ i ][ 2 ]; + var dStart = dir == 1 ? 0 : ds.length - 1, + dEnd = dir == 1 ? ds.length : -1; + + for (var i = dStart; i !== dEnd; i += dir) { + var x1 = ds[i][1] * dir, + y1 = ds[i][2]; var lni2 = y1 * width; if (x1 + x >= 0 && x1 + x < width && y1 + y >= 0 && y1 + y < height) { - var d = ds[ i ][ 0 ]; + var d = ds[i][0]; var idx2 = idx + (lni2 + x1), - p3 = pointArray[idx2]; + p3 = pointArray[idx2]; var r4 = Math.max(0, Math.min(255, p3.r + er * d)), g4 = Math.max(0, Math.min(255, p3.g + eg * d)), @@ -212,18 +224,78 @@ module ColorQuantization { return pointBuffer; } + // adapted from http://jsbin.com/iXofIji/2/edit by PAEz + /* + public ditherRiemer(pointBuffer : PointBuffer, palette : Palette) : PointBuffer { + var pointArray = pointBuffer.getPointArray(), + width = pointBuffer.getWidth(), + height = pointBuffer.getHeight(), + errorArray = [], + weightsArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]; + + var sum = 0; + for(var i = 0; i < weightsArray.length; i++) { + sum += weightsArray[i]; + } + for(var i = 0; i < weightsArray.length; i++) { + weightsArray[i] /= sum; + } + + for(var i = 0; i < 4; i++) { + errorArray[i] = []; + for(var j = 0; j < weightsArray.length; j++) { + errorArray[i].push(0); + } + } + + function simpleCurve(width, height, callback : (x : number, y : number, index : number) => void) { + for (var y = 0, index = 0; y < height; y++) { + for (var x = 0; x < width; x++, index++) { + callback(x, y, index); + } + + } + } + + simpleCurve(width, height, (x, y, index) => { + var p = pointArray[ index]; + + for(var quadrupletIndex = 0; quadrupletIndex < errorArray.length; quadrupletIndex++) { + var sum = 0; + for(var errorArrayIndex = 0; errorArrayIndex < errorArray.length; errorArrayIndex++) { + sum += errorArray[quadrupletIndex][errorArrayIndex] * weightsArray[errorArrayIndex]; + } + + p.rgba[quadrupletIndex] = Math.max(0, Math.min(255, (p.rgba[quadrupletIndex] + sum) | 0)); + } + + var correctedPoint = Point.createByQuadruplet(p.rgba), + palettePoint = palette.nearestColor(correctedPoint); + + for(var quadrupletIndex = 0; quadrupletIndex < errorArray.length; quadrupletIndex++) { + var componentErrorArray = errorArray[quadrupletIndex]; + componentErrorArray.shift(); + componentErrorArray.push(p.rgba[quadrupletIndex] - palettePoint.rgba[quadrupletIndex]); + } + + p.from(palettePoint); + }); + return pointBuffer; + } + + */ // reduces histogram to palette, remaps & memoizes reduced colors public palette() : Palette { - var idxi32 = this._getImportanceSortedColorsIDXI32(), + var idxi32 = this._getImportanceSortedColorsIDXI32(), palette : Palette = this._buildPalette(idxi32); palette.sort(this._hueGroups); return palette; -/* - var uint32Array = this._palette._paletteArray.map(point => point.uint32); - return tuples ? this._palette._paletteArray : new Uint8Array((new Uint32Array(uint32Array)).buffer); -*/ + /* + var uint32Array = this._palette._paletteArray.map(point => point.uint32); + return tuples ? this._palette._paletteArray : new Uint8Array((new Uint32Array(uint32Array)).buffer); + */ } private _getImportanceSortedColorsIDXI32() { @@ -234,16 +306,16 @@ module ColorQuantization { switch (this._method) { case 1: - var initialColorsLimit = Math.min(sorted.length, this._initColors ), - last = sorted[ initialColorsLimit - 1 ], - freq = this._histogram[ last ]; + var initialColorsLimit = Math.min(sorted.length, this._initColors), + last = sorted[initialColorsLimit - 1], + freq = this._histogram[last]; var idxi32 = sorted.slice(0, initialColorsLimit); // add any cut off colors with same freq as last var pos = initialColorsLimit, len = sorted.length; - while (pos < len && this._histogram[ sorted[ pos ] ] == freq) - idxi32.push(sorted[ pos++ ]); + while (pos < len && this._histogram[sorted[pos]] == freq) + idxi32.push(sorted[pos++]); // inject min huegroup colors this._hueStats.inject(idxi32); @@ -264,10 +336,9 @@ module ColorQuantization { // reduces similar colors from an importance-sorted Uint32 rgba array private _buildPalette(idxi32) { - var palette : Palette = new Palette(); - // reduce histogram to create initial palette // build full rgb palette + var idxrgb = idxi32.map(function (i32) { return [ (i32 & 0xff), @@ -276,6 +347,15 @@ module ColorQuantization { (i32 >>> 24) & 0xff ]; }); + /* + var workPalette : Palette = new Palette(), + pointArray = workPalette._paletteArray, + pointIndex, l; + + for(pointIndex = 0, l = idxi32.length; pointIndex < l; pointIndex++) { + pointArray.push(new Point(idxi32[pointIndex])); + } + */ var len = idxrgb.length, palLen = len, @@ -322,7 +402,7 @@ module ColorQuantization { }); var k = 0; - while (palLen < this._colors) { + while (palLen < this._colors && k < memDist.length) { // re-inject rgb into final palette idxrgb[memDist[k][0]] = memDist[k][1]; @@ -332,12 +412,18 @@ module ColorQuantization { } } - for (var i = 0, len = idxrgb.length; i < len; i++) { - if (!idxrgb[i]) continue; - - var point : Point = new Point(idxrgb[i]); - palette._paletteArray.push(point); + var palette : Palette = new Palette(); + for (var pointIndex = 0, l = idxrgb.length; pointIndex < l; pointIndex++) { + if (!idxrgb[pointIndex]) continue; + palette._paletteArray.push(Point.createByQuadruplet(idxrgb[pointIndex])); } + /* + var palette : Palette = new Palette(); + for (pointIndex = 0, l = pointArray.length; pointIndex < l; pointIndex++) { + if (!pointArray[pointIndex]) continue; + palette._paletteArray.push(pointArray[pointIndex]); + } + */ return palette; } @@ -374,9 +460,9 @@ module ColorQuantization { // global top-population private _colorStats1D(pointBuffer : PointBuffer) { - var histG = this._histogram, + var histG = this._histogram, pointArray = pointBuffer.getPointArray(), - len = pointArray.length; + len = pointArray.length; for (var i = 0; i < len; i++) { var col = pointArray[i].uint32; @@ -388,9 +474,9 @@ module ColorQuantization { this._hueStats.check(col); if (col in histG) - histG[ col ]++; + histG[col]++; else - histG[ col ] = 1; + histG[col] = 1; } } @@ -398,19 +484,20 @@ module ColorQuantization { // FIXME: this can over-reduce (few/no colors same?), need a way to keep // important colors that dont ever reach local thresholds (gradients?) private _colorStats2D(pointBuffer : PointBuffer) { - var width = pointBuffer.getWidth(), - height = pointBuffer.getHeight(), + var width = pointBuffer.getWidth(), + height = pointBuffer.getHeight(), pointArray = pointBuffer.getPointArray(); - var boxW = this._boxSize[ 0 ], - boxH = this._boxSize[ 1 ], - area = boxW * boxH, + var boxW = this._boxSize[0], + boxH = this._boxSize[1], + area = boxW * boxH, boxes = Utils.makeBoxes(width, height, boxW, boxH), histG = this._histogram; boxes.forEach(function (box) { - var effc = Math.max(Math.round((box.w * box.h) / area) * this._boxPxls, 2), - histL = {}, col; + var effc = Math.max(Math.round((box.w * box.h) / area) * this._boxPxls, 2), + histL = {}, + col; this._iterBox(box, width, function (i) { col = pointArray[i].uint32; @@ -422,13 +509,13 @@ module ColorQuantization { this._hueStats.check(col); if (col in histG) - histG[ col ]++; + histG[col]++; else if (col in histL) { - if (++histL[ col ] >= effc) - histG[ col ] = histL[ col ]; + if (++histL[col] >= effc) + histG[col] = histL[col]; } else - histL[ col ] = 1; + histL[col] = 1; }); }, this); @@ -438,9 +525,9 @@ module ColorQuantization { // iterates @bbox within a parent rect of width @wid; calls @fn, passing index within parent private _iterBox(bbox, wid, fn) { - var b = bbox, - i0 = b.y * wid + b.x, - i1 = (b.y + b.h - 1) * wid + (b.x + b.w - 1), + var b = bbox, + i0 = b.y * wid + b.x, + i1 = (b.y + b.h - 1) * wid + (b.x + b.w - 1), cnt = 0, incr = wid - b.w + 1, i = i0; do { diff --git a/ts/palette.ts b/ts/palette.ts index e9af532..1692b55 100644 --- a/ts/palette.ts +++ b/ts/palette.ts @@ -27,8 +27,6 @@ module ColorQuantization { idx = 0; for (var i = 0; i < len; i++) { - if (!this._paletteArray[i]) continue; // sparse palettes - var dist = Utils.distEuclidean(rgb, this._paletteArray[i].rgba); if (dist < min) { @@ -52,8 +50,6 @@ module ColorQuantization { var minimalDistance : number = 1000.0; for (var idx = 0, i = 0, l = this._paletteArray.length; i < l; i++) { - if (!this._paletteArray[i]) continue; // sparse palettes - var distance = Utils.distEuclidean(point.rgba, this._paletteArray[i].rgba); if (distance < minimalDistance) { @@ -81,8 +77,7 @@ module ColorQuantization { for (var j = 0, i = 0; j < this._paletteArray.length; j++) { if (this._paletteArray[j]) { - point = this._paletteArray[j]; - compactedPaletteArray[i] = point; + compactedPaletteArray[i] = this._paletteArray[j]; i++; } } diff --git a/ts/point.ts b/ts/point.ts index 8607053..49b6d1d 100644 --- a/ts/point.ts +++ b/ts/point.ts @@ -13,11 +13,47 @@ module ColorQuantization { public uint32 : number; public rgba : number[]; // TODO: better name is quadruplet or quad may be? - constructor(...args : number[]) { + static createByQuadruplet(quadruplet : number[]) : Point { + var point : Point = new Point(); + + point.r = quadruplet[0] | 0; + point.g = quadruplet[1] | 0; + point.b = quadruplet[2] | 0; + point.a = quadruplet[3] | 0; + point._loadUINT32(); + point._loadQuadruplet(); + + return point; + } + + static createByRGBA(red : number, green : number, blue : number, alpha : number): Point { + var point : Point = new Point(); + + point.r = red | 0; + point.g = green | 0; + point.b = blue | 0; + point.a = alpha | 0; + point._loadUINT32(); + point._loadQuadruplet(); + + return point; + } + + static createByUint32(uint32 : number) : Point { + var point : Point = new Point(); + + point.uint32 = uint32 >>> 0; + point._loadRGBA(); + point._loadQuadruplet(); + + return point; + } + + constructor(/*...args : number[]*/) { this.r = this.g = this.b = this.a = 0; this.rgba = [ this.r , this.g , this.b , this.a ]; this.uint32 = -1 >>> 0; - this.set(...args); + //this.set(...args); } public from(point : Point) { diff --git a/ts/pointBuffer.ts b/ts/pointBuffer.ts index a451dbd..332b64c 100644 --- a/ts/pointBuffer.ts +++ b/ts/pointBuffer.ts @@ -99,7 +99,7 @@ module ColorQuantization { this._pointArray = [];//new Array(uint32array.length); for(var i = 0, l = uint32array.length; i < l; i++) { - this._pointArray[i] = new Point(uint32array[i] | 0); // "| 0" is added for v8 optimization + this._pointArray[i] = Point.createByUint32(uint32array[i] | 0); // "| 0" is added for v8 optimization } } From a715225f85335bba468ee3ecd098945eeea68d9c Mon Sep 17 00:00:00 2001 From: Igor Date: Sun, 17 May 2015 19:03:07 +0300 Subject: [PATCH 22/23] dithering fixed, refactoring, code cleanup needed --- demo/js/demo.js | 20 ++++ ts/colorQuant.ts | 233 +++++++++++++++++++++++++++++++++++++++++++++- ts/pointBuffer.ts | 10 ++ 3 files changed, 262 insertions(+), 1 deletion(-) diff --git a/demo/js/demo.js b/demo/js/demo.js index ae9937c..6c73202 100644 --- a/demo/js/demo.js +++ b/demo/js/demo.js @@ -113,6 +113,7 @@ function process(srcs) { var pal8; ti.mark("build palette", function() { pal8 = quant.palette(); + //pal8 = quant.paletteMedianCut(); }); // TODO: temporary solution. see Palette class todo @@ -129,6 +130,25 @@ function process(srcs) { var img8; ti.mark("reduce '" + id + "'", function() { +/* + pal8 = new ColorQuantization.Palette(); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(10,49,4,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(80,148,15,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(149,172,45,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(173,209,79,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(181,215,166,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(161,176,175,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(219,231,196,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(56,236,56,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(116,167,148,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(200,20,128,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(54,101,7,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(196,94,54,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(56,92,200,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(58,235,200,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(200,92,200,255)); + pal8._paletteArray.push(ColorQuantization.Point.createByRGBA(56,20,200,255)); +*/ img8 = quant.reduce(pointBuffers[index], pal8).exportUint8Array(); }); diff --git a/ts/colorQuant.ts b/ts/colorQuant.ts index b95af43..82bbb3a 100644 --- a/ts/colorQuant.ts +++ b/ts/colorQuant.ts @@ -123,13 +123,33 @@ module ColorQuantization { //console.profile("__!dither"); if (dithKern) { //pointBuffer = this.ditherRiemer(pointBuffer, palette); - pointBuffer = this.dither(pointBuffer, palette, dithKern); + + if(typeof window["ditherx"] === "undefined") window["ditherx"] = true; + if( window["ditherx"]) { + pointBuffer = this.ditherFixWithCyclic(pointBuffer, palette, dithKern); + console.log("new (FIXED) dither") + } else { + pointBuffer = this.dither(pointBuffer, palette, dithKern); + console.log("old dither") + } + window["ditherx"] = !window["ditherx"]; } else { var pointArray = pointBuffer.getPointArray(); for (var i = 0, len = pointArray.length; i < len; i++) { pointArray[ i ].from(palette.nearestColor(pointArray[ i ])); } } + var pointArray = pointBuffer.getPointArray(), + len = pointArray.length; + + for (var i = 0; i < len; i++) { + for (var p = 0, found = false; p < palette._paletteArray.length; p++) { + if (palette._paletteArray[p].uint32 === pointArray[i].uint32) { + found = true; + } + } + if (!found) throw new Error("x"); + } //(console).profileEnd("__!dither"); console.log("[dither]: " + (Date.now() - start)); @@ -224,6 +244,192 @@ module ColorQuantization { return pointBuffer; } + // adapted from http://jsbin.com/iXofIji/2/edit by PAEz + // TODO: fixed version. it doesn't use image pixels as error storage + public ditherFix(pointBuffer : PointBuffer, palette : Palette, kernel) : PointBuffer { + if (!kernel || !kernels[kernel]) { + throw 'Unknown dithering kernel: ' + kernel; + } + + var ds = kernels[kernel]; + + var pointArray = pointBuffer.getPointArray(), + width = pointBuffer.getWidth(), + height = pointBuffer.getHeight(), + dir = 1, + errors = []; + + for(var i = 0; i < width * height; i++) errors[i] = [0,0,0,0]; + + //(console).profile("dither"); + for (var y = 0; y < height; y++) { + // always serpentine + if (true) dir = dir * -1; + + var lni = y * width, + xStart = dir == 1 ? 0 : width - 1, + xEnd = dir == 1 ? width : -1; + + for (var x = xStart, idx = lni + xStart; x !== xEnd; x += dir, idx += dir) { + // Image pixel + var p1 = pointArray[idx]; + + var r4 = Math.max(0, Math.min(255, p1.r + errors[idx][0])), + g4 = Math.max(0, Math.min(255, p1.g + errors[idx][1])), + b4 = Math.max(0, Math.min(255, p1.b + errors[idx][2])), + a4 = Math.max(0, Math.min(255, p1.a + errors[idx][3])); + + var np = Point.createByRGBA(r4, g4, b4, a4); + + // Reduced pixel + var point = palette.nearestColor(np); + + pointArray[idx].from(point); + + // dithering strength + if (this._dithDelta) { + var dist = Utils.distEuclidean(p1.rgba, point.rgba); + if (dist < this._dithDelta) + continue; + } + + // Component distance + point = np; + var er = p1.r - point.r, + eg = p1.g - point.g, + eb = p1.b - point.b, + ea = p1.a - point.a; + + var dStart = dir == 1 ? 0 : ds.length - 1, + dEnd = dir == 1 ? ds.length : -1; + + for (var i = dStart; i !== dEnd; i += dir) { + var x1 = ds[i][1] * dir, + y1 = ds[i][2]; + + var lni2 = y1 * width; + + if (x1 + x >= 0 && x1 + x < width && y1 + y >= 0 && y1 + y < height) { + var d = ds[i][0]; + var idx2 = idx + (lni2 + x1), + e = errors[idx2]; + + e[0] = e[0] -er * d; + e[1] = e[1] -eg * d; + e[2] = e[2] -eb * d; + e[3] = e[3] -ea * d; + + //pointArray[idx2].set(r4, g4, b4, a4); + } + } + } + } + + //(console).profileEnd("dither"); + return pointBuffer; + } + // adapted from http://jsbin.com/iXofIji/2/edit by PAEz + // TODO: fixed version. it doesn't use image pixels as error storage + public ditherFixWithCyclic(pointBuffer : PointBuffer, palette : Palette, kernel) : PointBuffer { + if (!kernel || !kernels[kernel]) { + throw 'Unknown dithering kernel: ' + kernel; + } + + var ds = kernels[kernel]; + + function fillErrorLine(errorLine : number[][], width : number) { + for(var i = 0; i < width; i++) { + errorLine[i] = [0, 0,0 , 0]; + } + if(errorLine.length > width) { + errorLine.length = width; + } + } + + var pointArray = pointBuffer.getPointArray(), + width = pointBuffer.getWidth(), + height = pointBuffer.getHeight(), + dir = 1, + errorLines = []; + + // initial error lines (number is taken from kernel) + for(var i = 0, maxErrorLines = 1; i < ds.length; i++) { + maxErrorLines = Math.max(maxErrorLines, ds[i][2] + 1); + } + for(var i = 0; i < maxErrorLines; i++) { + fillErrorLine(errorLines[ i ] = [], width); + } + + //(console).profile("dither"); + for (var y = 0; y < height; y++) { + // always serpentine + if (true) dir = dir * -1; + + var lni = y * width, + xStart = dir == 1 ? 0 : width - 1, + xEnd = dir == 1 ? width : -1; + + // cyclic shift with erasing + fillErrorLine(errorLines[ 0 ], width); + errorLines.push(errorLines.shift()); + + var errorLine = errorLines[0]; + + for (var x = xStart, idx = lni + xStart; x !== xEnd; x += dir, idx += dir) { + // Image pixel + var p1 = pointArray[idx], + error = errorLine[x]; + + var r4 = Math.max(0, Math.min(255, p1.r + error[0])), + g4 = Math.max(0, Math.min(255, p1.g + error[1])), + b4 = Math.max(0, Math.min(255, p1.b + error[2])), + a4 = Math.max(0, Math.min(255, p1.a + error[3])); + + var np = Point.createByRGBA(r4, g4, b4, a4); + + // Reduced pixel + var point = palette.nearestColor(np); + + pointArray[idx].from(point); + + // dithering strength + if (this._dithDelta) { + var dist = Utils.distEuclidean(p1.rgba, point.rgba); + if (dist < this._dithDelta) + continue; + } + + // Component distance + point = np; + var er = p1.r - point.r, + eg = p1.g - point.g, + eb = p1.b - point.b, + ea = p1.a - point.a; + + var dStart = dir == 1 ? 0 : ds.length - 1, + dEnd = dir == 1 ? ds.length : -1; + + for (var i = dStart; i !== dEnd; i += dir) { + var x1 = ds[i][1] * dir, + y1 = ds[i][2]; + + if (x1 + x >= 0 && x1 + x < width && y1 + y >= 0 && y1 + y < height) { + var d = ds[i][0], + e = errorLines[y1][x1 + x]; + + e[0] = e[0] -er * d; + e[1] = e[1] -eg * d; + e[2] = e[2] -eb * d; + e[3] = e[3] -ea * d; + } + } + } + } + + //(console).profileEnd("dither"); + return pointBuffer; + } + // adapted from http://jsbin.com/iXofIji/2/edit by PAEz /* public ditherRiemer(pointBuffer : PointBuffer, palette : Palette) : PointBuffer { @@ -285,12 +491,37 @@ module ColorQuantization { */ +/* + public paletteMedianCut () { + var idxi32 = this._getImportanceSortedColorsIDXI32(), + palette : Palette = new Palette(); + + var idxrgb = idxi32.map(function (i32) { + return [ + (i32 & 0xff), + (i32 >>> 8) & 0xff, + (i32 >>> 16) & 0xff, + (i32 >>> 24) & 0xff + ]; + }); + + init(idxrgb); + var arr = get_fixed_size_palette(this._colors); + for(var i = 0; i < arr.length; i++) { + palette._paletteArray.push(Point.createByQuadruplet(arr[i])); + } + console.log("MedianCut"); + return palette; + } +*/ + // reduces histogram to palette, remaps & memoizes reduced colors public palette() : Palette { var idxi32 = this._getImportanceSortedColorsIDXI32(), palette : Palette = this._buildPalette(idxi32); palette.sort(this._hueGroups); + console.log("Original"); return palette; /* var uint32Array = this._palette._paletteArray.map(point => point.uint32); diff --git a/ts/pointBuffer.ts b/ts/pointBuffer.ts index 332b64c..bdd746c 100644 --- a/ts/pointBuffer.ts +++ b/ts/pointBuffer.ts @@ -40,6 +40,16 @@ module ColorQuantization { return this._pointArray; } + public importPointBuffer(pointBuffer : PointBuffer) : void { + this._width = pointBuffer._width; + this._height = pointBuffer._height; + + this._pointArray = []; + for(var i = 0, l = pointBuffer._pointArray.length; i < l; i++) { + this._pointArray[i] = Point.createByUint32(pointBuffer._pointArray[i].uint32 | 0); // "| 0" is added for v8 optimization + } + } + public importHTMLImageElement(img : HTMLImageElement) : void { var width = img.naturalWidth, height = img.naturalHeight; From 8e2e7b0583df3fc94e8a7a427b2828e575afdf70 Mon Sep 17 00:00:00 2001 From: Igor Date: Sun, 17 May 2015 19:03:30 +0300 Subject: [PATCH 23/23] node-test added --- ts/node-test/_build_demo.cmd | 5 +++++ ts/node-test/_demo.ts | 29 +++++++++++++++++++++++++++++ ts/node-test/_test.cmd | 3 +++ 3 files changed, 37 insertions(+) create mode 100644 ts/node-test/_build_demo.cmd create mode 100644 ts/node-test/_demo.ts create mode 100644 ts/node-test/_test.cmd diff --git a/ts/node-test/_build_demo.cmd b/ts/node-test/_build_demo.cmd new file mode 100644 index 0000000..55bef50 --- /dev/null +++ b/ts/node-test/_build_demo.cmd @@ -0,0 +1,5 @@ +pushd %~dp0 +del /f/q _demo.js +del /f/q _demo.js.map +tsc _demo.ts --sourcemap --out _demo.js +popd diff --git a/ts/node-test/_demo.ts b/ts/node-test/_demo.ts new file mode 100644 index 0000000..978b6d8 --- /dev/null +++ b/ts/node-test/_demo.ts @@ -0,0 +1,29 @@ +/// + +var width = 32, + height = 32, + imageArray = []; + +for(var i = 0; i < width * height * 4; i++) { + imageArray[i] = (Math.random() * 256) | 0; +} + +for(var i = 0; i < 100; i++) { + var start = Date.now(); + + var cq = new ColorQuantization.RgbQuant({ + colors : 1024, + dithKern : "SierraLite" + }); + + var pointBuffer = new ColorQuantization.PointBuffer(); + pointBuffer.importArray(imageArray, width, height); + + cq.sample(pointBuffer); + + var pal8 = cq.palette(); + + var img8 = cq.reduce(pointBuffer, pal8).exportUint8Array(); + + console.log(i + ": " + (Date.now() - start)); +} diff --git a/ts/node-test/_test.cmd b/ts/node-test/_test.cmd new file mode 100644 index 0000000..a075489 --- /dev/null +++ b/ts/node-test/_test.cmd @@ -0,0 +1,3 @@ +del /q/f *.asm +del /q/f *.cfg +node --trace-hydrogen --trace-phase=Z --trace-deopt --code-comments --hydrogen-track-positions --redirect-code-traces --print_deopt_stress _demo.js \ No newline at end of file