@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
JavaScript
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