function ColorCache() {
  this.active = 0, this.pixcode = LATCHED, this.size = 17, this.element = new Uint16Array(this.size),
  this.display = function() {
    for (var i = 0; i < this.active; i++) {
      this.element[i];
    }
  }, this.reset = function() {
    this.element.fill(0, 0, this.active), this.active = 0, this.pixcode = LATCHED;
  }, this.lru = function(color) {
    var active = this.active, code = 0;
    return color |= AMASK, -1 == (code = this.element.lastIndexOf(color, active - 1)) && (active < this.size ? (active++,
    this.element.copyWithin(1, 0, active), this.element[0] = color, 2 > active ? this.pixcode = LATCHED : 2 == active ? this.pixcode = PIXLRU0 : 3 == active ? this.pixcode = PIXCODE1 : 6 > active ? this.pixcode = PIXCODE2 : 10 > active ? this.pixcode = PIXCODE3 : this.pixcode = PIXCODE4,
    this.active = active) : code = active), code > 0 && (this.element.copyWithin(1, 0, active),
    this.element[0] = color), !1;
  }, this.find = function(code) {
    var color;
    return code > this.active ? 0 : (color = this.element[code] | AMASK, code > 0 && this.element.copyWithin(1, 0, code),
    this.element[0] = color | AMASK, color);
  }, this.prune = function(code) {
    for (var active = this.active, i = 0, t = 0; active > i; ) this.element[i] & AMASK && (this.element[t++] = -2 & this.element[i]),
    i++;
    this.element.fill(0, active), this.active = active = t, 2 > active ? this.pixcode = LATCHED : 2 == active ? this.pixcode = PIXLRU0 : 3 == active ? this.pixcode = PIXCODE1 : 6 > active ? this.pixcode = PIXCODE2 : 10 > active ? this.pixcode = PIXCODE3 : this.pixcode = PIXCODE4,
    this.display();
  };
}

var _COLOR = 0, _USAGE = 1, _COUNTER = 2;

BLOCK_AGE = 1;

const AMASK = 1;

Uint16Array.prototype.fill || (Uint16Array.prototype.fill = function(value) {
  for (var t = Object(this), len = t.length, start = arguments[1] >> 0, end = arguments[2] >> 0 || len, k = 0 > start ? len + end : start, n = 0 > end ? len + end : end, i = k; n > i; i++) t[i] = value;
  return 0;
}), Uint16Array.prototype.lastIndexOf || (Uint16Array.prototype.lastIndexOf = function(searchElement) {
  var t = Object(this), n = t.length;
  arguments.length > 1 && (n = Number(arguments[1]));
  for (var i = n; i >= 0 && t[i] !== searchElement; i--) ;
  return i;
}), Uint16Array.prototype.copyWithin || (Uint16Array.prototype.copyWithin = function(target) {
  var t = Object(this), len = t.length, start = 0;
  arguments.length > 1 && (start = arguments[1], 0 > start && (start += len));
  var end = len;
  arguments.length > 2 && (end = arguments[2], 0 > end && (end += len));
  var c = end - start;
  if (target > start) for (var i = c - 1; i >= 0; i--) t[target + i] = t[start + i]; else for (var i = 0; c > i; i++) t[target + i] = t[start + i];
  return t;
});