UNPKG

@versatiledatakit/shared

Version:

Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.

204 lines 27.6 kB
/* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* eslint-disable */ import { ElementRef, HostBinding, Output, EventEmitter, Component, Input, ViewChild } from '@angular/core'; import { TRANSLATIONS } from './copy-to-clipboard-button.l10n'; import * as i0 from "@angular/core"; import * as i1 from "../../ngx-utils"; import * as i2 from "@angular/common"; import * as i3 from "@clr/angular"; const _c0 = ["area"]; function VdkCopyToClipboardButtonComponent_span_7_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span"); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", ctx_r0.btnLabel, " "); } } const _c1 = function (a0) { return { "hide-tooltip": a0 }; }; function VdkCopyToClipboardButtonComponent_clr_tooltip_content_10_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "clr-tooltip-content", 11); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵproperty("clrPosition", ctx_r1.tooltipDirection)("ngClass", i0.ɵɵpureFunction1(3, _c1, !(ctx_r1.tooltip == null ? null : ctx_r1.tooltip.length))); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", ctx_r1.tooltip, " "); } } function VdkCopyToClipboardButtonComponent_span_11_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span", 12); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", ctx_r2.copyAlert, "\n"); } } function VdkCopyToClipboardButtonComponent_textarea_12_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "textarea", 13, 14); } if (rf & 2) { i0.ɵɵproperty("hidden", true); } } const _c2 = function (a0) { return { "copy-button": a0 }; }; const _c3 = function (a0, a1, a2) { return { "line-height": a0, "min-width": a1, "height": a2 }; }; const _c4 = function (a0, a1) { return { "width": a0, "height": a1 }; }; const _c5 = ["*"]; const SHOW_CHECKBOX_TIMEOUT = 1500; export class VdkCopyToClipboardButtonComponent { constructor(el, translateService) { this.el = el; this.translateService = translateService; this.classList = ''; this.ariaLabel = ''; this.size = 16; this.tooltip = ''; this.btnLabel = ''; // if no label specified, show the normal copy icon this.btnClasses = ['btn-outline']; // if no label specified, show the normal copy icon this.disabled = false; this.tooltipDirection = 'top-left'; this.copyClick = new EventEmitter(); this.firstLoad = true; // show correct icon first this.hasProjectedContent = false; this.isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); this.copied = false; this.translateService.loadTranslationsForComponent('copy-to-clipboard-button', TRANSLATIONS); } ngOnInit() { this.bounds = this.size + 6 + 'px'; this.hasProjectedContent = this.el.nativeElement.innerText.trim(); this.calculateClassesToApply(); this.copyAlert = this.copyAlert || this.translateService.translate('copy-to-clipboard-button.copied'); } calculateClassesToApply() { let classes = []; if (!this.btnLabel.length) { classes.push('icon-btn'); } if (this.btnLabel.length) { classes = classes.concat(this.btnClasses); } if (this.disabled) { classes.push('disabled'); } this.btnClassesToApply = classes.join(' ') + ' ' + this.classList; } ngOnChanges() { this.calculateClassesToApply(); } copyToClipboard(val) { let myWindow = window; let onCopy = (e) => { e.preventDefault(); if (e.clipboardData) { e.clipboardData.setData('text/plain', val); } else if (myWindow.clipboardData) { myWindow.clipboardData.setData('Text', val); } myWindow.removeEventListener('copy', onCopy); }; if (this.isSafari) { this.area.nativeElement.value = val; this.area.nativeElement.select(); navigator.clipboard?.writeText(val); } myWindow.addEventListener('copy', onCopy); if (myWindow.clipboardData && myWindow.clipboardData.setData) { myWindow.clipboardData.setData('Text', val); } else { document.execCommand('copy'); } } doCopy() { this.copyToClipboard(this.value); this.copyClick.emit(); this.firstLoad = false; this.copied = true; setTimeout(() => { this.copied = false; }, SHOW_CHECKBOX_TIMEOUT); } } VdkCopyToClipboardButtonComponent.ɵfac = function VdkCopyToClipboardButtonComponent_Factory(t) { return new (t || VdkCopyToClipboardButtonComponent)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.VdkSimpleTranslateService)); }; VdkCopyToClipboardButtonComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VdkCopyToClipboardButtonComponent, selectors: [["vdk-copy-to-clipboard-button"]], viewQuery: function VdkCopyToClipboardButtonComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 5, ElementRef); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.area = _t.first); } }, hostVars: 2, hostBindings: function VdkCopyToClipboardButtonComponent_HostBindings(rf, ctx) { if (rf & 2) { i0.ɵɵclassMap(ctx.classList); } }, inputs: { classList: ["class", "classList"], value: "value", ariaLabel: "ariaLabel", copyAlert: "copyAlert", size: "size", tooltip: "tooltip", btnLabel: "btnLabel", btnClasses: "btnClasses", disabled: "disabled", tooltipDirection: "tooltipDirection" }, outputs: { copyClick: "copyClick" }, features: [i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c5, decls: 13, vars: 24, consts: [[3, "ngClass"], ["type", "button", "clrTooltipTrigger", "", 1, "btn", 3, "ngClass", "disabled", "ngStyle", "click"], [1, "anim-object", 3, "ngStyle"], [1, "front", "face", "face-label"], ["shape", "copy-to-clipboard"], [4, "ngIf"], [1, "back", "face", "face-label"], ["shape", "check"], ["clrSize", "md", 3, "clrPosition", "ngClass", 4, "clrIfOpen"], ["role", "alert", "aria-live", "assertive", "class", "clr-sr-only", 4, "ngIf"], ["contenteditable", "true", 3, "hidden", 4, "ngIf"], ["clrSize", "md", 3, "clrPosition", "ngClass"], ["role", "alert", "aria-live", "assertive", 1, "clr-sr-only"], ["contenteditable", "true", 3, "hidden"], ["area", ""]], template: function VdkCopyToClipboardButtonComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵprojectionDef(); i0.ɵɵelementStart(0, "span", 0)(1, "clr-tooltip")(2, "button", 1); i0.ɵɵlistener("click", function VdkCopyToClipboardButtonComponent_Template_button_click_2_listener() { return !ctx.disabled && ctx.doCopy(); }); i0.ɵɵelementStart(3, "div", 2)(4, "div", 3); i0.ɵɵelement(5, "cds-icon", 4); i0.ɵɵprojection(6); i0.ɵɵtemplate(7, VdkCopyToClipboardButtonComponent_span_7_Template, 2, 1, "span", 5); i0.ɵɵelementEnd(); i0.ɵɵelementStart(8, "div", 6); i0.ɵɵelement(9, "cds-icon", 7); i0.ɵɵelementEnd()()(); i0.ɵɵtemplate(10, VdkCopyToClipboardButtonComponent_clr_tooltip_content_10_Template, 2, 5, "clr-tooltip-content", 8); i0.ɵɵelementEnd()(); i0.ɵɵtemplate(11, VdkCopyToClipboardButtonComponent_span_11_Template, 2, 1, "span", 9); i0.ɵɵtemplate(12, VdkCopyToClipboardButtonComponent_textarea_12_Template, 2, 1, "textarea", 10); } if (rf & 2) { i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(15, _c2, !(ctx.btnLabel == null ? null : ctx.btnLabel.length) && !ctx.hasProjectedContent)); i0.ɵɵadvance(2); i0.ɵɵproperty("ngClass", ctx.btnClassesToApply)("disabled", ctx.disabled)("ngStyle", !(ctx.btnLabel == null ? null : ctx.btnLabel.length) && !ctx.hasProjectedContent && i0.ɵɵpureFunction3(17, _c3, ctx.bounds, ctx.bounds, ctx.bounds)); i0.ɵɵattribute("aria-label", ctx.ariaLabel); i0.ɵɵadvance(1); i0.ɵɵclassProp("flip-horizontal-reverse", !ctx.copied)("flip-horizontal-bottom", ctx.copied); i0.ɵɵproperty("ngStyle", !(ctx.btnLabel == null ? null : ctx.btnLabel.length) && !ctx.hasProjectedContent && i0.ɵɵpureFunction2(21, _c4, ctx.bounds, ctx.bounds)); i0.ɵɵadvance(2); i0.ɵɵattribute("size", ctx.size); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", ctx.btnLabel == null ? null : ctx.btnLabel.length); i0.ɵɵadvance(2); i0.ɵɵattribute("size", ctx.size); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", ctx.copied); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.isSafari); } }, directives: [i2.NgClass, i3.ClrTooltip, i3.ClrTooltipTrigger, i2.NgStyle, i3.CdsIconCustomTag, i2.NgIf, i3.ClrIfOpen, i3.ClrTooltipContent], styles: ["span.copy-button[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{margin-right:0!important;border:none;padding:0}.flip-horizontal-bottom[_ngcontent-%COMP%]{animation:flip-horizontal-bottom .5s cubic-bezier(.455,.03,.515,.955) both}.flip-horizontal-reverse[_ngcontent-%COMP%]{animation:flip-horizontal-reverse .5s cubic-bezier(.455,.03,.515,.955) both}.anim-object[_ngcontent-%COMP%]{transform-style:preserve-3d;display:block;outline:none}.face[_ngcontent-%COMP%]{position:absolute;width:100%;height:100%;backface-visibility:hidden;border-radius:3px;text-align:center;overflow:hidden;text-overflow:ellipsis;transform:rotateX(0)}.front[_ngcontent-%COMP%]{z-index:20}.front.face-label[_ngcontent-%COMP%]{position:relative}.back[_ngcontent-%COMP%]{z-index:10;transform:rotateX(180deg)}.back.face-label[_ngcontent-%COMP%]{top:0}.hide-tooltip[_ngcontent-%COMP%]{display:none}@keyframes flip-horizontal-bottom{0%{transform:rotateX(0)}to{transform:rotateX(-180deg)}}@keyframes flip-horizontal-reverse{0%{transform:rotateX(-180deg)}to{transform:rotateX(0)}}"] }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(VdkCopyToClipboardButtonComponent, [{ type: Component, args: [{ selector: 'vdk-copy-to-clipboard-button', template: "<!--\n ~ Copyright 2023-2025 Broadcom\n ~ SPDX-License-Identifier: Apache-2.0\n -->\n\n<span [ngClass]=\"{'copy-button': !btnLabel?.length && !hasProjectedContent}\">\n <clr-tooltip>\n <button\n type=\"button\"\n class=\"btn\"\n [ngClass]=\"btnClassesToApply\"\n [attr.aria-label]=\"ariaLabel\"\n [disabled]=\"disabled\"\n (click)=\"!disabled && doCopy()\"\n clrTooltipTrigger\n [ngStyle]=\"!btnLabel?.length && !hasProjectedContent && {'line-height': bounds, 'min-width': bounds, 'height': bounds}\"\n >\n <div\n class=\"anim-object\"\n [class.flip-horizontal-reverse]=\"!copied\"\n [class.flip-horizontal-bottom]=\"copied\"\n [ngStyle]=\"!btnLabel?.length && !hasProjectedContent && {'width': bounds, 'height': bounds}\"\n >\n <div class=\"front face face-label\">\n <cds-icon\n shape=\"copy-to-clipboard\"\n [attr.size]=\"size\"\n ></cds-icon>\n <ng-content></ng-content>\n <span *ngIf=\"btnLabel?.length\"> {{btnLabel}} </span>\n </div>\n <div class=\"back face face-label\">\n <cds-icon shape=\"check\" [attr.size]=\"size\"></cds-icon>\n </div>\n </div>\n </button>\n\n <clr-tooltip-content\n [clrPosition]=\"tooltipDirection\"\n clrSize=\"md\"\n *clrIfOpen\n [ngClass]=\"{'hide-tooltip': !tooltip?.length}\"\n >\n {{tooltip}}\n </clr-tooltip-content>\n </clr-tooltip>\n</span>\n\n<span *ngIf=\"copied\" role=\"alert\" aria-live=\"assertive\" class=\"clr-sr-only\">\n {{copyAlert}}\n</span>\n\n<textarea\n #area\n *ngIf=\"isSafari\"\n contenteditable=\"true\"\n [hidden]=\"true\"\n></textarea>\n", styles: ["/*!\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */span.copy-button button{margin-right:0!important;border:none;padding:0}.flip-horizontal-bottom{animation:flip-horizontal-bottom .5s cubic-bezier(.455,.03,.515,.955) both}.flip-horizontal-reverse{animation:flip-horizontal-reverse .5s cubic-bezier(.455,.03,.515,.955) both}.anim-object{transform-style:preserve-3d;display:block;outline:none}.face{position:absolute;width:100%;height:100%;backface-visibility:hidden;border-radius:3px;text-align:center;overflow:hidden;text-overflow:ellipsis;transform:rotateX(0)}.front{z-index:20}.front.face-label{position:relative}.back{z-index:10;transform:rotateX(180deg)}.back.face-label{top:0}.hide-tooltip{display:none}@keyframes flip-horizontal-bottom{0%{transform:rotateX(0)}to{transform:rotateX(-180deg)}}@keyframes flip-horizontal-reverse{0%{transform:rotateX(-180deg)}to{transform:rotateX(0)}}\n"] }] }], function () { return [{ type: i0.ElementRef }, { type: i1.VdkSimpleTranslateService }]; }, { area: [{ type: ViewChild, args: ['area', { read: ElementRef, static: false }] }], classList: [{ type: HostBinding, args: ['class'] }, { type: Input, args: ['class'] }], value: [{ type: Input }], ariaLabel: [{ type: Input }], copyAlert: [{ type: Input }], size: [{ type: Input }], tooltip: [{ type: Input }], btnLabel: [{ type: Input }], btnClasses: [{ type: Input }], disabled: [{ type: Input }], tooltipDirection: [{ type: Input }], copyClick: [{ type: Output }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29weS10by1jbGlwYm9hcmQtYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbW1vbnMvbmd4LWNvbXBvbmVudHMvY29weS10by1jbGlwYm9hcmQtYnV0dG9uL2NvcHktdG8tY2xpcGJvYXJkLWJ1dHRvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21tb25zL25neC1jb21wb25lbnRzL2NvcHktdG8tY2xpcGJvYXJkLWJ1dHRvbi9jb3B5LXRvLWNsaXBib2FyZC1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsb0JBQW9CO0FBRXBCLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbkgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7O0lDbUIzQyw0QkFBK0I7SUFBQyxZQUFhO0lBQUEsaUJBQU87OztJQUFwQixlQUFhO0lBQWIsZ0RBQWE7Ozs7SUFRekQsK0NBS0M7SUFDRyxZQUNKO0lBQUEsaUJBQXNCOzs7SUFObEIscURBQWdDLGlHQUFBO0lBS2hDLGVBQ0o7SUFESSwrQ0FDSjs7O0lBSVIsZ0NBQTRFO0lBQ3hFLFlBQ0o7SUFBQSxpQkFBTzs7O0lBREgsZUFDSjtJQURJLGtEQUNKOzs7SUFFQSxtQ0FLWTs7SUFEUiw2QkFBZTs7Ozs7O0FENUNuQixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQztBQU9uQyxNQUFNLE9BQU8saUNBQWlDO0lBeUIxQyxZQUNZLEVBQWMsRUFDZixnQkFBMkM7UUFEMUMsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNmLHFC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QiwrQ0FBNkIsMEJBQUEsZ0tBQUE7UUFDN0IsMkNBQTZCO1FBUXpCLGVBQXlDO1FBQXpDLHNEQUF5QyxzQ0FBQTtRQUV6QyxpS0FBNEY7UUFLcEYsZUFBa0I7UUFBbEIsZ0NBQWtCO1FBR2YsZUFBc0I7UUFBdEIsd0VBQXNCO1FBR0wsZUFBa0I7UUFBbEIsZ0NBQWtCO1FBZ0J2RCxlQUFZO1FBQVosaUNBQVk7UUFNZCxlQUFjO1FBQWQsbUNBQWM7O3VGRG5DTixpQ0FBaUM7Y0FMN0MsU0FBUzsyQkFDSSw4QkFBOEI7cUdBS2dCLElBQUk7a0JBQTNELFNBQVM7bUJBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO1lBRWhCLFNBQVM7a0JBQTlDLFdBQVc7bUJBQUMsT0FBTzs7a0JBQUcsS0FBSzttQkFBQyxPQUFPO1lBRTNCLEtBQUs7a0JBQWIsS0FBSztZQUNHLFNBQVM7a0JBQWpCLEtBQUs7WUFDRyxTQUFTO2tCQUFqQixLQUFLO1lBQ0csSUFBSTtrQkFBWixLQUFLO1lBQ0csT0FBTztrQkFBZixLQUFLO1lBQ0csUUFBUTtrQkFBaEIsS0FBSztZQUNHLFVBQVU7a0JBQWxCLEtBQUs7WUFDRyxRQUFRO2tCQUFoQixLQUFLO1lBQ0csZ0JBQWdCO2tCQUF4QixLQUFLO1lBRUksU0FBUztrQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAyMy0yMDI1IEJyb2FkY29tXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlICovXG5cbmltcG9ydCB7IEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZka1NpbXBsZVRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9uZ3gtdXRpbHMnO1xuXG5pbXBvcnQgeyBUUkFOU0xBVElPTlMgfSBmcm9tICcuL2NvcHktdG8tY2xpcGJvYXJkLWJ1dHRvbi5sMTBuJztcblxuY29uc3QgU0hPV19DSEVDS0JPWF9USU1FT1VUID0gMTUwMDtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd2ZGstY29weS10by1jbGlwYm9hcmQtYnV0dG9uJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29weS10by1jbGlwYm9hcmQtYnV0dG9uLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jb3B5LXRvLWNsaXBib2FyZC1idXR0b24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBWZGtDb3B5VG9DbGlwYm9hcmRCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBWaWV3Q2hpbGQoJ2FyZWEnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogZmFsc2UgfSkgYXJlYTogRWxlbWVudFJlZjtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MnKSBASW5wdXQoJ2NsYXNzJykgY2xhc3NMaXN0OiBzdHJpbmcgPSAnJztcblxuICAgIEBJbnB1dCgpIHZhbHVlOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYXJpYUxhYmVsOiBzdHJpbmcgPSAnJztcbiAgICBASW5wdXQoKSBjb3B5QWxlcnQ6IHN0cmluZztcbiAgICBASW5wdXQoKSBzaXplID0gMTY7XG4gICAgQElucHV0KCkgdG9vbHRpcCA9ICcnO1xuICAgIEBJbnB1dCgpIGJ0bkxhYmVsID0gJyc7IC8vIGlmIG5vIGxhYmVsIHNwZWNpZmllZCwgc2hvdyB0aGUgbm9ybWFsIGNvcHkgaWNvblxuICAgIEBJbnB1dCgpIGJ0bkNsYXNzZXMgPSBbJ2J0bi1vdXRsaW5lJ107IC8vIGlmIG5vIGxhYmVsIHNwZWNpZmllZCwgc2hvdyB0aGUgbm9ybWFsIGNvcHkgaWNvblxuICAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgdG9vbHRpcERpcmVjdGlvbiA9ICd0b3AtbGVmdCc7XG5cbiAgICBAT3V0cHV0KCkgY29weUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxudWxsPigpO1xuXG4gICAgcHJpdmF0ZSBmaXJzdExvYWQgPSB0cnVlOyAvLyBzaG93IGNvcnJlY3QgaWNvbiBmaXJzdFxuXG4gICAgYnRuQ2xhc3Nlc1RvQXBwbHk6IHN0cmluZztcbiAgICBib3VuZHM6IHN0cmluZztcbiAgICBoYXNQcm9qZWN0ZWRDb250ZW50OiBib29sZWFuID0gZmFsc2U7XG4gICAgaXNTYWZhcmk6IGJvb2xlYW4gPSAvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIGNvcGllZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgICAgIHB1YmxpYyB0cmFuc2xhdGVTZXJ2aWNlOiBWZGtTaW1wbGVUcmFuc2xhdGVTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5sb2FkVHJhbnNsYXRpb25zRm9yQ29tcG9uZW50KCdjb3B5LXRvLWNsaXBib2FyZC1idXR0b24nLCBUUkFOU0xBVElPTlMpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmJvdW5kcyA9IHRoaXMuc2l6ZSArIDYgKyAncHgnO1xuXG4gICAgICAgIHRoaXMuaGFzUHJvamVjdGVkQ29udGVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5pbm5lclRleHQudHJpbSgpO1xuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQ2xhc3Nlc1RvQXBwbHkoKTtcbiAgICAgICAgdGhpcy5jb3B5QWxlcnQgPSB0aGlzLmNvcHlBbGVydCB8fCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdjb3B5LXRvLWNsaXBib2FyZC1idXR0b24uY29waWVkJyk7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlQ2xhc3Nlc1RvQXBwbHkoKSB7XG4gICAgICAgIGxldCBjbGFzc2VzOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICAgICAgaWYgKCF0aGlzLmJ0bkxhYmVsLmxlbmd0aCkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpY29uLWJ0bicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYnRuTGFiZWwubGVuZ3RoKSB7XG4gICAgICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5jb25jYXQodGhpcy5idG5DbGFzc2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2Rpc2FibGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ0bkNsYXNzZXNUb0FwcGx5ID0gY2xhc3Nlcy5qb2luKCcgJykgKyAnICcgKyB0aGlzLmNsYXNzTGlzdDtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcygpIHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDbGFzc2VzVG9BcHBseSgpO1xuICAgIH1cblxuICAgIGNvcHlUb0NsaXBib2FyZCh2YWw6IHN0cmluZykge1xuICAgICAgICBsZXQgbXlXaW5kb3c6IGFueSA9IHdpbmRvdztcblxuICAgICAgICBsZXQgb25Db3B5ID0gKGU6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIGlmIChlLmNsaXBib2FyZERhdGEpIHtcbiAgICAgICAgICAgICAgICBlLmNsaXBib2FyZERhdGEuc2V0RGF0YSgndGV4dC9wbGFpbicsIHZhbCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG15V2luZG93LmNsaXBib2FyZERhdGEpIHtcbiAgICAgICAgICAgICAgICBteVdpbmRvdy5jbGlwYm9hcmREYXRhLnNldERhdGEoJ1RleHQnLCB2YWwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBteVdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjb3B5Jywgb25Db3B5KTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5pc1NhZmFyaSkge1xuICAgICAgICAgICAgdGhpcy5hcmVhLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB2YWw7XG4gICAgICAgICAgICB0aGlzLmFyZWEubmF0aXZlRWxlbWVudC5zZWxlY3QoKTtcbiAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQ/LndyaXRlVGV4dCh2YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbXlXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY29weScsIG9uQ29weSk7XG5cbiAgICAgICAgaWYgKG15V2luZG93LmNsaXBib2FyZERhdGEgJiYgbXlXaW5kb3cuY2xpcGJvYXJkRGF0YS5zZXREYXRhKSB7XG4gICAgICAgICAgICBteVdpbmRvdy5jbGlwYm9hcmREYXRhLnNldERhdGEoJ1RleHQnLCB2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRvQ29weSgpIHtcbiAgICAgICAgdGhpcy5jb3B5VG9DbGlwYm9hcmQodGhpcy52YWx1ZSk7XG4gICAgICAgIHRoaXMuY29weUNsaWNrLmVtaXQoKTtcbiAgICAgICAgdGhpcy5maXJzdExvYWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb3BpZWQgPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29waWVkID0gZmFsc2U7XG4gICAgICAgIH0sIFNIT1dfQ0hFQ0tCT1hfVElNRU9VVCk7XG4gICAgfVxufVxuIiwiPCEtLVxuICAgfiBDb3B5cmlnaHQgMjAyMy0yMDI1IEJyb2FkY29tXG4gICB+IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gIC0tPlxuXG48c3BhbiBbbmdDbGFzc109XCJ7J2NvcHktYnV0dG9uJzogIWJ0bkxhYmVsPy5sZW5ndGggJiYgIWhhc1Byb2plY3RlZENvbnRlbnR9XCI+XG4gICAgPGNsci10b29sdGlwPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImJ0bkNsYXNzZXNUb0FwcGx5XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiIWRpc2FibGVkICYmIGRvQ29weSgpXCJcbiAgICAgICAgICAgIGNsclRvb2x0aXBUcmlnZ2VyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCIhYnRuTGFiZWw/Lmxlbmd0aCAmJiAhaGFzUHJvamVjdGVkQ29udGVudCAmJiB7J2xpbmUtaGVpZ2h0JzogYm91bmRzLCAnbWluLXdpZHRoJzogYm91bmRzLCAnaGVpZ2h0JzogYm91bmRzfVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFuaW0tb2JqZWN0XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmxpcC1ob3Jpem9udGFsLXJldmVyc2VdPVwiIWNvcGllZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZsaXAtaG9yaXpvbnRhbC1ib3R0b21dPVwiY29waWVkXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCIhYnRuTGFiZWw/Lmxlbmd0aCAmJiAhaGFzUHJvamVjdGVkQ29udGVudCAmJiB7J3dpZHRoJzogYm91bmRzLCAnaGVpZ2h0JzogYm91bmRzfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZyb250IGZhY2UgZmFjZS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8Y2RzLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlPVwiY29weS10by1jbGlwYm9hcmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc2l6ZV09XCJzaXplXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvY2RzLWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJidG5MYWJlbD8ubGVuZ3RoXCI+IHt7YnRuTGFiZWx9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhY2sgZmFjZSBmYWNlLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxjZHMtaWNvbiBzaGFwZT1cImNoZWNrXCIgW2F0dHIuc2l6ZV09XCJzaXplXCI+PC9jZHMtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8Y2xyLXRvb2x0aXAtY29udGVudFxuICAgICAgICAgICAgW2NsclBvc2l0aW9uXT1cInRvb2x0aXBEaXJlY3Rpb25cIlxuICAgICAgICAgICAgY2xyU2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICpjbHJJZk9wZW5cbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaGlkZS10b29sdGlwJzogIXRvb2x0aXA/Lmxlbmd0aH1cIlxuICAgICAgICA+XG4gICAgICAgICAgICB7e3Rvb2x0aXB9fVxuICAgICAgICA8L2Nsci10b29sdGlwLWNvbnRlbnQ+XG4gICAgPC9jbHItdG9vbHRpcD5cbjwvc3Bhbj5cblxuPHNwYW4gKm5nSWY9XCJjb3BpZWRcIiByb2xlPVwiYWxlcnRcIiBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIiBjbGFzcz1cImNsci1zci1vbmx5XCI+XG4gICAge3tjb3B5QWxlcnR9fVxuPC9zcGFuPlxuXG48dGV4dGFyZWFcbiAgICAjYXJlYVxuICAgICpuZ0lmPVwiaXNTYWZhcmlcIlxuICAgIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIlxuICAgIFtoaWRkZW5dPVwidHJ1ZVwiXG4+PC90ZXh0YXJlYT5cbiJdfQ==