pdm-ui-kit 0.1.17 → 0.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,24 +2,45 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/common";
4
4
  export class PdmSwitchComponent {
5
- constructor() {
5
+ constructor(cdr) {
6
+ this.cdr = cdr;
6
7
  this.id = '';
7
8
  this.checked = false;
8
9
  this.disabled = false;
9
10
  this.label = '';
10
11
  this.className = '';
12
+ this.size = 'default';
11
13
  this.checkedChange = new EventEmitter();
12
14
  }
13
- onToggle(event) {
14
- this.checkedChange.emit(event.target.checked);
15
+ get rootClasses() {
16
+ return [
17
+ 'peer relative inline-flex shrink-0 items-center rounded-full border border-transparent outline-none transition-all focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50',
18
+ this.size === 'sm' ? 'h-[14px] w-[24px]' : 'h-[18.4px] w-[32px]',
19
+ this.checked ? 'bg-primary' : 'bg-input dark:bg-input/80'
20
+ ];
21
+ }
22
+ get thumbClasses() {
23
+ return [
24
+ 'pointer-events-none block rounded-full bg-background ring-0 transition-transform',
25
+ this.size === 'sm' ? 'size-3' : 'size-4',
26
+ this.checked ? 'translate-x-[calc(100%-2px)]' : 'translate-x-0'
27
+ ];
28
+ }
29
+ onToggle() {
30
+ if (this.disabled)
31
+ return;
32
+ const next = !this.checked;
33
+ this.checked = next;
34
+ this.checkedChange.emit(next);
35
+ this.cdr.markForCheck();
15
36
  }
16
37
  }
17
- PdmSwitchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmSwitchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
18
- PdmSwitchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmSwitchComponent, selector: "pdm-switch", inputs: { id: "id", checked: "checked", disabled: "disabled", label: "label", className: "className" }, outputs: { checkedChange: "checkedChange" }, ngImport: i0, template: "<label [attr.for]=\"id\" [ngClass]=\"['inline-flex items-center gap-2', className]\">\n <input\n [id]=\"id\"\n type=\"checkbox\"\n class=\"peer sr-only\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n (change)=\"onToggle($event)\"\n />\n <span class=\"relative inline-flex h-6 w-11 items-center rounded-full border border-transparent bg-muted transition-colors peer-focus-visible:ring-2 peer-focus-visible:ring-ring peer-focus-visible:ring-offset-2 peer-focus-visible:ring-offset-background peer-disabled:opacity-50 peer-checked:bg-primary\">\n <span class=\"h-5 w-5 translate-x-0.5 rounded-full bg-background shadow-sm transition-transform peer-checked:translate-x-5\"></span>\n </span>\n <span *ngIf=\"label\" class=\"text-sm text-foreground\">{{ label }}</span>\n</label>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
38
+ PdmSwitchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmSwitchComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
39
+ PdmSwitchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmSwitchComponent, selector: "pdm-switch", inputs: { id: "id", checked: "checked", disabled: "disabled", label: "label", className: "className", size: "size" }, outputs: { checkedChange: "checkedChange" }, ngImport: i0, template: "<div [ngClass]=\"['flex items-center space-x-2', className]\">\n <button\n type=\"button\"\n role=\"switch\"\n [attr.aria-checked]=\"checked\"\n [attr.aria-disabled]=\"disabled\"\n [attr.data-state]=\"checked ? 'checked' : 'unchecked'\"\n [attr.data-disabled]=\"disabled ? 'true' : 'false'\"\n [attr.data-size]=\"size\"\n [attr.data-slot]=\"'switch'\"\n [attr.value]=\"checked ? 'on' : 'off'\"\n [id]=\"id\"\n [disabled]=\"disabled\"\n [ngClass]=\"rootClasses\"\n (click)=\"onToggle()\"\n >\n <span\n [attr.data-state]=\"checked ? 'checked' : 'unchecked'\"\n [attr.data-slot]=\"'switch-thumb'\"\n [ngClass]=\"thumbClasses\"\n ></span>\n </button>\n <label\n *ngIf=\"label\"\n [attr.for]=\"id\"\n [attr.data-slot]=\"'label'\"\n class=\"flex cursor-pointer items-center gap-2 text-sm leading-none font-medium select-none peer-disabled:cursor-not-allowed peer-disabled:opacity-50\"\n (click)=\"onToggle()\"\n >\n {{ label }}\n </label>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
19
40
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmSwitchComponent, decorators: [{
20
41
  type: Component,
21
- args: [{ selector: 'pdm-switch', changeDetection: ChangeDetectionStrategy.OnPush, template: "<label [attr.for]=\"id\" [ngClass]=\"['inline-flex items-center gap-2', className]\">\n <input\n [id]=\"id\"\n type=\"checkbox\"\n class=\"peer sr-only\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n (change)=\"onToggle($event)\"\n />\n <span class=\"relative inline-flex h-6 w-11 items-center rounded-full border border-transparent bg-muted transition-colors peer-focus-visible:ring-2 peer-focus-visible:ring-ring peer-focus-visible:ring-offset-2 peer-focus-visible:ring-offset-background peer-disabled:opacity-50 peer-checked:bg-primary\">\n <span class=\"h-5 w-5 translate-x-0.5 rounded-full bg-background shadow-sm transition-transform peer-checked:translate-x-5\"></span>\n </span>\n <span *ngIf=\"label\" class=\"text-sm text-foreground\">{{ label }}</span>\n</label>\n" }]
22
- }], propDecorators: { id: [{
42
+ args: [{ selector: 'pdm-switch', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['flex items-center space-x-2', className]\">\n <button\n type=\"button\"\n role=\"switch\"\n [attr.aria-checked]=\"checked\"\n [attr.aria-disabled]=\"disabled\"\n [attr.data-state]=\"checked ? 'checked' : 'unchecked'\"\n [attr.data-disabled]=\"disabled ? 'true' : 'false'\"\n [attr.data-size]=\"size\"\n [attr.data-slot]=\"'switch'\"\n [attr.value]=\"checked ? 'on' : 'off'\"\n [id]=\"id\"\n [disabled]=\"disabled\"\n [ngClass]=\"rootClasses\"\n (click)=\"onToggle()\"\n >\n <span\n [attr.data-state]=\"checked ? 'checked' : 'unchecked'\"\n [attr.data-slot]=\"'switch-thumb'\"\n [ngClass]=\"thumbClasses\"\n ></span>\n </button>\n <label\n *ngIf=\"label\"\n [attr.for]=\"id\"\n [attr.data-slot]=\"'label'\"\n class=\"flex cursor-pointer items-center gap-2 text-sm leading-none font-medium select-none peer-disabled:cursor-not-allowed peer-disabled:opacity-50\"\n (click)=\"onToggle()\"\n >\n {{ label }}\n </label>\n</div>\n" }]
43
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { id: [{
23
44
  type: Input
24
45
  }], checked: [{
25
46
  type: Input
@@ -29,7 +50,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
29
50
  type: Input
30
51
  }], className: [{
31
52
  type: Input
53
+ }], size: [{
54
+ type: Input
32
55
  }], checkedChange: [{
33
56
  type: Output
34
57
  }] } });
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zd2l0Y2gvc3dpdGNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zd2l0Y2gvc3dpdGNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU9oRyxNQUFNLE9BQU8sa0JBQWtCO0lBTC9CO1FBTVcsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUNSLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1gsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVkLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztLQUt2RDtJQUhDLFFBQVEsQ0FBQyxLQUFZO1FBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFFLEtBQUssQ0FBQyxNQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RFLENBQUM7OytHQVhVLGtCQUFrQjttR0FBbEIsa0JBQWtCLHVNQ1AvQix5eUJBY0E7MkZEUGEsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLFlBQVksbUJBRUwsdUJBQXVCLENBQUMsTUFBTTs4QkFHdEMsRUFBRTtzQkFBVixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRtLXN3aXRjaCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zd2l0Y2guY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQZG1Td2l0Y2hDb21wb25lbnQge1xuICBASW5wdXQoKSBpZCA9ICcnO1xuICBASW5wdXQoKSBjaGVja2VkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG4gIEBJbnB1dCgpIGNsYXNzTmFtZSA9ICcnO1xuXG4gIEBPdXRwdXQoKSBjaGVja2VkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIG9uVG9nZ2xlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tlZENoYW5nZS5lbWl0KChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZCk7XG4gIH1cbn1cbiIsIjxsYWJlbCBbYXR0ci5mb3JdPVwiaWRcIiBbbmdDbGFzc109XCJbJ2lubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBnYXAtMicsIGNsYXNzTmFtZV1cIj5cbiAgPGlucHV0XG4gICAgW2lkXT1cImlkXCJcbiAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgIGNsYXNzPVwicGVlciBzci1vbmx5XCJcbiAgICBbY2hlY2tlZF09XCJjaGVja2VkXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIChjaGFuZ2UpPVwib25Ub2dnbGUoJGV2ZW50KVwiXG4gIC8+XG4gIDxzcGFuIGNsYXNzPVwicmVsYXRpdmUgaW5saW5lLWZsZXggaC02IHctMTEgaXRlbXMtY2VudGVyIHJvdW5kZWQtZnVsbCBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IGJnLW11dGVkIHRyYW5zaXRpb24tY29sb3JzIHBlZXItZm9jdXMtdmlzaWJsZTpyaW5nLTIgcGVlci1mb2N1cy12aXNpYmxlOnJpbmctcmluZyBwZWVyLWZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBwZWVyLWZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtYmFja2dyb3VuZCBwZWVyLWRpc2FibGVkOm9wYWNpdHktNTAgcGVlci1jaGVja2VkOmJnLXByaW1hcnlcIj5cbiAgICA8c3BhbiBjbGFzcz1cImgtNSB3LTUgdHJhbnNsYXRlLXgtMC41IHJvdW5kZWQtZnVsbCBiZy1iYWNrZ3JvdW5kIHNoYWRvdy1zbSB0cmFuc2l0aW9uLXRyYW5zZm9ybSBwZWVyLWNoZWNrZWQ6dHJhbnNsYXRlLXgtNVwiPjwvc3Bhbj5cbiAgPC9zcGFuPlxuICA8c3BhbiAqbmdJZj1cImxhYmVsXCIgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtZm9yZWdyb3VuZFwiPnt7IGxhYmVsIH19PC9zcGFuPlxuPC9sYWJlbD5cbiJdfQ==
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zd2l0Y2gvc3dpdGNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zd2l0Y2gvc3dpdGNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFTbkgsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUE2QixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUUxQyxPQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ1IsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2YsU0FBSSxHQUFrQixTQUFTLENBQUM7UUFFL0Isa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBVEEsQ0FBQztJQVd2RCxJQUFJLFdBQVc7UUFDYixPQUFPO1lBQ0wsOE9BQThPO1lBQzlPLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMscUJBQXFCO1lBQ2hFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsMkJBQTJCO1NBQzFELENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTztZQUNMLGtGQUFrRjtZQUNsRixJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRO1lBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQyxlQUFlO1NBQ2hFLENBQUM7SUFDSixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzFCLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7OytHQWxDVSxrQkFBa0I7bUdBQWxCLGtCQUFrQixxTkNUL0Isb2dDQWdDQTsyRkR2QmEsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLFlBQVksbUJBRUwsdUJBQXVCLENBQUMsTUFBTTt3R0FLdEMsRUFBRTtzQkFBVixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFFSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgdHlwZSBQZG1Td2l0Y2hTaXplID0gJ2RlZmF1bHQnIHwgJ3NtJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRtLXN3aXRjaCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zd2l0Y2guY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQZG1Td2l0Y2hDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgQElucHV0KCkgaWQgPSAnJztcbiAgQElucHV0KCkgY2hlY2tlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBsYWJlbCA9ICcnO1xuICBASW5wdXQoKSBjbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgc2l6ZTogUGRtU3dpdGNoU2l6ZSA9ICdkZWZhdWx0JztcblxuICBAT3V0cHV0KCkgY2hlY2tlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBnZXQgcm9vdENsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAncGVlciByZWxhdGl2ZSBpbmxpbmUtZmxleCBzaHJpbmstMCBpdGVtcy1jZW50ZXIgcm91bmRlZC1mdWxsIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQgb3V0bGluZS1ub25lIHRyYW5zaXRpb24tYWxsIGZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLTMgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAnLFxuICAgICAgdGhpcy5zaXplID09PSAnc20nID8gJ2gtWzE0cHhdIHctWzI0cHhdJyA6ICdoLVsxOC40cHhdIHctWzMycHhdJyxcbiAgICAgIHRoaXMuY2hlY2tlZCA/ICdiZy1wcmltYXJ5JyA6ICdiZy1pbnB1dCBkYXJrOmJnLWlucHV0LzgwJ1xuICAgIF07XG4gIH1cblxuICBnZXQgdGh1bWJDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ3BvaW50ZXItZXZlbnRzLW5vbmUgYmxvY2sgcm91bmRlZC1mdWxsIGJnLWJhY2tncm91bmQgcmluZy0wIHRyYW5zaXRpb24tdHJhbnNmb3JtJyxcbiAgICAgIHRoaXMuc2l6ZSA9PT0gJ3NtJyA/ICdzaXplLTMnIDogJ3NpemUtNCcsXG4gICAgICB0aGlzLmNoZWNrZWQgPyAndHJhbnNsYXRlLXgtW2NhbGMoMTAwJS0ycHgpXScgOiAndHJhbnNsYXRlLXgtMCdcbiAgICBdO1xuICB9XG5cbiAgb25Ub2dnbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICBjb25zdCBuZXh0ID0gIXRoaXMuY2hlY2tlZDtcbiAgICB0aGlzLmNoZWNrZWQgPSBuZXh0O1xuICAgIHRoaXMuY2hlY2tlZENoYW5nZS5lbWl0KG5leHQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8ZGl2IFtuZ0NsYXNzXT1cIlsnZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yJywgY2xhc3NOYW1lXVwiPlxuICA8YnV0dG9uXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgcm9sZT1cInN3aXRjaFwiXG4gICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImNoZWNrZWRcIlxuICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFthdHRyLmRhdGEtc3RhdGVdPVwiY2hlY2tlZCA/ICdjaGVja2VkJyA6ICd1bmNoZWNrZWQnXCJcbiAgICBbYXR0ci5kYXRhLWRpc2FibGVkXT1cImRpc2FibGVkID8gJ3RydWUnIDogJ2ZhbHNlJ1wiXG4gICAgW2F0dHIuZGF0YS1zaXplXT1cInNpemVcIlxuICAgIFthdHRyLmRhdGEtc2xvdF09XCInc3dpdGNoJ1wiXG4gICAgW2F0dHIudmFsdWVdPVwiY2hlY2tlZCA/ICdvbicgOiAnb2ZmJ1wiXG4gICAgW2lkXT1cImlkXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtuZ0NsYXNzXT1cInJvb3RDbGFzc2VzXCJcbiAgICAoY2xpY2spPVwib25Ub2dnbGUoKVwiXG4gID5cbiAgICA8c3BhblxuICAgICAgW2F0dHIuZGF0YS1zdGF0ZV09XCJjaGVja2VkID8gJ2NoZWNrZWQnIDogJ3VuY2hlY2tlZCdcIlxuICAgICAgW2F0dHIuZGF0YS1zbG90XT1cIidzd2l0Y2gtdGh1bWInXCJcbiAgICAgIFtuZ0NsYXNzXT1cInRodW1iQ2xhc3Nlc1wiXG4gICAgPjwvc3Bhbj5cbiAgPC9idXR0b24+XG4gIDxsYWJlbFxuICAgICpuZ0lmPVwibGFiZWxcIlxuICAgIFthdHRyLmZvcl09XCJpZFwiXG4gICAgW2F0dHIuZGF0YS1zbG90XT1cIidsYWJlbCdcIlxuICAgIGNsYXNzPVwiZmxleCBjdXJzb3ItcG9pbnRlciBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSBsZWFkaW5nLW5vbmUgZm9udC1tZWRpdW0gc2VsZWN0LW5vbmUgcGVlci1kaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgcGVlci1kaXNhYmxlZDpvcGFjaXR5LTUwXCJcbiAgICAoY2xpY2spPVwib25Ub2dnbGUoKVwiXG4gID5cbiAgICB7eyBsYWJlbCB9fVxuICA8L2xhYmVsPlxuPC9kaXY+XG4iXX0=
@@ -1,17 +1,209 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/common";
4
4
  export class PdmTableComponent {
5
- constructor() {
5
+ constructor(renderer) {
6
+ this.renderer = renderer;
7
+ this.variant = 'default';
8
+ this.reorderRows = false;
9
+ this.dragHandleSelector = '[data-drag-handle],[data-slot=row-drag-handle],.row-drag-handle,[data-auto-drag-handle]';
6
10
  this.className = '';
11
+ this.rowOrderChange = new EventEmitter();
12
+ this.cleanupListeners = [];
13
+ this.draggedRow = null;
14
+ }
15
+ ngAfterViewInit() {
16
+ this.syncReorderBehavior();
17
+ }
18
+ ngOnChanges(changes) {
19
+ if (changes['reorderRows'] || changes['variant']) {
20
+ this.syncReorderBehavior();
21
+ }
22
+ }
23
+ ngOnDestroy() {
24
+ this.cleanupReorderBehavior();
25
+ }
26
+ get wrapperClasses() {
27
+ return [
28
+ 'relative w-full overflow-auto',
29
+ this.variant === 'interactive' ? 'overflow-x-auto overflow-y-hidden rounded-xl border border-border bg-background' : '',
30
+ this.variant === 'data' ? 'overflow-hidden rounded-md border border-border bg-background' : '',
31
+ this.className
32
+ ];
33
+ }
34
+ get tableClasses() {
35
+ return [
36
+ 'w-full caption-bottom text-sm',
37
+ this.variant === 'data'
38
+ ? 'border-collapse text-foreground [&_thead_tr]:border-b [&_thead_tr]:border-border [&_tbody_tr]:border-b [&_tbody_tr]:border-border [&_tbody_tr:last-child]:border-b-0 [&_th]:h-10 [&_th]:px-2 [&_th]:text-left [&_th]:align-middle [&_th]:font-medium [&_td]:p-2 [&_td]:align-middle'
39
+ : '',
40
+ this.variant === 'interactive'
41
+ ? 'text-foreground [&_thead]:sticky [&_thead]:top-0 [&_thead]:z-10 [&_thead]:bg-muted/70 [&_thead_tr]:border-b [&_thead_tr]:border-border [&_th]:h-12 [&_th]:px-4 [&_th]:text-left [&_th]:align-middle [&_th]:text-sm [&_th]:font-medium [&_th]:whitespace-nowrap [&_tbody_tr]:border-b [&_tbody_tr]:border-border [&_tbody_tr]:transition-colors [&_tbody_tr:hover]:bg-muted/50 [&_tbody_tr:last-child]:border-b-0 [&_td]:h-14 [&_td]:px-4 [&_td]:align-middle [&_td]:text-sm [&_td]:whitespace-nowrap [&_td:first-child]:w-10 [&_td:last-child]:w-10 [&_svg]:text-muted-foreground'
42
+ : ''
43
+ ];
44
+ }
45
+ syncReorderBehavior() {
46
+ this.cleanupReorderBehavior();
47
+ if (!this.isReorderEnabled) {
48
+ return;
49
+ }
50
+ const tbody = this.getTbody();
51
+ if (!tbody) {
52
+ return;
53
+ }
54
+ this.setRowsDraggable(tbody, true);
55
+ this.cleanupListeners.push(this.renderer.listen(tbody, 'mousedown', (event) => this.armDragFromHandle(event)), this.renderer.listen(tbody, 'dragstart', (event) => this.onDragStart(event)), this.renderer.listen(tbody, 'dragover', (event) => this.onDragOver(event, tbody)), this.renderer.listen(tbody, 'drop', (event) => this.onDrop(event)), this.renderer.listen(tbody, 'dragend', () => this.onDragEnd()));
56
+ this.observer = new MutationObserver(() => this.setRowsDraggable(tbody, true));
57
+ this.observer.observe(tbody, { childList: true });
58
+ }
59
+ cleanupReorderBehavior() {
60
+ this.cleanupListeners.forEach((dispose) => dispose());
61
+ this.cleanupListeners = [];
62
+ if (this.observer) {
63
+ this.observer.disconnect();
64
+ this.observer = undefined;
65
+ }
66
+ const tbody = this.getTbody();
67
+ if (tbody) {
68
+ this.setRowsDraggable(tbody, false);
69
+ }
70
+ this.draggedRow = null;
71
+ }
72
+ get isReorderEnabled() {
73
+ return this.reorderRows;
74
+ }
75
+ getTbody() {
76
+ return this.tableElement?.nativeElement.tBodies.item(0) ?? null;
77
+ }
78
+ setRowsDraggable(tbody, enabled) {
79
+ const rows = Array.from(tbody.rows);
80
+ rows.forEach((row) => {
81
+ this.syncAutoDragHandle(row, enabled);
82
+ row.draggable = false;
83
+ if (!enabled) {
84
+ delete row.dataset['dragging'];
85
+ delete row.dataset['dragArmed'];
86
+ }
87
+ });
88
+ }
89
+ syncAutoDragHandle(row, enabled) {
90
+ const firstCell = row.cells.item(0);
91
+ if (!firstCell) {
92
+ return;
93
+ }
94
+ const existingAutoHandle = firstCell.querySelector('[data-auto-drag-handle]');
95
+ if (!enabled) {
96
+ existingAutoHandle?.remove();
97
+ return;
98
+ }
99
+ const hasCustomHandle = !!firstCell.querySelector('[data-drag-handle],[data-slot=row-drag-handle],.row-drag-handle');
100
+ if (hasCustomHandle || existingAutoHandle) {
101
+ return;
102
+ }
103
+ const button = this.renderer.createElement('button');
104
+ this.renderer.setAttribute(button, 'type', 'button');
105
+ this.renderer.setAttribute(button, 'aria-label', 'Drag row');
106
+ this.renderer.setAttribute(button, 'data-auto-drag-handle', 'true');
107
+ this.renderer.addClass(button, 'inline-flex');
108
+ this.renderer.addClass(button, 'h-7');
109
+ this.renderer.addClass(button, 'w-7');
110
+ this.renderer.addClass(button, 'items-center');
111
+ this.renderer.addClass(button, 'justify-center');
112
+ this.renderer.addClass(button, 'cursor-grab');
113
+ this.renderer.addClass(button, 'active:cursor-grabbing');
114
+ this.renderer.addClass(button, 'text-muted-foreground');
115
+ const dots = this.renderer.createElement('span');
116
+ this.renderer.addClass(dots, 'text-sm');
117
+ this.renderer.addClass(dots, 'leading-none');
118
+ this.renderer.setProperty(dots, 'textContent', '⋮⋮');
119
+ this.renderer.appendChild(button, dots);
120
+ this.renderer.insertBefore(firstCell, button, firstCell.firstChild);
121
+ }
122
+ onDragStart(event) {
123
+ const target = event.target;
124
+ const row = target?.closest('tr');
125
+ if (!row) {
126
+ return;
127
+ }
128
+ const handle = target?.closest(this.dragHandleSelector);
129
+ const isArmed = row.dataset['dragArmed'] === 'true';
130
+ if ((!handle || !row.contains(handle)) && !isArmed) {
131
+ event.preventDefault();
132
+ return;
133
+ }
134
+ this.draggedRow = row;
135
+ this.draggedRow.dataset['dragging'] = 'true';
136
+ if (event.dataTransfer) {
137
+ event.dataTransfer.effectAllowed = 'move';
138
+ event.dataTransfer.setData('text/plain', '');
139
+ }
140
+ }
141
+ onDragOver(event, tbody) {
142
+ if (!this.draggedRow) {
143
+ return;
144
+ }
145
+ event.preventDefault();
146
+ const target = event.target;
147
+ const targetRow = target?.closest('tr');
148
+ if (!targetRow || targetRow === this.draggedRow) {
149
+ return;
150
+ }
151
+ const rect = targetRow.getBoundingClientRect();
152
+ const shouldInsertBefore = event.clientY < rect.top + rect.height / 2;
153
+ tbody.insertBefore(this.draggedRow, shouldInsertBefore ? targetRow : targetRow.nextSibling);
154
+ }
155
+ onDrop(event) {
156
+ event.preventDefault();
157
+ }
158
+ onDragEnd() {
159
+ const tbody = this.getTbody();
160
+ if (tbody) {
161
+ Array.from(tbody.rows).forEach((row) => {
162
+ row.draggable = false;
163
+ delete row.dataset['dragArmed'];
164
+ });
165
+ }
166
+ if (this.draggedRow) {
167
+ delete this.draggedRow.dataset['dragging'];
168
+ this.draggedRow = null;
169
+ }
170
+ if (!tbody) {
171
+ return;
172
+ }
173
+ const order = Array.from(tbody.rows).map((row, index) => row.getAttribute('data-row-id') || String(index));
174
+ this.rowOrderChange.emit(order);
175
+ }
176
+ armDragFromHandle(event) {
177
+ const target = event.target;
178
+ const handle = target?.closest(this.dragHandleSelector);
179
+ if (!handle) {
180
+ return;
181
+ }
182
+ const row = handle.closest('tr');
183
+ if (!row) {
184
+ return;
185
+ }
186
+ row.draggable = true;
187
+ row.dataset['dragArmed'] = 'true';
7
188
  }
8
189
  }
9
- PdmTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10
- PdmTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmTableComponent, selector: "pdm-table", inputs: { className: "className" }, ngImport: i0, template: "<div [ngClass]=\"['relative w-full overflow-auto', className]\">\n <table class=\"w-full caption-bottom text-sm\">\n <ng-content></ng-content>\n </table>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
190
+ PdmTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTableComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
191
+ PdmTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmTableComponent, selector: "pdm-table", inputs: { variant: "variant", reorderRows: "reorderRows", dragHandleSelector: "dragHandleSelector", className: "className" }, outputs: { rowOrderChange: "rowOrderChange" }, viewQueries: [{ propertyName: "tableElement", first: true, predicate: ["tableElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [ngClass]=\"wrapperClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table-container' : null\">\n <table #tableElement [ngClass]=\"tableClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table' : null\">\n <ng-content></ng-content>\n </table>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11
192
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTableComponent, decorators: [{
12
193
  type: Component,
13
- args: [{ selector: 'pdm-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['relative w-full overflow-auto', className]\">\n <table class=\"w-full caption-bottom text-sm\">\n <ng-content></ng-content>\n </table>\n</div>\n" }]
14
- }], propDecorators: { className: [{
194
+ args: [{ selector: 'pdm-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"wrapperClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table-container' : null\">\n <table #tableElement [ngClass]=\"tableClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table' : null\">\n <ng-content></ng-content>\n </table>\n</div>\n" }]
195
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { variant: [{
196
+ type: Input
197
+ }], reorderRows: [{
198
+ type: Input
199
+ }], dragHandleSelector: [{
200
+ type: Input
201
+ }], className: [{
15
202
  type: Input
203
+ }], rowOrderChange: [{
204
+ type: Output
205
+ }], tableElement: [{
206
+ type: ViewChild,
207
+ args: ['tableElement']
16
208
  }] } });
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBTzFFLE1BQU0sT0FBTyxpQkFBaUI7SUFMOUI7UUFNVyxjQUFTLEdBQUcsRUFBRSxDQUFDO0tBQ3pCOzs4R0FGWSxpQkFBaUI7a0dBQWpCLGlCQUFpQixxRkNQOUIsMEtBS0E7MkZERWEsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLFdBQVcsbUJBRUosdUJBQXVCLENBQUMsTUFBTTs4QkFHdEMsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BkbS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFBkbVRhYmxlQ29tcG9uZW50IHtcbiAgQElucHV0KCkgY2xhc3NOYW1lID0gJyc7XG59XG4iLCI8ZGl2IFtuZ0NsYXNzXT1cIlsncmVsYXRpdmUgdy1mdWxsIG92ZXJmbG93LWF1dG8nLCBjbGFzc05hbWVdXCI+XG4gIDx0YWJsZSBjbGFzcz1cInctZnVsbCBjYXB0aW9uLWJvdHRvbSB0ZXh0LXNtXCI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L3RhYmxlPlxuPC9kaXY+XG4iXX0=
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFHTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7OztBQVN2QixNQUFNLE9BQU8saUJBQWlCO0lBYTVCLFlBQTZCLFFBQW1CO1FBQW5CLGFBQVEsR0FBUixRQUFRLENBQVc7UUFadkMsWUFBTyxHQUFvQixTQUFTLENBQUM7UUFDckMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsdUJBQWtCLEdBQUcseUZBQXlGLENBQUM7UUFDL0csY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNkLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUloRCxxQkFBZ0IsR0FBc0IsRUFBRSxDQUFDO1FBRXpDLGVBQVUsR0FBK0IsSUFBSSxDQUFDO0lBRUgsQ0FBQztJQUVwRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDaEQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTztZQUNMLCtCQUErQjtZQUMvQixJQUFJLENBQUMsT0FBTyxLQUFLLGFB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O0lBQ3BDLENBQUM7OzhHQXpPVSxpQkFBaUI7a0dBQWpCLGlCQUFpQixpV0N0QjlCLHVSQUtBOzJGRGlCYSxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0UsV0FBVyxtQkFFSix1QkFBdUIsQ0FBQyxNQUFNO2dHQUd0QyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNO2dCQUVvQixZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgUGRtVGFibGVWYXJpYW50ID0gJ2RlZmF1bHQnIHwgJ2RhdGEnIHwgJ2ludGVyYWN0aXZlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRtLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgUGRtVGFibGVDb21wb25lbnQge1xuICBASW5wdXQoKSB2YXJpYW50OiBQZG1UYWJsZVZhcmlhbnQgPSAnZGVmYXVsdCc7XG4gIEBJbnB1dCgpIHJlb3JkZXJSb3dzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRyYWdIYW5kbGVTZWxlY3RvciA9ICdbZGF0YS1kcmFnLWhhbmRsZV0sW2RhdGEtc2xvdD1yb3ctZHJhZy1oYW5kbGVdLC5yb3ctZHJhZy1oYW5kbGUsW2RhdGEtYXV0by1kcmFnLWhhbmRsZV0nO1xuICBASW5wdXQoKSBjbGFzc05hbWUgPSAnJztcbiAgQE91dHB1dCgpIHJvd09yZGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcblxuICBAVmlld0NoaWxkKCd0YWJsZUVsZW1lbnQnKSB0YWJsZUVsZW1lbnQ/OiBFbGVtZW50UmVmPEhUTUxUYWJsZUVsZW1lbnQ+O1xuXG4gIHByaXZhdGUgY2xlYW51cExpc3RlbmVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcbiAgcHJpdmF0ZSBvYnNlcnZlcj86IE11dGF0aW9uT2JzZXJ2ZXI7XG4gIHByaXZhdGUgZHJhZ2dlZFJvdzogSFRNTFRhYmxlUm93RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zeW5jUmVvcmRlckJlaGF2aW9yKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3Jlb3JkZXJSb3dzJ10gfHwgY2hhbmdlc1sndmFyaWFudCddKSB7XG4gICAgICB0aGlzLnN5bmNSZW9yZGVyQmVoYXZpb3IoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBSZW9yZGVyQmVoYXZpb3IoKTtcbiAgfVxuXG4gIGdldCB3cmFwcGVyQ2xhc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdyZWxhdGl2ZSB3LWZ1bGwgb3ZlcmZsb3ctYXV0bycsXG4gICAgICB0aGlzLnZhcmlhbnQgPT09ICdpbnRlcmFjdGl2ZScgPyAnb3ZlcmZsb3cteC1hdXRvIG92ZXJmbG93LXktaGlkZGVuIHJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctYmFja2dyb3VuZCcgOiAnJyxcbiAgICAgIHRoaXMudmFyaWFudCA9PT0gJ2RhdGEnID8gJ292ZXJmbG93LWhpZGRlbiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItYm9yZGVyIGJnLWJhY2tncm91bmQnIDogJycsXG4gICAgICB0aGlzLmNsYXNzTmFtZVxuICAgIF07XG4gIH1cblxuICBnZXQgdGFibGVDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ3ctZnVsbCBjYXB0aW9uLWJvdHRvbSB0ZXh0LXNtJyxcbiAgICAgIHRoaXMudmFyaWFudCA9PT0gJ2RhdGEnXG4gICAgICAgID8gJ2JvcmRlci1jb2xsYXBzZSB0ZXh0LWZvcmVncm91bmQgWyZfdGhlYWRfdHJdOmJvcmRlci1iIFsmX3RoZWFkX3RyXTpib3JkZXItYm9yZGVyIFsmX3Rib2R5X3RyXTpib3JkZXItYiBbJl90Ym9keV90cl06Ym9yZGVyLWJvcmRlciBbJl90Ym9keV90cjpsYXN0LWNoaWxkXTpib3JkZXItYi0wIFsmX3RoXTpoLTEwIFsmX3RoXTpweC0yIFsmX3RoXTp0ZXh0LWxlZnQgWyZfdGhdOmFsaWduLW1pZGRsZSBbJl90aF06Zm9udC1tZWRpdW0gWyZfdGRdOnAtMiBbJl90ZF06YWxpZ24tbWlkZGxlJ1xuICAgICAgICA6ICcnLFxuICAgICAgdGhpcy52YXJpYW50ID09PSAnaW50ZXJhY3RpdmUnXG4gICAgICAgID8gJ3RleHQtZm9yZWdyb3VuZCBbJl90aGVhZF06c3RpY2t5IFsmX3RoZWFkXTp0b3AtMCBbJl90aGVhZF06ei0xMCBbJl90aGVhZF06YmctbXV0ZWQvNzAgWyZfdGhlYWRfdHJdOmJvcmRlci1iIFsmX3RoZWFkX3RyXTpib3JkZXItYm9yZGVyIFsmX3RoXTpoLTEyIFsmX3RoXTpweC00IFsmX3RoXTp0ZXh0LWxlZnQgWyZfdGhdOmFsaWduLW1pZGRsZSBbJl90aF06dGV4dC1zbSBbJl90aF06Zm9udC1tZWRpdW0gWyZfdGhdOndoaXRlc3BhY2Utbm93cmFwIFsmX3Rib2R5X3RyXTpib3JkZXItYiBbJl90Ym9keV90cl06Ym9yZGVyLWJvcmRlciBbJl90Ym9keV90cl06dHJhbnNpdGlvbi1jb2xvcnMgWyZfdGJvZHlfdHI6aG92ZXJdOmJnLW11dGVkLzUwIFsmX3Rib2R5X3RyOmxhc3QtY2hpbGRdOmJvcmRlci1iLTAgWyZfdGRdOmgtMTQgWyZfdGRdOnB4LTQgWyZfdGRdOmFsaWduLW1pZGRsZSBbJl90ZF06dGV4dC1zbSBbJl90ZF06d2hpdGVzcGFjZS1ub3dyYXAgWyZfdGQ6Zmlyc3QtY2hpbGRdOnctMTAgWyZfdGQ6bGFzdC1jaGlsZF06dy0xMCBbJl9zdmddOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCdcbiAgICAgICAgOiAnJ1xuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN5bmNSZW9yZGVyQmVoYXZpb3IoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwUmVvcmRlckJlaGF2aW9yKCk7XG5cbiAgICBpZiAoIXRoaXMuaXNSZW9yZGVyRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRib2R5ID0gdGhpcy5nZXRUYm9keSgpO1xuICAgIGlmICghdGJvZHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFJvd3NEcmFnZ2FibGUodGJvZHksIHRydWUpO1xuXG4gICAgdGhpcy5jbGVhbnVwTGlzdGVuZXJzLnB1c2goXG4gICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0Ym9keSwgJ21vdXNlZG93bicsIChldmVudDogTW91c2VFdmVudCkgPT4gdGhpcy5hcm1EcmFnRnJvbUhhbmRsZShldmVudCkpLFxuICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGJvZHksICdkcmFnc3RhcnQnLCAoZXZlbnQ6IERyYWdFdmVudCkgPT4gdGhpcy5vbkRyYWdTdGFydChldmVudCkpLFxuICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGJvZHksICdkcmFnb3ZlcicsIChldmVudDogRHJhZ0V2ZW50KSA9PiB0aGlzLm9uRHJhZ092ZXIoZXZlbnQsIHRib2R5KSksXG4gICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0Ym9keSwgJ2Ryb3AnLCAoZXZlbnQ6IERyYWdFdmVudCkgPT4gdGhpcy5vbkRyb3AoZXZlbnQpKSxcbiAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRib2R5LCAnZHJhZ2VuZCcsICgpID0+IHRoaXMub25EcmFnRW5kKCkpXG4gICAgKTtcblxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB0aGlzLnNldFJvd3NEcmFnZ2FibGUodGJvZHksIHRydWUpKTtcbiAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGJvZHksIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwUmVvcmRlckJlaGF2aW9yKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cExpc3RlbmVycy5mb3JFYWNoKChkaXNwb3NlKSA9PiBkaXNwb3NlKCkpO1xuICAgIHRoaXMuY2xlYW51cExpc3RlbmVycyA9IFtdO1xuXG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5vYnNlcnZlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCB0Ym9keSA9IHRoaXMuZ2V0VGJvZHkoKTtcbiAgICBpZiAodGJvZHkpIHtcbiAgICAgIHRoaXMuc2V0Um93c0RyYWdnYWJsZSh0Ym9keSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHRoaXMuZHJhZ2dlZFJvdyA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldCBpc1Jlb3JkZXJFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlb3JkZXJSb3dzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYm9keSgpOiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnRhYmxlRWxlbWVudD8ubmF0aXZlRWxlbWVudC50Qm9kaWVzLml0ZW0oMCkgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Um93c0RyYWdnYWJsZSh0Ym9keTogSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQsIGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByb3dzID0gQXJyYXkuZnJvbSh0Ym9keS5yb3dzKTtcbiAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgdGhpcy5zeW5jQXV0b0RyYWdIYW5kbGUocm93LCBlbmFibGVkKTtcbiAgICAgIHJvdy5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgIGlmICghZW5hYmxlZCkge1xuICAgICAgICBkZWxldGUgcm93LmRhdGFzZXRbJ2RyYWdnaW5nJ107XG4gICAgICAgIGRlbGV0ZSByb3cuZGF0YXNldFsnZHJhZ0FybWVkJ107XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN5bmNBdXRvRHJhZ0hhbmRsZShyb3c6IEhUTUxUYWJsZVJvd0VsZW1lbnQsIGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBmaXJzdENlbGwgPSByb3cuY2VsbHMuaXRlbSgwKTtcbiAgICBpZiAoIWZpcnN0Q2VsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nQXV0b0hhbmRsZSA9IGZpcnN0Q2VsbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hdXRvLWRyYWctaGFuZGxlXScpO1xuICAgIGlmICghZW5hYmxlZCkge1xuICAgICAgZXhpc3RpbmdBdXRvSGFuZGxlPy5yZW1vdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNDdXN0b21IYW5kbGUgPSAhIWZpcnN0Q2VsbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1kcmFnLWhhbmRsZV0sW2RhdGEtc2xvdD1yb3ctZHJhZy1oYW5kbGVdLC5yb3ctZHJhZy1oYW5kbGUnKTtcbiAgICBpZiAoaGFzQ3VzdG9tSGFuZGxlIHx8IGV4aXN0aW5nQXV0b0hhbmRsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnYnV0dG9uJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYnV0dG9uLCAndHlwZScsICdidXR0b24nKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShidXR0b24sICdhcmlhLWxhYmVsJywgJ0RyYWcgcm93Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYnV0dG9uLCAnZGF0YS1hdXRvLWRyYWctaGFuZGxlJywgJ3RydWUnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGJ1dHRvbiwgJ2lubGluZS1mbGV4Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhidXR0b24sICdoLTcnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGJ1dHRvbiwgJ3ctNycpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoYnV0dG9uLCAnaXRlbXMtY2VudGVyJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhidXR0b24sICdqdXN0aWZ5LWNlbnRlcicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoYnV0dG9uLCAnY3Vyc29yLWdyYWInKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGJ1dHRvbiwgJ2FjdGl2ZTpjdXJzb3ItZ3JhYmJpbmcnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGJ1dHRvbiwgJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCcpO1xuXG4gICAgY29uc3QgZG90cyA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZG90cywgJ3RleHQtc20nKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGRvdHMsICdsZWFkaW5nLW5vbmUnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGRvdHMsICd0ZXh0Q29udGVudCcsICfii67ii64nKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGJ1dHRvbiwgZG90cyk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZShmaXJzdENlbGwsIGJ1dHRvbiwgZmlyc3RDZWxsLmZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdTdGFydChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCByb3cgPSB0YXJnZXQ/LmNsb3Nlc3QoJ3RyJyk7XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGUgPSB0YXJnZXQ/LmNsb3Nlc3QodGhpcy5kcmFnSGFuZGxlU2VsZWN0b3IpO1xuICAgIGNvbnN0IGlzQXJtZWQgPSByb3cuZGF0YXNldFsnZHJhZ0FybWVkJ10gPT09ICd0cnVlJztcbiAgICBpZiAoKCFoYW5kbGUgfHwgIXJvdy5jb250YWlucyhoYW5kbGUpKSAmJiAhaXNBcm1lZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRyYWdnZWRSb3cgPSByb3cgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcbiAgICB0aGlzLmRyYWdnZWRSb3cuZGF0YXNldFsnZHJhZ2dpbmcnXSA9ICd0cnVlJztcblxuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnO1xuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvcGxhaW4nLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQsIHRib2R5OiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnZ2VkUm93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IHRhcmdldFJvdyA9IHRhcmdldD8uY2xvc2VzdCgndHInKSBhcyBIVE1MVGFibGVSb3dFbGVtZW50IHwgbnVsbDtcblxuICAgIGlmICghdGFyZ2V0Um93IHx8IHRhcmdldFJvdyA9PT0gdGhpcy5kcmFnZ2VkUm93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVjdCA9IHRhcmdldFJvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzaG91bGRJbnNlcnRCZWZvcmUgPSBldmVudC5jbGllbnRZIDwgcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDI7XG4gICAgdGJvZHkuaW5zZXJ0QmVmb3JlKHRoaXMuZHJhZ2dlZFJvdywgc2hvdWxkSW5zZXJ0QmVmb3JlID8gdGFyZ2V0Um93IDogdGFyZ2V0Um93Lm5leHRTaWJsaW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWdFbmQoKTogdm9pZCB7XG4gICAgY29uc3QgdGJvZHkgPSB0aGlzLmdldFRib2R5KCk7XG4gICAgaWYgKHRib2R5KSB7XG4gICAgICBBcnJheS5mcm9tKHRib2R5LnJvd3MpLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICByb3cuZHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgICAgIGRlbGV0ZSByb3cuZGF0YXNldFsnZHJhZ0FybWVkJ107XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kcmFnZ2VkUm93KSB7XG4gICAgICBkZWxldGUgdGhpcy5kcmFnZ2VkUm93LmRhdGFzZXRbJ2RyYWdnaW5nJ107XG4gICAgICB0aGlzLmRyYWdnZWRSb3cgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghdGJvZHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvcmRlciA9IEFycmF5LmZyb20odGJvZHkucm93cykubWFwKChyb3csIGluZGV4KSA9PiByb3cuZ2V0QXR0cmlidXRlKCdkYXRhLXJvdy1pZCcpIHx8IFN0cmluZyhpbmRleCkpO1xuICAgIHRoaXMucm93T3JkZXJDaGFuZ2UuZW1pdChvcmRlcik7XG4gIH1cblxuICBwcml2YXRlIGFybURyYWdGcm9tSGFuZGxlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCBoYW5kbGUgPSB0YXJnZXQ/LmNsb3Nlc3QodGhpcy5kcmFnSGFuZGxlU2VsZWN0b3IpO1xuICAgIGlmICghaGFuZGxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgcm93ID0gaGFuZGxlLmNsb3Nlc3QoJ3RyJykgYXMgSFRNTFRhYmxlUm93RWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByb3cuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICByb3cuZGF0YXNldFsnZHJhZ0FybWVkJ10gPSAndHJ1ZSc7XG4gIH1cbn1cbiIsIjxkaXYgW25nQ2xhc3NdPVwid3JhcHBlckNsYXNzZXNcIiBbYXR0ci5kYXRhLXNsb3RdPVwidmFyaWFudCA9PT0gJ2ludGVyYWN0aXZlJyA/ICd0YWJsZS1jb250YWluZXInIDogbnVsbFwiPlxuICA8dGFibGUgI3RhYmxlRWxlbWVudCBbbmdDbGFzc109XCJ0YWJsZUNsYXNzZXNcIiBbYXR0ci5kYXRhLXNsb3RdPVwidmFyaWFudCA9PT0gJ2ludGVyYWN0aXZlJyA/ICd0YWJsZScgOiBudWxsXCI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L3RhYmxlPlxuPC9kaXY+XG4iXX0=