UNPKG

@eternalheart/ngx-file-preview

Version:

A powerful Angular file preview component library supporting multiple file formats including images, videos, PDFs, Office documents, text files and more.

364 lines (352 loc) 52.8 kB
import { Component, ViewChild } from '@angular/core'; import { CommonModule } from '@angular/common'; import { BasePreviewComponent } from '../base-preview/base-preview.component'; import { PreviewIconComponent } from '../../components'; import { I18nPipe } from "../../i18n"; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class AudioPreviewComponent extends BasePreviewComponent { constructor() { super(...arguments); this.coverUrl = null; this.isPlaying = false; this.currentTime = 0; this.duration = 0; this.progress = 0; this.volume = 1; this.previousVolume = 1; this.isDragging = false; this.showVolumeControl = false; this.showSpeedControl = false; this.playbackSpeed = 1; this.playbackSpeeds = [0.75, 1, 1.5, 2.0, 3.0, 5.0]; this.playHandler = () => { this.isPlaying = true; this.cdr.markForCheck(); }; this.pauseHandler = () => { this.isPlaying = false; this.cdr.markForCheck(); }; this.endedHandler = () => { this.isPlaying = false; this.cdr.markForCheck(); }; this.onGlobalDrag = (event) => { if (this.isDragging) { const progressBar = this.audioPlayer.nativeElement.parentElement?.querySelector('.progress-bar'); if (progressBar) { const rect = progressBar.getBoundingClientRect(); const pos = Math.max(0, Math.min(1, (event.clientX - rect.left) / rect.width)); const audio = this.audioPlayer.nativeElement; audio.currentTime = pos * audio.duration; this.progress = pos * 100; this.cdr.markForCheck(); } } }; this.stopDragging = () => { if (this.isDragging) { this.isDragging = false; document.removeEventListener('mousemove', this.onGlobalDrag); document.removeEventListener('mouseup', this.stopDragging); } }; } ngOnInit() { this.startLoading(); this.loadCover(); this.cdr.markForCheck(); } async loadCover() { try { // 如果文件对象中已经有封面URL,直接使用 if (this.file.coverUrl) { this.coverUrl = this.file.coverUrl; return; } // 如果没有封面,使用默认图标 this.coverUrl = null; this.cdr.markForCheck(); } catch (error) { console.error('加载封面失败:', error); this.coverUrl = null; this.cdr.markForCheck(); } } ngAfterViewInit() { // 在视图初始化后设置事件监听 const audio = this.audioPlayer.nativeElement; audio.addEventListener('play', this.playHandler); audio.addEventListener('pause', this.pauseHandler); audio.addEventListener('ended', this.endedHandler); } onAudioLoad() { this.stopLoading(); this.duration = this.audioPlayer.nativeElement.duration; this.cdr.markForCheck(); } onTimeUpdate() { if (!this.isDragging) { const audio = this.audioPlayer.nativeElement; this.currentTime = audio.currentTime; this.progress = (audio.currentTime / audio.duration) * 100; this.cdr.markForCheck(); } } async togglePlay() { const audio = this.audioPlayer.nativeElement; try { if (this.isPlaying) { await audio.pause(); } else { // 在播放前重置音频时间(如果已经结束) if (audio.ended) { audio.currentTime = 0; } await audio.play(); } } catch (error) { console.error('播放控制错误:', error); } // 状态会通过事件监听器自动更新 } // 进度条控制 startDragging(event) { this.isDragging = true; this.seek(event); document.addEventListener('mousemove', this.onGlobalDrag); document.addEventListener('mouseup', this.stopDragging); } seek(event) { const progressBar = event.currentTarget; const rect = progressBar.getBoundingClientRect(); const pos = (event.clientX - rect.left) / rect.width; if (pos >= 0 && pos <= 1) { const audio = this.audioPlayer.nativeElement; audio.currentTime = pos * audio.duration; this.progress = pos * 100; this.cdr.markForCheck(); } } // 音量控制 cycleVolume() { if (this.volume > 0) { this.previousVolume = this.volume; this.volume = 0; } else { this.volume = this.previousVolume; } this.audioPlayer.nativeElement.volume = this.volume; this.cdr.markForCheck(); } adjustVolume(event) { const value = +event.target.value; this.volume = value / 100; if (this.volume > 0) { this.previousVolume = this.volume; } this.audioPlayer.nativeElement.volume = this.volume; this.cdr.markForCheck(); } getVolumeIcon() { if (this.volume === 0) return 'mute'; return 'volume'; } // 倍速控制 setPlaybackSpeed(speed) { this.playbackSpeed = speed; this.audioPlayer.nativeElement.playbackRate = speed; this.showSpeedControl = false; this.cdr.markForCheck(); } formatTime(seconds) { if (!seconds) return '00:00'; const minutes = Math.floor(seconds / 60); const secs = Math.floor(seconds % 60); return [minutes, secs] .map(val => val.toString().padStart(2, '0')) .join(':'); } ngOnDestroy() { if (this.audioPlayer?.nativeElement) { const audio = this.audioPlayer.nativeElement; audio.removeEventListener('play', this.playHandler); audio.removeEventListener('pause', this.pauseHandler); audio.removeEventListener('ended', this.endedHandler); } this.stopDragging(); } async handleFileContent(content) { } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AudioPreviewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AudioPreviewComponent, isStandalone: true, selector: "ngx-audio-preview", viewQueries: [{ propertyName: "audioPlayer", first: true, predicate: ["audioPlayer"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` <div class="audio-container"> <audio #audioPlayer [src]="file.url" (loadeddata)="onAudioLoad()" (timeupdate)="onTimeUpdate()"> </audio> <div class="audio-player"> <!-- 封面图 --> <div class="cover"> <ng-container *ngIf="coverUrl; else defaultCover"> <img [src]="coverUrl" alt="album cover"> </ng-container> <ng-template #defaultCover> <preview-icon [themeMode]="themeMode" name="music" [size]="48"></preview-icon> </ng-template> </div> <!-- 控制区域 --> <div class="controls"> <!-- 文件信息 --> <div class="info"> <span class="filename">{{ file.name }}</span> </div> <!-- 播放控制 --> <div class="player-controls"> <div class="main-controls"> <button class="control-btn" (click)="togglePlay()"> <preview-icon [themeMode]="themeMode" [name]="isPlaying ? 'pause' : 'play'" [title]="(isPlaying ? 'preview.toolbar.pause' : 'preview.toolbar.play')|i18n" [size]="24"></preview-icon> </button> </div> <div class="progress-area"> <span class="time current">{{ formatTime(currentTime) }}</span> <div class="progress-bar" (mousedown)="startDragging($event)"> <div class="progress-bg"></div> <div class="progress" [style.width.%]="progress"> <div class="progress-handle"></div> </div> </div> <span class="time duration">{{ formatTime(duration) }}</span> </div> </div> <!-- 辅助控制 --> <div class="extra-controls"> <!-- 倍速控制 --> <div class="speed-control" (mouseenter)="showSpeedControl = true" (mouseleave)="showSpeedControl = false"> <button class="text-btn"> {{ playbackSpeed }}x </button> <div class="speed-options" *ngIf="showSpeedControl"> <button *ngFor="let speed of playbackSpeeds" (click)="setPlaybackSpeed(speed)" [class.active]="playbackSpeed === speed"> {{ speed }}x </button> </div> </div> <!-- 音量控制 --> <div class="volume-control" (mouseenter)="showVolumeControl = true" (mouseleave)="showVolumeControl = false"> <button class="control-btn" (click)="cycleVolume()"> <preview-icon [themeMode]="themeMode" [name]="getVolumeIcon()"></preview-icon> </button> <div class="slider-container" *ngIf="showVolumeControl"> <input type="range" min="0" max="100" [value]="volume * 100" (input)="adjustVolume($event)"> </div> </div> </div> </div> </div> </div> `, isInline: true, styles: [":root{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #d32029;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(0, 0, 0, .85);--nfp-text-secondary: rgba(0, 0, 0, .65);--nfp-text-disabled: rgba(0, 0, 0, .25);--nfp-bg-container: #ffffff;--nfp-bg-elevated: #fafafa;--nfp-bg-layout: #f0f2f5;--nfp-hover-bg: rgba(0, 0, 0, .04);--nfp-border-color: #d9d9d9;--nfp-split-color: rgba(0, 0, 0, .06);--nfp-scrollbar-bg: #ffffff;--nfp-scrollbar-thumb: #d9d9d9;--nfp-toolbar-bg: #fafafa;--nfp-toolbar-border: #d9d9d9;--nfp-toolbar-hover: rgba(0, 0, 0, .04);--nfp-toolbar-active: #e6f4ff;--nfp-preview-mask: rgba(0, 0, 0, .3);--nfp-preview-loading-bg: rgba(255, 255, 255, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .1);--nfp-theme-transition-duration: .3s}[data-nfp-theme=dark]{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #a61d24;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(255, 255, 255, .85);--nfp-text-secondary: rgba(255, 255, 255, .65);--nfp-text-disabled: rgba(255, 255, 255, .25);--nfp-bg-container: #1a1a1a;--nfp-bg-elevated: #262626;--nfp-bg-layout: #141414;--nfp-hover-bg: rgba(255, 255, 255, .08);--nfp-border-color: #303030;--nfp-split-color: rgba(255, 255, 255, .12);--nfp-scrollbar-bg: #1a1a1a;--nfp-scrollbar-thumb: #404040;--nfp-toolbar-bg: #262626;--nfp-toolbar-border: #303030;--nfp-toolbar-hover: rgba(255, 255, 255, .08);--nfp-toolbar-active: #111b26;--nfp-preview-mask: rgba(0, 0, 0, .65);--nfp-preview-loading-bg: rgba(0, 0, 0, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .4);--nfp-theme-transition-duration: .3s}*{transition:background-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),border-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),color var(--nfp-theme-transition-duration) var(--theme-transition-timing)}.no-transition,.no-transition *{transition:none!important}\n", ".audio-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--nfp-text-primary)}.audio-player{width:100%;max-width:800px;background:var(--nfp-bg-container);border-radius:12px;padding:32px;box-shadow:0 4px 24px var(--nfp-preview-mask);display:flex;gap:32px}.audio-player .cover{width:240px;height:240px;flex-shrink:0;border-radius:8px;overflow:hidden;background:var(--nfp-bg-elevated);display:flex;align-items:center;justify-content:center;color:var(--nfp-text-secondary);box-shadow:0 2px 8px var(--nfp-preview-mask)}.audio-player .cover img{width:100%;height:100%;object-fit:cover}.audio-player .controls{flex:1;min-width:0;display:flex;flex-direction:column;gap:24px}.audio-player .controls .info .filename{font-size:24px;font-weight:500;color:var(--nfp-text-primary);margin-bottom:8px;word-break:break-word}.audio-player .controls .player-controls{display:flex;flex-direction:column;gap:16px}.audio-player .controls .player-controls .main-controls{display:flex;align-items:center;gap:16px}.audio-player .controls .player-controls .progress-area{display:flex;align-items:center;gap:8px;width:300px}.audio-player .controls .player-controls .progress-area .time{color:var(--nfp-text-secondary);font-size:13px;font-family:monospace;min-width:64px;text-align:center}.audio-player .controls .player-controls .progress-area .progress-bar{flex:1;height:4px;background:var(--nfp-toolbar-bg);border-radius:2px;cursor:pointer;position:relative}.audio-player .controls .player-controls .progress-area .progress-bar .progress-bg{position:absolute;inset:0;background:var(--nfp-toolbar-hover);border-radius:inherit;opacity:.3}.audio-player .controls .player-controls .progress-area .progress-bar .progress{position:absolute;height:100%;background:var(--nfp-primary-color);border-radius:inherit}.audio-player .controls .player-controls .progress-area .progress-bar .progress .progress-handle{position:absolute;right:-6px;top:50%;width:12px;height:12px;background:var(--nfp-primary-color);border:2px solid var(--nfp-bg-container);border-radius:50%;transform:translate(50%,-50%) scale(0);transition:transform .2s;box-shadow:0 2px 4px var(--nfp-preview-mask)}.audio-player .controls .player-controls .progress-area .progress-bar:hover .progress .progress-handle{transform:translate(50%,-50%) scale(1)}.audio-player .controls .extra-controls{display:flex;align-items:center;gap:16px;margin-top:auto}.control-btn{background:transparent;border:none;color:var(--nfp-text-primary);width:40px;height:40px;padding:0;cursor:pointer;border-radius:20px;display:flex;align-items:center;justify-content:center;transition:all .2s}.control-btn:hover{background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}.control-btn:disabled{color:var(--nfp-text-disabled);cursor:not-allowed}.text-btn{background:transparent;border:none;color:var(--nfp-text-primary);padding:4px 12px;font-size:13px;cursor:pointer;border-radius:4px;transition:all .2s}.text-btn:hover{background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}.speed-control,.volume-control{position:relative}.speed-control .speed-options,.speed-control .slider-container,.volume-control .speed-options,.volume-control .slider-container{position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:var(--nfp-bg-container);border-radius:4px;box-shadow:0 2px 8px #0000004d;margin-bottom:0;opacity:0;pointer-events:none;transition:opacity .3s}.speed-control .speed-options:before,.speed-control .slider-container:before,.volume-control .speed-options:before,.volume-control .slider-container:before{content:\"\";position:absolute;bottom:-12px;left:0;right:0;height:12px;background:transparent}.speed-control .speed-options:after,.speed-control .slider-container:after,.volume-control .speed-options:after,.volume-control .slider-container:after{content:\"\";position:absolute;bottom:-4px;left:50%;transform:translate(-50%) rotate(45deg);width:8px;height:8px;background:var(--nfp-bg-container);box-shadow:3px 3px 7px #00000026}.speed-control:hover .speed-options,.speed-control:hover .slider-container,.volume-control:hover .speed-options,.volume-control:hover .slider-container{opacity:1;pointer-events:auto}.speed-options{padding:4px 0;min-width:100px;display:flex;flex-direction:column-reverse}.speed-options:before{content:\"\";position:absolute;bottom:-12px;left:0;right:0;height:12px;background:transparent}.speed-options button{width:100%;padding:8px 12px;text-align:left;background:transparent;border:none;cursor:pointer;color:var(--nfp-text-primary);transition:all .3s;position:relative;z-index:1}.speed-options button:hover{background:var(--nfp-hover-bg);color:var(--nfp-primary-active)}.speed-options button.active{color:var(--nfp-primary-active);background:var(--nfp-hover-bg)}.slider-container{padding:8px;height:100px;display:flex;flex-direction:column;align-items:center}.slider-container:before{content:\"\";position:absolute;bottom:-12px;left:-8px;right:-8px;height:12px;background:transparent}.slider-container input[type=range]{writing-mode:bt-lr;-webkit-appearance:slider-vertical;width:4px;height:100px;background:#404040;border-radius:2px;outline:none;position:relative;z-index:1;margin:0 8px}.slider-container input[type=range]:before{content:\"\";position:absolute;inset:0 -8px;background:transparent}.slider-container input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:12px;background:#177ddc;border:2px solid #ffffff;border-radius:50%;cursor:pointer;transition:transform .2s;position:relative;z-index:2}.slider-container input[type=range]::-webkit-slider-thumb:hover{transform:scale(1.2)}.slider-container input[type=range]::-moz-range-thumb{width:12px;height:12px;background:#177ddc;border:2px solid #ffffff;border-radius:50%;cursor:pointer;transition:transform .2s;position:relative;z-index:2}.slider-container input[type=range]::-moz-range-thumb:hover{transform:scale(1.2)}@media (max-width: 768px){.audio-container{padding:16px}.audio-player{flex-direction:column;align-items:center;padding:24px;gap:24px}.audio-player .cover{width:200px;height:200px}.audio-player .controls{width:100%;text-align:center}.audio-player .controls .info .filename{font-size:20px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PreviewIconComponent, selector: "preview-icon", inputs: ["name", "svg", "size", "color", "themeMode", "title", "cursor"] }, { kind: "pipe", type: I18nPipe, name: "i18n" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AudioPreviewComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-audio-preview', standalone: true, imports: [CommonModule, PreviewIconComponent, I18nPipe], template: ` <div class="audio-container"> <audio #audioPlayer [src]="file.url" (loadeddata)="onAudioLoad()" (timeupdate)="onTimeUpdate()"> </audio> <div class="audio-player"> <!-- 封面图 --> <div class="cover"> <ng-container *ngIf="coverUrl; else defaultCover"> <img [src]="coverUrl" alt="album cover"> </ng-container> <ng-template #defaultCover> <preview-icon [themeMode]="themeMode" name="music" [size]="48"></preview-icon> </ng-template> </div> <!-- 控制区域 --> <div class="controls"> <!-- 文件信息 --> <div class="info"> <span class="filename">{{ file.name }}</span> </div> <!-- 播放控制 --> <div class="player-controls"> <div class="main-controls"> <button class="control-btn" (click)="togglePlay()"> <preview-icon [themeMode]="themeMode" [name]="isPlaying ? 'pause' : 'play'" [title]="(isPlaying ? 'preview.toolbar.pause' : 'preview.toolbar.play')|i18n" [size]="24"></preview-icon> </button> </div> <div class="progress-area"> <span class="time current">{{ formatTime(currentTime) }}</span> <div class="progress-bar" (mousedown)="startDragging($event)"> <div class="progress-bg"></div> <div class="progress" [style.width.%]="progress"> <div class="progress-handle"></div> </div> </div> <span class="time duration">{{ formatTime(duration) }}</span> </div> </div> <!-- 辅助控制 --> <div class="extra-controls"> <!-- 倍速控制 --> <div class="speed-control" (mouseenter)="showSpeedControl = true" (mouseleave)="showSpeedControl = false"> <button class="text-btn"> {{ playbackSpeed }}x </button> <div class="speed-options" *ngIf="showSpeedControl"> <button *ngFor="let speed of playbackSpeeds" (click)="setPlaybackSpeed(speed)" [class.active]="playbackSpeed === speed"> {{ speed }}x </button> </div> </div> <!-- 音量控制 --> <div class="volume-control" (mouseenter)="showVolumeControl = true" (mouseleave)="showVolumeControl = false"> <button class="control-btn" (click)="cycleVolume()"> <preview-icon [themeMode]="themeMode" [name]="getVolumeIcon()"></preview-icon> </button> <div class="slider-container" *ngIf="showVolumeControl"> <input type="range" min="0" max="100" [value]="volume * 100" (input)="adjustVolume($event)"> </div> </div> </div> </div> </div> </div> `, styles: [":root{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #d32029;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(0, 0, 0, .85);--nfp-text-secondary: rgba(0, 0, 0, .65);--nfp-text-disabled: rgba(0, 0, 0, .25);--nfp-bg-container: #ffffff;--nfp-bg-elevated: #fafafa;--nfp-bg-layout: #f0f2f5;--nfp-hover-bg: rgba(0, 0, 0, .04);--nfp-border-color: #d9d9d9;--nfp-split-color: rgba(0, 0, 0, .06);--nfp-scrollbar-bg: #ffffff;--nfp-scrollbar-thumb: #d9d9d9;--nfp-toolbar-bg: #fafafa;--nfp-toolbar-border: #d9d9d9;--nfp-toolbar-hover: rgba(0, 0, 0, .04);--nfp-toolbar-active: #e6f4ff;--nfp-preview-mask: rgba(0, 0, 0, .3);--nfp-preview-loading-bg: rgba(255, 255, 255, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .1);--nfp-theme-transition-duration: .3s}[data-nfp-theme=dark]{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #a61d24;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(255, 255, 255, .85);--nfp-text-secondary: rgba(255, 255, 255, .65);--nfp-text-disabled: rgba(255, 255, 255, .25);--nfp-bg-container: #1a1a1a;--nfp-bg-elevated: #262626;--nfp-bg-layout: #141414;--nfp-hover-bg: rgba(255, 255, 255, .08);--nfp-border-color: #303030;--nfp-split-color: rgba(255, 255, 255, .12);--nfp-scrollbar-bg: #1a1a1a;--nfp-scrollbar-thumb: #404040;--nfp-toolbar-bg: #262626;--nfp-toolbar-border: #303030;--nfp-toolbar-hover: rgba(255, 255, 255, .08);--nfp-toolbar-active: #111b26;--nfp-preview-mask: rgba(0, 0, 0, .65);--nfp-preview-loading-bg: rgba(0, 0, 0, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .4);--nfp-theme-transition-duration: .3s}*{transition:background-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),border-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),color var(--nfp-theme-transition-duration) var(--theme-transition-timing)}.no-transition,.no-transition *{transition:none!important}\n", ".audio-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--nfp-text-primary)}.audio-player{width:100%;max-width:800px;background:var(--nfp-bg-container);border-radius:12px;padding:32px;box-shadow:0 4px 24px var(--nfp-preview-mask);display:flex;gap:32px}.audio-player .cover{width:240px;height:240px;flex-shrink:0;border-radius:8px;overflow:hidden;background:var(--nfp-bg-elevated);display:flex;align-items:center;justify-content:center;color:var(--nfp-text-secondary);box-shadow:0 2px 8px var(--nfp-preview-mask)}.audio-player .cover img{width:100%;height:100%;object-fit:cover}.audio-player .controls{flex:1;min-width:0;display:flex;flex-direction:column;gap:24px}.audio-player .controls .info .filename{font-size:24px;font-weight:500;color:var(--nfp-text-primary);margin-bottom:8px;word-break:break-word}.audio-player .controls .player-controls{display:flex;flex-direction:column;gap:16px}.audio-player .controls .player-controls .main-controls{display:flex;align-items:center;gap:16px}.audio-player .controls .player-controls .progress-area{display:flex;align-items:center;gap:8px;width:300px}.audio-player .controls .player-controls .progress-area .time{color:var(--nfp-text-secondary);font-size:13px;font-family:monospace;min-width:64px;text-align:center}.audio-player .controls .player-controls .progress-area .progress-bar{flex:1;height:4px;background:var(--nfp-toolbar-bg);border-radius:2px;cursor:pointer;position:relative}.audio-player .controls .player-controls .progress-area .progress-bar .progress-bg{position:absolute;inset:0;background:var(--nfp-toolbar-hover);border-radius:inherit;opacity:.3}.audio-player .controls .player-controls .progress-area .progress-bar .progress{position:absolute;height:100%;background:var(--nfp-primary-color);border-radius:inherit}.audio-player .controls .player-controls .progress-area .progress-bar .progress .progress-handle{position:absolute;right:-6px;top:50%;width:12px;height:12px;background:var(--nfp-primary-color);border:2px solid var(--nfp-bg-container);border-radius:50%;transform:translate(50%,-50%) scale(0);transition:transform .2s;box-shadow:0 2px 4px var(--nfp-preview-mask)}.audio-player .controls .player-controls .progress-area .progress-bar:hover .progress .progress-handle{transform:translate(50%,-50%) scale(1)}.audio-player .controls .extra-controls{display:flex;align-items:center;gap:16px;margin-top:auto}.control-btn{background:transparent;border:none;color:var(--nfp-text-primary);width:40px;height:40px;padding:0;cursor:pointer;border-radius:20px;display:flex;align-items:center;justify-content:center;transition:all .2s}.control-btn:hover{background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}.control-btn:disabled{color:var(--nfp-text-disabled);cursor:not-allowed}.text-btn{background:transparent;border:none;color:var(--nfp-text-primary);padding:4px 12px;font-size:13px;cursor:pointer;border-radius:4px;transition:all .2s}.text-btn:hover{background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}.speed-control,.volume-control{position:relative}.speed-control .speed-options,.speed-control .slider-container,.volume-control .speed-options,.volume-control .slider-container{position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:var(--nfp-bg-container);border-radius:4px;box-shadow:0 2px 8px #0000004d;margin-bottom:0;opacity:0;pointer-events:none;transition:opacity .3s}.speed-control .speed-options:before,.speed-control .slider-container:before,.volume-control .speed-options:before,.volume-control .slider-container:before{content:\"\";position:absolute;bottom:-12px;left:0;right:0;height:12px;background:transparent}.speed-control .speed-options:after,.speed-control .slider-container:after,.volume-control .speed-options:after,.volume-control .slider-container:after{content:\"\";position:absolute;bottom:-4px;left:50%;transform:translate(-50%) rotate(45deg);width:8px;height:8px;background:var(--nfp-bg-container);box-shadow:3px 3px 7px #00000026}.speed-control:hover .speed-options,.speed-control:hover .slider-container,.volume-control:hover .speed-options,.volume-control:hover .slider-container{opacity:1;pointer-events:auto}.speed-options{padding:4px 0;min-width:100px;display:flex;flex-direction:column-reverse}.speed-options:before{content:\"\";position:absolute;bottom:-12px;left:0;right:0;height:12px;background:transparent}.speed-options button{width:100%;padding:8px 12px;text-align:left;background:transparent;border:none;cursor:pointer;color:var(--nfp-text-primary);transition:all .3s;position:relative;z-index:1}.speed-options button:hover{background:var(--nfp-hover-bg);color:var(--nfp-primary-active)}.speed-options button.active{color:var(--nfp-primary-active);background:var(--nfp-hover-bg)}.slider-container{padding:8px;height:100px;display:flex;flex-direction:column;align-items:center}.slider-container:before{content:\"\";position:absolute;bottom:-12px;left:-8px;right:-8px;height:12px;background:transparent}.slider-container input[type=range]{writing-mode:bt-lr;-webkit-appearance:slider-vertical;width:4px;height:100px;background:#404040;border-radius:2px;outline:none;position:relative;z-index:1;margin:0 8px}.slider-container input[type=range]:before{content:\"\";position:absolute;inset:0 -8px;background:transparent}.slider-container input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:12px;background:#177ddc;border:2px solid #ffffff;border-radius:50%;cursor:pointer;transition:transform .2s;position:relative;z-index:2}.slider-container input[type=range]::-webkit-slider-thumb:hover{transform:scale(1.2)}.slider-container input[type=range]::-moz-range-thumb{width:12px;height:12px;background:#177ddc;border:2px solid #ffffff;border-radius:50%;cursor:pointer;transition:transform .2s;position:relative;z-index:2}.slider-container input[type=range]::-moz-range-thumb:hover{transform:scale(1.2)}@media (max-width: 768px){.audio-container{padding:16px}.audio-player{flex-direction:column;align-items:center;padding:24px;gap:24px}.audio-player .cover{width:200px;height:200px}.audio-player .controls{width:100%;text-align:center}.audio-player .controls .info .filename{font-size:20px}}\n"] }] }], propDecorators: { audioPlayer: [{ type: ViewChild, args: ['audioPlayer'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW8tcHJldmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1maWxlLXByZXZpZXcvc3JjL2xpYi9wcmV2aWV3LXR5cGVzL2F1ZGlvLXByZXZpZXcvYXVkaW8tcHJldmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixTQUFTLEVBQWlDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sd0NBQXdDLENBQUM7QUFHNUUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQzs7O0FBNEZwQyxNQUFNLE9BQU8scUJBQXNCLFNBQVEsb0JBQW9CO0lBMUYvRDs7UUE0RkUsYUFBUSxHQUFtQixJQUFJLENBQUM7UUFFaEMsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCxtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsbUJBQWMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFdkMsZ0JBQVcsR0FBRyxHQUFHLEVBQUU7WUFDekIsSUFBSSxDQUFDLFNB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QyxPQUEyQjtJQUN0RSxDQUFDOytHQWxNVSxxQkFBcUI7bUdBQXJCLHFCQUFxQixnTkF0RnRCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1GVCxvb1FBcEZTLFlBQVksZ1FBQUUsb0JBQW9CLDhIQUFFLFFBQVE7OzRGQXVGM0MscUJBQXFCO2tCQTFGakMsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxZQUM3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtRlQ7OEJBSXlCLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtCYXNlUHJldmlld0NvbXBvbmVudH0gZnJvbSAnLi4vYmFzZS1wcmV2aWV3L2Jhc2UtcHJldmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHtTYWZlVXJsfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7RmlsZVJlYWRlclJlc3BvbnNlfSBmcm9tIFwiLi4vLi4vc2VydmljZXNcIjtcbmltcG9ydCB7UHJldmlld0ljb25Db21wb25lbnR9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtJMThuUGlwZX0gZnJvbSBcIi4uLy4uL2kxOG5cIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWF1ZGlvLXByZXZpZXcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBQcmV2aWV3SWNvbkNvbXBvbmVudCwgSTE4blBpcGVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJhdWRpby1jb250YWluZXJcIj5cbiAgICAgIDxhdWRpbyAjYXVkaW9QbGF5ZXJcbiAgICAgICAgICAgICBbc3JjXT1cImZpbGUudXJsXCJcbiAgICAgICAgICAgICAobG9hZGVkZGF0YSk9XCJvbkF1ZGlvTG9hZCgpXCJcbiAgICAgICAgICAgICAodGltZXVwZGF0ZSk9XCJvblRpbWVVcGRhdGUoKVwiPlxuICAgICAgPC9hdWRpbz5cblxuICAgICAgPGRpdiBjbGFzcz1cImF1ZGlvLXBsYXllclwiPlxuICAgICAgICA8IS0tIOWwgemdouWbviAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvdmVyXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvdmVyVXJsOyBlbHNlIGRlZmF1bHRDb3ZlclwiPlxuICAgICAgICAgICAgPGltZyBbc3JjXT1cImNvdmVyVXJsXCIgYWx0PVwiYWxidW0gY292ZXJcIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDb3Zlcj5cbiAgICAgICAgICAgIDxwcmV2aWV3LWljb24gW3RoZW1lTW9kZV09XCJ0aGVtZU1vZGVcIiBuYW1lPVwibXVzaWNcIiBbc2l6ZV09XCI0OFwiPjwvcHJldmlldy1pY29uPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0g5o6n5Yi25Yy65Z+fIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbHNcIj5cbiAgICAgICAgICA8IS0tIOaWh+S7tuS/oeaBryAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mb1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlbmFtZVwiPnt7IGZpbGUubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0g5pKt5pS+5o6n5Yi2IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwbGF5ZXItY29udHJvbHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYWluLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250cm9sLWJ0blwiIChjbGljayk9XCJ0b2dnbGVQbGF5KClcIj5cbiAgICAgICAgICAgICAgICA8cHJldmlldy1pY29uIFt0aGVtZU1vZGVdPVwidGhlbWVNb2RlXCIgW25hbWVdPVwiaXNQbGF5aW5nID8gJ3BhdXNlJyA6ICdwbGF5J1wiIFt0aXRsZV09XCIoaXNQbGF5aW5nID8gJ3ByZXZpZXcudG9vbGJhci5wYXVzZScgOiAncHJldmlldy50b29sYmFyLnBsYXknKXxpMThuXCIgW3NpemVdPVwiMjRcIj48L3ByZXZpZXctaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWFyZWFcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lIGN1cnJlbnRcIj57eyBmb3JtYXRUaW1lKGN1cnJlbnRUaW1lKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIChtb3VzZWRvd24pPVwic3RhcnREcmFnZ2luZygkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJnXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCIgW3N0eWxlLndpZHRoLiVdPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1oYW5kbGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGltZSBkdXJhdGlvblwiPnt7IGZvcm1hdFRpbWUoZHVyYXRpb24pIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIOi+heWKqeaOp+WItiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXh0cmEtY29udHJvbHNcIj5cbiAgICAgICAgICAgIDwhLS0g5YCN6YCf5o6n5Yi2IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwZWVkLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzaG93U3BlZWRDb250cm9sID0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cInNob3dTcGVlZENvbnRyb2wgPSBmYWxzZVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGV4dC1idG5cIj5cbiAgICAgICAgICAgICAgICB7eyBwbGF5YmFja1NwZWVkIH19eFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwZWVkLW9wdGlvbnNcIiAqbmdJZj1cInNob3dTcGVlZENvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBzcGVlZCBvZiBwbGF5YmFja1NwZWVkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0UGxheWJhY2tTcGVlZChzcGVlZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJwbGF5YmFja1NwZWVkID09PSBzcGVlZFwiPlxuICAgICAgICAgICAgICAgICAge3sgc3BlZWQgfX14XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0g6Z+z6YeP5o6n5Yi2IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvbHVtZS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwic2hvd1ZvbHVtZUNvbnRyb2wgPSB0cnVlXCJcbiAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwic2hvd1ZvbHVtZUNvbnRyb2wgPSBmYWxzZVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udHJvbC1idG5cIiAoY2xpY2spPVwiY3ljbGVWb2x1bWUoKVwiPlxuICAgICAgICAgICAgICAgIDxwcmV2aWV3LWljb24gW3RoZW1lTW9kZV09XCJ0aGVtZU1vZGVcIiBbbmFtZV09XCJnZXRWb2x1bWVJY29uKClcIj48L3ByZXZpZXctaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItY29udGFpbmVyXCIgKm5nSWY9XCJzaG93Vm9sdW1lQ29udHJvbFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZvbHVtZSAqIDEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJhZGp1c3RWb2x1bWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi4vLi4vc3R5bGVzL190aGVtZS5zY3NzJywgJy4vYXVkaW8tcHJldmlldy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBBdWRpb1ByZXZpZXdDb21wb25lbnQgZXh0ZW5kcyBCYXNlUHJldmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnYXVkaW9QbGF5ZXInKSBhdWRpb1BsYXllciE6IEVsZW1lbnRSZWY8SFRNTEF1ZGlvRWxlbWVudD47XG4gIGNvdmVyVXJsOiBTYWZlVXJsIHwgbnVsbCA9IG51bGw7XG5cbiAgaXNQbGF5aW5nID0gZmFsc2U7XG4gIGN1cnJlbnRUaW1lID0gMDtcbiAgZHVyYXRpb24gPSAwO1xuICBwcm9ncmVzcyA9IDA7XG4gIHZvbHVtZSA9IDE7XG4gIHByZXZpb3VzVm9sdW1lID0gMTtcbiAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICBzaG93Vm9sdW1lQ29udHJvbCA9IGZhbHNlO1xuICBzaG93U3BlZWRDb250cm9sID0gZmFsc2U7XG4gIHBsYXliYWNrU3BlZWQgPSAxO1xuICBwbGF5YmFja1NwZWVkcyA9IFswLjc1LCAxLCAxLjUsIDIuMCwgMy4wLCA1LjBdO1xuXG4gIHByaXZhdGUgcGxheUhhbmRsZXIgPSAoKSA9PiB7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9O1xuXG4gIHByaXZhdGUgcGF1c2VIYW5kbGVyID0gKCkgPT4ge1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBlbmRlZEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnN0YXJ0TG9hZGluZygpXG4gICAgdGhpcy5sb2FkQ292ZXIoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZENvdmVyKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyDlpoLmnpzmlofku7blr7nosaHkuK3lt7Lnu4/mnInlsIHpnaJVUkzvvIznm7TmjqXkvb/nlKhcbiAgICAgIGlmICh0aGlzLmZpbGUuY292ZXJVcmwpIHtcbiAgICAgICAgdGhpcy5jb3ZlclVybCA9IHRoaXMuZmlsZS5jb3ZlclVybDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8g5aaC5p6c5rKh5pyJ5bCB6Z2i77yM5L2/55So6buY6K6k5Zu+5qCHXG4gICAgICB0aGlzLmNvdmVyVXJsID0gbnVsbDtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCfliqDovb3lsIHpnaLlpLHotKU6JywgZXJyb3IpO1xuICAgICAgdGhpcy5jb3ZlclVybCA9IG51bGw7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8g5Zyo6KeG5Zu+5Yid5aeL5YyW5ZCO6K6+572u5LqL5Lu255uR5ZCsXG4gICAgY29uc3QgYXVkaW8gPSB0aGlzLmF1ZGlvUGxheWVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheScsIHRoaXMucGxheUhhbmRsZXIpO1xuICAgIGF1ZGlvLmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgdGhpcy5wYXVzZUhhbmRsZXIpO1xuICAgIGF1ZGlvLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgdGhpcy5lbmRlZEhhbmRsZXIpO1xuICB9XG5cbiAgb25BdWRpb0xvYWQoKSB7XG4gICAgdGhpcy5zdG9wTG9hZGluZygpXG4gICAgdGhpcy5kdXJhdGlvbiA9IHRoaXMuYXVkaW9QbGF5ZXIubmF0aXZlRWxlbWVudC5kdXJhdGlvbjtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uVGltZVVwZGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgY29uc3QgYXVkaW8gPSB0aGlzLmF1ZGlvUGxheWVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICB0aGlzLmN1cnJlbnRUaW1lID0gYXVkaW8uY3VycmVudFRpbWU7XG4gICAgICB0aGlzLnByb2dyZXNzID0gKGF1ZGlvLmN1cnJlbnRUaW1lIC8gYXVkaW8uZHVyYXRpb24pICogMTAwO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdG9nZ2xlUGxheSgpIHtcbiAgICBjb25zdCBhdWRpbyA9IHRoaXMuYXVkaW9QbGF5ZXIubmF0aXZlRWxlbWVudDtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKSB7XG4gICAgICAgIGF3YWl0IGF1ZGlvLnBhdXNlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlnKjmkq3mlL7liY3ph43nva7pn7PpopHml7bpl7TvvIjlpoLmnpzlt7Lnu4/nu5PmnZ/vvIlcbiAgICAgICAgaWYgKGF1ZGlvLmVuZGVkKSB7XG4gICAgICAgICAgYXVkaW8uY3VycmVudFRpbWUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGF1ZGlvLnBsYXkoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcign5pKt5pS+5o6n5Yi26ZSZ6K+vOicsIGVycm9yKTtcbiAgICB9XG4gICAgLy8g54q25oCB5Lya6YCa6L+H5LqL5Lu255uR5ZCs5Zmo6Ieq5Yqo5pu05pawXG4gIH1cblxuICAvLyDov5vluqbmnaHmjqfliLZcbiAgc3RhcnREcmFnZ2luZyhldmVudDogTW91c2VFdmVudCkge1xuICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgdGhpcy5zZWVrKGV2ZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uR2xvYmFsRHJhZyk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuc3RvcERyYWdnaW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VlayhldmVudDogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IHByb2dyZXNzQmFyID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCByZWN0ID0gcHJvZ3Jlc3NCYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgcG9zID0gKGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aDtcbiAgICBpZiAocG9zID49IDAgJiYgcG9zIDw9IDEpIHtcbiAgICAgIGNvbnN0IGF1ZGlvID0gdGhpcy5hdWRpb1BsYXllci5uYXRpdmVFbGVtZW50O1xuICAgICAgYXVkaW8uY3VycmVudFRpbWUgPSBwb3MgKiBhdWRpby5kdXJhdGlvbjtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSBwb3MgKiAxMDA7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uR2xvYmFsRHJhZyA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIGNvbnN0IHByb2dyZXNzQmFyID0gdGhpcy5hdWRpb1BsYXllci5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoJy5wcm9ncmVzcy1iYXInKTtcbiAgICAgIGlmIChwcm9ncmVzc0Jhcikge1xuICAgICAgICBjb25zdCByZWN0ID0gcHJvZ3Jlc3NCYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHBvcyA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGgpKTtcbiAgICAgICAgY29uc3QgYXVkaW8gPSB0aGlzLmF1ZGlvUGxheWVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGF1ZGlvLmN1cnJlbnRUaW1lID0gcG9zICogYXVkaW8uZHVyYXRpb247XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBwb3MgKiAxMDA7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0b3BEc