UNPKG

ngx-color-palette

Version:

Angular library which provides color picker functionality to your angular application.

143 lines 60.8 kB
import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
import { RAW } from './RAW';
import { CRAYOLA } from "./CRAYOLA";
import { MATERIAL } from "./MATERIAL";
import { NgClass, KeyValuePipe } from '@angular/common';
import * as i0 from "@angular/core";
export class NgxColorPaletteComponent {
    constructor(elementRef) {
        this.elementRef = elementRef;
        this.color = '';
        this.squared = false;
        this.position = 'bottom-left';
        this.currentColor = new EventEmitter();
        this.mode = 'basic';
        this.colors = RAW;
        this.crayola = CRAYOLA;
        this.material = MATERIAL;
        this.choosenColor = '';
        this.isShow = false;
        this.isPalette = false;
        this.paletteIndex = 0;
        this.iterator = Array.from(Array(360).keys());
        this.colorAxis = [];
        this.randomId = new Date().getTime().toString();
        this.randomId = new Date().getTime().toString();
    }
    ngAfterViewInit() {
        this.color = this.color || this.colors[0]['preview'];
        this.choosenColor = this.color;
        if (this.mode === 'wheel') {
            this.showColorWheel();
        }
    }
    setColor(color) {
        this.choosenColor = color;
    }
    discardCoreColor() {
        this.isShow = false;
        this.isPalette = false;
    }
    setCoreColor() {
        this.color = this.choosenColor;
        this.isShow = false;
        this.isPalette = false;
        let colorEvent = {
            color: this.color
        };
        this.currentColor.emit(colorEvent);
        this.mode = 'basic';
    }
    showWheel() {
        this.mode = 'wheel';
        this.showColorWheel();
    }
    showHsl() {
        this.mode = 'hsl';
    }
    showCrayola() {
        this.mode = 'crayola';
    }
    showBasic() {
        this.mode = 'basic';
        this.isPalette = false;
    }
    showMaterial() {
        this.mode = 'material';
    }
    onGlobalClick(event) {
        if (!this.elementRef.nativeElement.contains(event.target)) {
            this.isShow = false;
        }
    }
    hslToHex(h, s, l) {
        l /= 100;
        const a = s * Math.min(l, 1 - l) / 100;
        const f = (n) => {
            const k = (n + h / 30) % 12;
            const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);
            return Math.round(255 * color).toString(16).padStart(2, '0'); // convert to Hex and prefix "0" if needed
        };
        return `#${f(0)}${f(8)}${f(4)}`;
    }
    showColorWheel() {
        setTimeout(() => {
            let box = document.getElementById("color-box-" + this.randomId);
            this.clientBox = box.getBoundingClientRect();
            let rect = box.getBoundingClientRect();
            for (let index = 0; index < 90; index++) {
                this.colorAxis.push({
                    x1: rect.width,
                    y1: rect.width - (rect.width / 90) * index,
                    x2: rect.width / 2,
                    y2: rect.width / 2
                });
            }
            for (let index = 0; index < 90; index++) {
                this.colorAxis.push({
                    x1: rect.width - (rect.width / 90) * index,
                    y1: 0,
                    x2: rect.width / 2,
                    y2: rect.width / 2
                });
            }
            for (let index = 0; index < 90; index++) {
                this.colorAxis.push({
                    x1: 0,
                    y1: (rect.width / 90) * index,
                    x2: rect.width / 2,
                    y2: rect.width / 2
                });
            }
            for (let index = 0; index < 90; index++) {
                this.colorAxis.push({
                    x1: (rect.width / 90) * index,
                    y1: rect.width,
                    x2: rect.width / 2,
                    y2: rect.width / 2
                });
            }
        }, 500);
    }
    randomColor() {
        return '#' + ((1 << 24) * (Math.random() + 1) | 0).toString(16).substr(1);
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: NgxColorPaletteComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
    static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: NgxColorPaletteComponent, isStandalone: true, selector: "ngx-color-palette", inputs: { color: "color", squared: "squared", position: "position" }, outputs: { currentColor: "currentColor" }, host: { listeners: { "document:mousedown": "onGlobalClick($event)" } }, ngImport: i0, template: "<div class=\"cp-core-container\">\n\n  <div class=\"cp-color-preview\" [class.ngx-palette-squared]=\"squared\" (mouseover)=\"isShow = true;\" (focusout)=\"isShow = false\" [style.background]=\"color\">\n    <div class=\"cp-color-palette\" [ngClass]=\"'cp-position-'+position\" [class.ngx-palette-squared]=\"squared\" [hidden]=\"!isShow\">\n      <div class=\"cp-colors-cavas ngx-cp-border-bottom\">\n        <div class=\"cp-color-pill-grid\">\n          <div class=\"cp-color-pill cp-color-pill-drop\" (click)=\"showBasic();\"  >\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" [class.npx-active-mode]=\"mode === 'basic'\" fill=\"#d9d9d9\" class=\"bi bi-stack\" viewBox=\"0 0 16 16\">\n              <path d=\"m14.12 10.163 1.715.858c.22.11.22.424 0 .534L8.267 15.34a.598.598 0 0 1-.534 0L.165 11.555a.299.299 0 0 1 0-.534l1.716-.858 5.317 2.659c.505.252 1.1.252 1.604 0l5.317-2.66zM7.733.063a.598.598 0 0 1 .534 0l7.568 3.784a.3.3 0 0 1 0 .535L8.267 8.165a.598.598 0 0 1-.534 0L.165 4.382a.299.299 0 0 1 0-.535L7.733.063z\"/>\n              <path d=\"m14.12 6.576 1.715.858c.22.11.22.424 0 .534l-7.568 3.784a.598.598 0 0 1-.534 0L.165 7.968a.299.299 0 0 1 0-.534l1.716-.858 5.317 2.659c.505.252 1.1.252 1.604 0l5.317-2.659z\"/>\n            </svg>\n          </div>\n          <div class=\"cp-color-pill cp-color-pill-drop\" (click)=\"showMaterial();\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" [class.npx-active-mode]=\"mode === 'material'\" fill=\"#d9d9d9\" class=\"bi bi-triangle-half\" viewBox=\"0 0 16 16\">\n              <path d=\"M8.065 2.016A.13.13 0 0 0 8.002 2v11.983l6.856.017a.12.12 0 0 0 .066-.017.162.162 0 0 0 .054-.06.176.176 0 0 0-.002-.183L8.12 2.073a.146.146 0 0 0-.054-.057zm-1.043-.45a1.13 1.13 0 0 1 1.96 0l6.856 11.667c.458.778-.091 1.767-.98 1.767H1.146c-.889 0-1.437-.99-.98-1.767L7.022 1.566z\"/>\n            </svg>\n          </div>\n          <div class=\"cp-color-pill cp-color-pill-drop\" (click)=\"showCrayola();\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" [class.npx-active-mode]=\"mode === 'crayola'\" fill=\"#d9d9d9\" class=\"bi bi-ui-radios-grid\" viewBox=\"0 0 16 16\">\n              <path d=\"M3.5 15a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5zm9-9a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5zm0 9a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zM16 3.5a3.5 3.5 0 1 1-7 0 3.5 3.5 0 0 1 7 0zm-9 9a3.5 3.5 0 1 1-7 0 3.5 3.5 0 0 1 7 0zm5.5 3.5a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7zm-9-11a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm0 2a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7z\"/>\n            </svg>\n          </div>\n          <div class=\"cp-color-pill cp-color-pill-drop\" (click)=\"showWheel();\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" [class.npx-active-mode]=\"mode === 'wheel'\" fill=\"#d9d9d9\" class=\"bi bi-palette-fill\" viewBox=\"0 0 16 16\">\n              <path d=\"M12.433 10.07C14.133 10.585 16 11.15 16 8a8 8 0 1 0-8 8c1.996 0 1.826-1.504 1.649-3.08-.124-1.101-.252-2.237.351-2.92.465-.527 1.42-.237 2.433.07zM8 5a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4.5 3a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zM5 6.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm.5 6.5a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z\" />\n            </svg>\n          </div>\n          <div class=\"cp-color-pill cp-color-pill-drop\" (click)=\"showHsl();\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" [class.npx-active-mode]=\"mode === 'hsl'\" fill=\"#d9d9d9\" class=\"bi bi-palette2\" viewBox=\"0 0 16 16\">\n              <path d=\"M0 .5A.5.5 0 0 1 .5 0h5a.5.5 0 0 1 .5.5v5.277l4.147-4.131a.5.5 0 0 1 .707 0l3.535 3.536a.5.5 0 0 1 0 .708L10.261 10H15.5a.5.5 0 0 1 .5.5v5a.5.5 0 0 1-.5.5H3a2.99 2.99 0 0 1-2.121-.879A2.99 2.99 0 0 1 0 13.044m6-.21 7.328-7.3-2.829-2.828L6 7.188v5.647zM4.5 13a1.5 1.5 0 1 0-3 0 1.5 1.5 0 0 0 3 0zM15 15v-4H9.258l-4.015 4H15zM0 .5v12.495V.5z\"/>\n              <path d=\"M0 12.995V13a3.07 3.07 0 0 0 0-.005z\"/>\n            </svg>\n          </div>\n        </div>\n      </div>\n      <!--  -->\n      <div class=\"color-wheel-box\" [hidden]=\"mode !== 'wheel'\">\n        <div class=\"color-box\" [attr.id]=\"'color-box-'+ randomId\">\n          <svg>\n            @for (axis of colorAxis; track axis; let i = $index) {\n              <line [style.zIndex]=\"i\" [attr.id]=\"i\"\n                (click)=\"choosenColor = hslToHex(i, 100, 50);\" [attr.x1]=\"axis?.x1\" [attr.y1]=\"axis?.y1\"\n                [attr.x2]=\"axis?.x2\" [attr.y2]=\"axis?.y2\" [style.stroke]=\"'hsl('+i+',100%,50%)'\"\n                [style.strokeWidth]=\"(clientBox.width * 4 / 360)\" />\n            }\n          </svg>\n        </div>\n        <div class=\"center-box\">\n          <div class=\"black-box\" [style.backgroundColor]=\"choosenColor\"></div>\n        </div>\n      </div>\n      <!--  -->\n      @if (mode === 'hsl') {\n        <div class=\"hue-grid-hex\">\n          @for (hue of iterator; track hue) {\n            <div (click)=\"choosenColor = hslToHex(hue, 100, 50);\"\n            [style.backgroundColor]=\"'hsl('+hue+',100%,50%)'\" class=\"hue-item-hex\"></div>\n          }\n        </div>\n      }\n      <!--  -->\n      @if (mode === 'crayola') {\n        <div class=\"cp-colors-cavas\">\n          <div class=\"cp-color-pill-grid\">\n            @for (colorValue of crayola; track colorValue) {\n              <div (click)=\"choosenColor = colorValue?.hex || '';\"\n                [class.ngx-palette-squared]=\"squared\"\n                [class.cp-color-pill-active]=\"choosenColor === colorValue?.hex\"\n              [style.backgroundColor]=\"colorValue?.hex\" class=\"cp-color-pill\"></div>\n            }\n          </div>\n        </div>\n      }\n      <!--  -->\n      @if (mode === 'material') {\n        <div class=\"cp-colors-cavas\">\n          @for (matkey of material | keyvalue; track matkey) {\n            <div>\n              <div class=\"cp-color-pill-grid\">\n                @for (colorValue of matkey['value'] | keyvalue; track colorValue) {\n                  <div (click)=\"choosenColor = colorValue['value'];\"\n                    [class.ngx-palette-squared]=\"squared\"\n                    [class.cp-color-pill-active]=\"choosenColor === colorValue['value']\"\n                    [style.backgroundColor]=\"colorValue['value']\" class=\"cp-color-pill\">\n                  </div>\n                }\n              </div>\n              &nbsp;\n            </div>\n          }\n        </div>\n      }\n      <!--  -->\n      @if (mode === 'basic') {\n        <div class=\"cp-colors-cavas\">\n          @if (!isPalette) {\n            <div class=\"cp-color-pill-grid\">\n              @for (colorValue of colors; track colorValue; let pIndex = $index) {\n                <div class=\"cp-color-pill\"\n                  [class.ngx-palette-squared]=\"squared\"\n                  [class.cp-color-pill-active]=\"choosenColor === colorValue.preview\"\n                  (click)=\"paletteIndex = pIndex;isPalette = true\" [style.background]=\"colorValue.preview\">\n                </div>\n              }\n            </div>\n          }\n          @if (isPalette) {\n            <div class=\"cp-color-pill-grid\">\n              @for (colorValue of colors[paletteIndex]['variants']; track colorValue; let cIndex = $index) {\n                <div class=\"cp-color-pill\"\n                  [class.ngx-palette-squared]=\"squared\"\n                  [class.cp-color-pill-active]=\"choosenColor === colorValue\" (click)=\"setColor(colorValue)\"\n                  [style.background]=\"colorValue\">\n                </div>\n              }\n              <div class=\"cp-color-pill cp-color-pill-drop\" (click)=\"isPalette = false;\">\n                <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"transform: rotate(90deg)\" width=\"32\" height=\"32\" fill=\"#d9d9d9\" class=\"bi bi-arrow-down-circle-fill\" viewBox=\"0 0 16 16\">\n                  <path d=\"M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8.5 4.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z\"/>\n                </svg>\n              </div>\n            </div>\n          }\n        </div>\n      }\n      <!--  -->\n      <div class=\"cp-color-actions\" [style.background]=\"choosenColor\">\n        <button class=\"cp-color-button cp-select-button\" [class.ngx-palette-squared]=\"squared\">\n          {{choosenColor}}\n        </button>\n        <div></div>\n        <button class=\"cp-color-button cp-select-button\" (click)=\"setCoreColor()\" [class.ngx-palette-squared]=\"squared\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"#5cb85c\" class=\"bi bi-check-circle-fill\" viewBox=\"0 0 16 16\">\n            <path d=\"M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-3.97-3.03a.75.75 0 0 0-1.08.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-.01-1.05z\"/>\n          </svg>\n        </button>\n        <button class=\"cp-color-button cp-cancel-button\" (click)=\"discardCoreColor();\" [class.ngx-palette-squared]=\"squared\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"#d9534f\" class=\"bi bi-x-circle-fill\" viewBox=\"0 0 16 16\">\n            <path d=\"M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM5.354 4.646a.5.5 0 1 0-.708.708L7.293 8l-2.647 2.646a.5.5 0 0 0 .708.708L8 8.707l2.646 2.647a.5.5 0 0 0 .708-.708L8.707 8l2.647-2.646a.5.5 0 0 0-.708-.708L8 7.293 5.354 4.646z\"/>\n          </svg>\n        </button>\n      </div>\n    </div>\n  </div>\n</div>\n", styles: [".cp-core-container{height:1.75rem;width:1.75rem;border-radius:1.5rem}.cp-core-container .cp-color-preview{position:relative;cursor:pointer;aspect-ratio:1/1;border-radius:1.5rem;outline:.35rem solid #ececec}.cp-core-container .cp-color-preview .cp-color-palette{z-index:1024;width:15rem;border:1px solid #ececec;overflow:hidden;transition:all .25s ease-in-out;border-radius:.5rem;background-color:#fff;transition:all 1s ease-in-out;animation:fadeinout 1s cubic-bezier(.175,.885,.32,1.275) forwards}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas{max-height:15rem;overflow:auto;background-color:#fff;padding:1rem}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas .cp-color-pill-grid{display:grid;align-items:center;justify-content:center;grid-template-columns:repeat(5,1fr);gap:1rem;transition:all .25s ease-in-out}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas .cp-color-pill-grid .cp-color-pill{width:100%;aspect-ratio:1/1;border-radius:100%;display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;-webkit-animation:scale-up-center .4s cubic-bezier(.39,.575,.565,1) both;animation:scale-up-center .4s cubic-bezier(.39,.575,.565,1) both}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas .cp-color-pill-grid .cp-color-pill-active{outline:.35rem solid #ececec}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas .cp-color-pill-grid .cp-color-pill-drop{background-color:#fff;display:grid;align-items:center;justify-content:center}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas .cp-color-pill-grid .cp-color-svg-left{transform:rotate(90deg)}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas::-webkit-scrollbar{width:10px!important;background-color:#fff!important}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas::-webkit-scrollbar-thumb{width:10px!important;border-radius:0!important;background-color:#ececec!important}.cp-core-container .cp-color-preview .cp-color-actions{padding:.5rem;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:.5rem;border-top:1px solid #ececec}.cp-core-container .cp-color-preview .cp-color-actions .cp-color-button{padding:.5rem;border:none;outline:1px solid #ececec;border-radius:.25rem;background-color:#fff;color:#00000080;font-size:small;font-weight:600;text-transform:capitalize;-webkit-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center}.cp-core-container .cp-color-preview .cp-color-actions .cp-color-button:hover{background-color:#fdfdfd}.cp-core-container .cp-color-preview .cp-color-actions .cp-color-picker{color:#00000080;padding:.5rem;border:1px solid #ececec;border-radius:7.5px!important;font-size:small;width:75%;font-weight:600;text-transform:uppercase;-webkit-user-select:none;user-select:none}.cp-core-container .cp-color-preview .cp-color-actions .cp-color-picker:focus{outline:none;box-shadow:none}@keyframes fadeinout{0%{opacity:0}to{opacity:1}}.hue-grid-hex{display:grid;grid-template-columns:repeat(360,1fr);width:100%;aspect-ratio:16/9}.hue-grid-hex .hue-item-hex{height:100%}.hue-grid-preview{padding:1rem;text-align:center;display:flex;align-items:center;justify-content:center}.hue-grid-preview .hue-grid-value{width:5rem!important;padding:.25rem .5rem;border-radius:5px;font-size:small;text-transform:uppercase;background-color:#f5f5f5}.color-wheel-box{padding:1rem}.color-wheel-box .color-box{width:100%;aspect-ratio:1/1;position:relative;border-radius:100%!important;overflow:hidden;display:flex;align-items:center;justify-content:center}.color-wheel-box .color-box svg{position:absolute;height:100%;width:100%;left:0}.color-wheel-box .color-box .center-box{height:5rem;width:5rem;background-color:#fff;position:absolute;left:50%;top:50%;border-radius:100%;transform:translate(-50%,-50%)}.color-wheel-box .color-box .center-box .black-box{height:2.5rem;width:2.5rem;background-color:#000;position:absolute;left:50%;top:50%;border-radius:100%;transform:translate(-50%,-50%)}@-webkit-keyframes scale-up-center{0%{-webkit-transform:scale(.5);transform:scale(.5)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes scale-up-center{0%{-webkit-transform:scale(.5);transform:scale(.5)}to{-webkit-transform:scale(1);transform:scale(1)}}.ngx-palette-squared{border-radius:0!important}.rgb-grid{display:grid;grid-template-columns:repeat(3,1fr)}.rgb-grid .rgb-range{width:3rem}.ngx-cp-border-bottom{border-bottom:1px solid #ececec}.npx-active-mode{fill:#000000bf}.cp-position-bottom-left{position:absolute;top:3rem;left:-1rem}.cp-position-bottom-right{position:absolute;top:3rem;right:-1rem}.cp-position-top-left{position:absolute;bottom:3rem;left:-1rem}.cp-position-top-right{position:absolute;bottom:3rem;right:-1rem}.cp-position-top{position:absolute;bottom:3rem;left:50%;transform:translate(-50%)}.cp-position-bottom{position:absolute;top:3rem;left:50%;transform:translate(-50%)}.cp-position-right{position:absolute;left:50%;transform:translateY(-50%) translate(12.5%)}.cp-position-left{position:absolute;right:50%;transform:translateY(-50%) translate(-12.5%)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: NgxColorPaletteComponent, decorators: [{
            type: Component,
            args: [{ selector: 'ngx-color-palette', standalone: true, imports: [NgClass, KeyValuePipe], template: "<div class=\"cp-core-container\">\n\n  <div class=\"cp-color-preview\" [class.ngx-palette-squared]=\"squared\" (mouseover)=\"isShow = true;\" (focusout)=\"isShow = false\" [style.background]=\"color\">\n    <div class=\"cp-color-palette\" [ngClass]=\"'cp-position-'+position\" [class.ngx-palette-squared]=\"squared\" [hidden]=\"!isShow\">\n      <div class=\"cp-colors-cavas ngx-cp-border-bottom\">\n        <div class=\"cp-color-pill-grid\">\n          <div class=\"cp-color-pill cp-color-pill-drop\" (click)=\"showBasic();\"  >\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" [class.npx-active-mode]=\"mode === 'basic'\" fill=\"#d9d9d9\" class=\"bi bi-stack\" viewBox=\"0 0 16 16\">\n              <path d=\"m14.12 10.163 1.715.858c.22.11.22.424 0 .534L8.267 15.34a.598.598 0 0 1-.534 0L.165 11.555a.299.299 0 0 1 0-.534l1.716-.858 5.317 2.659c.505.252 1.1.252 1.604 0l5.317-2.66zM7.733.063a.598.598 0 0 1 .534 0l7.568 3.784a.3.3 0 0 1 0 .535L8.267 8.165a.598.598 0 0 1-.534 0L.165 4.382a.299.299 0 0 1 0-.535L7.733.063z\"/>\n              <path d=\"m14.12 6.576 1.715.858c.22.11.22.424 0 .534l-7.568 3.784a.598.598 0 0 1-.534 0L.165 7.968a.299.299 0 0 1 0-.534l1.716-.858 5.317 2.659c.505.252 1.1.252 1.604 0l5.317-2.659z\"/>\n            </svg>\n          </div>\n          <div class=\"cp-color-pill cp-color-pill-drop\" (click)=\"showMaterial();\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" [class.npx-active-mode]=\"mode === 'material'\" fill=\"#d9d9d9\" class=\"bi bi-triangle-half\" viewBox=\"0 0 16 16\">\n              <path d=\"M8.065 2.016A.13.13 0 0 0 8.002 2v11.983l6.856.017a.12.12 0 0 0 .066-.017.162.162 0 0 0 .054-.06.176.176 0 0 0-.002-.183L8.12 2.073a.146.146 0 0 0-.054-.057zm-1.043-.45a1.13 1.13 0 0 1 1.96 0l6.856 11.667c.458.778-.091 1.767-.98 1.767H1.146c-.889 0-1.437-.99-.98-1.767L7.022 1.566z\"/>\n            </svg>\n          </div>\n          <div class=\"cp-color-pill cp-color-pill-drop\" (click)=\"showCrayola();\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" [class.npx-active-mode]=\"mode === 'crayola'\" fill=\"#d9d9d9\" class=\"bi bi-ui-radios-grid\" viewBox=\"0 0 16 16\">\n              <path d=\"M3.5 15a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5zm9-9a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5zm0 9a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zM16 3.5a3.5 3.5 0 1 1-7 0 3.5 3.5 0 0 1 7 0zm-9 9a3.5 3.5 0 1 1-7 0 3.5 3.5 0 0 1 7 0zm5.5 3.5a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7zm-9-11a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm0 2a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7z\"/>\n            </svg>\n          </div>\n          <div class=\"cp-color-pill cp-color-pill-drop\" (click)=\"showWheel();\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" [class.npx-active-mode]=\"mode === 'wheel'\" fill=\"#d9d9d9\" class=\"bi bi-palette-fill\" viewBox=\"0 0 16 16\">\n              <path d=\"M12.433 10.07C14.133 10.585 16 11.15 16 8a8 8 0 1 0-8 8c1.996 0 1.826-1.504 1.649-3.08-.124-1.101-.252-2.237.351-2.92.465-.527 1.42-.237 2.433.07zM8 5a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm4.5 3a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zM5 6.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm.5 6.5a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z\" />\n            </svg>\n          </div>\n          <div class=\"cp-color-pill cp-color-pill-drop\" (click)=\"showHsl();\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" [class.npx-active-mode]=\"mode === 'hsl'\" fill=\"#d9d9d9\" class=\"bi bi-palette2\" viewBox=\"0 0 16 16\">\n              <path d=\"M0 .5A.5.5 0 0 1 .5 0h5a.5.5 0 0 1 .5.5v5.277l4.147-4.131a.5.5 0 0 1 .707 0l3.535 3.536a.5.5 0 0 1 0 .708L10.261 10H15.5a.5.5 0 0 1 .5.5v5a.5.5 0 0 1-.5.5H3a2.99 2.99 0 0 1-2.121-.879A2.99 2.99 0 0 1 0 13.044m6-.21 7.328-7.3-2.829-2.828L6 7.188v5.647zM4.5 13a1.5 1.5 0 1 0-3 0 1.5 1.5 0 0 0 3 0zM15 15v-4H9.258l-4.015 4H15zM0 .5v12.495V.5z\"/>\n              <path d=\"M0 12.995V13a3.07 3.07 0 0 0 0-.005z\"/>\n            </svg>\n          </div>\n        </div>\n      </div>\n      <!--  -->\n      <div class=\"color-wheel-box\" [hidden]=\"mode !== 'wheel'\">\n        <div class=\"color-box\" [attr.id]=\"'color-box-'+ randomId\">\n          <svg>\n            @for (axis of colorAxis; track axis; let i = $index) {\n              <line [style.zIndex]=\"i\" [attr.id]=\"i\"\n                (click)=\"choosenColor = hslToHex(i, 100, 50);\" [attr.x1]=\"axis?.x1\" [attr.y1]=\"axis?.y1\"\n                [attr.x2]=\"axis?.x2\" [attr.y2]=\"axis?.y2\" [style.stroke]=\"'hsl('+i+',100%,50%)'\"\n                [style.strokeWidth]=\"(clientBox.width * 4 / 360)\" />\n            }\n          </svg>\n        </div>\n        <div class=\"center-box\">\n          <div class=\"black-box\" [style.backgroundColor]=\"choosenColor\"></div>\n        </div>\n      </div>\n      <!--  -->\n      @if (mode === 'hsl') {\n        <div class=\"hue-grid-hex\">\n          @for (hue of iterator; track hue) {\n            <div (click)=\"choosenColor = hslToHex(hue, 100, 50);\"\n            [style.backgroundColor]=\"'hsl('+hue+',100%,50%)'\" class=\"hue-item-hex\"></div>\n          }\n        </div>\n      }\n      <!--  -->\n      @if (mode === 'crayola') {\n        <div class=\"cp-colors-cavas\">\n          <div class=\"cp-color-pill-grid\">\n            @for (colorValue of crayola; track colorValue) {\n              <div (click)=\"choosenColor = colorValue?.hex || '';\"\n                [class.ngx-palette-squared]=\"squared\"\n                [class.cp-color-pill-active]=\"choosenColor === colorValue?.hex\"\n              [style.backgroundColor]=\"colorValue?.hex\" class=\"cp-color-pill\"></div>\n            }\n          </div>\n        </div>\n      }\n      <!--  -->\n      @if (mode === 'material') {\n        <div class=\"cp-colors-cavas\">\n          @for (matkey of material | keyvalue; track matkey) {\n            <div>\n              <div class=\"cp-color-pill-grid\">\n                @for (colorValue of matkey['value'] | keyvalue; track colorValue) {\n                  <div (click)=\"choosenColor = colorValue['value'];\"\n                    [class.ngx-palette-squared]=\"squared\"\n                    [class.cp-color-pill-active]=\"choosenColor === colorValue['value']\"\n                    [style.backgroundColor]=\"colorValue['value']\" class=\"cp-color-pill\">\n                  </div>\n                }\n              </div>\n              &nbsp;\n            </div>\n          }\n        </div>\n      }\n      <!--  -->\n      @if (mode === 'basic') {\n        <div class=\"cp-colors-cavas\">\n          @if (!isPalette) {\n            <div class=\"cp-color-pill-grid\">\n              @for (colorValue of colors; track colorValue; let pIndex = $index) {\n                <div class=\"cp-color-pill\"\n                  [class.ngx-palette-squared]=\"squared\"\n                  [class.cp-color-pill-active]=\"choosenColor === colorValue.preview\"\n                  (click)=\"paletteIndex = pIndex;isPalette = true\" [style.background]=\"colorValue.preview\">\n                </div>\n              }\n            </div>\n          }\n          @if (isPalette) {\n            <div class=\"cp-color-pill-grid\">\n              @for (colorValue of colors[paletteIndex]['variants']; track colorValue; let cIndex = $index) {\n                <div class=\"cp-color-pill\"\n                  [class.ngx-palette-squared]=\"squared\"\n                  [class.cp-color-pill-active]=\"choosenColor === colorValue\" (click)=\"setColor(colorValue)\"\n                  [style.background]=\"colorValue\">\n                </div>\n              }\n              <div class=\"cp-color-pill cp-color-pill-drop\" (click)=\"isPalette = false;\">\n                <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"transform: rotate(90deg)\" width=\"32\" height=\"32\" fill=\"#d9d9d9\" class=\"bi bi-arrow-down-circle-fill\" viewBox=\"0 0 16 16\">\n                  <path d=\"M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8.5 4.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z\"/>\n                </svg>\n              </div>\n            </div>\n          }\n        </div>\n      }\n      <!--  -->\n      <div class=\"cp-color-actions\" [style.background]=\"choosenColor\">\n        <button class=\"cp-color-button cp-select-button\" [class.ngx-palette-squared]=\"squared\">\n          {{choosenColor}}\n        </button>\n        <div></div>\n        <button class=\"cp-color-button cp-select-button\" (click)=\"setCoreColor()\" [class.ngx-palette-squared]=\"squared\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"#5cb85c\" class=\"bi bi-check-circle-fill\" viewBox=\"0 0 16 16\">\n            <path d=\"M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-3.97-3.03a.75.75 0 0 0-1.08.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-.01-1.05z\"/>\n          </svg>\n        </button>\n        <button class=\"cp-color-button cp-cancel-button\" (click)=\"discardCoreColor();\" [class.ngx-palette-squared]=\"squared\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"#d9534f\" class=\"bi bi-x-circle-fill\" viewBox=\"0 0 16 16\">\n            <path d=\"M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM5.354 4.646a.5.5 0 1 0-.708.708L7.293 8l-2.647 2.646a.5.5 0 0 0 .708.708L8 8.707l2.646 2.647a.5.5 0 0 0 .708-.708L8.707 8l2.647-2.646a.5.5 0 0 0-.708-.708L8 7.293 5.354 4.646z\"/>\n          </svg>\n        </button>\n      </div>\n    </div>\n  </div>\n</div>\n", styles: [".cp-core-container{height:1.75rem;width:1.75rem;border-radius:1.5rem}.cp-core-container .cp-color-preview{position:relative;cursor:pointer;aspect-ratio:1/1;border-radius:1.5rem;outline:.35rem solid #ececec}.cp-core-container .cp-color-preview .cp-color-palette{z-index:1024;width:15rem;border:1px solid #ececec;overflow:hidden;transition:all .25s ease-in-out;border-radius:.5rem;background-color:#fff;transition:all 1s ease-in-out;animation:fadeinout 1s cubic-bezier(.175,.885,.32,1.275) forwards}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas{max-height:15rem;overflow:auto;background-color:#fff;padding:1rem}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas .cp-color-pill-grid{display:grid;align-items:center;justify-content:center;grid-template-columns:repeat(5,1fr);gap:1rem;transition:all .25s ease-in-out}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas .cp-color-pill-grid .cp-color-pill{width:100%;aspect-ratio:1/1;border-radius:100%;display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none;-webkit-animation:scale-up-center .4s cubic-bezier(.39,.575,.565,1) both;animation:scale-up-center .4s cubic-bezier(.39,.575,.565,1) both}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas .cp-color-pill-grid .cp-color-pill-active{outline:.35rem solid #ececec}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas .cp-color-pill-grid .cp-color-pill-drop{background-color:#fff;display:grid;align-items:center;justify-content:center}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas .cp-color-pill-grid .cp-color-svg-left{transform:rotate(90deg)}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas::-webkit-scrollbar{width:10px!important;background-color:#fff!important}.cp-core-container .cp-color-preview .cp-color-palette .cp-colors-cavas::-webkit-scrollbar-thumb{width:10px!important;border-radius:0!important;background-color:#ececec!important}.cp-core-container .cp-color-preview .cp-color-actions{padding:.5rem;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:.5rem;border-top:1px solid #ececec}.cp-core-container .cp-color-preview .cp-color-actions .cp-color-button{padding:.5rem;border:none;outline:1px solid #ececec;border-radius:.25rem;background-color:#fff;color:#00000080;font-size:small;font-weight:600;text-transform:capitalize;-webkit-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center}.cp-core-container .cp-color-preview .cp-color-actions .cp-color-button:hover{background-color:#fdfdfd}.cp-core-container .cp-color-preview .cp-color-actions .cp-color-picker{color:#00000080;padding:.5rem;border:1px solid #ececec;border-radius:7.5px!important;font-size:small;width:75%;font-weight:600;text-transform:uppercase;-webkit-user-select:none;user-select:none}.cp-core-container .cp-color-preview .cp-color-actions .cp-color-picker:focus{outline:none;box-shadow:none}@keyframes fadeinout{0%{opacity:0}to{opacity:1}}.hue-grid-hex{display:grid;grid-template-columns:repeat(360,1fr);width:100%;aspect-ratio:16/9}.hue-grid-hex .hue-item-hex{height:100%}.hue-grid-preview{padding:1rem;text-align:center;display:flex;align-items:center;justify-content:center}.hue-grid-preview .hue-grid-value{width:5rem!important;padding:.25rem .5rem;border-radius:5px;font-size:small;text-transform:uppercase;background-color:#f5f5f5}.color-wheel-box{padding:1rem}.color-wheel-box .color-box{width:100%;aspect-ratio:1/1;position:relative;border-radius:100%!important;overflow:hidden;display:flex;align-items:center;justify-content:center}.color-wheel-box .color-box svg{position:absolute;height:100%;width:100%;left:0}.color-wheel-box .color-box .center-box{height:5rem;width:5rem;background-color:#fff;position:absolute;left:50%;top:50%;border-radius:100%;transform:translate(-50%,-50%)}.color-wheel-box .color-box .center-box .black-box{height:2.5rem;width:2.5rem;background-color:#000;position:absolute;left:50%;top:50%;border-radius:100%;transform:translate(-50%,-50%)}@-webkit-keyframes scale-up-center{0%{-webkit-transform:scale(.5);transform:scale(.5)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes scale-up-center{0%{-webkit-transform:scale(.5);transform:scale(.5)}to{-webkit-transform:scale(1);transform:scale(1)}}.ngx-palette-squared{border-radius:0!important}.rgb-grid{display:grid;grid-template-columns:repeat(3,1fr)}.rgb-grid .rgb-range{width:3rem}.ngx-cp-border-bottom{border-bottom:1px solid #ececec}.npx-active-mode{fill:#000000bf}.cp-position-bottom-left{position:absolute;top:3rem;left:-1rem}.cp-position-bottom-right{position:absolute;top:3rem;right:-1rem}.cp-position-top-left{position:absolute;bottom:3rem;left:-1rem}.cp-position-top-right{position:absolute;bottom:3rem;right:-1rem}.cp-position-top{position:absolute;bottom:3rem;left:50%;transform:translate(-50%)}.cp-position-bottom{position:absolute;top:3rem;left:50%;transform:translate(-50%)}.cp-position-right{position:absolute;left:50%;transform:translateY(-50%) translate(12.5%)}.cp-position-left{position:absolute;right:50%;transform:translateY(-50%) translate(-12.5%)}\n"] }]
        }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { color: [{
                type: Input
            }], squared: [{
                type: Input
            }], position: [{
                type: Input
            }], currentColor: [{
                type: Output
            }], onGlobalClick: [{
                type: HostListener,
                args: ['document:mousedown', ['$event']]
            }] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNvbG9yLXBhbGV0dGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbG9yLXBhbGV0dGUvc3JjL2xpYi9uZ3gtY29sb3ItcGFsZXR0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29sb3ItcGFsZXR0ZS9zcmMvbGliL25neC1jb2xvci1wYWxldHRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQWMsR0FBRyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQVV4RCxNQUFNLE9BQU8sd0JBQXdCO0lBMkJuQyxZQUFvQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBekJqQyxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBQ25CLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsYUFBUSxHQUFXLGFBQWEsQ0FBQztRQUVoQyxpQkFBWSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRTdELFNBQUksR0FBVyxPQUFPLENBQUM7UUFFcEIsV0FBTSxHQUFHLEdBQUcsQ0FBQztRQUNiLFlBQU8sR0FBRyxPQUFPLENBQUM7UUFDbEIsYUFBUSxHQUFHLFFBQVEsQ0FBQztRQUVwQixpQkFBWSxHQUFXLEVBQUUsQ0FBQztRQUUxQixXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFFM0IsaUJB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O2FBQ0o7UUFDSCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRU0sV0FBVztRQUNoQixPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQzs4R0E5SVUsd0JBQXdCO2tHQUF4Qix3QkFBd0Isc1FDZHJDLHU3U0FnSkEsNm5LRHBJYyxPQUFPLCtFQUFFLFlBQVk7OzJGQUV0Qix3QkFBd0I7a0JBUHBDLFNBQVM7K0JBQ0ksbUJBQW1CLGNBR2pCLElBQUksV0FDUCxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7K0VBSXpCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxZQUFZO3NCQUFyQixNQUFNO2dCQTZFRyxhQUFhO3NCQUR0QixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ09MT1JFVkVOVCwgUkFXIH0gZnJvbSAnLi9SQVcnO1xuaW1wb3J0IHsgQ1JBWU9MQSB9IGZyb20gXCIuL0NSQVlPTEFcIjtcbmltcG9ydCB7IE1BVEVSSUFMIH0gZnJvbSBcIi4vTUFURVJJQUxcIjtcbmltcG9ydCB7IE5nQ2xhc3MsIEtleVZhbHVlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbnR5cGUgY29sb3JNb2RlID0gJ2Jhc2ljJyB8ICdoc2wnIHwgJ3doZWVsJztcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd4LWNvbG9yLXBhbGV0dGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9uZ3gtY29sb3ItcGFsZXR0ZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbmd4LWNvbG9yLXBhbGV0dGUuY29tcG9uZW50LnNjc3MnXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ0NsYXNzLCBLZXlWYWx1ZVBpcGVdXG59KVxuZXhwb3J0IGNsYXNzIE5neENvbG9yUGFsZXR0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuXG4gIEBJbnB1dCgpIGNvbG9yOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc3F1YXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwb3NpdGlvbjogc3RyaW5nID0gJ2JvdHRvbS1sZWZ0JztcblxuICBAT3V0cHV0KCkgY3VycmVudENvbG9yOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIHB1YmxpYyBtb2RlOiBzdHJpbmcgPSAnYmFzaWMnO1xuXG4gIHByb3RlY3RlZCBjb2xvcnMgPSBSQVc7XG4gIHByb3RlY3RlZCBjcmF5b2xhID0gQ1JBWU9MQTtcbiAgcHJvdGVjdGVkIG1hdGVyaWFsID0gTUFURVJJQUw7XG5cbiAgcHJvdGVjdGVkIGNob29zZW5Db2xvcjogc3RyaW5nID0gJyc7XG5cbiAgcHJvdGVjdGVkIGlzU2hvdzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNQYWxldHRlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIHBhbGV0dGVJbmRleDogbnVtYmVyID0gMDtcblxuICBwcm90ZWN0ZWQgaXRlcmF0b3IgPSBBcnJheS5mcm9tKEFycmF5KDM2MCkua2V5cygpKTtcblxuICBwcm90ZWN0ZWQgY29sb3JBeGlzOiBhbnlbXSA9IFtdO1xuICBwcm90ZWN0ZWQgY2xpZW50Qm94OiBET01SZWN0O1xuICBwcm90ZWN0ZWQgcmFuZG9tSWQ6IHN0cmluZyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLnRvU3RyaW5nKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgdGhpcy5yYW5kb21JZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb2xvciA9IHRoaXMuY29sb3IgfHwgdGhpcy5jb2xvcnNbMF1bJ3ByZXZpZXcnXTtcbiAgICB0aGlzLmNob29zZW5Db2xvciA9IHRoaXMuY29sb3I7XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAnd2hlZWwnKSB7XG4gICAgICB0aGlzLnNob3dDb2xvcldoZWVsKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldENvbG9yKGNvbG9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNob29zZW5Db2xvciA9IGNvbG9yO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRpc2NhcmRDb3JlQ29sb3IoKSB7XG4gICAgdGhpcy5pc1Nob3cgPSBmYWxzZTtcbiAgICB0aGlzLmlzUGFsZXR0ZSA9IGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldENvcmVDb2xvcigpIHtcbiAgICB0aGlzLmNvbG9yID0gdGhpcy5jaG9vc2VuQ29sb3I7XG4gICAgdGhpcy5pc1Nob3cgPSBmYWxzZTtcbiAgICB0aGlzLmlzUGFsZXR0ZSA9IGZhbHNlO1xuICAgIGxldCBjb2xvckV2ZW50OiBDT0xPUkVWRU5UID0ge1xuICAgICAgY29sb3I6IHRoaXMuY29sb3JcbiAgICB9O1xuICAgIHRoaXMuY3VycmVudENvbG9yLmVtaXQoY29sb3JFdmVudCk7XG4gICAgdGhpcy5tb2RlID0gJ2Jhc2ljJztcbiAgfVxuXG4gIHB1YmxpYyBzaG93V2hlZWwoKSB7XG4gICAgdGhpcy5tb2RlID0gJ3doZWVsJztcbiAgICB0aGlzLnNob3dDb2xvcldoZWVsKCk7XG4gIH1cblxuICBwdWJsaWMgc2hvd0hzbCgpIHtcbiAgICB0aGlzLm1vZGUgPSAnaHNsJztcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q3JheW9sYSgpIHtcbiAgICB0aGlzLm1vZGUgPSAnY3JheW9sYSc7XG4gIH1cblxuICBwdWJsaWMgc2hvd0Jhc2ljKCkge1xuICAgIHRoaXMubW9kZSA9ICdiYXNpYyc7XG4gICAgdGhpcy5pc1BhbGV0dGUgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93TWF0ZXJpYWwoKSB7XG4gICAgdGhpcy5tb2RlID0gJ21hdGVyaWFsJztcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gIHByb3RlY3RlZCBvbkdsb2JhbENsaWNrKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHRoaXMuaXNTaG93ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhzbFRvSGV4KGg6IGFueSwgczogYW55LCBsOiBhbnkpIHtcbiAgICBsIC89IDEwMDtcbiAgICBjb25zdCBhID0gcyAqIE1hdGgubWluKGwsIDEgLSBsKSAvIDEwMDtcbiAgICBjb25zdCBmID0gKG46IGFueSkgPT4ge1xuICAgICAgY29uc3QgayA9IChuICsgaCAvIDMwKSAlIDEyO1xuICAgICAgY29uc3QgY29sb3IgPSBsIC0gYSAqIE1hdGgubWF4KE1hdGgubWluKGsgLSAzLCA5IC0gaywgMSksIC0xKTtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKDI1NSAqIGNvbG9yKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKTsgICAvLyBjb252ZXJ0IHRvIEhleCBhbmQgcHJlZml4IFwiMFwiIGlmIG5lZWRlZFxuICAgIH07XG4gICAgcmV0dXJuIGAjJHtmKDApfSR7Zig4KX0ke2YoNCl9YDtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q29sb3JXaGVlbCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxldCBib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbG9yLWJveC1cIiArIHRoaXMucmFuZG9tSWQpIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgICAgdGhpcy5jbGllbnRCb3ggPSBib3guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBsZXQgcmVjdDogRE9NUmVjdCA9IGJveC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCA5MDsgaW5kZXgrKykge1xuICAgICAgICB0aGlzLmNvbG9yQXhpcy5wdXNoKHtcbiAgICAgICAgICB4MTogcmVjdC53aWR0aCxcbiAgICAgICAgICB5MTogcmVjdC53aWR0aCAtIChyZWN0LndpZHRoIC8gOTApICogaW5kZXgsXG4gICAgICAgICAgeDI6IHJlY3Qud2lkdGggLyAyLFxuICAgICAgICAgIHkyOiByZWN0LndpZHRoIC8gMlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCA5MDsgaW5kZXgrKykge1xuICAgICAgICB0aGlzLmNvbG9yQXhpcy5wdXNoKHtcbiAgICAgICAgICB4MTogcmVjdC53aWR0aCAtIChyZWN0LndpZHRoIC8gOTApICogaW5kZXgsXG4gICAgICAgICAgeTE6IDAsXG4gICAgICAgICAgeDI6IHJlY3Qud2lkdGggLyAyLFxuICAgICAgICAgIHkyOiByZWN0LndpZHRoIC8gMlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCA5MDsgaW5kZXgrKykge1xuICAgICAgICB0aGlzLmNvbG9yQXhpcy5wdXNoKHtcbiAgICAgICAgICB4MTogMCxcbiAgICAgICAgICB5MTogKHJlY3Qud2lkdGggLyA5MCkgKiBpbmRleCxcbiAgICAgICAgICB4MjogcmVjdC53aWR0aCAvIDIsXG4gICAgICAgICAgeTI6IHJlY3Qud2lkdGggLyAyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDkwOyBpbmRleCsrKSB7XG4gICAgICAgIHRoaXMuY29sb3JBeGlzLnB1c2goe1xuICAgICAgICAgIHgxOiAocmVjdC53aWR0aCAvIDkwKSAqIGluZGV4LFxuICAgICAgICAgIHkxOiByZWN0LndpZHRoLFxuICAgICAgICAgIHgyOiByZWN0LndpZHRoIC8gMixcbiAgICAgICAgICB5MjogcmVjdC53aWR0aCAvIDJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIHB1YmxpYyByYW5kb21Db2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnIycgKyAoKDEgPDwgMjQpICogKE1hdGgucmFuZG9tKCkgKyAxKSB8IDApLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcC1jb3JlLWNvbnRhaW5lclwiPlxuXG4gIDxkaXYgY2xhc3M9XCJjcC1jb2xvci1wcmV2aWV3XCIgW2NsYXNzLm5neC1wYWxldHRlLXNxdWFyZWRdPVwic3F1YXJlZFwiIChtb3VzZW92ZXIpPVwiaXNTaG93ID0gdHJ1ZTtcIiAoZm9jdXNvdXQpPVwiaXNTaG93ID0gZmFsc2VcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJjb2xvclwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcC1jb2xvci1wYWxldHRlXCIgW25nQ2xhc3NdPVwiJ2NwLXBvc2l0aW9uLScrcG9zaXRpb25cIiBbY2xhc3Mubmd4LXBhbGV0dGUtc3F1YXJlZF09XCJzcXVhcmVkXCIgW2hpZGRlbl09XCIhaXNTaG93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3AtY29sb3JzLWNhdmFzIG5neC1jcC1ib3JkZXItYm90dG9tXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcC1jb2xvci1waWxsLWdyaWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3AtY29sb3ItcGlsbCBjcC1jb2xvci1waWxsLWRyb3BcIiAoY2xpY2spPVwic2hvd0Jhc2ljKCk7XCIgID5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIFtjbGFzcy5ucHgtYWN0aXZlLW1vZGVdPVwibW9kZSA9PT0gJ2Jhc2ljJ1wiIGZpbGw9XCIjZDlkOWQ5XCIgY2xhc3M9XCJiaSBiaS1zdGFja1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIm0xNC4xMiAxMC4xNjMgMS43MTUuODU4Yy4yMi4xMS4yMi40MjQgMCAuNTM0TDguMjY3IDE1LjM0YS41OTguNTk4IDAgMCAxLS41MzQgMEwuMTY1IDExLjU1NWEuMjk5LjI5OSAwIDAgMSAwLS41MzRsMS43MTYtLjg1OCA1LjMxNyAyLjY1OWMuNTA1LjI1MiAxLjEuMjUyIDEuNjA0IDBsNS4zMTctMi42NnpNNy43MzMuMDYzYS41OTguNTk4IDAgMCAxIC41MzQgMGw3LjU2OCAzLjc4NGEuMy4zIDAgMCAxIDAgLjUzNUw4LjI2NyA4LjE2NWEuNTk4LjU5OCAwIDAgMS0uNTM0IDBMLjE2NSA0LjM4MmEuMjk5LjI5OSAwIDAgMSAwLS41MzVMNy43MzMuMDYzelwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIm0xNC4xMiA2LjU3NiAxLjcxNS44NThjLjIyLjExLjIyLjQyNCAwIC41MzRsLTcuNTY4IDMuNzg0YS41OTguNTk4IDAgMCAxLS41MzQgMEwuMTY1IDcuOTY4YS4yOTkuMjk5IDAgMCAxIDAtLjUzNGwxLjcxNi0uODU4IDUuMzE3IDIuNjU5Yy41MDUuMjUyIDEuMS4yNTIgMS42MDQgMGw1LjMxNy0yLjY1OXpcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3AtY29sb3ItcGlsbCBjcC1jb2xvci1waWxsLWRyb3BcIiAoY2xpY2spPVwic2hvd01hdGVyaWFsKCk7XCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiBbY2xhc3MubnB4LWFjdGl2ZS1tb2RlXT1cIm1vZGUgPT09ICdtYXRlcmlhbCdcIiBmaWxsPVwiI2Q5ZDlkOVwiIGNsYXNzPVwiYmkgYmktdHJpYW5nbGUtaGFsZlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjA2NSAyLjAxNkEuMTMuMTMgMCAwIDAgOC4wMDIgMnYxMS45ODNsNi44NTYuMDE3YS4xMi4xMiAwIDAgMCAuMDY2LS4wMTcuMTYyLjE2MiAwIDAgMCAuMDU0LS4wNi4xNzYuMTc2IDAgMCAwLS4wMDItLjE4M0w4LjEyIDIuMDczYS4xNDYuMTQ2IDAgMCAwLS4wNTQtLjA1N3ptLTEuMDQzLS40NWExLjEzIDEuMTMgMCAwIDEgMS45NiAwbDYuODU2IDExLjY2N2MuNDU4Ljc3OC0uMDkxIDEuNzY3LS45OCAxLjc2N0gxLjE0NmMtLjg4OSAwLTEuNDM3LS45OS0uOTgtMS43NjdMNy4wMjIgMS41NjZ6XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNwLWNvbG9yLXBpbGwgY3AtY29sb3ItcGlsbC1kcm9wXCIgKGNsaWNrKT1cInNob3dDcmF5b2xhKCk7XCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiBbY2xhc3MubnB4LWFjdGl2ZS1tb2RlXT1cIm1vZGUgPT09ICdjcmF5b2xhJ1wiIGZpbGw9XCIjZDlkOWQ5XCIgY2xhc3M9XCJiaSBiaS11aS1yYWRpb3MtZ3JpZFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjUgMTVhMi41IDIuNSAwIDEgMCAwLTUgMi41IDIuNSAwIDAgMCAwIDV6bTktOWEyLjUgMi41IDAgMSAwIDAtNSAyLjUgMi41IDAgMCAwIDAgNXptMCA5YTIuNSAyLjUgMCAxIDEgMC01IDIuNSAyLjUgMCAwIDEgMCA1ek0xNiAzLjVhMy41IDMuNSAwIDEgMS03IDAgMy41IDMuNSAwIDAgMSA3IDB6bS05IDlhMy41IDMuNSAwIDEgMS03IDAgMy41IDMuNSAwIDAgMSA3IDB6bTUuNSAzLjVhMy41IDMuNSAwIDEgMCAwLTcgMy41IDMuNSAwIDAgMCAwIDd6bS05LTExYTEuNSAxLjUgMCAxIDEgMC0zIDEuNSAxLjUgMCAwIDEgMCAzem0wIDJhMy41IDMuNSAwIDEgMCAwLTcgMy41IDMuNSAwIDAgMCAwIDd6XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNwLWNvbG9yLXBpbGwgY3AtY29sb3ItcGlsbC1kcm9wXCIgKGNsaWNrKT1cInNob3dXaGVlbCgpO1wiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgW2NsYXNzLm5weC1hY3RpdmUtbW9kZV09XCJtb2RlID09PSAnd2hlZWwnXCIgZmlsbD1cIiNkOWQ5ZDlcIiBjbGFzcz1cImJpIGJpLXBhbGV0dGUtZmlsbFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMi40MzMgMTAuMDdDMTQuMTMzIDEwLjU4NSAxNiAxMS4xNSAxNiA4YTggOCAwIDEgMC04IDhjMS45OTYgMCAxLjgyNi0xLjUwNCAxLjY0OS0zLjA4LS4xMjQtMS4xMDEtLjI1Mi0yLjIzNy4zNTEtMi45Mi40NjUtLjUyNyAxLjQyLS4yMzcgMi40MzMuMDd6TTggNWExLjUgMS41IDAgMSAxIDAtMyAxLjUgMS41IDAgMCAxIDAgM3ptNC41IDNhMS41IDEuNSAwIDEgMSAwLTMgMS41IDEuNSAwIDAgMSAwIDN6TTUgNi41YTEuNSAxLjUgMCAxIDEtMyAwIDEuNSAxLjUgMCAwIDEgMyAwem0uNSA2LjVhMS41IDEuNSAwIDEgMSAwLTMgMS41IDEuNSAwIDAgMSAwIDN6XCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcC1jb2xvci1waWxsIGNwLWNvbG9yLXBpbGwtZHJvcFwiIChjbGljayk9XCJzaG93SHNsKCk7XCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiBbY2xhc3MubnB4LWFjdGl2ZS1tb2RlXT1cIm1vZGUgPT09ICdoc2wnXCIgZmlsbD1cIiNkOWQ5ZDlcIiBjbGFzcz1cImJpIGJpLXBhbGV0dGUyXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgLjVBLjUuNSAwIDAgMSAuNSAwaDVhLjUuNSAwIDAgMSAuNS41djUuMjc3bDQuMTQ3LTQuMTMxYS41LjUgMCAwIDEgLjcwNyAwbDMuNTM1IDMuNTM2YS41LjUgMCAwIDEgMCAuNzA4TDEwLjI2MSAxMEgxNS41YS41LjUgMCAwIDEgLjUuNXY1YS41LjUgMCAwIDEtLjUuNUgzYTIuOTkgMi45OSAwIDAgMS0yLjEyMS0uODc5QTIuOTkgMi45OSAwIDAgMSAwIDEzLjA0NG02LS4yMSA3LjMyOC03LjMtMi44MjktMi44MjhMNiA3LjE4OHY1LjY0N3pNNC41IDEzYTEuNSAxLjUgMCAxIDAtMyAwIDEuNSAxLjUgMCAwIDAgMyAwek0xNSAxNXYtNEg5LjI1OGwtNC4wMTUgNEgxNXpNMCAuNXYxMi40OTVWLjV6XCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMTIuOTk1VjEzYTMuMDcgMy4wNyAwIDAgMCAwLS4wMDV6XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tICAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci13aGVlbC1ib3hcIiBbaGlkZGVuXT1cIm1vZGUgIT09ICd3aGVlbCdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbG9yLWJveFwiIFthdHRyLmlkXT1cIidjb2xvci1ib3gtJysgcmFuZG9tSWRcIj5cbiAgICAgICAgICA8c3ZnPlxuICAgICAgICAgICAgQGZvciAoYXhpcyBvZiBjb2xvckF4aXM7IHRyYWNrIGF4aXM7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxsaW5lIFtzdHlsZS56SW5kZXhdPVwiaVwiIFthdHRyLmlkXT1cImlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjaG9vc2VuQ29sb3IgPSBoc2xUb0hleChpLCAxMDAsIDUwKTtcIiBbYXR0ci54MV09XCJheGlzPy54MVwiIFthdHRyLnkxXT1cImF4aXM/LnkxXCJcbiAgICAgICAgICAgICAgICBbYXR0ci54Ml09XCJheGlzPy54MlwiIFthdHRyLnkyXT1cImF4aXM/LnkyXCIgW3N0eWxlLnN0cm9rZV09XCInaHNsKCcraSsnLDEwMCUsNTAlKSdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5zdHJva2VXaWR0aF09XCIoY2xpZW50Qm94LndpZHRoICogNCAvIDM2MClcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNlbnRlci1ib3hcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxhY2stYm94XCIgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJjaG9vc2VuQ29sb3JcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gIC0tPlxuICAgICAgQGlmIChtb2RlID09PSAnaHNsJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiaHVlLWdyaWQtaGV4XCI+XG4gICAgICAgICAgQGZvciAoaHVlIG9mIGl0ZXJhdG9yOyB0cmFjayBodWUpIHtcbiAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImNob29zZW5Db2xvciA9IGhzbFRvSGV4KGh1ZSwgMTAwLCA1MCk7XCJcbiAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiJ2hzbCgnK2h1ZSsnLDEwMCUsNTAlKSdcIiBjbGFzcz1cImh1ZS1pdGVtLWhleFwiPjwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8IS0tICAtLT5cbiAgICAgIEBpZiAobW9kZSA9PT0gJ2NyYXlvbGEnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcC1jb2xvcnMtY2F2YXNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3AtY29sb3ItcGlsbC1ncmlkXCI+XG4gICAgICAgICAgICBAZm9yIChjb2xvclZhbHVlIG9mIGNyYXlvbGE7IHRyYWNrIGNvbG9yVmFsdWUpIHtcbiAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiY2hvb3NlbkNvbG9yID0gY29sb3JWYWx1ZT8uaGV4IHx8ICcnO1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm5neC1wYWxldHRlLXNxdWFyZWRdPVwic3F1YXJlZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmNwLWNvbG9yLXBpbGwtYWN0aXZlXT1cImNob29zZW5Db2xvciA9PT0gY29sb3JWYWx1ZT8uaGV4XCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJjb2xvclZhbHVlPy5oZXhcIiBjbGFzcz1cImNwLWNvbG9yLXBpbGxcIj48L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8IS0tICAtLT5cbiAgICAgIEBpZiAobW9kZSA9PT0gJ21hdGVyaWFsJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY3AtY29sb3JzLWNhdmFzXCI+XG4gICAgICAgICAgQGZvciAobWF0a2V5IG9mIG1hdGVyaWFsIHwga2V5dmFsdWU7IHRyYWNrIG1hdGtleSkge1xuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNwLWNvbG9yLXBpbGwtZ3JpZFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbG9yVmFsdWUgb2YgbWF0a2V5Wyd2YWx1ZSddIHwga2V5dmFsdWU7IHRyYWNrIGNvbG9yVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImNob29zZW5Db2xvciA9IGNvbG9yVmFsdWVbJ3ZhbHVlJ107XCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5neC1wYWxldHRlLXNxdWFyZWRdPVwic3F1YXJlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jcC1jb2xvci1waWxsLWFjdGl2ZV09XCJjaG9vc2VuQ29sb3IgPT09IGNvbG9yVmFsdWVbJ3ZhbHVlJ11cIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImNvbG9yVmFsdWVbJ3ZhbHVlJ11cIiBjbGFzcz1cImNwLWNvbG9yLXBpbGxcIj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDwhLS0gIC0tPlxuICAgICAgQGlmIChtb2RlID09PSAnYmFzaWMnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcC1jb2xvcnMtY2F2YXNcIj5cbiAgICAgICAgICBAaWYgKCFpc1BhbGV0dGUpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcC1jb2xvci1waWxsLWdyaWRcIj5cbiAgICAgICAgICAgICAgQGZvciAoY29sb3JWYWx1ZSBvZiBjb2xvcnM7IHRyYWNrIGNvbG9yVmFsdWU7IGxldCBwSW5kZXggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3AtY29sb3ItcGlsbFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mubmd4LXBhbGV0dGUtc3F1YXJlZF09XCJzcXVhcmVkXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5jcC1jb2xvci1waWxsLWFjdGl2ZV09XCJjaG9vc2VuQ29sb3IgPT09IGNvbG9yVmFsdWUucHJldmlld1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFsZXR0ZUluZGV4ID0gcEluZGV4O2lzUGFsZXR0ZSA9IHRydWVcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJjb2xvclZhbHVlLnByZXZpZXdcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoaXNQYWxldHRlKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3AtY29sb3ItcGlsbC1ncmlkXCI+XG4gICAgICAgICAgICAgIEBmb3IgKGNvbG9yVmFsdWUgb2YgY29sb3JzW3BhbGV0dGVJbmRleF1bJ3ZhcmlhbnRzJ107IHRyYWNrIGNvbG9yVmFsdWU7IGxldCBjSW5kZXggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3AtY29sb3ItcGlsbFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mubmd4LXBhbGV0dGUtc3F1YXJlZF09XCJzcXVhcmVkXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5jcC1jb2xvci1waWxsLWFjdGl2ZV09XCJjaG9vc2VuQ29sb3IgPT09IGNvbG9yVmFsdWVcIiAoY2xpY2spPVwic2V0Q29sb3IoY29sb3JWYWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiY29sb3JWYWx1ZVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcC1jb2xvci1waWxsIGNwLWNvbG9yLXBpbGwtZHJvcFwiIChjbGljayk9XCJpc1BhbGV0dGUgPSBmYWxzZTtcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBzdHlsZT1cInRyYW5zZm9ybTogcm90YXRlKDkwZGVnKVwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGZpbGw9XCIjZDlkOWQ5XCIgY2xhc3M9XCJiaSBiaS1hcnJvdy1kb3duLWNpcmNsZS1maWxsXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNiA4QTggOCAwIDEgMSAwIDhhOCA4IDAgMCAxIDE2IDB6TTguNSA0LjVhLjUuNSAwIDAgMC0xIDB2NS43OTNMNS4zNTQgOC4xNDZhLjUuNSAwIDEgMC0uNzA4LjcwOGwzIDNhLjUuNSAwIDAgMCAuNzA4IDBsMy0zYS41LjUgMCAwIDAtLjcwOC0uNzA4TDguNSAxMC4yOTNWNC41elwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPCEtLSAgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3AtY29sb3ItYWN0aW9uc1wiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImNob29zZW5Db2xvclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY3AtY29sb3ItYnV0dG9uIGNwLXNlbGVjdC1idXR0b25cIiBbY2xhc3Mubmd4LXBhbGV0dGUtc3F1YXJlZF09XCJzcXVhcmVkXCI+XG4gICAgICAgICAge3tjaG9vc2VuQ29sb3J9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNwLWNvbG9yLWJ1dHRvbiBjcC1zZWxlY3QtYnV0dG9uXCIgKGNsaWNrKT1cInNldENvcmVDb2xvcigpXCIgW2NsYXNzLm5neC1wYWxldHRlLXNxdWFyZWRdPVwic3F1YXJlZFwiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCIjNWNiODVjXCIgY2xhc3M9XCJiaSBiaS1jaGVjay1jaXJjbGUtZmlsbFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTYgOEE4IDggMCAxIDEgMCA4YTggOCAwIDAgMSAxNiAwem0tMy45Ny0zLjAzYS43NS43NSAwIDAgMC0xLjA4LjAyMkw3LjQ3NyA5LjQxNyA1LjM4NCA3LjMyM2EuNzUuNzUgMCAwIDAtMS4wNiAxLjA2TDYuOTcgMTEuMDNhLjc1Ljc1IDAgMCAwIDEuMDc5LS4wMmwzLjk5Mi00Ljk5YS43NS43NSAwIDAgMC0uMDEtMS4wNXpcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY3AtY29sb3ItYnV0dG9uIGNwLWNhbmNlbC1idXR0b25cIiAoY2xpY2spPVwiZGlzY2FyZENvcmVDb2xvcigpO1wiIFtjbGFzcy5uZ3gtcGFsZXR0ZS1zcXVhcmVkXT1cInNxdWFyZWRcIj5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwiI2Q5NTM0ZlwiIGNsYXNzPVwiYmkgYmkteC1jaXJjbGUtZmlsbFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTYgOEE4IDggMCAxIDEgMCA4YTggOCAwIDAgMSAxNiAwek01LjM1NCA0LjY0NmEuNS41IDAgMSAwLS43MDguNzA4TDcuMjkzIDhsLTIuNjQ3IDIuNjQ2YS41LjUgMCAwIDAgLjcwOC43MDhMOCA4LjcwN2wyLjY0NiAyLjY0N2EuNS41IDAgMCAwIC43MDgtLjcwOEw4LjcwNyA4bDIuNjQ3LTIuNjQ2YS41LjUgMCAwIDAtLjcwOC0uNzA4TDggNy4yOTMgNS4zNTQgNC42NDZ6XCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19