123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, Optional, Output, ViewChild, } from '@angular/core';
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
- import { ButtonComponent } from '../../components/atoms/button/button.component';
- import { IconComponent } from '../../components/atoms/icon/icon.component';
- import { OptionComponent } from '../option/option.component';
- import { Subject, debounceTime } from 'rxjs';
- import { LabelComponent } from '../label/label.component';
- import { AlertComponent } from '../../components/atoms/alert/alert.component';
- import { provideControlContainer, provideValueAccessor } from '../utils/form.util';
- import { FormGenericComponent } from '../../services/form-generic.abstract';
- import { FormErrorComponent } from '../error/error.component';
- import { OverlayDirective } from '../../directives/overlay.directive';
- import * as i0 from "@angular/core";
- import * as i1 from "@angular/forms";
- export class SelectComponent extends FormGenericComponent {
- constructor(formGroupDirective, destroyRef) {
- super(formGroupDirective);
- this.formGroupDirective = formGroupDirective;
- this.destroyRef = destroyRef;
- this.focusOut$ = new Subject();
- this.isOpen = false;
- this.option = '';
- this.key = '';
- this.options = [];
- this.label = '';
- this.helper = '';
- this.placeholder = '';
- this.value = '';
- this.disposition = 'vertical';
- this.fullSize = true;
- this.showError = false;
- this.selected = new EventEmitter();
- }
- ngOnInit() {
- this.selectOption(this.value, false);
- this.focusOut$.pipe(takeUntilDestroyed(this.destroyRef), debounceTime(200)).subscribe(() => {
- this.triggerMarkCheck();
- this.close();
- });
- }
- ngOnChanges(changes) {
- if (changes['options'])
- this.selectOption(this.value, false);
- }
- toggle() {
- this.isOpen = !this.isOpen;
- if (!this.isOpen) {
- this.triggerTouched();
- }
- }
- close() {
- this.isOpen = false;
- this.triggerTouched();
- }
- selectOption(key, propagate = true) {
- const selectedOption = this.options.find(option => option.key === key);
- this.option = key === null ? this.placeholder : selectedOption?.label;
- if (propagate) {
- this.selected.emit(key);
- this.triggerChange(selectedOption?.key ?? null);
- this.close();
- }
- }
- writeValue(value) {
- this.triggerMarkCheck();
- this.selectOption(value, false);
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: SelectComponent, deps: [{ token: i1.FormGroupDirective, optional: true }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component }); }
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: SelectComponent, isStandalone: true, selector: "ct-select", inputs: { formControlName: "formControlName", key: "key", options: "options", label: "label", helper: "helper", placeholder: "placeholder", value: "value", disposition: "disposition", fullSize: "fullSize", showError: "showError" }, outputs: { selected: "selected" }, providers: [provideValueAccessor(forwardRef(() => SelectComponent))], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["triggerElement"], descendants: true }, { propertyName: "panel", first: true, predicate: ["optionsPanel"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"flex gap-1 font-primary\"\n [class.items-start]=\"disposition === 'vertical'\"\n [class.flex-col]=\"disposition === 'vertical'\">\n @if (label) {\n <ct-form-label\n [class.grow]=\"disposition === 'horizontal'\"\n [text]=\"label\"\n [hasError]=\"hasErrors(formControl)\"\n [showError]=\"showError\" />\n }\n <div class=\"flex flex-col\" [class.w-full]=\"fullSize\" [class.w-fit]=\"!fullSize\">\n <div\n tabindex=\"0\"\n class=\"flex cursor-pointer flex-row items-center justify-between rounded-md border bg-surface px-4 py-2 text-sm text-on-surface dark:bg-surface-dark dark:text-on-surface-dark\"\n [class.border-error]=\"hasErrors(formControl) && showError\"\n [class.border-neutral-300]=\"!hasErrors(formControl) || !showError\"\n [class.text-on-surface]=\"option !== placeholder\"\n (focusout)=\"focusOut$.next($event)\"\n (click)=\"toggle()\">\n <span [class.text-neutral-500]=\"option === placeholder\">{{ option }}</span>\n <ct-icon class=\"flex\" [size]=\"'sm'\" [icon]=\"isOpen ? 'chevron-up' : 'chevron-down'\" />\n </div>\n <!-- [ctOverlay]=\"dropDown\"\n [ctOverlayCloseOnClick]=\"true\"\n ctOverlayPosition=\"vertical\"\n <ng-template #dropDown>\n <div\n [class.w-full]=\"fullSize\"\n [class.w-fit]=\"!fullSize\"\n class=\"flex max-h-72 flex-col overflow-y-auto rounded-md border border-neutral-400 bg-surface text-on-surface shadow-lg dark:bg-surface-dark dark:text-on-surface-dark\">\n @if (placeholder) {\n <ct-option (click)=\"selectOption(null)\" [label]=\"placeholder\" />\n }\n @for (option of options; track option) {\n <ct-option (click)=\"selectOption(option.key)\" [label]=\"option.label\" [icon]=\"option.icon!\" />\n }\n </div>\n </ng-template> -->\n @if (isOpen) {\n <div class=\"relative flex flex-col\">\n <div\n [class.w-full]=\"fullSize\"\n [class.w-fit]=\"!fullSize\"\n class=\"absolute top-0.5 z-10 flex max-h-72 flex-col overflow-y-auto rounded-md border border-neutral-400 bg-surface text-on-surface shadow-lg dark:bg-surface-dark dark:text-on-surface-dark\">\n @if (placeholder) {\n <ct-option (click)=\"selectOption(null)\" [label]=\"placeholder\" />\n }\n @for (option of options; track option) {\n <ct-option (click)=\"selectOption(option.key)\" [label]=\"option.label\" [icon]=\"option.icon!\" />\n }\n </div>\n </div>\n }\n </div>\n @if (formControl) {\n <ct-form-alert\n [hasErrors]=\"hasErrors(formControl)\"\n [helper]=\"helper\"\n [errors]=\"formControl.errors ?? {}\"\n size=\"xs\" />\n }\n</div>\n", styles: ["vertical-overlay{width:100%}\n"], dependencies: [{ kind: "component", type: OptionComponent, selector: "ct-option", inputs: ["label", "icon"] }, { kind: "component", type: IconComponent, selector: "ct-icon", inputs: ["icon", "fill", "strokeWidth", "strokeColor", "size", "variant"] }, { kind: "component", type: LabelComponent, selector: "ct-form-label", inputs: ["text", "type", "formControlName", "hasError", "showError"] }, { kind: "component", type: FormErrorComponent, selector: "ct-form-alert", inputs: ["errors", "size", "hasErrors", "fullSize", "helper", "errorMessages"] }], viewProviders: [provideControlContainer()], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: SelectComponent, decorators: [{
- type: Component,
- args: [{ selector: 'ct-select', standalone: true, imports: [
- OptionComponent,
- ButtonComponent,
- IconComponent,
- LabelComponent,
- AlertComponent,
- FormErrorComponent,
- OverlayDirective,
- ], providers: [provideValueAccessor(forwardRef(() => SelectComponent))], viewProviders: [provideControlContainer()], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"flex gap-1 font-primary\"\n [class.items-start]=\"disposition === 'vertical'\"\n [class.flex-col]=\"disposition === 'vertical'\">\n @if (label) {\n <ct-form-label\n [class.grow]=\"disposition === 'horizontal'\"\n [text]=\"label\"\n [hasError]=\"hasErrors(formControl)\"\n [showError]=\"showError\" />\n }\n <div class=\"flex flex-col\" [class.w-full]=\"fullSize\" [class.w-fit]=\"!fullSize\">\n <div\n tabindex=\"0\"\n class=\"flex cursor-pointer flex-row items-center justify-between rounded-md border bg-surface px-4 py-2 text-sm text-on-surface dark:bg-surface-dark dark:text-on-surface-dark\"\n [class.border-error]=\"hasErrors(formControl) && showError\"\n [class.border-neutral-300]=\"!hasErrors(formControl) || !showError\"\n [class.text-on-surface]=\"option !== placeholder\"\n (focusout)=\"focusOut$.next($event)\"\n (click)=\"toggle()\">\n <span [class.text-neutral-500]=\"option === placeholder\">{{ option }}</span>\n <ct-icon class=\"flex\" [size]=\"'sm'\" [icon]=\"isOpen ? 'chevron-up' : 'chevron-down'\" />\n </div>\n <!-- [ctOverlay]=\"dropDown\"\n [ctOverlayCloseOnClick]=\"true\"\n ctOverlayPosition=\"vertical\"\n <ng-template #dropDown>\n <div\n [class.w-full]=\"fullSize\"\n [class.w-fit]=\"!fullSize\"\n class=\"flex max-h-72 flex-col overflow-y-auto rounded-md border border-neutral-400 bg-surface text-on-surface shadow-lg dark:bg-surface-dark dark:text-on-surface-dark\">\n @if (placeholder) {\n <ct-option (click)=\"selectOption(null)\" [label]=\"placeholder\" />\n }\n @for (option of options; track option) {\n <ct-option (click)=\"selectOption(option.key)\" [label]=\"option.label\" [icon]=\"option.icon!\" />\n }\n </div>\n </ng-template> -->\n @if (isOpen) {\n <div class=\"relative flex flex-col\">\n <div\n [class.w-full]=\"fullSize\"\n [class.w-fit]=\"!fullSize\"\n class=\"absolute top-0.5 z-10 flex max-h-72 flex-col overflow-y-auto rounded-md border border-neutral-400 bg-surface text-on-surface shadow-lg dark:bg-surface-dark dark:text-on-surface-dark\">\n @if (placeholder) {\n <ct-option (click)=\"selectOption(null)\" [label]=\"placeholder\" />\n }\n @for (option of options; track option) {\n <ct-option (click)=\"selectOption(option.key)\" [label]=\"option.label\" [icon]=\"option.icon!\" />\n }\n </div>\n </div>\n }\n </div>\n @if (formControl) {\n <ct-form-alert\n [hasErrors]=\"hasErrors(formControl)\"\n [helper]=\"helper\"\n [errors]=\"formControl.errors ?? {}\"\n size=\"xs\" />\n }\n</div>\n", styles: ["vertical-overlay{width:100%}\n"] }]
- }], ctorParameters: () => [{ type: i1.FormGroupDirective, decorators: [{
- type: Optional
- }] }, { type: i0.DestroyRef }], propDecorators: { formControlName: [{
- type: Input
- }], key: [{
- type: Input
- }], options: [{
- type: Input,
- args: [{ required: true }]
- }], label: [{
- type: Input
- }], helper: [{
- type: Input
- }], placeholder: [{
- type: Input
- }], value: [{
- type: Input
- }], disposition: [{
- type: Input
- }], fullSize: [{
- type: Input
- }], showError: [{
- type: Input
- }], selected: [{
- type: Output
- }], trigger: [{
- type: ViewChild,
- args: ['triggerElement']
- }], panel: [{
- type: ViewChild,
- args: ['optionsPanel']
- }] } });
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NpcmNsZXRvbmUvc3JjL2xpYi9mb3Jtcy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NpcmNsZXRvbmUvc3JjL2xpYi9mb3Jtcy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUdULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNqRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7OztBQW9CdEUsTUFBTSxPQUFPLGVBQWdCLFNB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NUN0RSxxdEZBK0RBLHdGRDdCSSxlQUFlLGlGQUVmLGFBQWEsK0hBQ2IsY0FBYyxnSUFFZCxrQkFBa0IsK0hBTUwsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDOzsyRkFHL0IsZUFBZTtrQkFsQjNCLFNBQVM7K0JBQ0UsV0FBVyxjQUNULElBQUksV0FDUDt3QkFDUCxlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQixnQkFBZ0I7cUJBQ2pCLGFBR1UsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxpQkFDckQsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLG1CQUN6Qix1QkFBdUIsQ0FBQyxNQUFNOzswQkF3QjVDLFFBQVE7a0VBakJGLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNxQixPQUFPO3NCQUFqQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDaEIsS0FBSztzQkFBYixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNO2dCQUVzQixPQUFPO3NCQUFuQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFDQSxLQUFLO3NCQUEvQixTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYXRvbXMvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYXRvbXMvaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtT3B0aW9uQmFzZSB9IGZyb20gJy4uLy4uL21vZGVsL2Zvcm1zL2Zvcm0tYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyBPcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9vcHRpb24vb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZvcm1Hcm91cERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IExhYmVsQ29tcG9uZW50IH0gZnJvbSAnLi4vbGFiZWwvbGFiZWwuY29tcG9uZW50JztcbmltcG9ydCB7IEFsZXJ0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hdG9tcy9hbGVydC9hbGVydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgcHJvdmlkZUNvbnRyb2xDb250YWluZXIsIHByb3ZpZGVWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvZm9ybS51dGlsJztcbmltcG9ydCB7IEZvcm1HZW5lcmljQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZm9ybS1nZW5lcmljLmFic3RyYWN0JztcbmltcG9ydCB7IEZvcm1FcnJvckNvbXBvbmVudCB9IGZyb20gJy4uL2Vycm9yL2Vycm9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnREaXNwb3NpdGlvbiB9IGZyb20gJy4uLy4uL21vZGVsL2NvbXBvbmVudHMvY29tcG9uZW50LWRpc3Bvc2l0aW9uLmVudW0nO1xuaW1wb3J0IHsgT3ZlcmxheURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvb3ZlcmxheS5kaXJlY3RpdmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjdC1zZWxlY3QnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgT3B0aW9uQ29tcG9uZW50LFxuICAgIEJ1dHRvbkNvbXBvbmVudCxcbiAgICBJY29uQ29tcG9uZW50LFxuICAgIExhYmVsQ29tcG9uZW50LFxuICAgIEFsZXJ0Q29tcG9uZW50LFxuICAgIEZvcm1FcnJvckNvbXBvbmVudCxcbiAgICBPdmVybGF5RGlyZWN0aXZlLFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbJ3ZlcnRpY2FsLW92ZXJsYXkgeyBAYXBwbHkgdy1mdWxsOyB9J10sXG4gIHByb3ZpZGVyczogW3Byb3ZpZGVWYWx1ZUFjY2Vzc29yKGZvcndhcmRSZWYoKCkgPT4gU2VsZWN0Q29tcG9uZW50KSldLFxuICB2aWV3UHJvdmlkZXJzOiBbcHJvdmlkZUNvbnRyb2xDb250YWluZXIoKV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBGb3JtR2VuZXJpY0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgZm9jdXNPdXQkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICBpc09wZW4gPSBmYWxzZTtcbiAgb3B0aW9uID0gJyc7XG5cbiAgQElucHV0KCkgZm9ybUNvbnRyb2xOYW1lITogc3RyaW5nO1xuICBASW5wdXQoKSBrZXkgPSAnJztcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgb3B0aW9uczogRm9ybU9wdGlvbkJhc2VbXSA9IFtdO1xuICBASW5wdXQoKSBsYWJlbCA9ICcnO1xuICBASW5wdXQoKSBoZWxwZXIgPSAnJztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcbiAgQElucHV0KCkgdmFsdWU6IGFueSA9ICcnO1xuICBASW5wdXQoKSBkaXNwb3NpdGlvbjogQ29tcG9uZW50RGlzcG9zaXRpb24gPSAndmVydGljYWwnO1xuICBASW5wdXQoKSBmdWxsU2l6ZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXJFbGVtZW50JykgdHJpZ2dlciE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdvcHRpb25zUGFuZWwnKSBwYW5lbCE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBvdmVycmlkZSBmb3JtR3JvdXBEaXJlY3RpdmU6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWY6IERlc3Ryb3lSZWZcbiAgKSB7XG4gICAgc3VwZXIoZm9ybUdyb3VwRGlyZWN0aXZlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0T3B0aW9uKHRoaXMudmFsdWUsIGZhbHNlKTtcbiAgICB0aGlzLmZvY3VzT3V0JC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLCBkZWJvdW5jZVRpbWUoMjAwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudHJpZ2dlck1hcmtDaGVjaygpO1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydvcHRpb25zJ10pIHRoaXMuc2VsZWN0T3B0aW9uKHRoaXMudmFsdWUsIGZhbHNlKTtcbiAgfVxuXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XG4gICAgICB0aGlzLnRyaWdnZXJUb3VjaGVkKCk7XG4gICAgfVxuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnRyaWdnZXJUb3VjaGVkKCk7XG4gIH1cblxuICBzZWxlY3RPcHRpb24oa2V5OiBhbnksIHByb3BhZ2F0ZSA9IHRydWUpIHtcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKG9wdGlvbiA9PiBvcHRpb24ua2V5ID09PSBrZXkpITtcbiAgICB0aGlzLm9wdGlvbiA9IGtleSA9PT0gbnVsbCA/IHRoaXMucGxhY2Vob2xkZXIgOiBzZWxlY3RlZE9wdGlvbj8ubGFiZWw7XG4gICAgaWYgKHByb3BhZ2F0ZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KGtleSk7XG4gICAgICB0aGlzLnRyaWdnZXJDaGFuZ2Uoc2VsZWN0ZWRPcHRpb24/LmtleSA/PyBudWxsKTtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnRyaWdnZXJNYXJrQ2hlY2soKTtcbiAgICB0aGlzLnNlbGVjdE9wdGlvbih2YWx1ZSwgZmFsc2UpO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiZmxleCBnYXAtMSBmb250LXByaW1hcnlcIlxuICBbY2xhc3MuaXRlbXMtc3RhcnRdPVwiZGlzcG9zaXRpb24gPT09ICd2ZXJ0aWNhbCdcIlxuICBbY2xhc3MuZmxleC1jb2xdPVwiZGlzcG9zaXRpb24gPT09ICd2ZXJ0aWNhbCdcIj5cbiAgQGlmIChsYWJlbCkge1xuICAgIDxjdC1mb3JtLWxhYmVsXG4gICAgICBbY2xhc3MuZ3Jvd109XCJkaXNwb3NpdGlvbiA9PT0gJ2hvcml6b250YWwnXCJcbiAgICAgIFt0ZXh0XT1cImxhYmVsXCJcbiAgICAgIFtoYXNFcnJvcl09XCJoYXNFcnJvcnMoZm9ybUNvbnRyb2wpXCJcbiAgICAgIFtzaG93RXJyb3JdPVwic2hvd0Vycm9yXCIgLz5cbiAgfVxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiIFtjbGFzcy53LWZ1bGxdPVwiZnVsbFNpemVcIiBbY2xhc3Mudy1maXRdPVwiIWZ1bGxTaXplXCI+XG4gICAgPGRpdlxuICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgIGNsYXNzPVwiZmxleCBjdXJzb3ItcG9pbnRlciBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHJvdW5kZWQtbWQgYm9yZGVyIGJnLXN1cmZhY2UgcHgtNCBweS0yIHRleHQtc20gdGV4dC1vbi1zdXJmYWNlIGRhcms6Ymctc3VyZmFjZS1kYXJrIGRhcms6dGV4dC1vbi1zdXJmYWNlLWRhcmtcIlxuICAgICAgW2NsYXNzLmJvcmRlci1lcnJvcl09XCJoYXNFcnJvcnMoZm9ybUNvbnRyb2wpICYmIHNob3dFcnJvclwiXG4gICAgICBbY2xhc3MuYm9yZGVyLW5ldXRyYWwtMzAwXT1cIiFoYXNFcnJvcnMoZm9ybUNvbnRyb2wpIHx8ICFzaG93RXJyb3JcIlxuICAgICAgW2NsYXNzLnRleHQtb24tc3VyZmFjZV09XCJvcHRpb24gIT09IHBsYWNlaG9sZGVyXCJcbiAgICAgIChmb2N1c291dCk9XCJmb2N1c091dCQubmV4dCgkZXZlbnQpXCJcbiAgICAgIChjbGljayk9XCJ0b2dnbGUoKVwiPlxuICAgICAgPHNwYW4gW2NsYXNzLnRleHQtbmV1dHJhbC01MDBdPVwib3B0aW9uID09PSBwbGFjZWhvbGRlclwiPnt7IG9wdGlvbiB9fTwvc3Bhbj5cbiAgICAgIDxjdC1pY29uIGNsYXNzPVwiZmxleFwiIFtzaXplXT1cIidzbSdcIiBbaWNvbl09XCJpc09wZW4gPyAnY2hldnJvbi11cCcgOiAnY2hldnJvbi1kb3duJ1wiIC8+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBbY3RPdmVybGF5XT1cImRyb3BEb3duXCJcbiAgICBbY3RPdmVybGF5Q2xvc2VPbkNsaWNrXT1cInRydWVcIlxuICAgIGN0T3ZlcmxheVBvc2l0aW9uPVwidmVydGljYWxcIlxuICAgIDxuZy10ZW1wbGF0ZSAjZHJvcERvd24+XG4gICAgICA8ZGl2XG4gICAgICAgIFtjbGFzcy53LWZ1bGxdPVwiZnVsbFNpemVcIlxuICAgICAgICBbY2xhc3Mudy1maXRdPVwiIWZ1bGxTaXplXCJcbiAgICAgICAgY2xhc3M9XCJmbGV4IG1heC1oLTcyIGZsZXgtY29sIG92ZXJmbG93LXktYXV0byByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItbmV1dHJhbC00MDAgYmctc3VyZmFjZSB0ZXh0LW9uLXN1cmZhY2Ugc2hhZG93LWxnIGRhcms6Ymctc3VyZmFjZS1kYXJrIGRhcms6dGV4dC1vbi1zdXJmYWNlLWRhcmtcIj5cbiAgICAgICAgQGlmIChwbGFjZWhvbGRlcikge1xuICAgICAgICAgIDxjdC1vcHRpb24gKGNsaWNrKT1cInNlbGVjdE9wdGlvbihudWxsKVwiIFtsYWJlbF09XCJwbGFjZWhvbGRlclwiIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGZvciAob3B0aW9uIG9mIG9wdGlvbnM7IHRyYWNrIG9wdGlvbikge1xuICAgICAgICAgIDxjdC1vcHRpb24gKGNsaWNrKT1cInNlbGVjdE9wdGlvbihvcHRpb24ua2V5KVwiIFtsYWJlbF09XCJvcHRpb24ubGFiZWxcIiBbaWNvbl09XCJvcHRpb24uaWNvbiFcIiAvPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPiAtLT5cbiAgICBAaWYgKGlzT3Blbikge1xuICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIFtjbGFzcy53LWZ1bGxdPVwiZnVsbFNpemVcIlxuICAgICAgICAgIFtjbGFzcy53LWZpdF09XCIhZnVsbFNpemVcIlxuICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdG9wLTAuNSB6LTEwIGZsZXggbWF4LWgtNzIgZmxleC1jb2wgb3ZlcmZsb3cteS1hdXRvIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1uZXV0cmFsLTQwMCBiZy1zdXJmYWNlIHRleHQtb24tc3VyZmFjZSBzaGFkb3ctbGcgZGFyazpiZy1zdXJmYWNlLWRhcmsgZGFyazp0ZXh0LW9uLXN1cmZhY2UtZGFya1wiPlxuICAgICAgICAgIEBpZiAocGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgIDxjdC1vcHRpb24gKGNsaWNrKT1cInNlbGVjdE9wdGlvbihudWxsKVwiIFtsYWJlbF09XCJwbGFjZWhvbGRlclwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBvcHRpb25zOyB0cmFjayBvcHRpb24pIHtcbiAgICAgICAgICAgIDxjdC1vcHRpb24gKGNsaWNrKT1cInNlbGVjdE9wdGlvbihvcHRpb24ua2V5KVwiIFtsYWJlbF09XCJvcHRpb24ubGFiZWxcIiBbaWNvbl09XCJvcHRpb24uaWNvbiFcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKGZvcm1Db250cm9sKSB7XG4gICAgPGN0LWZvcm0tYWxlcnRcbiAgICAgIFtoYXNFcnJvcnNdPVwiaGFzRXJyb3JzKGZvcm1Db250cm9sKVwiXG4gICAgICBbaGVscGVyXT1cImhlbHBlclwiXG4gICAgICBbZXJyb3JzXT1cImZvcm1Db250cm9sLmVycm9ycyA/PyB7fVwiXG4gICAgICBzaXplPVwieHNcIiAvPlxuICB9XG48L2Rpdj5cbiJdfQ==
|