Copy disabled (too large)
Download .txt
Showing preview only (10,789K chars total). Download the full file to get everything.
Repository: alyssaxuu/screenity
Branch: master
Commit: aaba4088b293
Files: 376
Total size: 53.8 MB
Directory structure:
gitextract_mujineax/
├── .babelrc
├── .gitattributes
├── .github/
│ └── FUNDING.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── custom.config.js
├── package.json
├── patches/
│ ├── fabric+5.3.0.patch
│ ├── fabric+5.5.2.patch
│ └── plyr+3.7.8.patch
├── scripts/
│ └── patch-radix.js
├── src/
│ ├── _locales/
│ │ ├── ca/
│ │ │ └── messages.json
│ │ ├── de/
│ │ │ └── messages.json
│ │ ├── en/
│ │ │ └── messages.json
│ │ ├── es/
│ │ │ └── messages.json
│ │ ├── fr/
│ │ │ └── messages.json
│ │ ├── hi/
│ │ │ └── messages.json
│ │ ├── id/
│ │ │ └── messages.json
│ │ ├── it/
│ │ │ └── messages.json
│ │ ├── ko/
│ │ │ └── messages.json
│ │ ├── pl/
│ │ │ └── messages.json
│ │ ├── pt_BR/
│ │ │ └── messages.json
│ │ ├── pt_PT/
│ │ │ └── messages.json
│ │ ├── ru/
│ │ │ └── messages.json
│ │ ├── ta/
│ │ │ └── messages.json
│ │ ├── tr/
│ │ │ └── messages.json
│ │ ├── uk/
│ │ │ └── messages.json
│ │ ├── zh_CN/
│ │ │ └── messages.json
│ │ └── zh_TW/
│ │ └── messages.json
│ ├── assets/
│ │ ├── editor/
│ │ │ └── index.html
│ │ ├── fonts/
│ │ │ └── fonts.css
│ │ ├── mediapipeVision/
│ │ │ ├── selfie_segmenter.tflite
│ │ │ ├── vision_wasm_internal.js
│ │ │ ├── vision_wasm_internal.wasm
│ │ │ ├── vision_wasm_nosimd_internal.js
│ │ │ └── vision_wasm_nosimd_internal.wasm
│ │ ├── satoshi.css
│ │ └── vendor/
│ │ ├── ffmpeg-core.js
│ │ ├── ffmpeg-core.wasm
│ │ ├── ffmpeg-core.worker.js
│ │ └── gif.js/
│ │ └── gif.worker.js
│ ├── manifest.json
│ ├── media/
│ │ └── fastRecorderGate.ts
│ ├── messaging/
│ │ └── messageRouter.js
│ ├── pages/
│ │ ├── AudioOffscreen/
│ │ │ ├── index.html
│ │ │ └── index.js
│ │ ├── Background/
│ │ │ ├── alarms/
│ │ │ │ ├── addAlarmListener.js
│ │ │ │ └── handleAlarm.js
│ │ │ ├── auth/
│ │ │ │ └── loginWithWebsite.js
│ │ │ ├── backup/
│ │ │ │ └── initBackup.js
│ │ │ ├── drive/
│ │ │ │ ├── handleSaveToDrive.js
│ │ │ │ └── handleSignOutDrive.js
│ │ │ ├── index.js
│ │ │ ├── listeners/
│ │ │ │ ├── index.js
│ │ │ │ ├── onActionButtonClickedListener.js
│ │ │ │ ├── onCommandListener.js
│ │ │ │ ├── onInstalledListener.js
│ │ │ │ ├── onMessageExternalListener.js
│ │ │ │ ├── onStartupListener.js
│ │ │ │ ├── onTabActivatedListener.js
│ │ │ │ ├── onTabRemovedListener.js
│ │ │ │ ├── onTabUpdatedListener.js
│ │ │ │ └── onWindowFocusChangedListener.js
│ │ │ ├── messaging/
│ │ │ │ └── handlers.js
│ │ │ ├── modules/
│ │ │ │ └── signIn.js
│ │ │ ├── offscreen/
│ │ │ │ ├── closeOffscreenDocument.js
│ │ │ │ ├── discardOffscreenDocuments.js
│ │ │ │ └── offscreenDocument.js
│ │ │ ├── recording/
│ │ │ │ ├── cancelRecording.js
│ │ │ │ ├── checkRecording.js
│ │ │ │ ├── chunkHandler.js
│ │ │ │ ├── cloudLocalPlaybackConstants.js
│ │ │ │ ├── desktopCapture.js
│ │ │ │ ├── discardRecording.js
│ │ │ │ ├── forceProcessing.js
│ │ │ │ ├── getStreamingData.js
│ │ │ │ ├── recordingHelpers.js
│ │ │ │ ├── restartRecording.js
│ │ │ │ ├── restoreCloudRecording.js
│ │ │ │ ├── restoreRecording.js
│ │ │ │ ├── sendChunks.js
│ │ │ │ ├── sendMessageRecord.js
│ │ │ │ ├── startRecording.js
│ │ │ │ └── stopRecording.js
│ │ │ ├── tabManagement/
│ │ │ │ ├── createTab.js
│ │ │ │ ├── editorTab.js
│ │ │ │ ├── focusTab.js
│ │ │ │ ├── getCurrentTab.js
│ │ │ │ ├── index.js
│ │ │ │ ├── removeTab.js
│ │ │ │ ├── resetActiveTab.js
│ │ │ │ ├── sendMessageTab.js
│ │ │ │ ├── setSurface.js
│ │ │ │ └── tabHelpers.js
│ │ │ └── utils/
│ │ │ ├── base64ToUint8Array.js
│ │ │ ├── blobToBase64.js
│ │ │ ├── browserHelpers.js
│ │ │ ├── downloadHelpers.js
│ │ │ ├── executeScripts.js
│ │ │ ├── featureDetection.js
│ │ │ └── waitForContentScript.js
│ │ ├── Backup/
│ │ │ ├── Backup.jsx
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ └── messaging/
│ │ │ └── handlers.js
│ │ ├── Camera/
│ │ │ ├── Camera.jsx
│ │ │ ├── components/
│ │ │ │ └── Background.js
│ │ │ ├── context/
│ │ │ │ └── CameraContext.js
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── messaging/
│ │ │ │ └── handlers.js
│ │ │ └── utils/
│ │ │ ├── backgroundUtils.js
│ │ │ ├── cameraUtils.js
│ │ │ ├── canvasUtils.js
│ │ │ ├── effects.js
│ │ │ └── uiState.js
│ │ ├── CloudRecorder/
│ │ │ ├── CloudRecorder.jsx
│ │ │ ├── RecorderUI.jsx
│ │ │ ├── bunnyTusUploader.js
│ │ │ ├── createVideoProject.js
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── messaging.js
│ │ │ ├── recorderConfig.js
│ │ │ └── warning/
│ │ │ └── Warning.jsx
│ │ ├── Content/
│ │ │ ├── Content.jsx
│ │ │ ├── DevHUD.jsx
│ │ │ ├── Wrapper.jsx
│ │ │ ├── camera/
│ │ │ │ ├── Camera.jsx
│ │ │ │ ├── components/
│ │ │ │ │ └── ResizeHandle.jsx
│ │ │ │ ├── layout/
│ │ │ │ │ ├── CameraToolbar.jsx
│ │ │ │ │ └── CameraWrap.jsx
│ │ │ │ └── styles/
│ │ │ │ ├── _Camera.scss
│ │ │ │ ├── components/
│ │ │ │ │ └── _ResizeHandle.scss
│ │ │ │ └── layout/
│ │ │ │ ├── _CameraToolbar.scss
│ │ │ │ └── _CameraWrap.scss
│ │ │ ├── camera-only/
│ │ │ │ ├── CameraOnly.jsx
│ │ │ │ ├── layout/
│ │ │ │ │ └── CameraWrap.jsx
│ │ │ │ └── styles/
│ │ │ │ └── _CameraOnly.scss
│ │ │ ├── canvas/
│ │ │ │ ├── Canvas.jsx
│ │ │ │ ├── layout/
│ │ │ │ │ ├── CanvasWrap.jsx
│ │ │ │ │ └── TextToolbar.jsx
│ │ │ │ ├── modules/
│ │ │ │ │ ├── ArrowTool.jsx
│ │ │ │ │ ├── CustomControls.jsx
│ │ │ │ │ ├── EraserTool.jsx
│ │ │ │ │ ├── History.jsx
│ │ │ │ │ ├── ImageTool.jsx
│ │ │ │ │ ├── PenTool.jsx
│ │ │ │ │ ├── SelectTool.jsx
│ │ │ │ │ ├── ShapeTool.jsx
│ │ │ │ │ └── TextTool.jsx
│ │ │ │ └── styles/
│ │ │ │ ├── _Canvas.scss
│ │ │ │ └── layout/
│ │ │ │ └── _Canvas.scss
│ │ │ ├── context/
│ │ │ │ ├── ContentState.jsx
│ │ │ │ ├── messaging/
│ │ │ │ │ └── handlers.js
│ │ │ │ └── utils/
│ │ │ │ ├── checkAuthStatus.js
│ │ │ │ ├── checkRecording.js
│ │ │ │ └── updateFromStorage.js
│ │ │ ├── countdown/
│ │ │ │ ├── Countdown.jsx
│ │ │ │ └── styles/
│ │ │ │ └── _Countdown.scss
│ │ │ ├── cursor/
│ │ │ │ └── trackClicks.js
│ │ │ ├── images/
│ │ │ │ └── popup/
│ │ │ │ └── images.js
│ │ │ ├── index.css
│ │ │ ├── index.js
│ │ │ ├── index.jsx
│ │ │ ├── modal/
│ │ │ │ ├── Modal.jsx
│ │ │ │ └── styles/
│ │ │ │ └── _Modal.scss
│ │ │ ├── popup/
│ │ │ │ ├── PopupContainer.jsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── BackgroundEffects.jsx
│ │ │ │ │ ├── Dropdown.jsx
│ │ │ │ │ ├── RegionDimensions.jsx
│ │ │ │ │ ├── Switch.jsx
│ │ │ │ │ ├── TimeSetter.jsx
│ │ │ │ │ ├── TooltipWrap.jsx
│ │ │ │ │ └── VideoItem.jsx
│ │ │ │ ├── layout/
│ │ │ │ │ ├── Announcement.jsx
│ │ │ │ │ ├── InactiveSubscription.jsx
│ │ │ │ │ ├── LoggedOut.jsx
│ │ │ │ │ ├── RecordingTab.jsx
│ │ │ │ │ ├── RecordingType.jsx
│ │ │ │ │ ├── Settings.jsx
│ │ │ │ │ ├── SettingsMenu.jsx
│ │ │ │ │ ├── VideosTab.jsx
│ │ │ │ │ ├── Welcome.jsx
│ │ │ │ │ └── WelcomeAlternate.jsx
│ │ │ │ ├── onboarding/
│ │ │ │ │ ├── proOnboarding.js
│ │ │ │ │ └── storage.js
│ │ │ │ └── styles/
│ │ │ │ ├── _Popup.scss
│ │ │ │ ├── components/
│ │ │ │ │ ├── _BackgroundEffects.scss
│ │ │ │ │ ├── _Dropdown.scss
│ │ │ │ │ ├── _MainButton.scss
│ │ │ │ │ ├── _RegionDimensions.scss
│ │ │ │ │ ├── _Switch.scss
│ │ │ │ │ ├── _Tabs.scss
│ │ │ │ │ ├── _TimeSetter.scss
│ │ │ │ │ ├── _Tooltip.scss
│ │ │ │ │ └── _VideoItem.scss
│ │ │ │ └── layout/
│ │ │ │ ├── _Announcement.scss
│ │ │ │ ├── _PopupContainer.scss
│ │ │ │ ├── _Settings.scss
│ │ │ │ ├── _SettingsMenu.scss
│ │ │ │ ├── _VideosTab.scss
│ │ │ │ └── _Welcome.scss
│ │ │ ├── region/
│ │ │ │ ├── Region.jsx
│ │ │ │ ├── components/
│ │ │ │ │ └── RegionHandles.jsx
│ │ │ │ ├── layout/
│ │ │ │ │ ├── CameraToolbar.jsx
│ │ │ │ │ └── CameraWrap.jsx
│ │ │ │ └── styles/
│ │ │ │ ├── _Region.scss
│ │ │ │ └── layout/
│ │ │ │ ├── _CameraToolbar.scss
│ │ │ │ └── _CameraWrap.scss
│ │ │ ├── shortcuts/
│ │ │ │ └── Shortcuts.jsx
│ │ │ ├── styles/
│ │ │ │ ├── _variables.scss
│ │ │ │ ├── app.css
│ │ │ │ ├── app.scss
│ │ │ │ └── dist/
│ │ │ │ └── app.css
│ │ │ ├── toolbar/
│ │ │ │ ├── Toolbar.jsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── ColorWheel.jsx
│ │ │ │ │ ├── MicToggle.jsx
│ │ │ │ │ ├── RadialMenu.jsx
│ │ │ │ │ ├── SVG.jsx
│ │ │ │ │ ├── StrokeWeight.jsx
│ │ │ │ │ ├── Toast.jsx
│ │ │ │ │ ├── ToolTrigger.jsx
│ │ │ │ │ └── TooltipWrap.jsx
│ │ │ │ ├── layout/
│ │ │ │ │ ├── BlurToolbar.jsx
│ │ │ │ │ ├── CursorToolbar.jsx
│ │ │ │ │ ├── DrawingToolbar.jsx
│ │ │ │ │ ├── ShapeToolbar.jsx
│ │ │ │ │ └── ToolbarWrap.jsx
│ │ │ │ └── styles/
│ │ │ │ ├── _Page.scss
│ │ │ │ ├── components/
│ │ │ │ │ ├── _ColorWheel.scss
│ │ │ │ │ ├── _RadialMenu.scss
│ │ │ │ │ ├── _StrokeWidth.scss
│ │ │ │ │ ├── _Toast.scss
│ │ │ │ │ └── _Tooltip.scss
│ │ │ │ └── layout/
│ │ │ │ ├── _DrawingToolbar.scss
│ │ │ │ ├── _ShapeToolbar.scss
│ │ │ │ └── _Toolbar.scss
│ │ │ ├── utils/
│ │ │ │ ├── BlurTool.jsx
│ │ │ │ ├── CursorModes.jsx
│ │ │ │ └── ZoomContainer.jsx
│ │ │ └── warning/
│ │ │ ├── Warning.jsx
│ │ │ └── styles/
│ │ │ └── _Warning.scss
│ │ ├── Download/
│ │ │ ├── Download.jsx
│ │ │ ├── index.html
│ │ │ └── index.jsx
│ │ ├── Editor/
│ │ │ ├── Sandbox.jsx
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ └── utils/
│ │ │ ├── addAudioToVideo.js
│ │ │ ├── base64toBlob.js
│ │ │ ├── blobToArrayBuffer.js
│ │ │ ├── cropVideo.js
│ │ │ ├── cutVideo.js
│ │ │ ├── getFrame.js
│ │ │ ├── hasAudio.js
│ │ │ ├── muteVideo.js
│ │ │ ├── reencodeVideo.js
│ │ │ ├── toGIF.js
│ │ │ └── toWebM.js
│ │ ├── EditorViewer/
│ │ │ ├── Sandbox.jsx
│ │ │ ├── index.css
│ │ │ ├── index.html
│ │ │ └── index.jsx
│ │ ├── EditorWebCodecs/
│ │ │ ├── Sandbox.jsx
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── mediabunny/
│ │ │ │ └── lib/
│ │ │ │ ├── videoAudioMixer.ts
│ │ │ │ ├── videoConverter.ts
│ │ │ │ ├── videoCropper.ts
│ │ │ │ ├── videoCutter.ts
│ │ │ │ ├── videoMuter.ts
│ │ │ │ └── videoTrimmer.ts
│ │ │ └── utils/
│ │ │ ├── addAudioToVideo.js
│ │ │ ├── blobToArrayBuffer.js
│ │ │ ├── convertMp4ToWebm.js
│ │ │ ├── convertWebmToMp4.js
│ │ │ ├── cropVideo.js
│ │ │ ├── cutVideo.js
│ │ │ ├── getFrame.js
│ │ │ ├── hasAudio.js
│ │ │ ├── muteVideo.js
│ │ │ ├── reencodeVideo.js
│ │ │ └── toGIF.js
│ │ ├── Permissions/
│ │ │ ├── Permissions.jsx
│ │ │ ├── index.html
│ │ │ └── index.jsx
│ │ ├── Playground/
│ │ │ ├── Setup.jsx
│ │ │ ├── index.html
│ │ │ └── index.jsx
│ │ ├── Recorder/
│ │ │ ├── Recorder.jsx
│ │ │ ├── RecorderUI.jsx
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── mediaRecorderUtils.js
│ │ │ ├── messaging.js
│ │ │ ├── recorderConfig.js
│ │ │ ├── warning/
│ │ │ │ └── Warning.jsx
│ │ │ └── webcodecs/
│ │ │ ├── Mp4MuxerWrapper.ts
│ │ │ └── WebCodecsRecorder.js
│ │ ├── RecorderOffscreen/
│ │ │ ├── RecorderOffscreen.jsx
│ │ │ ├── index.html
│ │ │ └── index.jsx
│ │ ├── Region/
│ │ │ ├── Recorder.jsx
│ │ │ ├── index.html
│ │ │ └── index.jsx
│ │ ├── Sandbox/
│ │ │ ├── DevHUD.jsx
│ │ │ ├── Sandbox.jsx
│ │ │ ├── components/
│ │ │ │ ├── editor/
│ │ │ │ │ ├── CropperWrap.jsx
│ │ │ │ │ ├── Dropdown.jsx
│ │ │ │ │ ├── Switch.jsx
│ │ │ │ │ ├── Trimmer.jsx
│ │ │ │ │ ├── VideoPlayer.jsx
│ │ │ │ │ └── Waveform.jsx
│ │ │ │ ├── global/
│ │ │ │ │ ├── Modal.jsx
│ │ │ │ │ └── ProBanner.jsx
│ │ │ │ └── player/
│ │ │ │ ├── HelpButton.jsx
│ │ │ │ ├── ShareModal.jsx
│ │ │ │ ├── Title.jsx
│ │ │ │ └── VideoPlayer.jsx
│ │ │ ├── context/
│ │ │ │ └── ContentState.jsx
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── layout/
│ │ │ │ ├── editor/
│ │ │ │ │ ├── AudioNav.js
│ │ │ │ │ ├── AudioUI.js
│ │ │ │ │ ├── CropNav.js
│ │ │ │ │ ├── CropUI.js
│ │ │ │ │ ├── Editor.js
│ │ │ │ │ ├── EditorNav.js
│ │ │ │ │ └── TrimUI.js
│ │ │ │ └── player/
│ │ │ │ ├── Content.js
│ │ │ │ ├── Player.js
│ │ │ │ ├── PlayerNav.js
│ │ │ │ └── RightPanel.js
│ │ │ └── styles/
│ │ │ ├── edit/
│ │ │ │ ├── _Dropdown.module.scss
│ │ │ │ ├── _EditorNav.module.scss
│ │ │ │ ├── _Switch.module.scss
│ │ │ │ ├── _TrimUI.module.scss
│ │ │ │ ├── _Trimmer.module.scss
│ │ │ │ ├── _VideoPlayer.scss
│ │ │ │ └── _Waveform.module.scss
│ │ │ ├── global/
│ │ │ │ ├── _app.scss
│ │ │ │ └── _variables.scss
│ │ │ ├── player/
│ │ │ │ ├── _Content.module.scss
│ │ │ │ ├── _HelpButton.module.scss
│ │ │ │ ├── _Nav.module.scss
│ │ │ │ ├── _Player.module.scss
│ │ │ │ ├── _RightPanel.module.scss
│ │ │ │ ├── _ShareModal.module.scss
│ │ │ │ └── _Title.module.scss
│ │ │ └── plyr.css
│ │ ├── Setup/
│ │ │ ├── Setup.jsx
│ │ │ ├── index.html
│ │ │ └── index.jsx
│ │ ├── Waveform/
│ │ │ ├── Waveform.jsx
│ │ │ ├── index.html
│ │ │ └── index.jsx
│ │ └── utils/
│ │ ├── buildDiagnosticZip.js
│ │ ├── buildSupportContext.js
│ │ ├── buildSupportDebugInfo.js
│ │ ├── diagnosticLog.js
│ │ ├── errorCodes.js
│ │ ├── filenameHelpers.js
│ │ ├── mediaDeviceFallback.js
│ │ ├── recordingDebug.js
│ │ └── startFlowTrace.js
│ └── schema.json
├── tsconfig.json
├── utils/
│ ├── autoReloadClients/
│ │ ├── backgroundClient.js
│ │ └── contentScriptClient.js
│ ├── build.js
│ ├── env.js
│ └── server.js
└── webpack.config.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .babelrc
================================================
{
"presets": [
["@babel/preset-env", { "targets": { "chrome": "110" } }],
["@babel/preset-react", { "runtime": "automatic" }]
]
}
================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: alyssaxuu
================================================
FILE: .gitignore
================================================
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
node_modules/
.DS_Store
.vscode/
.env
.env.local
.env.development
.env.production
.env.*.local
build/
docs/
tools/
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
hi@alyssax.com.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
# Screenity
> _✨ Screenity's open source work is sponsored by_
> ### Recall.ai - API for desktop recording [<img src="https://github.com/user-attachments/assets/eee643f1-1b64-4d14-bb04-498c321fd937" align="right">](https://www.recall.ai/product/desktop-recording-sdk?utm_source=github&utm_medium=sponsorship&utm_campaign=alyssaxuu-screenity)
>
> If you’re looking for a hosted desktop recording API, consider checking out [Recall.ai](https://www.recall.ai/product/desktop-recording-sdk?utm_source=github&utm_medium=sponsorship&utm_campaign=alyssaxuu-screenity), an API that records Zoom, Google Meet, Microsoft Teams, in-person meetings, and more.
[](https://screenity.io)
The free and privacy-friendly screen recorder with no limits 🎥
[Get it now - it's free!](https://chrome.google.com/webstore/detail/screenity-screen-recorder/kbbdabhdfibnancpjfhlkhafgdilcnji)
Screenity is a powerful privacy-friendly screen recorder and annotation tool to make better videos for work, education, and more. You can create stunning product demos, tutorials, presentations, or share feedback with your team - all for free.
<a href="https://www.producthunt.com/posts/screenity?utm_source=badge-top-post-badge&utm_medium=badge&utm_source=badge-screenity" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=275308&theme=light&period=daily" alt="Screenity - The most powerful screen recorder for Chrome | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
<a href="https://news.ycombinator.com/item?id=25150804" target="_blank"><img height=53 src="https://hackerbadge.now.sh/api?id=25150804&type=orange" alt="Featured on HackerNews"></a>
> Want to support the project (and the solo developer behind it)?
>
> Check out [**Screenity Pro**](https://screenity.io/pro): a privacy-friendly, EU-hosted platform with link sharing, multi-scene editing, zoom keyframes, captions, and more ❤️
Made by [Alyssa X](https://alyssax.com)
## Table of contents
- [Screenity](#screenity)
- [Table of contents](#table-of-contents)
- [Features](#features)
- [Self-hosting Screenity](#self-hosting-screenity)
- [Creating a development version](#creating-a-development-version)
- [Enabling Save to Google Drive](#enabling-save-to-google-drive)
- [Acknowledgements](#acknowledgements)
## Features
🎥 Make unlimited recordings of your tab, a specific area, desktop, any application, or camera<br>
🎙️ Record your microphone or internal audio, and use features like push to talk<br>
✏️ Annotate by drawing anywhere on the screen, adding text, arrows, shapes, and more<br>
✨ Use AI-powered camera backgrounds or blur to enhance your recordings<br>
🔎 Zoom in smoothly in your recordings to focus on specific areas<br>
🪄 Blur out any sensitive content of any page to keep it private<br>
✂️ Remove or add audio, cut, trim, or crop your recordings with a comprehensive editor<br>
👀 Highlight your clicks and cursor, and go in spotlight mode<br>
⏱️ Set up alarms to automatically stop your recording<br>
💾 Export as mp4, gif, and webm, or save the video directly to Google Drive to share a link<br>
⚙️ Set a countdown, hide parts of the UI, or move it anywhere<br>
🔒 Only you can see your videos, we don’t collect any of your data. You can even go offline!<br>
💙 No limits, make as many videos as you want, for as long as you want<br> …and much more - all for free & no sign in needed!
## Self-hosting Screenity
> 🛠️ Note: When self-hosted, the extension runs entirely in local-only mode.
> No API calls, sign-in flows, or platform features are enabled, nothing is sent anywhere.
> Some internal code paths connect to [Screenity Pro](https://screenity.io/pro), but these are only active in the official Chrome Store version.
You can run Screenity locally without having to install it from the Chrome Store. Here's how:
1. Download the latest Build.zip from the [releases page](https://github.com/alyssaxuu/screenity/releases)
2. Load the extension by pasting `chrome://extensions/` in the address bar, and [enabling developer mode](https://developer.chrome.com/docs/extensions/mv2/faq/#:~:text=You%20can%20start%20by%20turning,a%20packaged%20extension%2C%20and%20more.).
3. Drag the folder that contains the code (make sure it's a folder and not a ZIP file, so unzip first), or click on the "Load unpacked" button and locate the folder.
4. That's it, you should now be able to use Screenity locally. [Follow these instructions](#enabling-save-to-google-drive) to set up the Google Drive integration.
<small>Self-hosting is totally fine for personal, educational, or internal use.
If you’re thinking of building a commercial product from this, feel free to [reach out](mailto:alyssa@screenity.io), I’m open to chatting 💜</small>
## Creating a development version
> ❗️ Note that the license has changed to [GPLv3](https://github.com/alyssaxuu/screenity/blob/master/LICENSE) for the current MV3 version (Screenity version 3.0.0 and higher). Make sure to read the license and the [Terms of Service](https://screenity.io/en/terms/) regarding intellectual property.
1. Check if your [Node.js](https://nodejs.org/) version is >= **14**.
2. Clone this repository.
3. Run `npm install` to install dependencies.
4. Run `npm start` to start the local development server.
5. Open `chrome://extensions/` in your browser and [enable developer mode](https://developer.chrome.com/docs/extensions/mv2/faq/#:~:text=You%20can%20start%20by%20turning,a%20packaged%20extension%2C%20and%20more.).
6. Click **Load unpacked** and select the `build` folder.
7. The extension should now be available locally.
To rebuild after code changes, run `npm run build`.
### Enabling Save to Google Drive
To enable the Google Drive Upload (authorization consent screen) you must change the client_id in the manifest.json file with your linked extension key.
You can create it accessing [Google Cloud Console](https://console.cloud.google.com/apis/credentials) and selecting Create Credential > OAuth Client ID > Chrome App. To create a persistent extension key, you can follow the steps detailed [here](https://developer.chrome.com/docs/extensions/reference/manifest/key).
## Acknowledgements
- Thanks to [HelpKit](https://www.helpkit.so/) for sponsoring this project by hosting the [Screenity Help Center](https://help.screenity.io/).
- Thanks to [Mei Xuan](https://www.behance.net/meixuanloo) for helping with the Chinese translation of the extension.
If you need any help, or want to become a Screenity expert, you can browse articles and guides in the [help center](https://help.screenity.io). You can also submit any feedback or ideas in this [form](https://tally.so/r/3ElpXq), or contact through [this page](https://help.screenity.io/contact)
================================================
FILE: custom.config.js
================================================
module.exports = {
notHMR: ["background", "contentScript", "devtools", "sandbox"],
enableBackgroundAutoReload: true,
enableContentScriptsAutoReload: true,
};
================================================
FILE: package.json
================================================
{
"name": "screenity",
"version": "4.3.0",
"description": "The free and privacy-friendly screen recorder with no sign in needed.",
"scripts": {
"build": "cross-env NODE_ENV=production node utils/build.js",
"start": "cross-env NODE_ENV=development node utils/server.js",
"dev": "npm run hot-reload",
"watch": "cross-env NODE_ENV=development webpack --watch",
"hot-reload": "cross-env NODE_ENV=development webpack serve --hot",
"prettier": "prettier --write '**/*.{js,jsx,ts,tsx,json,css,scss,md}'",
"postinstall": "patch-package && node scripts/patch-radix.js",
"package": "npm run build && cd build && zip -r ../extension.zip . && cd ..",
"clean": "rm -rf build && mkdir build",
"lint": "eslint src/**/*.js --fix"
},
"dependencies": {
"@babel/plugin-transform-react-jsx": "^7.27.1",
"@mediapipe/tasks-vision": "0.10.32",
"@radix-ui/react-alert-dialog": "^1.0.4",
"@radix-ui/react-collapsible": "^1.0.2",
"@radix-ui/react-dropdown-menu": "^2.0.6",
"@radix-ui/react-popover": "^1.0.5",
"@radix-ui/react-select": "^1.2.1",
"@radix-ui/react-slider": "^1.1.2",
"@radix-ui/react-switch": "^1.0.2",
"@radix-ui/react-tabs": "^1.0.3",
"@radix-ui/react-toast": "^1.2.13",
"@radix-ui/react-toggle": "^1.1.8",
"@radix-ui/react-toggle-group": "^1.1.9",
"@radix-ui/react-toolbar": "^1.1.9",
"@radix-ui/react-tooltip": "^1.2.6",
"@sentry/browser": "^7.94.1",
"@uiw/color-convert": "^1.2.2",
"@uiw/react-color-wheel": "^1.2.2",
"axios": "^1.6.2",
"concurrently": "^8.2.0",
"dotenv": "^17.0.1",
"driver.js": "^1.3.6",
"fabric": "^5.3.0",
"fix-webm-duration": "^1.0.5",
"gif.js": "^0.2.0",
"jszip": "^3.10.1",
"localforage": "^1.10.0",
"mediabunny": "^1.24.4",
"patch-package": "^8.0.0",
"plyr": "3.7.8",
"plyr-react": "^5.3.0",
"querystring": "^0.2.1",
"raw-loader": "^4.0.2",
"react": "^18.2.0",
"react-advanced-cropper": "^0.19.4",
"react-dom": "^18.2.0",
"react-hotkeys-hook": "^4.4.1",
"react-rnd": "^10.4.1",
"react-shadow": "^20.0.0",
"react-svg": "^16.1.18",
"ssestream": "^1.1.0",
"tar": "7.5.9",
"wavesurfer.js": "^7.4.2",
"webm-duration-fix": "^1.0.4"
},
"devDependencies": {
"@babel/core": "^7.20.2",
"@babel/plugin-transform-runtime": "^7.27.1",
"@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.27.1",
"@types/react": "^18.3.21",
"@types/react-dom": "^18.3.7",
"babel-loader": "^9.1.3",
"copy-webpack-plugin": "^7.0.0",
"cross-env": "^7.0.3",
"css-loader": "^6.7.2",
"fs-extra": "^10.1.0",
"html-loader": "^3.1.0",
"html-webpack-plugin": "^5.5.0",
"prettier": "^2.7.1",
"sass": "^1.97.3",
"sass-loader": "^16.0.7",
"source-map-loader": "^3.0.1",
"style-loader": "^3.3.1",
"terser-webpack-plugin": "^5.3.6",
"ts-loader": "^9.4.1",
"typescript": "^4.9.3",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^4.11.1"
},
"overrides": {
"tar": "7.5.9",
"minimatch": "10.2.2"
}
}
================================================
FILE: patches/fabric+5.3.0.patch
================================================
diff --git a/node_modules/fabric/dist/fabric.js b/node_modules/fabric/dist/fabric.js
index faee7fc..02e5ae3 100644
--- a/node_modules/fabric/dist/fabric.js
+++ b/node_modules/fabric/dist/fabric.js
@@ -12591,7 +12591,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab
this.cacheCanvasEl = this._createCanvasElement();
this.cacheCanvasEl.setAttribute('width', this.width);
this.cacheCanvasEl.setAttribute('height', this.height);
- this.contextCache = this.cacheCanvasEl.getContext('2d');
+ this.contextCache = this.cacheCanvasEl.getContext('2d', {willReadFrequently: true});
},
/**
@@ -15103,7 +15103,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
_createCacheCanvas: function() {
this._cacheProperties = {};
this._cacheCanvas = fabric.util.createCanvasElement();
- this._cacheContext = this._cacheCanvas.getContext('2d');
+ this._cacheContext = this._cacheCanvas.getContext('2d', {willReadFrequently: true});
this._updateCacheCanvas();
// if canvas gets created, is empty, so dirty.
this.dirty = true;
================================================
FILE: patches/fabric+5.5.2.patch
================================================
diff --git a/node_modules/fabric/dist/fabric.js b/node_modules/fabric/dist/fabric.js
index a7ad0f5..d8e7670 100644
--- a/node_modules/fabric/dist/fabric.js
+++ b/node_modules/fabric/dist/fabric.js
@@ -12596,7 +12596,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab
this.cacheCanvasEl = this._createCanvasElement();
this.cacheCanvasEl.setAttribute('width', this.width);
this.cacheCanvasEl.setAttribute('height', this.height);
- this.contextCache = this.cacheCanvasEl.getContext('2d');
+ this.contextCache = this.cacheCanvasEl.getContext('2d', {willReadFrequently: true});
},
/**
@@ -15108,7 +15108,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
_createCacheCanvas: function() {
this._cacheProperties = {};
this._cacheCanvas = fabric.util.createCanvasElement();
- this._cacheContext = this._cacheCanvas.getContext('2d');
+ this._cacheContext = this._cacheCanvas.getContext('2d', {willReadFrequently: true});
this._updateCacheCanvas();
// if canvas gets created, is empty, so dirty.
this.dirty = true;
================================================
FILE: patches/plyr+3.7.8.patch
================================================
diff --git a/node_modules/plyr/dist/plyr.js b/node_modules/plyr/dist/plyr.js
index 0a79517..e69634f 100644
--- a/node_modules/plyr/dist/plyr.js
+++ b/node_modules/plyr/dist/plyr.js
@@ -3539,21 +3539,7 @@ typeof navigator === "object" && (function (global, factory) {
}
},
// URLs
- urls: {
- download: null,
- vimeo: {
- sdk: 'https://player.vimeo.com/api/player.js',
- iframe: 'https://player.vimeo.com/video/{0}?{1}',
- api: 'https://vimeo.com/api/oembed.json?url={0}'
- },
- youtube: {
- sdk: 'https://www.youtube.com/iframe_api',
- api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'
- },
- googleIMA: {
- sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'
- }
- },
+ urls: null,
// Custom control listeners
listeners: {
seek: null,
diff --git a/node_modules/plyr/dist/plyr.min.js b/node_modules/plyr/dist/plyr.min.js
index 707308e..25fc326 100644
--- a/node_modules/plyr/dist/plyr.min.js
+++ b/node_modules/plyr/dist/plyr.min.js
@@ -1,2 +1,2 @@
-"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):(e="undefined"!=typeof globalThis?globalThis:e||self).Plyr=t()}(this,(function(){"use strict";function e(e,t,i){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var i=e[Symbol.toPrimitive];if(void 0!==i){var s=i.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function t(e,t){for(var i=0;i<t.length;i++){var s=t[i];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(e,s.key,s)}}function i(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function s(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);t&&(s=s.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,s)}return i}function n(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?s(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var a={addCSS:!0,thumbWidth:15,watch:!0};var l=function(e){return null!=e?e.constructor:null},r=function(e,t){return!!(e&&t&&e instanceof t)},o=function(e){return null==e},c=function(e){return l(e)===Object},u=function(e){return l(e)===String},h=function(e){return Array.isArray(e)},d=function(e){return r(e,NodeList)},m={nullOrUndefined:o,object:c,number:function(e){return l(e)===Number&&!Number.isNaN(e)},string:u,boolean:function(e){return l(e)===Boolean},function:function(e){return l(e)===Function},array:h,nodeList:d,element:function(e){return r(e,Element)},event:function(e){return r(e,Event)},empty:function(e){return o(e)||(u(e)||h(e)||d(e))&&!e.length||c(e)&&!Object.keys(e).length}};function p(e,t){if(1>t){var i=function(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}(t);return parseFloat(e.toFixed(i))}return Math.round(e/t)*t}var g=function(){function e(t,i){(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,e),m.element(t)?this.element=t:m.string(t)&&(this.element=document.querySelector(t)),m.element(this.element)&&m.empty(this.element.rangeTouch)&&(this.config=n({},a,{},i),this.init())}return function(e,i,s){i&&t(e.prototype,i),s&&t(e,s)}(e,[{key:"init",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="",this.element.style.webKitUserSelect="",this.element.style.touchAction=""),this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,i=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach((function(e){t.element[i](e,(function(e){return t.set(e)}),!1)}))}},{key:"get",value:function(t){if(!e.enabled||!m.event(t))return null;var i,s=t.target,n=t.changedTouches[0],a=parseFloat(s.getAttribute("min"))||0,l=parseFloat(s.getAttribute("max"))||100,r=parseFloat(s.getAttribute("step"))||1,o=s.getBoundingClientRect(),c=100/o.width*(this.config.thumbWidth/2)/100;return 0>(i=100/o.width*(n.clientX-o.left))?i=0:100<i&&(i=100),50>i?i-=(100-2*i)*c:50<i&&(i+=2*(i-50)*c),a+p(i/100*(l-a),r)}},{key:"set",value:function(t){e.enabled&&m.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),function(e,t){if(e&&t){var i=new Event(t,{bubbles:!0});e.dispatchEvent(i)}}(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var i=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},s=null;if(m.empty(t)||m.string(t)?s=Array.from(document.querySelectorAll(m.string(t)?t:'input[type="range"]')):m.element(t)?s=[t]:m.nodeList(t)?s=Array.from(t):m.array(t)&&(s=t.filter(m.element)),m.empty(s))return null;var l=n({},a,{},i);if(m.string(t)&&l.watch){var r=new MutationObserver((function(i){Array.from(i).forEach((function(i){Array.from(i.addedNodes).forEach((function(i){m.element(i)&&function(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}(i,t)&&new e(i,l)}))}))}));r.observe(document.body,{childList:!0,subtree:!0})}return s.map((function(t){return new e(t,i)}))}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}();const f=e=>null!=e?e.constructor:null,y=(e,t)=>Boolean(e&&t&&e instanceof t),b=e=>null==e,v=e=>f(e)===Object,w=e=>f(e)===String,T=e=>"function"==typeof e,k=e=>Array.isArray(e),C=e=>y(e,NodeList),A=e=>b(e)||(w(e)||k(e)||C(e))&&!e.length||v(e)&&!Object.keys(e).length;var S={nullOrUndefined:b,object:v,number:e=>f(e)===Number&&!Number.isNaN(e),string:w,boolean:e=>f(e)===Boolean,function:T,array:k,weakMap:e=>y(e,WeakMap),nodeList:C,element:e=>null!==e&&"object"==typeof e&&1===e.nodeType&&"object"==typeof e.style&&"object"==typeof e.ownerDocument,textNode:e=>f(e)===Text,event:e=>y(e,Event),keyboardEvent:e=>y(e,KeyboardEvent),cue:e=>y(e,window.TextTrackCue)||y(e,window.VTTCue),track:e=>y(e,TextTrack)||!b(e)&&w(e.kind),promise:e=>y(e,Promise)&&T(e.then),url:e=>{if(y(e,window.URL))return!0;if(!w(e))return!1;let t=e;e.startsWith("http://")&&e.startsWith("https://")||(t=`http://${e}`);try{return!A(new URL(t).hostname)}catch(e){return!1}},empty:A};const E=(()=>{const e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},i=Object.keys(t).find((t=>void 0!==e.style[t]));return!!S.string(i)&&t[i]})();function P(e,t){setTimeout((()=>{try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch(e){}}),t)}var M={isIE:Boolean(window.document.documentMode),isEdge:/Edge/g.test(navigator.userAgent),isWebKit:"WebkitAppearance"in document.documentElement.style&&!/Edge/g.test(navigator.userAgent),isIPhone:/iPhone|iPod/gi.test(navigator.userAgent)&&navigator.maxTouchPoints>1,isIPadOS:"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1,isIos:/iPad|iPhone|iPod/gi.test(navigator.userAgent)&&navigator.maxTouchPoints>1};function N(e,t){return t.split(".").reduce(((e,t)=>e&&e[t]),e)}function x(e={},...t){if(!t.length)return e;const i=t.shift();return S.object(i)?(Object.keys(i).forEach((t=>{S.object(i[t])?(Object.keys(e).includes(t)||Object.assign(e,{[t]:{}}),x(e[t],i[t])):Object.assign(e,{[t]:i[t]})})),x(e,...t)):e}function L(e,t){const i=e.length?e:[e];Array.from(i).reverse().forEach(((e,i)=>{const s=i>0?t.cloneNode(!0):t,n=e.parentNode,a=e.nextSibling;s.appendChild(e),a?n.insertBefore(s,a):n.appendChild(s)}))}function I(e,t){S.element(e)&&!S.empty(t)&&Object.entries(t).filter((([,e])=>!S.nullOrUndefined(e))).forEach((([t,i])=>e.setAttribute(t,i)))}function $(e,t,i){const s=document.createElement(e);return S.object(t)&&I(s,t),S.string(i)&&(s.innerText=i),s}function _(e,t,i,s){S.element(t)&&t.appendChild($(e,i,s))}function O(e){S.nodeList(e)||S.array(e)?Array.from(e).forEach(O):S.element(e)&&S.element(e.parentNode)&&e.parentNode.removeChild(e)}function j(e){if(!S.element(e))return;let{length:t}=e.childNodes;for(;t>0;)e.removeChild(e.lastChild),t-=1}function q(e,t){return S.element(t)&&S.element(t.parentNode)&&S.element(e)?(t.parentNode.replaceChild(e,t),e):null}function D(e,t){if(!S.string(e)||S.empty(e))return{};const i={},s=x({},t);return e.split(",").forEach((e=>{const t=e.trim(),n=t.replace(".",""),a=t.replace(/[[\]]/g,"").split("="),[l]=a,r=a.length>1?a[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":S.string(s.class)?i.class=`${s.class} ${n}`:i.class=n;break;case"#":i.id=t.replace("#","");break;case"[":i[l]=r}})),x(s,i)}function H(e,t){if(!S.element(e))return;let i=t;S.boolean(i)||(i=!e.hidden),e.hidden=i}function R(e,t,i){if(S.nodeList(e))return Array.from(e).map((e=>R(e,t,i)));if(S.element(e)){let s="toggle";return void 0!==i&&(s=i?"add":"remove"),e.classList[s](t),e.classList.contains(t)}return!1}function F(e,t){return S.element(e)&&e.classList.contains(t)}function V(e,t){const{prototype:i}=Element;return(i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function U(e){return this.elements.container.querySelectorAll(e)}function B(e){return this.elements.container.querySelector(e)}function W(e=null,t=!1){S.element(e)&&e.focus({preventScroll:!0,focusVisible:t})}const z={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},K={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check(e,t){const i=K[e]||"html5"!==t;return{api:i,ui:i&&K.rangeInput}},pip:!(M.isIPhone||!S.function($("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||$("video").disablePictureInPicture)),airplay:S.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime(e){if(S.empty(e))return!1;const[t]=e.split("/");let i=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(z).includes(i)&&(i+=`; codecs="${z[e]}"`);try{return Boolean(i&&this.media.canPlayType(i).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(()=>{const e=document.createElement("input");return e.type="range","range"===e.type})(),touch:"ontouchstart"in document.documentElement,transitions:!1!==E,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},Y=(()=>{let e=!1;try{const t=Object.defineProperty({},"passive",{get:()=>(e=!0,null)});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e})();function Q(e,t,i,s=!1,n=!0,a=!1){if(!e||!("addEventListener"in e)||S.empty(t)||!S.function(i))return;const l=t.split(" ");let r=a;Y&&(r={passive:n,capture:a}),l.forEach((t=>{this&&this.eventListeners&&s&&this.eventListeners.push({element:e,type:t,callback:i,options:r}),e[s?"addEventListener":"removeEventListener"](t,i,r)}))}function X(e,t="",i,s=!0,n=!1){Q.call(this,e,t,i,!0,s,n)}function J(e,t="",i,s=!0,n=!1){Q.call(this,e,t,i,!1,s,n)}function G(e,t="",i,s=!0,n=!1){const a=(...l)=>{J(e,t,a,s,n),i.apply(this,l)};Q.call(this,e,t,a,!0,s,n)}function Z(e,t="",i=!1,s={}){if(!S.element(e)||S.empty(t))return;const n=new CustomEvent(t,{bubbles:i,detail:{...s,plyr:this}});e.dispatchEvent(n)}function ee(){this&&this.eventListeners&&(this.eventListeners.forEach((e=>{const{element:t,type:i,callback:s,options:n}=e;t.removeEventListener(i,s,n)})),this.eventListeners=[])}function te(){return new Promise((e=>this.ready?setTimeout(e,0):X.call(this,this.elements.container,"ready",e))).then((()=>{}))}function ie(e){S.promise(e)&&e.then(null,(()=>{}))}function se(e){return S.array(e)?e.filter(((t,i)=>e.indexOf(t)===i)):e}function ne(e,t){return S.array(e)&&e.length?e.reduce(((e,i)=>Math.abs(i-t)<Math.abs(e-t)?i:e)):null}function ae(e){return!(!window||!window.CSS)&&window.CSS.supports(e)}const le=[[1,1],[4,3],[3,4],[5,4],[4,5],[3,2],[2,3],[16,10],[10,16],[16,9],[9,16],[21,9],[9,21],[32,9],[9,32]].reduce(((e,[t,i])=>({...e,[t/i]:[t,i]})),{});function re(e){if(!(S.array(e)||S.string(e)&&e.includes(":")))return!1;return(S.array(e)?e:e.split(":")).map(Number).every(S.number)}function oe(e){if(!S.array(e)||!e.every(S.number))return null;const[t,i]=e,s=(e,t)=>0===t?e:s(t,e%t),n=s(t,i);return[t/n,i/n]}function ce(e){const t=e=>re(e)?e.split(":").map(Number):null;let i=t(e);if(null===i&&(i=t(this.config.ratio)),null===i&&!S.empty(this.embed)&&S.array(this.embed.ratio)&&({ratio:i}=this.embed),null===i&&this.isHTML5){const{videoWidth:e,videoHeight:t}=this.media;i=[e,t]}return oe(i)}function ue(e){if(!this.isVideo)return{};const{wrapper:t}=this.elements,i=ce.call(this,e);if(!S.array(i))return{};const[s,n]=oe(i),a=100/s*n;if(ae(`aspect-ratio: ${s}/${n}`)?t.style.aspectRatio=`${s}/${n}`:t.style.paddingBottom=`${a}%`,this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){const e=100/this.media.offsetWidth*parseInt(window.getComputedStyle(this.media).paddingBottom,10),i=(e-a)/(e/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform=`translateY(-${i}%)`}else this.isHTML5&&t.classList.add(this.config.classNames.videoFixedRatio);return{padding:a,ratio:i}}function he(e,t,i=.05){const s=e/t,n=ne(Object.keys(le),s);return Math.abs(n-s)<=i?le[n]:[e,t]}const de={getSources(){if(!this.isHTML5)return[];return Array.from(this.media.querySelectorAll("source")).filter((e=>{const t=e.getAttribute("type");return!!S.empty(t)||K.mime.call(this,t)}))},getQualityOptions(){return this.config.quality.forced?this.config.quality.options:de.getSources.call(this).map((e=>Number(e.getAttribute("size")))).filter(Boolean)},setup(){if(!this.isHTML5)return;const e=this;e.options.speed=e.config.speed.options,S.empty(this.config.ratio)||ue.call(e),Object.defineProperty(e.media,"quality",{get(){const t=de.getSources.call(e).find((t=>t.getAttribute("src")===e.source));return t&&Number(t.getAttribute("size"))},set(t){if(e.quality!==t){if(e.config.quality.forced&&S.function(e.config.quality.onChange))e.config.quality.onChange(t);else{const i=de.getSources.call(e).find((e=>Number(e.getAttribute("size"))===t));if(!i)return;const{currentTime:s,paused:n,preload:a,readyState:l,playbackRate:r}=e.media;e.media.src=i.getAttribute("src"),("none"!==a||l)&&(e.once("loadedmetadata",(()=>{e.speed=r,e.currentTime=s,n||ie(e.play())})),e.media.load())}Z.call(e,e.media,"qualitychange",!1,{quality:t})}}})},cancelRequests(){this.isHTML5&&(O(de.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function me(e,...t){return S.empty(e)?e:e.toString().replace(/{(\d+)}/g,((e,i)=>t[i].toString()))}const pe=(e="",t="",i="")=>e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1"),"g"),i.toString()),ge=(e="")=>e.toString().replace(/\w\S*/g,(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()));function fe(e=""){let t=e.toString();return t=function(e=""){let t=e.toString();return t=pe(t,"-"," "),t=pe(t,"_"," "),t=ge(t),pe(t," ","")}(t),t.charAt(0).toLowerCase()+t.slice(1)}function ye(e){const t=document.createElement("div");return t.appendChild(e),t.innerHTML}const be={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},ve={get(e="",t={}){if(S.empty(e)||S.empty(t))return"";let i=N(t.i18n,e);if(S.empty(i))return Object.keys(be).includes(e)?be[e]:"";const s={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(s).forEach((([e,t])=>{i=pe(i,e,t)})),i}};class we{constructor(t){e(this,"get",(e=>{if(!we.supported||!this.enabled)return null;const t=window.localStorage.getItem(this.key);if(S.empty(t))return null;const i=JSON.parse(t);return S.string(e)&&e.length?i[e]:i})),e(this,"set",(e=>{if(!we.supported||!this.enabled)return;if(!S.object(e))return;let t=this.get();S.empty(t)&&(t={}),x(t,e);try{window.localStorage.setItem(this.key,JSON.stringify(t))}catch(e){}})),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}static get supported(){try{if(!("localStorage"in window))return!1;const e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}}}function Te(e,t="text"){return new Promise(((i,s)=>{try{const s=new XMLHttpRequest;if(!("withCredentials"in s))return;s.addEventListener("load",(()=>{if("text"===t)try{i(JSON.parse(s.responseText))}catch(e){i(s.responseText)}else i(s.response)})),s.addEventListener("error",(()=>{throw new Error(s.status)})),s.open("GET",e,!0),s.responseType=t,s.send()}catch(e){s(e)}}))}function ke(e,t){if(!S.string(e))return;const i="cache",s=S.string(t);let n=!1;const a=()=>null!==document.getElementById(t),l=(e,t)=>{e.innerHTML=t,s&&a()||document.body.insertAdjacentElement("afterbegin",e)};if(!s||!a()){const a=we.supported,r=document.createElement("div");if(r.setAttribute("hidden",""),s&&r.setAttribute("id",t),a){const e=window.localStorage.getItem(`${i}-${t}`);if(n=null!==e,n){const t=JSON.parse(e);l(r,t.content)}}Te(e).then((e=>{if(!S.empty(e)){if(a)try{window.localStorage.setItem(`${i}-${t}`,JSON.stringify({content:e}))}catch(e){}l(r,e)}})).catch((()=>{}))}}const Ce=e=>Math.trunc(e/60/60%60,10),Ae=e=>Math.trunc(e/60%60,10),Se=e=>Math.trunc(e%60,10);function Ee(e=0,t=!1,i=!1){if(!S.number(e))return Ee(void 0,t,i);const s=e=>`0${e}`.slice(-2);let n=Ce(e);const a=Ae(e),l=Se(e);return n=t||n>0?`${n}:`:"",`${i&&e>0?"-":""}${n}${s(a)}:${s(l)}`}const Pe={getIconUrl(){const e=new URL(this.config.iconUrl,window.location),t=window.location.host?window.location.host:window.top.location.host,i=e.host!==t||M.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:i}},findElements(){try{return this.elements.controls=B.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:U.call(this,this.config.selectors.buttons.play),pause:B.call(this,this.config.selectors.buttons.pause),restart:B.call(this,this.config.selectors.buttons.restart),rewind:B.call(this,this.config.selectors.buttons.rewind),fastForward:B.call(this,this.config.selectors.buttons.fastForward),mute:B.call(this,this.config.selectors.buttons.mute),pip:B.call(this,this.config.selectors.buttons.pip),airplay:B.call(this,this.config.selectors.buttons.airplay),settings:B.call(this,this.config.selectors.buttons.settings),captions:B.call(this,this.config.selectors.buttons.captions),fullscreen:B.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=B.call(this,this.config.selectors.progress),this.elements.inputs={seek:B.call(this,this.config.selectors.inputs.seek),volume:B.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:B.call(this,this.config.selectors.display.buffer),currentTime:B.call(this,this.config.selectors.display.currentTime),duration:B.call(this,this.config.selectors.display.duration)},S.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon(e,t){const i="http://www.w3.org/2000/svg",s=Pe.getIconUrl.call(this),n=`${s.cors?"":s.url}#${this.config.iconPrefix}`,a=document.createElementNS(i,"svg");I(a,x(t,{"aria-hidden":"true",focusable:"false"}));const l=document.createElementNS(i,"use"),r=`${n}-${e}`;return"href"in l&&l.setAttributeNS("http://www.w3.org/1999/xlink","href",r),l.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",r),a.appendChild(l),a},createLabel(e,t={}){const i=ve.get(e,this.config);return $("span",{...t,class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")},i)},createBadge(e){if(S.empty(e))return null;const t=$("span",{class:this.config.classNames.menu.value});return t.appendChild($("span",{class:this.config.classNames.menu.badge},e)),t},createButton(e,t){const i=x({},t);let s=fe(e);const n={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach((e=>{Object.keys(i).includes(e)&&(n[e]=i[e],delete i[e])})),"button"!==n.element||Object.keys(i).includes("type")||(i.type="button"),Object.keys(i).includes("class")?i.class.split(" ").some((e=>e===this.config.classNames.control))||x(i,{class:`${i.class} ${this.config.classNames.control}`}):i.class=this.config.classNames.control,e){case"play":n.toggle=!0,n.label="play",n.labelPressed="pause",n.icon="play",n.iconPressed="pause";break;case"mute":n.toggle=!0,n.label="mute",n.labelPressed="unmute",n.icon="volume",n.iconPressed="muted";break;case"captions":n.toggle=!0,n.label="enableCaptions",n.labelPressed="disableCaptions",n.icon="captions-off",n.iconPressed="captions-on";break;case"fullscreen":n.toggle=!0,n.label="enterFullscreen",n.labelPressed="exitFullscreen",n.icon="enter-fullscreen",n.iconPressed="exit-fullscreen";break;case"play-large":i.class+=` ${this.config.classNames.control}--overlaid`,s="play",n.label="play",n.icon="play";break;default:S.empty(n.label)&&(n.label=s),S.empty(n.icon)&&(n.icon=e)}const a=$(n.element);return n.toggle?(a.appendChild(Pe.createIcon.call(this,n.iconPressed,{class:"icon--pressed"})),a.appendChild(Pe.createIcon.call(this,n.icon,{class:"icon--not-pressed"})),a.appendChild(Pe.createLabel.call(this,n.labelPressed,{class:"label--pressed"})),a.appendChild(Pe.createLabel.call(this,n.label,{class:"label--not-pressed"}))):(a.appendChild(Pe.createIcon.call(this,n.icon)),a.appendChild(Pe.createLabel.call(this,n.label))),x(i,D(this.config.selectors.buttons[s],i)),I(a,i),"play"===s?(S.array(this.elements.buttons[s])||(this.elements.buttons[s]=[]),this.elements.buttons[s].push(a)):this.elements.buttons[s]=a,a},createRange(e,t){const i=$("input",x(D(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":ve.get(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=i,Pe.updateRangeFill.call(this,i),g.setup(i),i},createProgress(e,t){const i=$("progress",x(D(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){i.appendChild($("span",null,"0"));const t={played:"played",buffer:"buffered"}[e],s=t?ve.get(t,this.config):"";i.innerText=`% ${s.toLowerCase()}`}return this.elements.display[e]=i,i},createTime(e,t){const i=D(this.config.selectors.display[e],t),s=$("div",x(i,{class:`${i.class?i.class:""} ${this.config.classNames.display.time} `.trim(),"aria-label":ve.get(e,this.config),role:"timer"}),"00:00");return this.elements.display[e]=s,s},bindMenuItemShortcuts(e,t){X.call(this,e,"keydown keyup",(i=>{if(![" ","ArrowUp","ArrowDown","ArrowRight"].includes(i.key))return;if(i.preventDefault(),i.stopPropagation(),"keydown"===i.type)return;const s=V(e,'[role="menuitemradio"]');if(!s&&[" ","ArrowRight"].includes(i.key))Pe.showMenuPanel.call(this,t,!0);else{let t;" "!==i.key&&("ArrowDown"===i.key||s&&"ArrowRight"===i.key?(t=e.nextElementSibling,S.element(t)||(t=e.parentNode.firstElementChild)):(t=e.previousElementSibling,S.element(t)||(t=e.parentNode.lastElementChild)),W.call(this,t,!0))}}),!1),X.call(this,e,"keyup",(e=>{"Return"===e.key&&Pe.focusFirstMenuItem.call(this,null,!0)}))},createMenuItem({value:e,list:t,type:i,title:s,badge:n=null,checked:a=!1}){const l=D(this.config.selectors.inputs[i]),r=$("button",x(l,{type:"button",role:"menuitemradio",class:`${this.config.classNames.control} ${l.class?l.class:""}`.trim(),"aria-checked":a,value:e})),o=$("span");o.innerHTML=s,S.element(n)&&o.appendChild(n),r.appendChild(o),Object.defineProperty(r,"checked",{enumerable:!0,get:()=>"true"===r.getAttribute("aria-checked"),set(e){e&&Array.from(r.parentNode.children).filter((e=>V(e,'[role="menuitemradio"]'))).forEach((e=>e.setAttribute("aria-checked","false"))),r.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(r,"click keyup",(t=>{if(!S.keyboardEvent(t)||" "===t.key){switch(t.preventDefault(),t.stopPropagation(),r.checked=!0,i){case"language":this.currentTrack=Number(e);break;case"quality":this.quality=e;break;case"speed":this.speed=parseFloat(e)}Pe.showMenuPanel.call(this,"home",S.keyboardEvent(t))}}),i,!1),Pe.bindMenuItemShortcuts.call(this,r,i),t.appendChild(r)},formatTime(e=0,t=!1){if(!S.number(e))return e;return Ee(e,Ce(this.duration)>0,t)},updateTimeDisplay(e=null,t=0,i=!1){S.element(e)&&S.number(t)&&(e.innerText=Pe.formatTime(t,i))},updateVolume(){this.supported.ui&&(S.element(this.elements.inputs.volume)&&Pe.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),S.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange(e,t=0){S.element(e)&&(e.value=t,Pe.updateRangeFill.call(this,e))},updateProgress(e){if(!this.supported.ui||!S.event(e))return;let t=0;const i=(e,t)=>{const i=S.number(t)?t:0,s=S.element(e)?e:this.elements.display.buffer;if(S.element(s)){s.value=i;const e=s.getElementsByTagName("span")[0];S.element(e)&&(e.childNodes[0].nodeValue=i)}};if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":s=this.currentTime,n=this.duration,t=0===s||0===n||Number.isNaN(s)||Number.isNaN(n)?0:(s/n*100).toFixed(2),"timeupdate"===e.type&&Pe.setRange.call(this,this.elements.inputs.seek,t);break;case"playing":case"progress":i(this.elements.display.buffer,100*this.buffered)}var s,n},updateRangeFill(e){const t=S.event(e)?e.target:e;if(S.element(t)&&"range"===t.getAttribute("type")){if(V(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);const e=Pe.formatTime(this.currentTime),i=Pe.formatTime(this.duration),s=ve.get("seekLabel",this.config);t.setAttribute("aria-valuetext",s.replace("{currentTime}",e).replace("{duration}",i))}else if(V(t,this.config.selectors.inputs.volume)){const e=100*t.value;t.setAttribute("aria-valuenow",e),t.setAttribute("aria-valuetext",`${e.toFixed(1)}%`)}else t.setAttribute("aria-valuenow",t.value);(M.isWebKit||M.isIPadOS)&&t.style.setProperty("--value",t.value/t.max*100+"%")}},updateSeekTooltip(e){var t,i;if(!this.config.tooltips.seek||!S.element(this.elements.inputs.seek)||!S.element(this.elements.display.seekTooltip)||0===this.duration)return;const s=this.elements.display.seekTooltip,n=`${this.config.classNames.tooltip}--visible`,a=e=>R(s,n,e);if(this.touch)return void a(!1);let l=0;const r=this.elements.progress.getBoundingClientRect();if(S.event(e))l=100/r.width*(e.pageX-r.left);else{if(!F(s,n))return;l=parseFloat(s.style.left,10)}l<0?l=0:l>100&&(l=100);const o=this.duration/100*l;s.innerText=Pe.formatTime(o);const c=null===(t=this.config.markers)||void 0===t||null===(i=t.points)||void 0===i?void 0:i.find((({time:e})=>e===Math.round(o)));c&&s.insertAdjacentHTML("afterbegin",`${c.label}<br>`),s.style.left=`${l}%`,S.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&a("mouseenter"===e.type)},timeUpdate(e){const t=!S.element(this.elements.display.duration)&&this.config.invertTime;Pe.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||Pe.updateProgress.call(this,e)},durationUpdate(){if(!this.supported.ui||!this.config.invertTime&&this.currentTime)return;if(this.duration>=2**32)return H(this.elements.display.currentTime,!0),void H(this.elements.progress,!0);S.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);const e=S.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&Pe.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&Pe.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),this.config.markers.enabled&&Pe.setMarkers.call(this),Pe.updateSeekTooltip.call(this)},toggleMenuButton(e,t){H(this.elements.settings.buttons[e],!t)},updateSetting(e,t,i){const s=this.elements.settings.panels[e];let n=null,a=t;if("captions"===e)n=this.currentTrack;else{if(n=S.empty(i)?this[e]:i,S.empty(n)&&(n=this.config[e].default),!S.empty(this.options[e])&&!this.options[e].includes(n))return void this.debug.warn(`Unsupported value of '${n}' for ${e}`);if(!this.config[e].options.includes(n))return void this.debug.warn(`Disabled value of '${n}' for ${e}`)}if(S.element(a)||(a=s&&s.querySelector('[role="menu"]')),!S.element(a))return;this.elements.settings.buttons[e].querySelector(`.${this.config.classNames.menu.value}`).innerHTML=Pe.getLabel.call(this,e,n);const l=a&&a.querySelector(`[value="${n}"]`);S.element(l)&&(l.checked=!0)},getLabel(e,t){switch(e){case"speed":return 1===t?ve.get("normal",this.config):`${t}×`;case"quality":if(S.number(t)){const e=ve.get(`qualityLabel.${t}`,this.config);return e.length?e:`${t}p`}return ge(t);case"captions":return xe.getLabel.call(this);default:return null}},setQualityMenu(e){if(!S.element(this.elements.settings.panels.quality))return;const t="quality",i=this.elements.settings.panels.quality.querySelector('[role="menu"]');S.array(e)&&(this.options.quality=se(e).filter((e=>this.config.quality.options.includes(e))));const s=!S.empty(this.options.quality)&&this.options.quality.length>1;if(Pe.toggleMenuButton.call(this,t,s),j(i),Pe.checkMenu.call(this),!s)return;const n=e=>{const t=ve.get(`qualityBadge.${e}`,this.config);return t.length?Pe.createBadge.call(this,t):null};this.options.quality.sort(((e,t)=>{const i=this.config.quality.options;return i.indexOf(e)>i.indexOf(t)?1:-1})).forEach((e=>{Pe.createMenuItem.call(this,{value:e,list:i,type:t,title:Pe.getLabel.call(this,"quality",e),badge:n(e)})})),Pe.updateSetting.call(this,t,i)},setCaptionsMenu(){if(!S.element(this.elements.settings.panels.captions))return;const e="captions",t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),i=xe.getTracks.call(this),s=Boolean(i.length);if(Pe.toggleMenuButton.call(this,e,s),j(t),Pe.checkMenu.call(this),!s)return;const n=i.map(((e,i)=>({value:i,checked:this.captions.toggled&&this.currentTrack===i,title:xe.getLabel.call(this,e),badge:e.language&&Pe.createBadge.call(this,e.language.toUpperCase()),list:t,type:"language"})));n.unshift({value:-1,checked:!this.captions.toggled,title:ve.get("disabled",this.config),list:t,type:"language"}),n.forEach(Pe.createMenuItem.bind(this)),Pe.updateSetting.call(this,e,t)},setSpeedMenu(){if(!S.element(this.elements.settings.panels.speed))return;const e="speed",t=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter((e=>e>=this.minimumSpeed&&e<=this.maximumSpeed));const i=!S.empty(this.options.speed)&&this.options.speed.length>1;Pe.toggleMenuButton.call(this,e,i),j(t),Pe.checkMenu.call(this),i&&(this.options.speed.forEach((i=>{Pe.createMenuItem.call(this,{value:i,list:t,type:e,title:Pe.getLabel.call(this,"speed",i)})})),Pe.updateSetting.call(this,e,t))},checkMenu(){const{buttons:e}=this.elements.settings,t=!S.empty(e)&&Object.values(e).some((e=>!e.hidden));H(this.elements.settings.menu,!t)},focusFirstMenuItem(e,t=!1){if(this.elements.settings.popup.hidden)return;let i=e;S.element(i)||(i=Object.values(this.elements.settings.panels).find((e=>!e.hidden)));const s=i.querySelector('[role^="menuitem"]');W.call(this,s,t)},toggleMenu(e){const{popup:t}=this.elements.settings,i=this.elements.buttons.settings;if(!S.element(t)||!S.element(i))return;const{hidden:s}=t;let n=s;if(S.boolean(e))n=e;else if(S.keyboardEvent(e)&&"Escape"===e.key)n=!1;else if(S.event(e)){const s=S.function(e.composedPath)?e.composedPath()[0]:e.target,a=t.contains(s);if(a||!a&&e.target!==i&&n)return}i.setAttribute("aria-expanded",n),H(t,!n),R(this.elements.container,this.config.classNames.menu.open,n),n&&S.keyboardEvent(e)?Pe.focusFirstMenuItem.call(this,null,!0):n||s||W.call(this,i,S.keyboardEvent(e))},getMenuSize(e){const t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);const i=t.scrollWidth,s=t.scrollHeight;return O(t),{width:i,height:s}},showMenuPanel(e="",t=!1){const i=this.elements.container.querySelector(`#plyr-settings-${this.id}-${e}`);if(!S.element(i))return;const s=i.parentNode,n=Array.from(s.children).find((e=>!e.hidden));if(K.transitions&&!K.reducedMotion){s.style.width=`${n.scrollWidth}px`,s.style.height=`${n.scrollHeight}px`;const e=Pe.getMenuSize.call(this,i),t=e=>{e.target===s&&["width","height"].includes(e.propertyName)&&(s.style.width="",s.style.height="",J.call(this,s,E,t))};X.call(this,s,E,t),s.style.width=`${e.width}px`,s.style.height=`${e.height}px`}H(n,!0),H(i,!1),Pe.focusFirstMenuItem.call(this,i,t)},setDownloadUrl(){const e=this.elements.buttons.download;S.element(e)&&e.setAttribute("href",this.download)},create(e){const{bindMenuItemShortcuts:t,createButton:i,createProgress:s,createRange:n,createTime:a,setQualityMenu:l,setSpeedMenu:r,showMenuPanel:o}=Pe;this.elements.controls=null,S.array(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(i.call(this,"play-large"));const c=$("div",D(this.config.selectors.controls.wrapper));this.elements.controls=c;const u={class:"plyr__controls__item"};return se(S.array(this.config.controls)?this.config.controls:[]).forEach((l=>{if("restart"===l&&c.appendChild(i.call(this,"restart",u)),"rewind"===l&&c.appendChild(i.call(this,"rewind",u)),"play"===l&&c.appendChild(i.call(this,"play",u)),"fast-forward"===l&&c.appendChild(i.call(this,"fast-forward",u)),"progress"===l){const t=$("div",{class:`${u.class} plyr__progress__container`}),i=$("div",D(this.config.selectors.progress));if(i.appendChild(n.call(this,"seek",{id:`plyr-seek-${e.id}`})),i.appendChild(s.call(this,"buffer")),this.config.tooltips.seek){const e=$("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(e),this.elements.display.seekTooltip=e}this.elements.progress=i,t.appendChild(this.elements.progress),c.appendChild(t)}if("current-time"===l&&c.appendChild(a.call(this,"currentTime",u)),"duration"===l&&c.appendChild(a.call(this,"duration",u)),"mute"===l||"volume"===l){let{volume:t}=this.elements;if(S.element(t)&&c.contains(t)||(t=$("div",x({},u,{class:`${u.class} plyr__volume`.trim()})),this.elements.volume=t,c.appendChild(t)),"mute"===l&&t.appendChild(i.call(this,"mute")),"volume"===l&&!M.isIos&&!M.isIPadOS){const i={max:1,step:.05,value:this.config.volume};t.appendChild(n.call(this,"volume",x(i,{id:`plyr-volume-${e.id}`})))}}if("captions"===l&&c.appendChild(i.call(this,"captions",u)),"settings"===l&&!S.empty(this.config.settings)){const s=$("div",x({},u,{class:`${u.class} plyr__menu`.trim(),hidden:""}));s.appendChild(i.call(this,"settings",{"aria-haspopup":!0,"aria-controls":`plyr-settings-${e.id}`,"aria-expanded":!1}));const n=$("div",{class:"plyr__menu__container",id:`plyr-settings-${e.id}`,hidden:""}),a=$("div"),l=$("div",{id:`plyr-settings-${e.id}-home`}),r=$("div",{role:"menu"});l.appendChild(r),a.appendChild(l),this.elements.settings.panels.home=l,this.config.settings.forEach((i=>{const s=$("button",x(D(this.config.selectors.buttons.settings),{type:"button",class:`${this.config.classNames.control} ${this.config.classNames.control}--forward`,role:"menuitem","aria-haspopup":!0,hidden:""}));t.call(this,s,i),X.call(this,s,"click",(()=>{o.call(this,i,!1)}));const n=$("span",null,ve.get(i,this.config)),l=$("span",{class:this.config.classNames.menu.value});l.innerHTML=e[i],n.appendChild(l),s.appendChild(n),r.appendChild(s);const c=$("div",{id:`plyr-settings-${e.id}-${i}`,hidden:""}),u=$("button",{type:"button",class:`${this.config.classNames.control} ${this.config.classNames.control}--back`});u.appendChild($("span",{"aria-hidden":!0},ve.get(i,this.config))),u.appendChild($("span",{class:this.config.classNames.hidden},ve.get("menuBack",this.config))),X.call(this,c,"keydown",(e=>{"ArrowLeft"===e.key&&(e.preventDefault(),e.stopPropagation(),o.call(this,"home",!0))}),!1),X.call(this,u,"click",(()=>{o.call(this,"home",!1)})),c.appendChild(u),c.appendChild($("div",{role:"menu"})),a.appendChild(c),this.elements.settings.buttons[i]=s,this.elements.settings.panels[i]=c})),n.appendChild(a),s.appendChild(n),c.appendChild(s),this.elements.settings.popup=n,this.elements.settings.menu=s}if("pip"===l&&K.pip&&c.appendChild(i.call(this,"pip",u)),"airplay"===l&&K.airplay&&c.appendChild(i.call(this,"airplay",u)),"download"===l){const e=x({},u,{element:"a",href:this.download,target:"_blank"});this.isHTML5&&(e.download="");const{download:t}=this.config.urls;!S.url(t)&&this.isEmbed&&x(e,{icon:`logo-${this.provider}`,label:this.provider}),c.appendChild(i.call(this,"download",e))}"fullscreen"===l&&c.appendChild(i.call(this,"fullscreen",u))})),this.isHTML5&&l.call(this,de.getQualityOptions.call(this)),r.call(this),c},inject(){if(this.config.loadSprite){const e=Pe.getIconUrl.call(this);e.cors&&ke(e.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());let e=null;this.elements.controls=null;const t={id:this.id,seektime:this.config.seekTime,title:this.config.title};let i=!0;S.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this,t)),this.config.controls||(this.config.controls=[]),S.element(this.config.controls)||S.string(this.config.controls)?e=this.config.controls:(e=Pe.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:xe.getLabel.call(this)}),i=!1);let s;i&&S.string(this.config.controls)&&(e=(e=>{let i=e;return Object.entries(t).forEach((([e,t])=>{i=pe(i,`{${e}}`,t)})),i})(e)),S.string(this.config.selectors.controls.container)&&(s=document.querySelector(this.config.selectors.controls.container)),S.element(s)||(s=this.elements.container);if(s[S.element(e)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",e),S.element(this.elements.controls)||Pe.findElements.call(this),!S.empty(this.elements.buttons)){const e=e=>{const t=this.config.classNames.controlPressed;e.setAttribute("aria-pressed","false"),Object.defineProperty(e,"pressed",{configurable:!0,enumerable:!0,get:()=>F(e,t),set(i=!1){R(e,t,i),e.setAttribute("aria-pressed",i?"true":"false")}})};Object.values(this.elements.buttons).filter(Boolean).forEach((t=>{S.array(t)||S.nodeList(t)?Array.from(t).filter(Boolean).forEach(e):e(t)}))}if(M.isEdge&&P(s),this.config.tooltips.controls){const{classNames:e,selectors:t}=this.config,i=`${t.controls.wrapper} ${t.labels} .${e.hidden}`,s=U.call(this,i);Array.from(s).forEach((e=>{R(e,this.config.classNames.hidden,!1),R(e,this.config.classNames.tooltip,!0)}))}},setMediaMetadata(){try{"mediaSession"in navigator&&(navigator.mediaSession.metadata=new window.MediaMetadata({title:this.config.mediaMetadata.title,artist:this.config.mediaMetadata.artist,album:this.config.mediaMetadata.album,artwork:this.config.mediaMetadata.artwork}))}catch(e){}},setMarkers(){var e,t;if(!this.duration||this.elements.markers)return;const i=null===(e=this.config.markers)||void 0===e||null===(t=e.points)||void 0===t?void 0:t.filter((({time:e})=>e>0&&e<this.duration));if(null==i||!i.length)return;const s=document.createDocumentFragment(),n=document.createDocumentFragment();let a=null;const l=`${this.config.classNames.tooltip}--visible`,r=e=>R(a,l,e);i.forEach((e=>{const t=$("span",{class:this.config.classNames.marker},""),i=e.time/this.duration*100+"%";a&&(t.addEventListener("mouseenter",(()=>{e.label||(a.style.left=i,a.innerHTML=e.label,r(!0))})),t.addEventListener("mouseleave",(()=>{r(!1)}))),t.addEventListener("click",(()=>{this.currentTime=e.time})),t.style.left=i,n.appendChild(t)})),s.appendChild(n),this.config.tooltips.seek||(a=$("span",{class:this.config.classNames.tooltip},""),s.appendChild(a)),this.elements.markers={points:n,tip:a},this.elements.progress.appendChild(s)}};function Me(e,t=!0){let i=e;if(t){const e=document.createElement("a");e.href=i,i=e.href}try{return new URL(i)}catch(e){return null}}function Ne(e){const t=new URLSearchParams;return S.object(e)&&Object.entries(e).forEach((([e,i])=>{t.set(e,i)})),t}const xe={setup(){if(!this.supported.ui)return;if(!this.isVideo||this.isYouTube||this.isHTML5&&!K.textTracks)return void(S.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&Pe.setCaptionsMenu.call(this));var e,t;if(S.element(this.elements.captions)||(this.elements.captions=$("div",D(this.config.selectors.captions)),this.elements.captions.setAttribute("dir","auto"),e=this.elements.captions,t=this.elements.wrapper,S.element(e)&&S.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)),M.isIE&&window.URL){const e=this.media.querySelectorAll("track");Array.from(e).forEach((e=>{const t=e.getAttribute("src"),i=Me(t);null!==i&&i.hostname!==window.location.href.hostname&&["http:","https:"].includes(i.protocol)&&Te(t,"blob").then((t=>{e.setAttribute("src",window.URL.createObjectURL(t))})).catch((()=>{O(e)}))}))}const i=se((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map((e=>e.split("-")[0])));let s=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();"auto"===s&&([s]=i);let n=this.storage.get("captions");if(S.boolean(n)||({active:n}=this.config.captions),Object.assign(this.captions,{toggled:!1,active:n,language:s,languages:i}),this.isHTML5){const e=this.config.captions.update?"addtrack removetrack":"removetrack";X.call(this,this.media.textTracks,e,xe.update.bind(this))}setTimeout(xe.update.bind(this),0)},update(){const e=xe.getTracks.call(this,!0),{active:t,language:i,meta:s,currentTrackNode:n}=this.captions,a=Boolean(e.find((e=>e.language===i)));this.isHTML5&&this.isVideo&&e.filter((e=>!s.get(e))).forEach((e=>{this.debug.log("Track added",e),s.set(e,{default:"showing"===e.mode}),"showing"===e.mode&&(e.mode="hidden"),X.call(this,e,"cuechange",(()=>xe.updateCues.call(this)))})),(a&&this.language!==i||!e.includes(n))&&(xe.setLanguage.call(this,i),xe.toggle.call(this,t&&a)),this.elements&&R(this.elements.container,this.config.classNames.captions.enabled,!S.empty(e)),S.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&Pe.setCaptionsMenu.call(this)},toggle(e,t=!0){if(!this.supported.ui)return;const{toggled:i}=this.captions,s=this.config.classNames.captions.active,n=S.nullOrUndefined(e)?!i:e;if(n!==i){if(t||(this.captions.active=n,this.storage.set({captions:n})),!this.language&&n&&!t){const e=xe.getTracks.call(this),t=xe.findTrack.call(this,[this.captions.language,...this.captions.languages],!0);return this.captions.language=t.language,void xe.set.call(this,e.indexOf(t))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=n),R(this.elements.container,s,n),this.captions.toggled=n,Pe.updateSetting.call(this,"captions"),Z.call(this,this.media,n?"captionsenabled":"captionsdisabled")}setTimeout((()=>{n&&this.captions.toggled&&(this.captions.currentTrackNode.mode="hidden")}))},set(e,t=!0){const i=xe.getTracks.call(this);if(-1!==e)if(S.number(e))if(e in i){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;const s=i[e],{language:n}=s||{};this.captions.currentTrackNode=s,Pe.updateSetting.call(this,"captions"),t||(this.captions.language=n,this.storage.set({language:n})),this.isVimeo&&this.embed.enableTextTrack(n),Z.call(this,this.media,"languagechange")}xe.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&xe.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else xe.toggle.call(this,!1,t)},setLanguage(e,t=!0){if(!S.string(e))return void this.debug.warn("Invalid language argument",e);const i=e.toLowerCase();this.captions.language=i;const s=xe.getTracks.call(this),n=xe.findTrack.call(this,[i]);xe.set.call(this,s.indexOf(n),t)},getTracks(e=!1){return Array.from((this.media||{}).textTracks||[]).filter((t=>!this.isHTML5||e||this.captions.meta.has(t))).filter((e=>["captions","subtitles"].includes(e.kind)))},findTrack(e,t=!1){const i=xe.getTracks.call(this),s=e=>Number((this.captions.meta.get(e)||{}).default),n=Array.from(i).sort(((e,t)=>s(t)-s(e)));let a;return e.every((e=>(a=n.find((t=>t.language===e)),!a))),a||(t?n[0]:void 0)},getCurrentTrack(){return xe.getTracks.call(this)[this.currentTrack]},getLabel(e){let t=e;return!S.track(t)&&K.textTracks&&this.captions.toggled&&(t=xe.getCurrentTrack.call(this)),S.track(t)?S.empty(t.label)?S.empty(t.language)?ve.get("enabled",this.config):e.language.toUpperCase():t.label:ve.get("disabled",this.config)},updateCues(e){if(!this.supported.ui)return;if(!S.element(this.elements.captions))return void this.debug.warn("No captions element to render to");if(!S.nullOrUndefined(e)&&!Array.isArray(e))return void this.debug.warn("updateCues: Invalid input",e);let t=e;if(!t){const e=xe.getCurrentTrack.call(this);t=Array.from((e||{}).activeCues||[]).map((e=>e.getCueAsHTML())).map(ye)}const i=t.map((e=>e.trim())).join("\n");if(i!==this.elements.captions.innerHTML){j(this.elements.captions);const e=$("span",D(this.config.selectors.caption));e.innerHTML=i,this.elements.captions.appendChild(e),Z.call(this,this.media,"cuechange")}}},Le={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.7.8/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,download:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","download","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',download:'[data-plyr="download"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",marker:"plyr__progress__marker",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",display:{time:"plyr__time"},menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id",hash:"data-plyr-embed-hash"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1},mediaMetadata:{title:"",artist:"",album:"",artwork:[]},markers:{enabled:!1,points:[]}},Ie="picture-in-picture",$e="inline",_e={html5:"html5",youtube:"youtube",vimeo:"vimeo"},Oe="audio",je="video";const qe=()=>{};class De{constructor(e=!1){this.enabled=window.console&&e,this.enabled&&this.log("Debugging enabled")}get log(){return this.enabled?Function.prototype.bind.call(console.log,console):qe}get warn(){return this.enabled?Function.prototype.bind.call(console.warn,console):qe}get error(){return this.enabled?Function.prototype.bind.call(console.error,console):qe}}class He{constructor(t){e(this,"onChange",(()=>{if(!this.supported)return;const e=this.player.elements.buttons.fullscreen;S.element(e)&&(e.pressed=this.active);const t=this.target===this.player.media?this.target:this.player.elements.container;Z.call(this.player,t,this.active?"enterfullscreen":"exitfullscreen",!0)})),e(this,"toggleFallback",((e=!1)=>{if(e?this.scrollPosition={x:window.scrollX??0,y:window.scrollY??0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",R(this.target,this.player.config.classNames.fullscreen.fallback,e),M.isIos){let t=document.head.querySelector('meta[name="viewport"]');const i="viewport-fit=cover";t||(t=document.createElement("meta"),t.setAttribute("name","viewport"));const s=S.string(t.content)&&t.content.includes(i);e?(this.cleanupViewport=!s,s||(t.content+=`,${i}`)):this.cleanupViewport&&(t.content=t.content.split(",").filter((e=>e.trim()!==i)).join(","))}this.onChange()})),e(this,"trapFocus",(e=>{if(M.isIos||M.isIPadOS||!this.active||"Tab"!==e.key)return;const t=document.activeElement,i=U.call(this.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),[s]=i,n=i[i.length-1];t!==n||e.shiftKey?t===s&&e.shiftKey&&(n.focus(),e.preventDefault()):(s.focus(),e.preventDefault())})),e(this,"update",(()=>{if(this.supported){let e;e=this.forceFallback?"Fallback (forced)":He.nativeSupported?"Native":"Fallback",this.player.debug.log(`${e} fullscreen enabled`)}else this.player.debug.log("Fullscreen not supported and fallback disabled");R(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.supported)})),e(this,"enter",(()=>{this.supported&&(M.isIos&&this.player.config.fullscreen.iosNative?this.player.isVimeo?this.player.embed.requestFullscreen():this.target.webkitEnterFullscreen():!He.nativeSupported||this.forceFallback?this.toggleFallback(!0):this.prefix?S.empty(this.prefix)||this.target[`${this.prefix}Request${this.property}`]():this.target.requestFullscreen({navigationUI:"hide"}))})),e(this,"exit",(()=>{if(this.supported)if(M.isIos&&this.player.config.fullscreen.iosNative)this.player.isVimeo?this.player.embed.exitFullscreen():this.target.webkitEnterFullscreen(),ie(this.player.play());else if(!He.nativeSupported||this.forceFallback)this.toggleFallback(!1);else if(this.prefix){if(!S.empty(this.prefix)){const e="moz"===this.prefix?"Cancel":"Exit";document[`${this.prefix}${e}${this.property}`]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document)})),e(this,"toggle",(()=>{this.active?this.exit():this.enter()})),this.player=t,this.prefix=He.prefix,this.property=He.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===t.config.fullscreen.fallback,this.player.elements.fullscreen=t.config.fullscreen.container&&function(e,t){const{prototype:i}=Element;return(i.closest||function(){let e=this;do{if(V.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}).call(e,t)}(this.player.elements.container,t.config.fullscreen.container),X.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":`${this.prefix}fullscreenchange`,(()=>{this.onChange()})),X.call(this.player,this.player.elements.container,"dblclick",(e=>{S.element(this.player.elements.controls)&&this.player.elements.controls.contains(e.target)||this.player.listeners.proxy(e,this.toggle,"fullscreen")})),X.call(this,this.player.elements.container,"keydown",(e=>this.trapFocus(e))),this.update()}static get nativeSupported(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}get useNative(){return He.nativeSupported&&!this.forceFallback}static get prefix(){if(S.function(document.exitFullscreen))return"";let e="";return["webkit","moz","ms"].some((t=>!(!S.function(document[`${t}ExitFullscreen`])&&!S.function(document[`${t}CancelFullScreen`]))&&(e=t,!0))),e}static get property(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}get supported(){return[this.player.config.fullscreen.enabled,this.player.isVideo,He.nativeSupported||this.player.config.fullscreen.fallback,!this.player.isYouTube||He.nativeSupported||!M.isIos||this.player.config.playsinline&&!this.player.config.fullscreen.iosNative].every(Boolean)}get active(){if(!this.supported)return!1;if(!He.nativeSupported||this.forceFallback)return F(this.target,this.player.config.classNames.fullscreen.fallback);const e=this.prefix?this.target.getRootNode()[`${this.prefix}${this.property}Element`]:this.target.getRootNode().fullscreenElement;return e&&e.shadowRoot?e===this.target.getRootNode().host:e===this.target}get target(){return M.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen??this.player.elements.container}}function Re(e,t=1){return new Promise(((i,s)=>{const n=new Image,a=()=>{delete n.onload,delete n.onerror,(n.naturalWidth>=t?i:s)(n)};Object.assign(n,{onload:a,onerror:a,src:e})}))}const Fe={addStyleHook(){R(this.elements.container,this.config.selectors.container.replace(".",""),!0),R(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls(e=!1){e&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build(){if(this.listeners.media(),!this.supported.ui)return this.debug.warn(`Basic support only for ${this.provider} ${this.type}`),void Fe.toggleNativeControls.call(this,!0);S.element(this.elements.controls)||(Pe.inject.call(this),this.listeners.controls()),Fe.toggleNativeControls.call(this),this.isHTML5&&xe.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,Pe.updateVolume.call(this),Pe.timeUpdate.call(this),Pe.durationUpdate.call(this),Fe.checkPlaying.call(this),R(this.elements.container,this.config.classNames.pip.supported,K.pip&&this.isHTML5&&this.isVideo),R(this.elements.container,this.config.classNames.airplay.supported,K.airplay&&this.isHTML5),R(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout((()=>{Z.call(this,this.media,"ready")}),0),Fe.setTitle.call(this),this.poster&&Fe.setPoster.call(this,this.poster,!1).catch((()=>{})),this.config.duration&&Pe.durationUpdate.call(this),this.config.mediaMetadata&&Pe.setMediaMetadata.call(this)},setTitle(){let e=ve.get("play",this.config);if(S.string(this.config.title)&&!S.empty(this.config.title)&&(e+=`, ${this.config.title}`),Array.from(this.elements.buttons.play||[]).forEach((t=>{t.setAttribute("aria-label",e)})),this.isEmbed){const e=B.call(this,"iframe");if(!S.element(e))return;const t=S.empty(this.config.title)?"video":this.config.title,i=ve.get("frameTitle",this.config);e.setAttribute("title",i.replace("{title}",t))}},togglePoster(e){R(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster(e,t=!0){return t&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),te.call(this).then((()=>Re(e))).catch((t=>{throw e===this.poster&&Fe.togglePoster.call(this,!1),t})).then((()=>{if(e!==this.poster)throw new Error("setPoster cancelled by later call to setPoster")})).then((()=>(Object.assign(this.elements.poster.style,{backgroundImage:`url('${e}')`,backgroundSize:""}),Fe.togglePoster.call(this,!0),e))))},checkPlaying(e){R(this.elements.container,this.config.classNames.playing,this.playing),R(this.elements.container,this.config.classNames.paused,this.paused),R(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach((e=>{Object.assign(e,{pressed:this.playing}),e.setAttribute("aria-label",ve.get(this.playing?"pause":"play",this.config))})),S.event(e)&&"timeupdate"===e.type||Fe.toggleControls.call(this)},checkLoading(e){this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout((()=>{R(this.elements.container,this.config.classNames.loading,this.loading),Fe.toggleControls.call(this)}),this.loading?250:0)},toggleControls(e){const{controls:t}=this.elements;if(t&&this.config.hideControls){const i=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||i))}},migrateStyles(){Object.values({...this.media.style}).filter((e=>!S.empty(e)&&S.string(e)&&e.startsWith("--plyr"))).forEach((e=>{this.elements.container.style.setProperty(e,this.media.style.getPropertyValue(e)),this.media.style.removeProperty(e)})),S.empty(this.media.style)&&this.media.removeAttribute("style")}};class Ve{constructor(t){e(this,"firstTouch",(()=>{const{player:e}=this,{elements:t}=e;e.touch=!0,R(t.container,e.config.classNames.isTouch,!0)})),e(this,"global",((e=!0)=>{const{player:t}=this;t.config.keyboard.global&&Q.call(t,window,"keydown keyup",this.handleKey,e,!1),Q.call(t,document.body,"click",this.toggleMenu,e),G.call(t,document.body,"touchstart",this.firstTouch)})),e(this,"container",(()=>{const{player:e}=this,{config:t,elements:i,timers:s}=e;!t.keyboard.global&&t.keyboard.focused&&X.call(e,i.container,"keydown keyup",this.handleKey,!1),X.call(e,i.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",(t=>{const{controls:n}=i;n&&"enterfullscreen"===t.type&&(n.pressed=!1,n.hover=!1);let a=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(Fe.toggleControls.call(e,!0),a=e.touch?3e3:2e3),clearTimeout(s.controls),s.controls=setTimeout((()=>Fe.toggleControls.call(e,!1)),a)}));const n=()=>{if(!e.isVimeo||e.config.vimeo.premium)return;const t=i.wrapper,{active:s}=e.fullscreen,[n,a]=ce.call(e),l=ae(`aspect-ratio: ${n} / ${a}`);if(!s)return void(l?(t.style.width=null,t.style.height=null):(t.style.maxWidth=null,t.style.margin=null));const[r,o]=[Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)],c=r/o>n/a;l?(t.style.width=c?"auto":"100%",t.style.height=c?"100%":"auto"):(t.style.maxWidth=c?o/a*n+"px":null,t.style.margin=c?"0 auto":null)},a=()=>{clearTimeout(s.resized),s.resized=setTimeout(n,50)};X.call(e,i.container,"enterfullscreen exitfullscreen",(t=>{const{target:s}=e.fullscreen;if(s!==i.container)return;if(!e.isEmbed&&S.empty(e.config.ratio))return;n();("enterfullscreen"===t.type?X:J).call(e,window,"resize",a)}))})),e(this,"media",(()=>{const{player:e}=this,{elements:t}=e;if(X.call(e,e.media,"timeupdate seeking seeked",(t=>Pe.timeUpdate.call(e,t))),X.call(e,e.media,"durationchange loadeddata loadedmetadata",(t=>Pe.durationUpdate.call(e,t))),X.call(e,e.media,"ended",(()=>{e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&(e.restart(),e.pause())})),X.call(e,e.media,"progress playing seeking seeked",(t=>Pe.updateProgress.call(e,t))),X.call(e,e.media,"volumechange",(t=>Pe.updateVolume.call(e,t))),X.call(e,e.media,"playing play pause ended emptied timeupdate",(t=>Fe.checkPlaying.call(e,t))),X.call(e,e.media,"waiting canplay seeked playing",(t=>Fe.checkLoading.call(e,t))),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){const i=B.call(e,`.${e.config.classNames.video}`);if(!S.element(i))return;X.call(e,t.container,"click",(s=>{([t.container,i].includes(s.target)||i.contains(s.target))&&(e.touch&&e.config.hideControls||(e.ended?(this.proxy(s,e.restart,"restart"),this.proxy(s,(()=>{ie(e.play())}),"play")):this.proxy(s,(()=>{ie(e.togglePlay())}),"play")))}))}e.supported.ui&&e.config.disableContextMenu&&X.call(e,t.wrapper,"contextmenu",(e=>{e.preventDefault()}),!1),X.call(e,e.media,"volumechange",(()=>{e.storage.set({volume:e.volume,muted:e.muted})})),X.call(e,e.media,"ratechange",(()=>{Pe.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})})),X.call(e,e.media,"qualitychange",(t=>{Pe.updateSetting.call(e,"quality",null,t.detail.quality)})),X.call(e,e.media,"ready qualitychange",(()=>{Pe.setDownloadUrl.call(e)}));const i=e.config.events.concat(["keyup","keydown"]).join(" ");X.call(e,e.media,i,(i=>{let{detail:s={}}=i;"error"===i.type&&(s=e.media.error),Z.call(e,t.container,i.type,!0,s)}))})),e(this,"proxy",((e,t,i)=>{const{player:s}=this,n=s.config.listeners[i];let a=!0;S.function(n)&&(a=n.call(s,e)),!1!==a&&S.function(t)&&t.call(s,e)})),e(this,"bind",((e,t,i,s,n=!0)=>{const{player:a}=this,l=a.config.listeners[s],r=S.function(l);X.call(a,e,t,(e=>this.proxy(e,i,s)),n&&!r)})),e(this,"controls",(()=>{const{player:e}=this,{elements:t}=e,i=M.isIE?"change":"input";if(t.buttons.play&&Array.from(t.buttons.play).forEach((t=>{this.bind(t,"click",(()=>{ie(e.togglePlay())}),"play")})),this.bind(t.buttons.restart,"click",e.restart,"restart"),this.bind(t.buttons.rewind,"click",(()=>{e.lastSeekTime=Date.now(),e.rewind()}),"rewind"),this.bind(t.buttons.fastForward,"click",(()=>{e.lastSeekTime=Date.now(),e.forward()}),"fastForward"),this.bind(t.buttons.mute,"click",(()=>{e.muted=!e.muted}),"mute"),this.bind(t.buttons.captions,"click",(()=>e.toggleCaptions())),this.bind(t.buttons.download,"click",(()=>{Z.call(e,e.media,"download")}),"download"),this.bind(t.buttons.fullscreen,"click",(()=>{e.fullscreen.toggle()}),"fullscreen"),this.bind(t.buttons.pip,"click",(()=>{e.pip="toggle"}),"pip"),this.bind(t.buttons.airplay,"click",e.airplay,"airplay"),this.bind(t.buttons.settings,"click",(t=>{t.stopPropagation(),t.preventDefault(),Pe.toggleMenu.call(e,t)}),null,!1),this.bind(t.buttons.settings,"keyup",(t=>{[" ","Enter"].includes(t.key)&&("Enter"!==t.key?(t.preventDefault(),t.stopPropagation(),Pe.toggleMenu.call(e,t)):Pe.focusFirstMenuItem.call(e,null,!0))}),null,!1),this.bind(t.settings.menu,"keydown",(t=>{"Escape"===t.key&&Pe.toggleMenu.call(e,t)})),this.bind(t.inputs.seek,"mousedown mousemove",(e=>{const i=t.progress.getBoundingClientRect(),s=100/i.width*(e.pageX-i.left);e.currentTarget.setAttribute("seek-value",s)})),this.bind(t.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",(t=>{const i=t.currentTarget,s="play-on-seeked";if(S.keyboardEvent(t)&&!["ArrowLeft","ArrowRight"].includes(t.key))return;e.lastSeekTime=Date.now();const n=i.hasAttribute(s),a=["mouseup","touchend","keyup"].includes(t.type);n&&a?(i.removeAttribute(s),ie(e.play())):!a&&e.playing&&(i.setAttribute(s,""),e.pause())})),M.isIos){const t=U.call(e,'input[type="range"]');Array.from(t).forEach((e=>this.bind(e,i,(e=>P(e.target)))))}this.bind(t.inputs.seek,i,(t=>{const i=t.currentTarget;let s=i.getAttribute("seek-value");S.empty(s)&&(s=i.value),i.removeAttribute("seek-value"),e.currentTime=s/i.max*e.duration}),"seek"),this.bind(t.progress,"mouseenter mouseleave mousemove",(t=>Pe.updateSeekTooltip.call(e,t))),this.bind(t.progress,"mousemove touchmove",(t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.startMove(t)})),this.bind(t.progress,"mouseleave touchend click",(()=>{const{previewThumbnails:t}=e;t&&t.loaded&&t.endMove(!1,!0)})),this.bind(t.progress,"mousedown touchstart",(t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.startScrubbing(t)})),this.bind(t.progress,"mouseup touchend",(t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.endScrubbing(t)})),M.isWebKit&&Array.from(U.call(e,'input[type="range"]')).forEach((t=>{this.bind(t,"input",(t=>Pe.updateRangeFill.call(e,t.target)))})),e.config.toggleInvert&&!S.element(t.display.duration)&&this.bind(t.display.currentTime,"click",(()=>{0!==e.currentTime&&(e.config.invertTime=!e.config.invertTime,Pe.timeUpdate.call(e))})),this.bind(t.inputs.volume,i,(t=>{e.volume=t.target.value}),"volume"),this.bind(t.controls,"mouseenter mouseleave",(i=>{t.controls.hover=!e.touch&&"mouseenter"===i.type})),t.fullscreen&&Array.from(t.fullscreen.children).filter((e=>!e.contains(t.container))).forEach((i=>{this.bind(i,"mouseenter mouseleave",(i=>{t.controls&&(t.controls.hover=!e.touch&&"mouseenter"===i.type)}))})),this.bind(t.controls,"mousedown mouseup touchstart touchend touchcancel",(e=>{t.controls.pressed=["mousedown","touchstart"].includes(e.type)})),this.bind(t.controls,"focusin",(()=>{const{config:i,timers:s}=e;R(t.controls,i.classNames.noTransition,!0),Fe.toggleControls.call(e,!0),setTimeout((()=>{R(t.controls,i.classNames.noTransition,!1)}),0);const n=this.touch?3e3:4e3;clearTimeout(s.controls),s.controls=setTimeout((()=>Fe.toggleControls.call(e,!1)),n)})),this.bind(t.inputs.volume,"wheel",(t=>{const i=t.webkitDirectionInvertedFromDevice,[s,n]=[t.deltaX,-t.deltaY].map((e=>i?-e:e)),a=Math.sign(Math.abs(s)>Math.abs(n)?s:n);e.increaseVolume(a/50);const{volume:l}=e.media;(1===a&&l<1||-1===a&&l>0)&&t.preventDefault()}),"volume",!1)})),this.player=t,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.firstTouch=this.firstTouch.bind(this)}handleKey(e){const{player:t}=this,{elements:i}=t,{key:s,type:n,altKey:a,ctrlKey:l,metaKey:r,shiftKey:o}=e,c="keydown"===n,u=c&&s===this.lastKey;if(a||l||r||o)return;if(!s)return;if(c){const n=document.activeElement;if(S.element(n)){const{editable:s}=t.config.selectors,{seek:a}=i.inputs;if(n!==a&&V(n,s))return;if(" "===e.key&&V(n,'button, [role^="menuitem"]'))return}switch([" ","ArrowLeft","ArrowUp","ArrowRight","ArrowDown","0","1","2","3","4","5","6","7","8","9","c","f","k","l","m"].includes(s)&&(e.preventDefault(),e.stopPropagation()),s){case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":u||(h=parseInt(s,10),t.currentTime=t.duration/10*h);break;case" ":case"k":u||ie(t.togglePlay());break;case"ArrowUp":t.increaseVolume(.1);break;case"ArrowDown":t.decreaseVolume(.1);break;case"m":u||(t.muted=!t.muted);break;case"ArrowRight":t.forward();break;case"ArrowLeft":t.rewind();break;case"f":t.fullscreen.toggle();break;case"c":u||t.toggleCaptions();break;case"l":t.loop=!t.loop}"Escape"===s&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=s}else this.lastKey=null;var h}toggleMenu(e){Pe.toggleMenu.call(this.player,e)}}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Ue=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e,t){e.exports=function(){var e=function(){},t={},i={},s={};function n(e,t){e=e.push?e:[e];var n,a,l,r=[],o=e.length,c=o;for(n=function(e,i){i.length&&r.push(e),--c||t(r)};o--;)a=e[o],(l=i[a])?n(a,l):(s[a]=s[a]||[]).push(n)}function a(e,t){if(e){var n=s[e];if(i[e]=t,n)for(;n.length;)n[0](e,t),n.splice(0,1)}}function l(t,i){t.call&&(t={success:t}),i.length?(t.error||e)(i):(t.success||e)(t)}function r(t,i,s,n){var a,l,o=document,c=s.async,u=(s.numRetries||0)+1,h=s.before||e,d=t.replace(/[\?|#].*$/,""),m=t.replace(/^(css|img)!/,"");n=n||0,/(^css!|\.css$)/.test(d)?((l=o.createElement("link")).rel="stylesheet",l.href=m,(a="hideFocus"in l)&&l.relList&&(a=0,l.rel="preload",l.as="style")):/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(d)?(l=o.createElement("img")).src=m:((l=o.createElement("script")).src=t,l.async=void 0===c||c),l.onload=l.onerror=l.onbeforeload=function(e){var o=e.type[0];if(a)try{l.sheet.cssText.length||(o="e")}catch(e){18!=e.code&&(o="e")}if("e"==o){if((n+=1)<u)return r(t,i,s,n)}else if("preload"==l.rel&&"style"==l.as)return l.rel="stylesheet";i(t,o,e.defaultPrevented)},!1!==h(t,l)&&o.head.appendChild(l)}function o(e,t,i){var s,n,a=(e=e.push?e:[e]).length,l=a,o=[];for(s=function(e,i,s){if("e"==i&&o.push(e),"b"==i){if(!s)return;o.push(e)}--a||t(o)},n=0;n<l;n++)r(e[n],s,i)}function c(e,i,s){var n,r;if(i&&i.trim&&(n=i),r=(n?s:i)||{},n){if(n in t)throw"LoadJS";t[n]=!0}function c(t,i){o(e,(function(e){l(r,e),t&&l({success:t,error:i},e),a(n,e)}),r)}if(r.returnPromise)return new Promise(c);c()}return c.ready=function(e,t){return n(e,(function(e){l(t,e)})),c},c.done=function(e){a(e,[])},c.reset=function(){t={},i={},s={}},c.isDefined=function(e){return e in t},c}()}));function Be(e){return new Promise(((t,i)=>{Ue(e,{success:t,error:i})}))}function We(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,Z.call(this,this.media,e?"play":"pause"))}const ze={setup(){const e=this;R(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,ue.call(e),S.object(window.Vimeo)?ze.ready.call(e):Be(e.config.urls.vimeo.sdk).then((()=>{ze.ready.call(e)})).catch((t=>{e.debug.warn("Vimeo SDK (player.js) failed to load",t)}))},ready(){const e=this,t=e.config.vimeo,{premium:i,referrerPolicy:s,...n}=t;let a=e.media.getAttribute("src"),l="";S.empty(a)?(a=e.media.getAttribute(e.config.attributes.embed.id),l=e.media.getAttribute(e.config.attributes.embed.hash)):l=function(e){const t=e.match(/^.*(vimeo.com\/|video\/)(\d+)(\?.*&*h=|\/)+([\d,a-f]+)/);return t&&5===t.length?t[4]:null}(a);const r=l?{h:l}:{};i&&Object.assign(n,{controls:!1,sidedock:!1});const o=Ne({loop:e.config.loop.active,autoplay:e.autoplay,muted:e.muted,gesture:"media",playsinline:e.config.playsinline,...r,...n}),c=(u=a,S.empty(u)?null:S.number(Number(u))?u:u.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:u);var u;const h=$("iframe"),d=me(e.config.urls.vimeo.iframe,c,o);if(h.setAttribute("src",d),h.setAttribute("allowfullscreen",""),h.setAttribute("allow",["autoplay","fullscreen","picture-in-picture","encrypted-media","accelerometer","gyroscope"].join("; ")),S.empty(s)||h.setAttribute("referrerPolicy",s),i||!t.customControls)h.setAttribute("data-poster",e.poster),e.media=q(h,e.media);else{const t=$("div",{class:e.config.classNames.embedContainer,"data-poster":e.poster});t.appendChild(h),e.media=q(t,e.media)}t.customControls||Te(me(e.config.urls.vimeo.api,d)).then((t=>{!S.empty(t)&&t.thumbnail_url&&Fe.setPoster.call(e,t.thumbnail_url).catch((()=>{}))})),e.embed=new window.Vimeo.Player(h,{autopause:e.config.autopause,muted:e.muted}),e.media.paused=!0,e.media.currentTime=0,e.supported.ui&&e.embed.disableTextTrack(),e.media.play=()=>(We.call(e,!0),e.embed.play()),e.media.pause=()=>(We.call(e,!1),e.embed.pause()),e.media.stop=()=>{e.pause(),e.currentTime=0};let{currentTime:m}=e.media;Object.defineProperty(e.media,"currentTime",{get:()=>m,set(t){const{embed:i,media:s,paused:n,volume:a}=e,l=n&&!i.hasPlayed;s.seeking=!0,Z.call(e,s,"seeking"),Promise.resolve(l&&i.setVolume(0)).then((()=>i.setCurrentTime(t))).then((()=>l&&i.pause())).then((()=>l&&i.setVolume(a))).catch((()=>{}))}});let p=e.config.speed.selected;Object.defineProperty(e.media,"playbackRate",{get:()=>p,set(t){e.embed.setPlaybackRate(t).then((()=>{p=t,Z.call(e,e.media,"ratechange")})).catch((()=>{e.options.speed=[1]}))}});let{volume:g}=e.config;Object.defineProperty(e.media,"volume",{get:()=>g,set(t){e.embed.setVolume(t).then((()=>{g=t,Z.call(e,e.media,"volumechange")}))}});let{muted:f}=e.config;Object.defineProperty(e.media,"muted",{get:()=>f,set(t){const i=!!S.boolean(t)&&t;e.embed.setMuted(!!i||e.config.muted).then((()=>{f=i,Z.call(e,e.media,"volumechange")}))}});let y,{loop:b}=e.config;Object.defineProperty(e.media,"loop",{get:()=>b,set(t){const i=S.boolean(t)?t:e.config.loop.active;e.embed.setLoop(i).then((()=>{b=i}))}}),e.embed.getVideoUrl().then((t=>{y=t,Pe.setDownloadUrl.call(e)})).catch((e=>{this.debug.warn(e)})),Object.defineProperty(e.media,"currentSrc",{get:()=>y}),Object.defineProperty(e.media,"ended",{get:()=>e.currentTime===e.duration}),Promise.all([e.embed.getVideoWidth(),e.embed.getVideoHeight()]).then((t=>{const[i,s]=t;e.embed.ratio=he(i,s),ue.call(this)})),e.embed.setAutopause(e.config.autopause).then((t=>{e.config.autopause=t})),e.embed.getVideoTitle().then((t=>{e.config.title=t,Fe.setTitle.call(this)})),e.embed.getCurrentTime().then((t=>{m=t,Z.call(e,e.media,"timeupdate")})),e.embed.getDuration().then((t=>{e.media.duration=t,Z.call(e,e.media,"durationchange")})),e.embed.getTextTracks().then((t=>{e.media.textTracks=t,xe.setup.call(e)})),e.embed.on("cuechange",(({cues:t=[]})=>{const i=t.map((e=>function(e){const t=document.createDocumentFragment(),i=document.createElement("div");return t.appendChild(i),i.innerHTML=e,t.firstChild.innerText}(e.text)));xe.updateCues.call(e,i)})),e.embed.on("loaded",(()=>{if(e.embed.getPaused().then((t=>{We.call(e,!t),t||Z.call(e,e.media,"playing")})),S.element(e.embed.element)&&e.supported.ui){e.embed.element.setAttribute("tabindex",-1)}})),e.embed.on("bufferstart",(()=>{Z.call(e,e.media,"waiting")})),e.embed.on("bufferend",(()=>{Z.call(e,e.media,"playing")})),e.embed.on("play",(()=>{We.call(e,!0),Z.call(e,e.media,"playing")})),e.embed.on("pause",(()=>{We.call(e,!1)})),e.embed.on("timeupdate",(t=>{e.media.seeking=!1,m=t.seconds,Z.call(e,e.media,"timeupdate")})),e.embed.on("progress",(t=>{e.media.buffered=t.percent,Z.call(e,e.media,"progress"),1===parseInt(t.percent,10)&&Z.call(e,e.media,"canplaythrough"),e.embed.getDuration().then((t=>{t!==e.media.duration&&(e.media.duration=t,Z.call(e,e.media,"durationchange"))}))})),e.embed.on("seeked",(()=>{e.media.seeking=!1,Z.call(e,e.media,"seeked")})),e.embed.on("ended",(()=>{e.media.paused=!0,Z.call(e,e.media,"ended")})),e.embed.on("error",(t=>{e.media.error=t,Z.call(e,e.media,"error")})),t.customControls&&setTimeout((()=>Fe.build.call(e)),0)}};function Ke(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,Z.call(this,this.media,e?"play":"pause"))}function Ye(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}const Qe={setup(){if(R(this.elements.wrapper,this.config.classNames.embed,!0),S.object(window.YT)&&S.function(window.YT.Player))Qe.ready.call(this);else{const e=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=()=>{S.function(e)&&e(),Qe.ready.call(this)},Be(this.config.urls.youtube.sdk).catch((e=>{this.debug.warn("YouTube API failed to load",e)}))}},getTitle(e){Te(me(this.config.urls.youtube.api,e)).then((e=>{if(S.object(e)){const{title:t,height:i,width:s}=e;this.config.title=t,Fe.setTitle.call(this),this.embed.ratio=he(s,i)}ue.call(this)})).catch((()=>{ue.call(this)}))},ready(){const e=this,t=e.config.youtube,i=e.media&&e.media.getAttribute("id");if(!S.empty(i)&&i.startsWith("youtube-"))return;let s=e.media.getAttribute("src");S.empty(s)&&(s=e.media.getAttribute(this.config.attributes.embed.id));const n=(a=s,S.empty(a)?null:a.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:a);var a;const l=$("div",{id:`${e.provider}-${Math.floor(1e4*Math.random())}`,"data-poster":t.customControls?e.poster:void 0});if(e.media=q(l,e.media),t.customControls){const t=e=>`https://i.ytimg.com/vi/${n}/${e}default.jpg`;Re(t("maxres"),121).catch((()=>Re(t("sd"),121))).catch((()=>Re(t("hq")))).then((t=>Fe.setPoster.call(e,t.src))).then((t=>{t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")})).catch((()=>{}))}e.embed=new window.YT.Player(e.media,{videoId:n,host:Ye(t),playerVars:x({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.playsinline&&!e.config.fullscreen.iosNative?1:0,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),events:{onError(t){if(!e.media.error){const i=t.data,s={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[i]||"An unknown error occurred";e.media.error={code:i,message:s},Z.call(e,e.media,"error")}},onPlaybackRateChange(t){const i=t.target;e.media.playbackRate=i.getPlaybackRate(),Z.call(e,e.media,"ratechange")},onReady(i){if(S.function(e.media.play))return;const s=i.target;Qe.getTitle.call(e,n),e.media.play=()=>{Ke.call(e,!0),s.playVideo()},e.media.pause=()=>{Ke.call(e,!1),s.pauseVideo()},e.media.stop=()=>{s.stopVideo()},e.media.duration=s.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:()=>Number(s.getCurrentTime()),set(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,Z.call(e,e.media,"seeking"),s.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:()=>s.getPlaybackRate(),set(e){s.setPlaybackRate(e)}});let{volume:a}=e.config;Object.defineProperty(e.media,"volume",{get:()=>a,set(t){a=t,s.setVolume(100*a),Z.call(e,e.media,"volumechange")}});let{muted:l}=e.config;Object.defineProperty(e.media,"muted",{get:()=>l,set(t){const i=S.boolean(t)?t:l;l=i,s[i?"mute":"unMute"](),s.setVolume(100*a),Z.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:()=>s.getVideoUrl()}),Object.defineProperty(e.media,"ended",{get:()=>e.currentTime===e.duration});const r=s.getAvailablePlaybackRates();e.options.speed=r.filter((t=>e.config.speed.options.includes(t))),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),Z.call(e,e.media,"timeupdate"),Z.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval((()=>{e.media.buffered=s.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&Z.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),Z.call(e,e.media,"canplaythrough"))}),200),t.customControls&&setTimeout((()=>Fe.build.call(e)),50)},onStateChange(i){const s=i.target;clearInterval(e.timers.playing);switch(e.media.seeking&&[1,2].includes(i.data)&&(e.media.seeking=!1,Z.call(e,e.media,"seeked")),i.data){case-1:Z.call(e,e.media,"timeupdate"),e.media.buffered=s.getVideoLoadedFraction(),Z.call(e,e.media,"progress");break;case 0:Ke.call(e,!1),e.media.loop?(s.stopVideo(),s.playVideo()):Z.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(Ke.call(e,!0),Z.call(e,e.media,"playing"),e.timers.playing=setInterval((()=>{Z.call(e,e.media,"timeupdate")}),50),e.media.duration!==s.getDuration()&&(e.media.duration=s.getDuration(),Z.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),Ke.call(e,!1);break;case 3:Z.call(e,e.media,"waiting")}Z.call(e,e.elements.container,"statechange",!1,{code:i.data})}}})}},Xe={setup(){this.media?(R(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),R(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&R(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=$("div",{class:this.config.classNames.video}),L(this.media,this.elements.wrapper),this.elements.poster=$("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?de.setup.call(this):this.isYouTube?Qe.setup.call(this):this.isVimeo&&ze.setup.call(this)):this.debug.warn("No media element found!")}};class Je{constructor(t){e(this,"load",(()=>{this.enabled&&(S.object(window.google)&&S.object(window.google.ima)?this.ready():Be(this.player.config.urls.googleIMA.sdk).then((()=>{this.ready()})).catch((()=>{this.trigger("error",new Error("Google IMA SDK failed to load"))})))})),e(this,"ready",(()=>{var e;this.enabled||((e=this).manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()),this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then((()=>{this.clearSafetyTimer("onAdsManagerLoaded()")})),this.listeners(),this.setupIMA()})),e(this,"setupIMA",(()=>{this.elements.container=$("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container,this.player.media),this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,(e=>this.onAdsManagerLoaded(e)),!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(e=>this.onAdError(e)),!1),this.requestAds()})),e(this,"requestAds",(()=>{const{container:e}=this.player.elements;try{const t=new google.ima.AdsRequest;t.adTagUrl=this.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(t)}catch(e){this.onAdError(e)}})),e(this,"pollCountdown",((e=!1)=>{if(!e)return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval((()=>{const e=Ee(Math.max(this.manager.getRemainingTime(),0)),t=`${ve.get("advertisement",this.player.config)} - ${e}`;this.elements.container.setAttribute("data-badge-text",t)}),100)})),e(this,"onAdsManagerLoaded",(e=>{if(!this.enabled)return;const t=new google.ima.AdsRenderingSettings;t.restoreCustomPlaybackStateOnAdBreakComplete=!0,t.enablePreloading=!0,this.manager=e.getAdsManager(this.player,t),this.cuePoints=this.manager.getCuePoints(),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(e=>this.onAdError(e))),Object.keys(google.ima.AdEvent.Type).forEach((e=>{this.manager.addEventListener(google.ima.AdEvent.Type[e],(e=>this.onAdEvent(e)))})),this.trigger("loaded")})),e(this,"addCuePoints",(()=>{S.empty(this.cuePoints)||this.cuePoints.forEach((e=>{if(0!==e&&-1!==e&&e<this.player.duration){const t=this.player.elements.progress;if(S.element(t)){const i=100/this.player.duration*e,s=$("span",{class:this.player.config.classNames.cues});s.style.left=`${i.toString()}%`,t.appendChild(s)}}}))})),e(this,"onAdEvent",(e=>{const{container:t}=this.player.elements,i=e.getAd(),s=e.getAdData();switch((e=>{Z.call(this.player,this.player.media,`ads${e.replace(/_/g,"").toLowerCase()}`)})(e.type),e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),this.pollCountdown(!0),i.isLinear()||(i.width=t.offsetWidth,i.height=t.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:this.manager.setVolume(this.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:this.player.ended?this.loadAds():this.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.LOG:s.adError&&this.player.debug.warn(`Non-fatal ad error: ${s.adError.getMessage()}`)}})),e(this,"onAdError",(e=>{this.cancel(),this.player.debug.warn("Ads error",e)})),e(this,"listeners",(()=>{const{container:e}=this.player.elements;let t;this.player.on("canplay",(()=>{this.addCuePoints()})),this.player.on("ended",(()=>{this.loader.contentComplete()})),this.player.on("timeupdate",(()=>{t=this.player.currentTime})),this.player.on("seeked",(()=>{const e=this.player.currentTime;S.empty(this.cuePoints)||this.cuePoints.forEach(((i,s)=>{t<i&&i<e&&(this.manager.discardAdBreak(),this.cuePoints.splice(s,1))}))})),window.addEventListener("resize",(()=>{this.manager&&this.manager.resize(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL)}))})),e(this,"play",(()=>{const{container:e}=this.player.elements;this.managerPromise||this.resumeContent(),this.managerPromise.then((()=>{this.manager.setVolume(this.player.volume),this.elements.displayContainer.initialize();try{this.initialized||(this.manager.init(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL),this.manager.start()),this.initialized=!0}catch(e){this.onAdError(e)}})).catch((()=>{}))})),e(this,"resumeContent",(()=>{this.elements.container.style.zIndex="",this.playing=!1,ie(this.player.media.play())})),e(this,"pauseContent",(()=>{this.elements.container.style.zIndex=3,this.playing=!0,this.player.media.pause()})),e(this,"cancel",(()=>{this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()})),e(this,"loadAds",(()=>{this.managerPromise.then((()=>{this.manager&&this.manager.destroy(),this.managerPromise=new Promise((e=>{this.on("loaded",e),this.player.debug.log(this.manager)})),this.initialized=!1,this.requestAds()})).catch((()=>{}))})),e(this,"trigger",((e,...t)=>{const i=this.events[e];S.array(i)&&i.forEach((e=>{S.function(e)&&e.apply(this,t)}))})),e(this,"on",((e,t)=>(S.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this))),e(this,"startSafetyTimer",((e,t)=>{this.player.debug.log(`Safety timer invoked from: ${t}`),this.safetyTimer=setTimeout((()=>{this.cancel(),this.clearSafetyTimer("startSafetyTimer()")}),e)})),e(this,"clearSafetyTimer",(e=>{S.nullOrUndefined(this.safetyTimer)||(this.player.debug.log(`Safety timer cleared from: ${e}`),clearTimeout(this.safetyTimer),this.safetyTimer=null)})),this.player=t,this.config=t.config.ads,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(((e,t)=>{this.on("loaded",e),this.on("error",t)})),this.load()}get enabled(){const{config:e}=this;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!S.empty(e.publisherId)||S.url(e.tagUrl))}get tagUrl(){const{config:e}=this;if(S.url(e.tagUrl))return e.tagUrl;return`https://go.aniview.com/api/adserver6/vast/?${Ne({AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId})}`}}function Ge(e=0,t=0,i=255){return Math.min(Math.max(e,t),i)}const Ze=e=>{const t=[];return e.split(/\r\n\r\n|\n\n|\r\r/).forEach((e=>{const i={};e.split(/\r\n|\n|\r/).forEach((e=>{if(S.number(i.startTime)){if(!S.empty(e.trim())&&S.empty(i.text)){const t=e.trim().split("#xywh=");[i.text]=t,t[1]&&([i.x,i.y,i.w,i.h]=t[1].split(","))}}else{const t=e.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);t&&(i.startTime=60*Number(t[1]||0)*60+60*Number(t[2])+Number(t[3])+Number(`0.${t[4]}`),i.endTime=60*Number(t[6]||0)*60+60*Number(t[7])+Number(t[8])+Number(`0.${t[9]}`))}})),i.text&&t.push(i)})),t},et=(e,t)=>{const i={};return e>t.width/t.height?(i.width=t.width,i.height=1/e*t.width):(i.height=t.height,i.width=e*t.height),i};class tt{constructor(t){e(this,"load",(()=>{this.player.elements.display.seekTooltip&&(this.player.elements.display.seekTooltip.hidden=this.enabled),this.enabled&&this.getThumbnails().then((()=>{this.enabled&&(this.render(),this.determineContainerAutoSizing(),this.listeners(),this.loaded=!0)}))})),e(this,"getThumbnails",(()=>new Promise((e=>{const{src:t}=this.player.config.previewThumbnails;if(S.empty(t))throw new Error("Missing previewThumbnails.src config attribute");const i=()=>{this.thumbnails.sort(((e,t)=>e.height-t.height)),this.player.debug.log("Preview thumbnails",this.thumbnails),e()};if(S.function(t))t((e=>{this.thumbnails=e,i()}));else{const e=(S.string(t)?[t]:t).map((e=>this.getThumbnail(e)));Promise.all(e).then(i)}})))),e(this,"getThumbnail",(e=>new Promise((t=>{Te(e).then((i=>{const s={frames:Ze(i),height:null,urlPrefix:""};s.frames[0].text.startsWith("/")||s.frames[0].text.startsWith("http://")||s.frames[0].text.startsWith("https://")||(s.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));const n=new Image;n.onload=()=>{s.height=n.naturalHeight,s.width=n.naturalWidth,this.thumbnails.push(s),t()},n.src=s.urlPrefix+s.frames[0].text}))})))),e(this,"startMove",(e=>{if(this.loaded&&S.event(e)&&["touchmove","mousemove"].includes(e.type)&&this.player.media.duration){if("touchmove"===e.type)this.seekTime=this.player.media.duration*(this.player.elements.inputs.seek.value/100);else{var t,i;const s=this.player.elements.progress.getBoundingClientRect(),n=100/s.width*(e.pageX-s.left);this.seekTime=this.player.media.duration*(n/100),this.seekTime<0&&(this.seekTime=0),this.seekTime>this.player.media.duration-1&&(this.seekTime=this.player.media.duration-1),this.mousePosX=e.pageX,this.elements.thumb.time.innerText=Ee(this.seekTime);const a=null===(t=this.player.config.markers)||void 0===t||null===(i=t.points)||void 0===i?void 0:i.find((({time:e})=>e===Math.round(this.seekTime)));a&&this.elements.thumb.time.insertAdjacentHTML("afterbegin",`${a.label}<br>`)}this.showImageAtCurrentTime()}})),e(this,"endMove",(()=>{this.toggleThumbContainer(!1,!0)})),e(this,"startScrubbing",(e=>{(S.nullOrUndefined(e.button)||!1===e.button||0===e.button)&&(this.mouseDown=!0,this.player.media.duration&&(this.toggleScrubbingContainer(!0),this.toggleThumbContainer(!1,!0),this.showImageAtCurrentTime()))})),e(this,"endScrubbing",(()=>{this.mouseDown=!1,Math.ceil(this.lastTime)===Math.ceil(this.player.media.currentTime)?this.toggleScrubbingContainer(!1):G.call(this.player,this.player.media,"timeupdate",(()=>{this.mouseDown||this.toggleScrubbingContainer(!1)}))})),e(this,"listeners",(()=>{this.player.on("play",(()=>{this.toggleThumbContainer(!1,!0)})),this.player.on("seeked",(()=>{this.toggleThumbContainer(!1)})),this.player.on("timeupdate",(()=>{this.lastTime=this.player.media.currentTime}))})),e(this,"render",(()=>{this.elements.thumb.container=$("div",{class:this.player.config.classNames.previewThumbnails.thumbContainer}),this.elements.thumb.imageContainer=$("div",{class:this.player.config.classNames.previewThumbnails.imageContainer}),this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);const e=$("div",{class:this.player.config.classNames.previewThumbnails.timeContainer});this.elements.thumb.time=$("span",{},"00:00"),e.appendChild(this.elements.thumb.time),this.elements.thumb.imageContainer.appendChild(e),S.element(this.player.elements.progress)&&this.player.elements.progress.appendChild(this.elements.thumb.container),this.elements.scrubbing.container=$("div",{class:this.player.config.classNames.previewThumbnails.scrubbingContainer}),this.player.elements.wrapper.appendChild(this.elements.scrubbing.container)})),e(this,"destroy",(()=>{this.elements.thumb.container&&this.elements.thumb.container.remove(),this.elements.scrubbing.container&&this.elements.scrubbing.container.remove()})),e(this,"showImageAtCurrentTime",(()=>{this.mouseDown?this.setScrubbingContainerSize():this.setThumbContainerSizeAndPos();const e=this.thumbnails[0].frames.findIndex((e=>this.seekTime>=e.startTime&&this.seekTime<=e.endTime)),t=e>=0;let i=0;this.mouseDown||this.toggleThumbContainer(t),t&&(this.thumbnails.forEach(((t,s)=>{this.loadedImages.includes(t.frames[e].text)&&(i=s)})),e!==this.showingThumb&&(this.showingThumb=e,this.loadImage(i)))})),e(this,"loadImage",((e=0)=>{const t=this.showingThumb,i=this.thumbnails[e],{urlPrefix:s}=i,n=i.frames[t],a=i.frames[t].text,l=s+a;if(this.currentImageElement&&this.currentImageElement.dataset.filename===a)this.showImage(this.currentImageElement,n,e,t,a,!1),this.currentImageElement.dataset.index=t,this.removeOldImages(this.currentImageElement);else{this.loadingImage&&this.usingSprites&&(this.loadingImage.onload=null);const i=new Image;i.src=l,i.dataset.index=t,i.dataset.filename=a,this.showingThumbFilename=a,this.player.debug.log(`Loading image: ${l}`),i.onload=()=>this.showImage(i,n,e,t,a,!0),this.loadingImage=i,this.removeOldImages(i)}})),e(this,"showImage",((e,t,i,s,n,a=!0)=>{this.player.debug.log(`Showing thumb: ${n}. num: ${s}. qual: ${i}. newimg: ${a}`),this.setImageSizeAndOffset(e,t),a&&(this.currentImageContainer.appendChild(e),this.currentImageElement=e,this.loadedImages.includes(n)||this.loadedImages.push(n)),this.preloadNearby(s,!0).then(this.preloadNearby(s,!1)).then(this.getHigherQuality(i,e,t,n))})),e(this,"removeOldImages",(e=>{Array.from(this.currentImageContainer.children).forEach((t=>{if("img"!==t.tagName.toLowerCase())return;const i=this.usingSprites?500:1e3;if(t.dataset.index!==e.dataset.index&&!t.dataset.deleting){t.dataset.deleting=!0;const{currentImageContainer:e}=this;setTimeout((()=>{e.removeChild(t),this.player.debug.log(`Removing thumb: ${t.dataset.filename}`)}),i)}}))})),e(this,"preloadNearby",((e,t=!0)=>new Promise((i=>{setTimeout((()=>{const s=this.thumbnails[0].frames[e].text;if(this.showingThumbFilename===s){let n;n=t?this.thumbnails[0].frames.slice(e):this.thumbnails[0].frames.slice(0,e).reverse();let a=!1;n.forEach((e=>{const t=e.text;if(t!==s&&!this.loadedImages.includes(t)){a=!0,this.player.debug.log(`Preloading thumb filename: ${t}`);const{urlPrefix:e}=this.thumbnails[0],s=e+t,n=new Image;n.src=s,n.onload=()=>{this.player.debug.log(`Preloaded thumb filename: ${t}`),this.loadedImages.includes(t)||this.loadedImages.push(t),i()}}})),a||i()}}),300)})))),e(this,"getHigherQuality",((e,t,i,s)=>{if(e<this.thumbnails.length-1){let n=t.naturalHeight;this.usingSprites&&(n=i.h),n<this.thumbContainerHeight&&setTimeout((()=>{this.showingThumbFilename===s&&(this.player.debug.log(`Showing higher quality thumb for: ${s}`),this.loadImage(e+1))}),300)}})),e(this,"toggleThumbContainer",((e=!1,t=!1)=>{const i=this.player.config.classNames.previewThumbnails.thumbContainerShown;this.elements.thumb.container.classList.toggle(i,e),!e&&t&&(this.showingThumb=null,this.showingThumbFilename=null)})),e(this,"toggleScrubbingContainer",((e=!1)=>{const t=this.player.config.classNames.previewThumbnails.scrubbingContainerShown;this.elements.scrubbing.container.classList.toggle(t,e),e||(this.showingThumb=null,this.showingThumbFilename=null)})),e(this,"determineContainerAutoSizing",(()=>{(this.elements.thumb.imageContainer.clientHeight>20||this.elements.thumb.imageContainer.clientWidth>20)&&(this.sizeSpecifiedInCSS=!0)})),e(this,"setThumbContainerSizeAndPos",(()=>{const{imageContainer:e}=this.elements.thumb;if(this.sizeSpecifiedInCSS){if(e.clientHeight>20&&e.clientWidth<20){const t=Math.floor(e.clientHeight*this.thumbAspectRatio);e.style.width=`${t}px`}else if(e.clientHeight<20&&e.clientWidth>20){const t=Math.floor(e.clientWidth/this.thumbAspectRatio);e.style.height=`${t}px`}}else{const t=Math.floor(this.thumbContainerHeight*this.thumbAspectRatio);e.style.height=`${this.thumbContainerHeight}px`,e.style.width=`${t}px`}this.setThumbContainerPos()})),e(this,"setThumbContainerPos",(()=>{const e=this.player.elements.progress.getBoundingClientRect(),t=this.player.elements.container.getBoundingClientRect(),{container:i}=this.elements.thumb,s=t.left-e.left+10,n=t.right-e.left-i.clientWidth-10,a=this.mousePosX-e.left-i.clientWidth/2,l=Ge(a,s,n);i.style.left=`${l}px`,i.style.setProperty("--preview-arrow-offset",a-l+"px")})),e(this,"setScrubbingContainerSize",(()=>{const{width:e,height:t}=et(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight});this.elements.scrubbing.container.style.width=`${e}px`,this.elements.scrubbing.container.style.height=`${t}px`})),e(this,"setImageSizeAndOffset",((e,t)=>{if(!this.usingSprites)return;const i=this.thumbContainerHeight/t.h;e.style.height=e.naturalHeight*i+"px",e.style.width=e.naturalWidth*i+"px",e.style.left=`-${t.x*i}px`,e.style.top=`-${t.y*i}px`})),this.player=t,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}get enabled(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}get currentImageContainer(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}get usingSprites(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}get thumbAspectRatio(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}get thumbContainerHeight(){if(this.mouseDown){const{height:e}=et(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight});return e}return this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}get currentImageElement(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement}set currentImageElement(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}const it={insertElements(e,t){S.string(t)?_(e,this.media,{src:t}):S.array(t)&&t.forEach((t=>{_(e,this.media,t)}))},change(e){N(e,"sources.length")?(de.cancelRequests.call(this),this.destroy.call(this,(()=>{this.options.quality=[],O(this.media),this.media=null,S.element(this.elements.container)&&this.elements.container.removeAttribute("class");const{sources:t,type:i}=e,[{provider:s=_e.html5,src:n}]=t,a="html5"===s?i:"div",l="html5"===s?{}:{src:n};Object.assign(this,{provider:s,type:i,supported:K.check(i,s,this.config.playsinline),media:$(a,l)}),this.elements.container.appendChild(this.media),S.boolean(e.autoplay)&&(this.config.autoplay=e.autoplay),this.isHTML5&&(this.config.crossorigin&&this.media.setAttribute("crossorigin",""),this.config.autoplay&&this.media.setAttribute("autoplay",""),S.empty(e.poster)||(this.poster=e.poster),this.config.loop.active&&this.media.setAttribute("loop",""),this.config.muted&&this.media.setAttribute("muted",""),this.config.playsinline&&this.media.setAttribute("playsinline","")),Fe.addStyleHook.call(this),this.isHTML5&&it.insertElements.call(this,"source",t),this.config.title=e.title,Xe.setup.call(this),this.isHTML5&&Object.keys(e).includes("tracks")&&it.insertElements.call(this,"track",e.tracks),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&Fe.build.call(this),this.isHTML5&&this.media.load(),S.empty(e.previewThumbnails)||(Object.assign(this.config.previewThumbnails,e.previewThumbnails),this.previewThumbnails&&this.previewThumbnails.loaded&&(this.previewThumbnails.destroy(),this.previewThumbnails=null),this.config.previewThumbnails.enabled&&(this.previewThumbnails=new tt(this))),this.fullscreen.update()}),!0)):this.debug.warn("Invalid source format")}};class st{constructor(t,i){if(e(this,"play",(()=>S.function(this.media.play)?(this.ads&&this.ads.enabled&&this.ads.managerPromise.then((()=>this.ads.play())).catch((()=>ie(this.media.play()))),this.media.play()):null)),e(this,"pause",(()=>this.playing&&S.function(this.media.pause)?this.media.pause():null)),e(this,"togglePlay",(e=>(S.boolean(e)?e:!this.playing)?this.play():this.pause())),e(this,"stop",(()=>{this.isHTML5?(this.pause(),this.restart()):S.function(this.media.stop)&&this.media.stop()})),e(this,"restart",(()=>{this.currentTime=0})),e(this,"rewind",(e=>{this.currentTime-=S.number(e)?e:this.config.seekTime})),e(this,"forward",(e=>{this.currentTime+=S.number(e)?e:this.config.seekTime})),e(this,"increaseVolume",(e=>{const t=this.media.muted?0:this.volume;this.volume=t+(S.number(e)?e:0)})),e(this,"decreaseVolume",(e=>{this.increaseVolume(-e)})),e(this,"airplay",(()=>{K.airplay&&this.media.webkitShowPlaybackTargetPicker()})),e(this,"toggleControls",(e=>{if(this.supported.ui&&!this.isAudio){const t=F(this.elements.container,this.config.classNames.hideControls),i=void 0===e?void 0:!e,s=R(this.elements.container,this.config.classNames.hideControls,i);if(s&&S.array(this.config.controls)&&this.config.controls.includes("settings")&&!S.empty(this.config.settings)&&Pe.toggleMenu.call(this,!1),s!==t){const e=s?"controlshidden":"controlsshown";Z.call(this,this.media,e)}return!s}return!1})),e(this,"on",((e,t)=>{X.call(this,this.elements.container,e,t)})),e(this,"once",((e,t)=>{G.call(this,this.elements.container,e,t)})),e(this,"off",((e,t)=>{J(this.elements.container,e,t)})),e(this,"destroy",((e,t=!1)=>{if(!this.ready)return;const i=()=>{document.body.style.overflow="",this.embed=null,t?(Object.keys(this.elements).length&&(O(this.elements.buttons.play),O(this.elements.captions),O(this.elements.controls),O(this.elements.wrapper),this.elements.buttons.play=null,this.elements.captions=null,this.elements.controls=null,this.elements.wrapper=null),S.function(e)&&e()):(ee.call(this),de.cancelRequests.call(this),q(this.elements.original,this.elements.container),Z.call(this,this.elements.original,"destroyed",!0),S.function(e)&&e.call(this.elements.original),this.ready=!1,setTimeout((()=>{this.elements=null,this.media=null}),200))};this.stop(),clearTimeout(this.timers.loading),clearTimeout(this.timers.controls),clearTimeout(this.timers.resized),this.isHTML5?(Fe.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&S.function(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))})),e(this,"supports",(e=>K.mime.call(this,e))),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=K.touch,this.media=t,S.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||S.nodeList(this.media)||S.array(this.media))&&(this.media=this.media[0]),this.config=x({},Le,st.defaults,i||{},(()=>{try{return JSON.parse(this.media.getAttribute("data-plyr-config"))}catch(e){return{}}})()),this.elements={container:null,fullscreen:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new De(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",K),S.nullOrUndefined(this.media)||!S.element(this.media))return void this.debug.error("Setup failed: no suitable element passed");if(this.media.plyr)return void this.debug.warn("Target already setup");if(!this.config.enabled)return void this.debug.error("Setup failed: disabled by config");if(!K.check().api)return void this.debug.error("Setup failed: no support");const s=this.media.cloneNode(!0);s.autoplay=!1,this.elements.original=s;const n=this.media.tagName.toLowerCase();let a=null,l=null;switch(n){case"div":if(a=this.media.querySelector("iframe"),S.element(a)){if(l=Me(a.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?_e.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?_e.vimeo:null}(l.toString()),this.elements.container=this.media,this.media=a,this.elements.container.className="",l.search.length){const e=["1","true"];e.includes(l.searchParams.get("autoplay"))&&(this.config.autoplay=!0),e.includes(l.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=e.includes(l.searchParams.get("playsinline")),this.config.youtube.hl=l.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(S.empty(this.provider)||!Object.values(_e).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=je;break;case"video":case"audio":this.type=n,this.provider=_e.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-playsinline"))&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=K.check(this.type,this.provider),this.supported.api?(this.eventListeners=[],this.listeners=new Ve(this),this.storage=new we(this),this.media.plyr=this,S.element(this.elements.container)||(this.elements.container=$("div"),L(this.media,this.elements.container)),Fe.migrateStyles.call(this),Fe.addStyleHook.call(this),Xe.setup.call(this),this.config.debug&&X.call(this,this.elements.container,this.config.events.join(" "),(e=>{this.debug.log(`event: ${e.type}`)})),this.fullscreen=new He(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&Fe.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new Je(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",(()=>ie(this.play()))),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new tt(this))):this.debug.error("Setup failed: no support")}get isHTML5(){return this.provider===_e.html5}get isEmbed(){return this.isYouTube||this.isVimeo}get isYouTube(){return this.provider===_e.youtube}get isVimeo(){return this.provider===_e.vimeo}get isVideo(){return this.type===je}get isAudio(){return this.type===Oe}get playing(){return Boolean(this.ready&&!this.paused&&!this.ended)}get paused(){return Boolean(this.media.paused)}get stopped(){return Boolean(this.paused&&0===this.currentTime)}get ended(){return Boolean(this.media.ended)}set currentTime(e){if(!this.duration)return;const t=S.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log(`Seeking to ${this.currentTime} seconds`)}get currentTime(){return Number(this.media.currentTime)}get buffered(){const{buffered:e}=this.media;return S.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}get seeking(){return Boolean(this.media.seeking)}get duration(){const e=parseFloat(this.config.duration),t=(this.media||{}).duration,i=S.number(t)&&t!==1/0?t:0;return e||i}set volume(e){let t=e;S.string(t)&&(t=Number(t)),S.number(t)||(t=this.storage.get("volume")),S.number(t)||({volume:t}=this.config),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!S.empty(e)&&this.muted&&t>0&&(this.muted=!1)}get volume(){return Number(this.media.volume)}set muted(e){let t=e;S.boolean(t)||(t=this.storage.get("muted")),S.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t}get muted(){return Boolean(this.media.muted)}get hasAudio(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}set speed(e){let t=null;S.number(e)&&(t=e),S.number(t)||(t=this.storage.get("speed")),S.number(t)||(t=this.config.speed.selected);const{minimumSpeed:i,maximumSpeed:s}=this;t=Ge(t,i,s),this.config.speed.selected=t,setTimeout((()=>{this.media&&(this.media.playbackRate=t)}),0)}get speed(){return Number(this.media.playbackRate)}get minimumSpeed(){return this.isYouTube?Math.min(...this.options.speed):this.isVimeo?.5:.0625}get maximumSpeed(){return this.isYouTube?Math.max(...this.options.speed):this.isVimeo?2:16}set quality(e){const t=this.config.quality,i=this.options.quality;if(!i.length)return;let s=[!S.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(S.number),n=!0;if(!i.includes(s)){const e=ne(i,s);this.debug.warn(`Unsupported quality option: ${s}, using ${e} instead`),s=e,n=!1}t.selected=s,this.media.quality=s,n&&this.storage.set({quality:s})}get quality(){return this.media.quality}set loop(e){const t=S.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t}get loop(){return Boolean(this.media.loop)}set source(e){it.change.call(this,e)}get source(){return this.media.currentSrc}get download(){const{download:e}=this.config.urls;return S.url(e)?e:this.source}set download(e){S.url(e)&&(this.config.urls.download=e,Pe.setDownloadUrl.call(this))}set poster(e){this.isVideo?Fe.setPoster.call(this,e,!1).catch((()=>{})):this.debug.warn("Poster can only be set for video")}get poster(){return this.isVideo?this.media.getAttribute("poster")||this.media.getAttribute("data-poster"):null}get ratio(){if(!this.isVideo)return null;const e=oe(ce.call(this));return S.array(e)?e.join(":"):e}set ratio(e){this.isVideo?S.string(e)&&re(e)?(this.config.ratio=oe(e),ue.call(this)):this.debug.error(`Invalid aspect ratio specified (${e})`):this.debug.warn("Aspect ratio can only be set for video")}set autoplay(e){this.config.autoplay=S.boolean(e)?e:this.config.autoplay}get autoplay(){return Boolean(this.config.autoplay)}toggleCaptions(e){xe.toggle.call(this,e,!1)}set currentTrack(e){xe.set.call(this,e,!1),xe.setup.call(this)}get currentTrack(){const{toggled:e,currentTrack:t}=this.captions;return e?t:-1}set language(e){xe.setLanguage.call(this,e,!1)}get language(){return(xe.getCurrentTrack.call(this)||{}).language}set pip(e){if(!K.pip)return;const t=S.boolean(e)?e:!this.pip;S.function(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?Ie:$e),S.function(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}get pip(){return K.pip?S.empty(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===Ie:null}setPreviewThumbnails(e){this.previewThumbnails&&this.previewThumbnails.loaded&&(this.previewThumbnails.destroy(),this.previewThumbnails=null),Object.assign(this.config.previewThumbnails,e),this.config.previewThumbnails.enabled&&(this.previewThumbnails=new tt(this))}static supported(e,t){return K.check(e,t)}static loadSprite(e,t){return ke(e,t)}static setup(e,t={}){let i=null;return S.string(e)?i=Array.from(document.querySelectorAll(e)):S.nodeList(e)?i=Array.from(e):S.array(e)&&(i=e.filter(S.element)),S.empty(i)?null:i.map((e=>new st(e,t)))}}var nt;return st.defaults=(nt=Le,JSON.parse(JSON.stringify(nt))),st}));
+"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):(e="undefined"!=typeof globalThis?globalThis:e||self).Plyr=t()}(this,(function(){"use strict";function e(e,t,i){return(t=function(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var i=e[Symbol.toPrimitive];if(void 0!==i){var s=i.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function t(e,t){for(var i=0;i<t.length;i++){var s=t[i];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(e,s.key,s)}}function i(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function s(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);t&&(s=s.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,s)}return i}function n(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?s(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var a={addCSS:!0,thumbWidth:15,watch:!0};var l=function(e){return null!=e?e.constructor:null},r=function(e,t){return!!(e&&t&&e instanceof t)},o=function(e){return null==e},c=function(e){return l(e)===Object},u=function(e){return l(e)===String},h=function(e){return Array.isArray(e)},d=function(e){return r(e,NodeList)},m={nullOrUndefined:o,object:c,number:function(e){return l(e)===Number&&!Number.isNaN(e)},string:u,boolean:function(e){return l(e)===Boolean},function:function(e){return l(e)===Function},array:h,nodeList:d,element:function(e){return r(e,Element)},event:function(e){return r(e,Event)},empty:function(e){return o(e)||(u(e)||h(e)||d(e))&&!e.length||c(e)&&!Object.keys(e).length}};function p(e,t){if(1>t){var i=function(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}(t);return parseFloat(e.toFixed(i))}return Math.round(e/t)*t}var g=function(){function e(t,i){(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,e),m.element(t)?this.element=t:m.string(t)&&(this.element=document.querySelector(t)),m.element(this.element)&&m.empty(this.element.rangeTouch)&&(this.config=n({},a,{},i),this.init())}return function(e,i,s){i&&t(e.prototype,i),s&&t(e,s)}(e,[{key:"init",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="",this.element.style.webKitUserSelect="",this.element.style.touchAction=""),this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,i=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach((function(e){t.element[i](e,(function(e){return t.set(e)}),!1)}))}},{key:"get",value:function(t){if(!e.enabled||!m.event(t))return null;var i,s=t.target,n=t.changedTouches[0],a=parseFloat(s.getAttribute("min"))||0,l=parseFloat(s.getAttribute("max"))||100,r=parseFloat(s.getAttribute("step"))||1,o=s.getBoundingClientRect(),c=100/o.width*(this.config.thumbWidth/2)/100;return 0>(i=100/o.width*(n.clientX-o.left))?i=0:100<i&&(i=100),50>i?i-=(100-2*i)*c:50<i&&(i+=2*(i-50)*c),a+p(i/100*(l-a),r)}},{key:"set",value:function(t){e.enabled&&m.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),function(e,t){if(e&&t){var i=new Event(t,{bubbles:!0});e.dispatchEvent(i)}}(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var i=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},s=null;if(m.empty(t)||m.string(t)?s=Array.from(document.querySelectorAll(m.string(t)?t:'input[type="range"]')):m.element(t)?s=[t]:m.nodeList(t)?s=Array.from(t):m.array(t)&&(s=t.filter(m.element)),m.empty(s))return null;var l=n({},a,{},i);if(m.string(t)&&l.watch){var r=new MutationObserver((function(i){Array.from(i).forEach((function(i){Array.from(i.addedNodes).forEach((function(i){m.element(i)&&function(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}(i,t)&&new e(i,l)}))}))}));r.observe(document.body,{childList:!0,subtree:!0})}return s.map((function(t){return new e(t,i)}))}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}();const f=e=>null!=e?e.constructor:null,y=(e,t)=>Boolean(e&&t&&e instanceof t),b=e=>null==e,v=e=>f(e)===Object,w=e=>f(e)===String,T=e=>"function"==typeof e,k=e=>Array.isArray(e),C=e=>y(e,NodeList),A=e=>b(e)||(w(e)||k(e)||C(e))&&!e.length||v(e)&&!Object.keys(e).length;var S={nullOrUndefined:b,object:v,number:e=>f(e)===Number&&!Number.isNaN(e),string:w,boolean:e=>f(e)===Boolean,function:T,array:k,weakMap:e=>y(e,WeakMap),nodeList:C,element:e=>null!==e&&"object"==typeof e&&1===e.nodeType&&"object"==typeof e.style&&"object"==typeof e.ownerDocument,textNode:e=>f(e)===Text,event:e=>y(e,Event),keyboardEvent:e=>y(e,KeyboardEvent),cue:e=>y(e,window.TextTrackCue)||y(e,window.VTTCue),track:e=>y(e,TextTrack)||!b(e)&&w(e.kind),promise:e=>y(e,Promise)&&T(e.then),url:e=>{if(y(e,window.URL))return!0;if(!w(e))return!1;let t=e;e.startsWith("http://")&&e.startsWith("https://")||(t=`http://${e}`);try{return!A(new URL(t).hostname)}catch(e){return!1}},empty:A};const E=(()=>{const e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},i=Object.keys(t).find((t=>void 0!==e.style[t]));return!!S.string(i)&&t[i]})();function P(e,t){setTimeout((()=>{try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch(e){}}),t)}var M={isIE:Boolean(window.document.documentMode),isEdge:/Edge/g.test(navigator.userAgent),isWebKit:"WebkitAppearance"in document.documentElement.style&&!/Edge/g.test(navigator.userAgent),isIPhone:/iPhone|iPod/gi.test(navigator.userAgent)&&navigator.maxTouchPoints>1,isIPadOS:"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1,isIos:/iPad|iPhone|iPod/gi.test(navigator.userAgent)&&navigator.maxTouchPoints>1};function N(e,t){return t.split(".").reduce(((e,t)=>e&&e[t]),e)}function x(e={},...t){if(!t.length)return e;const i=t.shift();return S.object(i)?(Object.keys(i).forEach((t=>{S.object(i[t])?(Object.keys(e).includes(t)||Object.assign(e,{[t]:{}}),x(e[t],i[t])):Object.assign(e,{[t]:i[t]})})),x(e,...t)):e}function L(e,t){const i=e.length?e:[e];Array.from(i).reverse().forEach(((e,i)=>{const s=i>0?t.cloneNode(!0):t,n=e.parentNode,a=e.nextSibling;s.appendChild(e),a?n.insertBefore(s,a):n.appendChild(s)}))}function I(e,t){S.element(e)&&!S.empty(t)&&Object.entries(t).filter((([,e])=>!S.nullOrUndefined(e))).forEach((([t,i])=>e.setAttribute(t,i)))}function $(e,t,i){const s=document.createElement(e);return S.object(t)&&I(s,t),S.string(i)&&(s.innerText=i),s}function _(e,t,i,s){S.element(t)&&t.appendChild($(e,i,s))}function O(e){S.nodeList(e)||S.array(e)?Array.from(e).forEach(O):S.element(e)&&S.element(e.parentNode)&&e.parentNode.removeChild(e)}function j(e){if(!S.element(e))return;let{length:t}=e.childNodes;for(;t>0;)e.removeChild(e.lastChild),t-=1}function q(e,t){return S.element(t)&&S.element(t.parentNode)&&S.element(e)?(t.parentNode.replaceChild(e,t),e):null}function D(e,t){if(!S.string(e)||S.empty(e))return{};const i={},s=x({},t);return e.split(",").forEach((e=>{const t=e.trim(),n=t.replace(".",""),a=t.replace(/[[\]]/g,"").split("="),[l]=a,r=a.length>1?a[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":S.string(s.class)?i.class=`${s.class} ${n}`:i.class=n;break;case"#":i.id=t.replace("#","");break;case"[":i[l]=r}})),x(s,i)}function H(e,t){if(!S.element(e))return;let i=t;S.boolean(i)||(i=!e.hidden),e.hidden=i}function R(e,t,i){if(S.nodeList(e))return Array.from(e).map((e=>R(e,t,i)));if(S.element(e)){let s="toggle";return void 0!==i&&(s=i?"add":"remove"),e.classList[s](t),e.classList.contains(t)}return!1}function F(e,t){return S.element(e)&&e.classList.contains(t)}function V(e,t){const{prototype:i}=Element;return(i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function U(e){return this.elements.container.querySelectorAll(e)}function B(e){return this.elements.container.querySelector(e)}function W(e=null,t=!1){S.element(e)&&e.focus({preventScroll:!0,focusVisible:t})}const z={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},K={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check(e,t){const i=K[e]||"html5"!==t;return{api:i,ui:i&&K.rangeInput}},pip:!(M.isIPhone||!S.function($("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||$("video").disablePictureInPicture)),airplay:S.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime(e){if(S.empty(e))return!1;const[t]=e.split("/");let i=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(z).includes(i)&&(i+=`; codecs="${z[e]}"`);try{return Boolean(i&&this.media.canPlayType(i).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(()=>{const e=document.createElement("input");return e.type="range","range"===e.type})(),touch:"ontouchstart"in document.documentElement,transitions:!1!==E,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},Y=(()=>{let e=!1;try{const t=Object.defineProperty({},"passive",{get:()=>(e=!0,null)});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e})();function Q(e,t,i,s=!1,n=!0,a=!1){if(!e||!("addEventListener"in e)||S.empty(t)||!S.function(i))return;const l=t.split(" ");let r=a;Y&&(r={passive:n,capture:a}),l.forEach((t=>{this&&this.eventListeners&&s&&this.eventListeners.push({element:e,type:t,callback:i,options:r}),e[s?"addEventListener":"removeEventListener"](t,i,r)}))}function X(e,t="",i,s=!0,n=!1){Q.call(this,e,t,i,!0,s,n)}function J(e,t="",i,s=!0,n=!1){Q.call(this,e,t,i,!1,s,n)}function G(e,t="",i,s=!0,n=!1){const a=(...l)=>{J(e,t,a,s,n),i.apply(this,l)};Q.call(this,e,t,a,!0,s,n)}function Z(e,t="",i=!1,s={}){if(!S.element(e)||S.empty(t))return;const n=new CustomEvent(t,{bubbles:i,detail:{...s,plyr:this}});e.dispatchEvent(n)}function ee(){this&&this.eventListeners&&(this.eventListeners.forEach((e=>{const{element:t,type:i,callback:s,options:n}=e;t.removeEventListener(i,s,n)})),this.eventListeners=[])}function te(){return new Promise((e=>this.ready?setTimeout(e,0):X.call(this,this.elements.container,"ready",e))).then((()=>{}))}function ie(e){S.promise(e)&&e.then(null,(()=>{}))}function se(e){return S.array(e)?e.filter(((t,i)=>e.indexOf(t)===i)):e}function ne(e,t){return S.array(e)&&e.length?e.reduce(((e,i)=>Math.abs(i-t)<Math.abs(e-t)?i:e)):null}function ae(e){return!(!window||!window.CSS)&&window.CSS.supports(e)}const le=[[1,1],[4,3],[3,4],[5,4],[4,5],[3,2],[2,3],[16,10],[10,16],[16,9],[9,16],[21,9],[9,21],[32,9],[9,32]].reduce(((e,[t,i])=>({...e,[t/i]:[t,i]})),{});function re(e){if(!(S.array(e)||S.string(e)&&e.includes(":")))return!1;return(S.array(e)?e:e.split(":")).map(Number).every(S.number)}function oe(e){if(!S.array(e)||!e.every(S.number))return null;const[t,i]=e,s=(e,t)=>0===t?e:s(t,e%t),n=s(t,i);return[t/n,i/n]}function ce(e){const t=e=>re(e)?e.split(":").map(Number):null;let i=t(e);if(null===i&&(i=t(this.config.ratio)),null===i&&!S.empty(this.embed)&&S.array(this.embed.ratio)&&({ratio:i}=this.embed),null===i&&this.isHTML5){const{videoWidth:e,videoHeight:t}=this.media;i=[e,t]}return oe(i)}function ue(e){if(!this.isVideo)return{};const{wrapper:t}=this.elements,i=ce.call(this,e);if(!S.array(i))return{};const[s,n]=oe(i),a=100/s*n;if(ae(`aspect-ratio: ${s}/${n}`)?t.style.aspectRatio=`${s}/${n}`:t.style.paddingBottom=`${a}%`,this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){const e=100/this.media.offsetWidth*parseInt(window.getComputedStyle(this.media).paddingBottom,10),i=(e-a)/(e/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform=`translateY(-${i}%)`}else this.isHTML5&&t.classList.add(this.config.classNames.videoFixedRatio);return{padding:a,ratio:i}}function he(e,t,i=.05){const s=e/t,n=ne(Object.keys(le),s);return Math.abs(n-s)<=i?le[n]:[e,t]}const de={getSources(){if(!this.isHTML5)return[];return Array.from(this.media.querySelectorAll("source")).filter((e=>{const t=e.getAttribute("type");return!!S.empty(t)||K.mime.call(this,t)}))},getQualityOptions(){return this.config.quality.forced?this.config.quality.options:de.getSources.call(this).map((e=>Number(e.getAttribute("size")))).filter(Boolean)},setup(){if(!this.isHTML5)return;const e=this;e.options.speed=e.config.speed.options,S.empty(this.config.ratio)||ue.call(e),Object.defineProperty(e.media,"quality",{get(){const t=de.getSources.call(e).find((t=>t.getAttribute("src")===e.source));return t&&Number(t.getAttribute("size"))},set(t){if(e.quality!==t){if(e.config.quality.forced&&S.function(e.config.quality.onChange))e.config.quality.onChange(t);else{const i=de.getSources.call(e).find((e=>Number(e.getAttribute("size"))===t));if(!i)return;const{currentTime:s,paused:n,preload:a,readyState:l,playbackRate:r}=e.media;e.media.src=i.getAttribute("src"),("none"!==a||l)&&(e.once("loadedmetadata",(()=>{e.speed=r,e.currentTime=s,n||ie(e.play())})),e.media.load())}Z.call(e,e.media,"qualitychange",!1,{quality:t})}}})},cancelRequests(){this.isHTML5&&(O(de.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function me(e,...t){return S.empty(e)?e:e.toString().replace(/{(\d+)}/g,((e,i)=>t[i].toString()))}const pe=(e="",t="",i="")=>e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1"),"g"),i.toString()),ge=(e="")=>e.toString().replace(/\w\S*/g,(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()));function fe(e=""){let t=e.toString();return t=function(e=""){let t=e.toString();return t=pe(t,"-"," "),t=pe(t,"_"," "),t=ge(t),pe(t," ","")}(t),t.charAt(0).toLowerCase()+t.slice(1)}function ye(e){const t=document.createElement("div");return t.appendChild(e),t.innerHTML}const be={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},ve={get(e="",t={}){if(S.empty(e)||S.empty(t))return"";let i=N(t.i18n,e);if(S.empty(i))return Object.keys(be).includes(e)?be[e]:"";const s={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(s).forEach((([e,t])=>{i=pe(i,e,t)})),i}};class we{constructor(t){e(this,"get",(e=>{if(!we.supported||!this.enabled)return null;const t=window.localStorage.getItem(this.key);if(S.empty(t))return null;const i=JSON.parse(t);return S.string(e)&&e.length?i[e]:i})),e(this,"set",(e=>{if(!we.supported||!this.enabled)return;if(!S.object(e))return;let t=this.get();S.empty(t)&&(t={}),x(t,e);try{window.localStorage.setItem(this.key,JSON.stringify(t))}catch(e){}})),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}static get supported(){try{if(!("localStorage"in window))return!1;const e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}}}function Te(e,t="text"){return new Promise(((i,s)=>{try{const s=new XMLHttpRequest;if(!("withCredentials"in s))return;s.addEventListener("load",(()=>{if("text"===t)try{i(JSON.parse(s.responseText))}catch(e){i(s.responseText)}else i(s.response)})),s.addEventListener("error",(()=>{throw new Error(s.status)})),s.open("GET",e,!0),s.responseType=t,s.send()}catch(e){s(e)}}))}function ke(e,t){if(!S.string(e))return;const i="cache",s=S.string(t);let n=!1;const a=()=>null!==document.getElementById(t),l=(e,t)=>{e.innerHTML=t,s&&a()||document.body.insertAdjacentElement("afterbegin",e)};if(!s||!a()){const a=we.supported,r=document.createElement("div");if(r.setAttribute("hidden",""),s&&r.setAttribute("id",t),a){const e=window.localStorage.getItem(`${i}-${t}`);if(n=null!==e,n){const t=JSON.parse(e);l(r,t.content)}}Te(e).then((e=>{if(!S.empty(e)){if(a)try{window.localStorage.setItem(`${i}-${t}`,JSON.stringify({content:e}))}catch(e){}l(r,e)}})).catch((()=>{}))}}const Ce=e=>Math.trunc(e/60/60%60,10),Ae=e=>Math.trunc(e/60%60,10),Se=e=>Math.trunc(e%60,10);function Ee(e=0,t=!1,i=!1){if(!S.number(e))return Ee(void 0,t,i);const s=e=>`0${e}`.slice(-2);let n=Ce(e);const a=Ae(e),l=Se(e);return n=t||n>0?`${n}:`:"",`${i&&e>0?"-":""}${n}${s(a)}:${s(l)}`}const Pe={getIconUrl(){const e=new URL(this.config.iconUrl,window.location),t=window.location.host?window.location.host:window.top.location.host,i=e.host!==t||M.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:i}},findElements(){try{return this.elements.controls=B.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:U.call(this,this.config.selectors.buttons.play),pause:B.call(this,this.config.selectors.buttons.pause),restart:B.call(this,this.config.selectors.buttons.restart),rewind:B.call(this,this.config.selectors.buttons.rewind),fastForward:B.call(this,this.config.selectors.buttons.fastForward),mute:B.call(this,this.config.selectors.buttons.mute),pip:B.call(this,this.config.selectors.buttons.pip),airplay:B.call(this,this.config.selectors.buttons.airplay),settings:B.call(this,this.config.selectors.buttons.settings),captions:B.call(this,this.config.selectors.buttons.captions),fullscreen:B.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=B.call(this,this.config.selectors.progress),this.elements.inputs={seek:B.call(this,this.config.selectors.inputs.seek),volume:B.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:B.call(this,this.config.selectors.display.buffer),currentTime:B.call(this,this.config.selectors.display.currentTime),duration:B.call(this,this.config.selectors.display.duration)},S.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon(e,t){const i="http://www.w3.org/2000/svg",s=Pe.getIconUrl.call(this),n=`${s.cors?"":s.url}#${this.config.iconPrefix}`,a=document.createElementNS(i,"svg");I(a,x(t,{"aria-hidden":"true",focusable:"false"}));const l=document.createElementNS(i,"use"),r=`${n}-${e}`;return"href"in l&&l.setAttributeNS("http://www.w3.org/1999/xlink","href",r),l.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",r),a.appendChild(l),a},createLabel(e,t={}){const i=ve.get(e,this.config);return $("span",{...t,class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")},i)},createBadge(e){if(S.empty(e))return null;const t=$("span",{class:this.config.classNames.menu.value});return t.appendChild($("span",{class:this.config.classNames.menu.badge},e)),t},createButton(e,t){const i=x({},t);let s=fe(e);const n={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach((e=>{Object.keys(i).includes(e)&&(n[e]=i[e],delete i[e])})),"button"!==n.element||Object.keys(i).includes("type")||(i.type="button"),Object.keys(i).includes("class")?i.class.split(" ").some((e=>e===this.config.classNames.control))||x(i,{class:`${i.class} ${this.config.classNames.control}`}):i.class=this.config.classNames.control,e){case"play":n.toggle=!0,n.label="play",n.labelPressed="pause",n.icon="play",n.iconPressed="pause";break;case"mute":n.toggle=!0,n.label="mute",n.labelPressed="unmute",n.icon="volume",n.iconPressed="muted";break;case"captions":n.toggle=!0,n.label="enableCaptions",n.labelPressed="disableCaptions",n.icon="captions-off",n.iconPressed="captions-on";break;case"fullscreen":n.toggle=!0,n.label="enterFullscreen",n.labelPressed="exitFullscreen",n.icon="enter-fullscreen",n.iconPressed="exit-fullscreen";break;case"play-large":i.class+=` ${this.config.classNames.control}--overlaid`,s="play",n.label="play",n.icon="play";break;default:S.empty(n.label)&&(n.label=s),S.empty(n.icon)&&(n.icon=e)}const a=$(n.element);return n.toggle?(a.appendChild(Pe.createIcon.call(this,n.iconPressed,{class:"icon--pressed"})),a.appendChild(Pe.createIcon.call(this,n.icon,{class:"icon--not-pressed"})),a.appendChild(Pe.createLabel.call(this,n.labelPressed,{class:"label--pressed"})),a.appendChild(Pe.createLabel.call(this,n.label,{class:"label--not-pressed"}))):(a.appendChild(Pe.createIcon.call(this,n.icon)),a.appendChild(Pe.createLabel.call(this,n.label))),x(i,D(this.config.selectors.buttons[s],i)),I(a,i),"play"===s?(S.array(this.elements.buttons[s])||(this.elements.buttons[s]=[]),this.elements.buttons[s].push(a)):this.elements.buttons[s]=a,a},createRange(e,t){const i=$("input",x(D(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":ve.get(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=i,Pe.updateRangeFill.call(this,i),g.setup(i),i},createProgress(e,t){const i=$("progress",x(D(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){i.appendChild($("span",null,"0"));const t={played:"played",buffer:"buffered"}[e],s=t?ve.get(t,this.config):"";i.innerText=`% ${s.toLowerCase()}`}return this.elements.display[e]=i,i},createTime(e,t){const i=D(this.config.selectors.display[e],t),s=$("div",x(i,{class:`${i.class?i.class:""} ${this.config.classNames.display.time} `.trim(),"aria-label":ve.get(e,this.config),role:"timer"}),"00:00");return this.elements.display[e]=s,s},bindMenuItemShortcuts(e,t){X.call(this,e,"keydown keyup",(i=>{if(![" ","ArrowUp","ArrowDown","ArrowRight"].includes(i.key))return;if(i.preventDefault(),i.stopPropagation(),"keydown"===i.type)return;const s=V(e,'[role="menuitemradio"]');if(!s&&[" ","ArrowRight"].includes(i.key))Pe.showMenuPanel.call(this,t,!0);else{let t;" "!==i.key&&("ArrowDown"===i.key||s&&"ArrowRight"===i.key?(t=e.nextElementSibling,S.element(t)||(t=e.parentNode.firstElementChild)):(t=e.previousElementSibling,S.element(t)||(t=e.parentNode.lastElementChild)),W.call(this,t,!0))}}),!1),X.call(this,e,"keyup",(e=>{"Return"===e.key&&Pe.focusFirstMenuItem.call(this,null,!0)}))},createMenuItem({value:e,list:t,type:i,title:s,badge:n=null,checked:a=!1}){const l=D(this.config.selectors.inputs[i]),r=$("button",x(l,{type:"button",role:"menuitemradio",class:`${this.config.classNames.control} ${l.class?l.class:""}`.trim(),"aria-checked":a,value:e})),o=$("span");o.innerHTML=s,S.element(n)&&o.appendChild(n),r.appendChild(o),Object.defineProperty(r,"checked",{enumerable:!0,get:()=>"true"===r.getAttribute("aria-checked"),set(e){e&&Array.from(r.parentNode.children).filter((e=>V(e,'[role="menuitemradio"]'))).forEach((e=>e.setAttribute("aria-checked","false"))),r.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(r,"click keyup",(t=>{if(!S.keyboardEvent(t)||" "===t.key){switch(t.preventDefault(),t.stopPropagation(),r.checked=!0,i){case"language":this.currentTrack=Number(e);break;case"quality":this.quality=e;break;case"speed":this.speed=parseFloat(e)}Pe.showMenuPanel.call(this,"home",S.keyboardEvent(t))}}),i,!1),Pe.bindMenuItemShortcuts.call(this,r,i),t.appendChild(r)},formatTime(e=0,t=!1){if(!S.number(e))return e;return Ee(e,Ce(this.duration)>0,t)},updateTimeDisplay(e=null,t=0,i=!1){S.element(e)&&S.number(t)&&(e.innerText=Pe.formatTime(t,i))},updateVolume(){this.supported.ui&&(S.element(this.elements.inputs.volume)&&Pe.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),S.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange(e,t=0){S.element(e)&&(e.value=t,Pe.updateRangeFill.call(this,e))},updateProgress(e){if(!this.supported.ui||!S.event(e))return;let t=0;const i=(e,t)=>{const i=S.number(t)?t:0,s=S.element(e)?e:this.elements.display.buffer;if(S.element(s)){s.value=i;const e=s.getElementsByTagName("span")[0];S.element(e)&&(e.childNodes[0].nodeValue=i)}};if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":s=this.currentTime,n=this.duration,t=0===s||0===n||Number.isNaN(s)||Number.isNaN(n)?0:(s/n*100).toFixed(2),"timeupdate"===e.type&&Pe.setRange.call(this,this.elements.inputs.seek,t);break;case"playing":case"progress":i(this.elements.display.buffer,100*this.buffered)}var s,n},updateRangeFill(e){const t=S.event(e)?e.target:e;if(S.element(t)&&"range"===t.getAttribute("type")){if(V(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);const e=Pe.formatTime(this.currentTime),i=Pe.formatTime(this.duration),s=ve.get("seekLabel",this.config);t.setAttribute("aria-valuetext",s.replace("{currentTime}",e).replace("{duration}",i))}else if(V(t,this.config.selectors.inputs.volume)){const e=100*t.value;t.setAttribute("aria-valuenow",e),t.setAttribute("aria-valuetext",`${e.toFixed(1)}%`)}else t.setAttribute("aria-valuenow",t.value);(M.isWebKit||M.isIPadOS)&&t.style.setProperty("--value",t.value/t.max*100+"%")}},updateSeekTooltip(e){var t,i;if(!this.config.tooltips.seek||!S.element(this.elements.inputs.seek)||!S.element(this.elements.display.seekTooltip)||0===this.duration)return;const s=this.elements.display.seekTooltip,n=`${this.config.classNames.tooltip}--visible`,a=e=>R(s,n,e);if(this.touch)return void a(!1);let l=0;const r=this.elements.progress.getBoundingClientRect();if(S.event(e))l=100/r.width*(e.pageX-r.left);else{if(!F(s,n))return;l=parseFloat(s.style.left,10)}l<0?l=0:l>100&&(l=100);const o=this.duration/100*l;s.innerText=Pe.formatTime(o);const c=null===(t=this.config.markers)||void 0===t||null===(i=t.points)||void 0===i?void 0:i.find((({time:e})=>e===Math.round(o)));c&&s.insertAdjacentHTML("afterbegin",`${c.label}<br>`),s.style.left=`${l}%`,S.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&a("mouseenter"===e.type)},timeUpdate(e){const t=!S.element(this.elements.display.duration)&&this.config.invertTime;Pe.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||Pe.updateProgress.call(this,e)},durationUpdate(){if(!this.supported.ui||!this.config.invertTime&&this.currentTime)return;if(this.duration>=2**32)return H(this.elements.display.currentTime,!0),void H(this.elements.progress,!0);S.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);const e=S.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&Pe.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&Pe.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),this.config.markers.enabled&&Pe.setMarkers.call(this),Pe.updateSeekTooltip.call(this)},toggleMenuButton(e,t){H(this.elements.settings.buttons[e],!t)},updateSetting(e,t,i){const s=this.elements.settings.panels[e];let n=null,a=t;if("captions"===e)n=this.currentTrack;else{if(n=S.empty(i)?this[e]:i,S.empty(n)&&(n=this.config[e].default),!S.empty(this.options[e])&&!this.options[e].includes(n))return void this.debug.warn(`Unsupported value of '${n}' for ${e}`);if(!this.config[e].options.includes(n))return void this.debug.warn(`Disabled value of '${n}' for ${e}`)}if(S.element(a)||(a=s&&s.querySelector('[role="menu"]')),!S.element(a))return;this.elements.settings.buttons[e].querySelector(`.${this.config.classNames.menu.value}`).innerHTML=Pe.getLabel.call(this,e,n);const l=a&&a.querySelector(`[value="${n}"]`);S.element(l)&&(l.checked=!0)},getLabel(e,t){switch(e){case"speed":return 1===t?ve.get("normal",this.config):`${t}×`;case"quality":if(S.number(t)){const e=ve.get(`qualityLabel.${t}`,this.config);return e.length?e:`${t}p`}return ge(t);case"captions":return xe.getLabel.call(this);default:return null}},setQualityMenu(e){if(!S.element(this.elements.settings.panels.quality))return;const t="quality",i=this.elements.settings.panels.quality.querySelector('[role="menu"]');S.array(e)&&(this.options.quality=se(e).filter((e=>this.config.quality.options.includes(e))));const s=!S.empty(this.options.quality)&&this.options.quality.length>1;if(Pe.toggleMenuButton.call(this,t,s),j(i),Pe.checkMenu.call(this),!s)return;const n=e=>{const t=ve.get(`qualityBadge.${e}`,this.config);return t.length?Pe.createBadge.call(this,t):null};this.options.quality.sort(((e,t)=>{const i=this.config.quality.options;return i.indexOf(e)>i.indexOf(t)?1:-1})).forEach((e=>{Pe.createMenuItem.call(this,{value:e,list:i,type:t,title:Pe.getLabel.call(this,"quality",e),badge:n(e)})})),Pe.updateSetting.call(this,t,i)},setCaptionsMenu(){if(!S.element(this.elements.settings.panels.captions))return;const e="captions",t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),i=xe.getTracks.call(this),s=Boolean(i.length);if(Pe.toggleMenuButton.call(this,e,s),j(t),Pe.checkMenu.call(this),!s)return;const n=i.map(((e,i)=>({value:i,checked:this.captions.toggled&&this.currentTrack===i,title:xe.getLabel.call(this,e),badge:e.language&&Pe.createBadge.call(this,e.language.toUpperCase()),list:t,type:"language"})));n.unshift({value:-1,checked:!this.captions.toggled,title:ve.get("disabled",this.config),list:t,type:"language"}),n.forEach(Pe.createMenuItem.bind(this)),Pe.updateSetting.call(this,e,t)},setSpeedMenu(){if(!S.element(this.elements.settings.panels.speed))return;const e="speed",t=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter((e=>e>=this.minimumSpeed&&e<=this.maximumSpeed));const i=!S.empty(this.options.speed)&&this.options.speed.length>1;Pe.toggleMenuButton.call(this,e,i),j(t),Pe.checkMenu.call(this),i&&(this.options.speed.forEach((i=>{Pe.createMenuItem.call(this,{value:i,list:t,type:e,title:Pe.getLabel.call(this,"speed",i)})})),Pe.updateSetting.call(this,e,t))},checkMenu(){const{buttons:e}=this.elements.settings,t=!S.empty(e)&&Object.values(e).some((e=>!e.hidden));H(this.elements.settings.menu,!t)},focusFirstMenuItem(e,t=!1){if(this.elements.settings.popup.hidden)return;let i=e;S.element(i)||(i=Object.values(this.elements.settings.panels).find((e=>!e.hidden)));const s=i.querySelector('[role^="menuitem"]');W.call(this,s,t)},toggleMenu(e){const{popup:t}=this.elements.settings,i=this.elements.buttons.settings;if(!S.element(t)||!S.element(i))return;const{hidden:s}=t;let n=s;if
gitextract_mujineax/ ├── .babelrc ├── .gitattributes ├── .github/ │ └── FUNDING.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── custom.config.js ├── package.json ├── patches/ │ ├── fabric+5.3.0.patch │ ├── fabric+5.5.2.patch │ └── plyr+3.7.8.patch ├── scripts/ │ └── patch-radix.js ├── src/ │ ├── _locales/ │ │ ├── ca/ │ │ │ └── messages.json │ │ ├── de/ │ │ │ └── messages.json │ │ ├── en/ │ │ │ └── messages.json │ │ ├── es/ │ │ │ └── messages.json │ │ ├── fr/ │ │ │ └── messages.json │ │ ├── hi/ │ │ │ └── messages.json │ │ ├── id/ │ │ │ └── messages.json │ │ ├── it/ │ │ │ └── messages.json │ │ ├── ko/ │ │ │ └── messages.json │ │ ├── pl/ │ │ │ └── messages.json │ │ ├── pt_BR/ │ │ │ └── messages.json │ │ ├── pt_PT/ │ │ │ └── messages.json │ │ ├── ru/ │ │ │ └── messages.json │ │ ├── ta/ │ │ │ └── messages.json │ │ ├── tr/ │ │ │ └── messages.json │ │ ├── uk/ │ │ │ └── messages.json │ │ ├── zh_CN/ │ │ │ └── messages.json │ │ └── zh_TW/ │ │ └── messages.json │ ├── assets/ │ │ ├── editor/ │ │ │ └── index.html │ │ ├── fonts/ │ │ │ └── fonts.css │ │ ├── mediapipeVision/ │ │ │ ├── selfie_segmenter.tflite │ │ │ ├── vision_wasm_internal.js │ │ │ ├── vision_wasm_internal.wasm │ │ │ ├── vision_wasm_nosimd_internal.js │ │ │ └── vision_wasm_nosimd_internal.wasm │ │ ├── satoshi.css │ │ └── vendor/ │ │ ├── ffmpeg-core.js │ │ ├── ffmpeg-core.wasm │ │ ├── ffmpeg-core.worker.js │ │ └── gif.js/ │ │ └── gif.worker.js │ ├── manifest.json │ ├── media/ │ │ └── fastRecorderGate.ts │ ├── messaging/ │ │ └── messageRouter.js │ ├── pages/ │ │ ├── AudioOffscreen/ │ │ │ ├── index.html │ │ │ └── index.js │ │ ├── Background/ │ │ │ ├── alarms/ │ │ │ │ ├── addAlarmListener.js │ │ │ │ └── handleAlarm.js │ │ │ ├── auth/ │ │ │ │ └── loginWithWebsite.js │ │ │ ├── backup/ │ │ │ │ └── initBackup.js │ │ │ ├── drive/ │ │ │ │ ├── handleSaveToDrive.js │ │ │ │ └── handleSignOutDrive.js │ │ │ ├── index.js │ │ │ ├── listeners/ │ │ │ │ ├── index.js │ │ │ │ ├── onActionButtonClickedListener.js │ │ │ │ ├── onCommandListener.js │ │ │ │ ├── onInstalledListener.js │ │ │ │ ├── onMessageExternalListener.js │ │ │ │ ├── onStartupListener.js │ │ │ │ ├── onTabActivatedListener.js │ │ │ │ ├── onTabRemovedListener.js │ │ │ │ ├── onTabUpdatedListener.js │ │ │ │ └── onWindowFocusChangedListener.js │ │ │ ├── messaging/ │ │ │ │ └── handlers.js │ │ │ ├── modules/ │ │ │ │ └── signIn.js │ │ │ ├── offscreen/ │ │ │ │ ├── closeOffscreenDocument.js │ │ │ │ ├── discardOffscreenDocuments.js │ │ │ │ └── offscreenDocument.js │ │ │ ├── recording/ │ │ │ │ ├── cancelRecording.js │ │ │ │ ├── checkRecording.js │ │ │ │ ├── chunkHandler.js │ │ │ │ ├── cloudLocalPlaybackConstants.js │ │ │ │ ├── desktopCapture.js │ │ │ │ ├── discardRecording.js │ │ │ │ ├── forceProcessing.js │ │ │ │ ├── getStreamingData.js │ │ │ │ ├── recordingHelpers.js │ │ │ │ ├── restartRecording.js │ │ │ │ ├── restoreCloudRecording.js │ │ │ │ ├── restoreRecording.js │ │ │ │ ├── sendChunks.js │ │ │ │ ├── sendMessageRecord.js │ │ │ │ ├── startRecording.js │ │ │ │ └── stopRecording.js │ │ │ ├── tabManagement/ │ │ │ │ ├── createTab.js │ │ │ │ ├── editorTab.js │ │ │ │ ├── focusTab.js │ │ │ │ ├── getCurrentTab.js │ │ │ │ ├── index.js │ │ │ │ ├── removeTab.js │ │ │ │ ├── resetActiveTab.js │ │ │ │ ├── sendMessageTab.js │ │ │ │ ├── setSurface.js │ │ │ │ └── tabHelpers.js │ │ │ └── utils/ │ │ │ ├── base64ToUint8Array.js │ │ │ ├── blobToBase64.js │ │ │ ├── browserHelpers.js │ │ │ ├── downloadHelpers.js │ │ │ ├── executeScripts.js │ │ │ ├── featureDetection.js │ │ │ └── waitForContentScript.js │ │ ├── Backup/ │ │ │ ├── Backup.jsx │ │ │ ├── index.html │ │ │ ├── index.jsx │ │ │ └── messaging/ │ │ │ └── handlers.js │ │ ├── Camera/ │ │ │ ├── Camera.jsx │ │ │ ├── components/ │ │ │ │ └── Background.js │ │ │ ├── context/ │ │ │ │ └── CameraContext.js │ │ │ ├── index.html │ │ │ ├── index.jsx │ │ │ ├── messaging/ │ │ │ │ └── handlers.js │ │ │ └── utils/ │ │ │ ├── backgroundUtils.js │ │ │ ├── cameraUtils.js │ │ │ ├── canvasUtils.js │ │ │ ├── effects.js │ │ │ └── uiState.js │ │ ├── CloudRecorder/ │ │ │ ├── CloudRecorder.jsx │ │ │ ├── RecorderUI.jsx │ │ │ ├── bunnyTusUploader.js │ │ │ ├── createVideoProject.js │ │ │ ├── index.html │ │ │ ├── index.jsx │ │ │ ├── messaging.js │ │ │ ├── recorderConfig.js │ │ │ └── warning/ │ │ │ └── Warning.jsx │ │ ├── Content/ │ │ │ ├── Content.jsx │ │ │ ├── DevHUD.jsx │ │ │ ├── Wrapper.jsx │ │ │ ├── camera/ │ │ │ │ ├── Camera.jsx │ │ │ │ ├── components/ │ │ │ │ │ └── ResizeHandle.jsx │ │ │ │ ├── layout/ │ │ │ │ │ ├── CameraToolbar.jsx │ │ │ │ │ └── CameraWrap.jsx │ │ │ │ └── styles/ │ │ │ │ ├── _Camera.scss │ │ │ │ ├── components/ │ │ │ │ │ └── _ResizeHandle.scss │ │ │ │ └── layout/ │ │ │ │ ├── _CameraToolbar.scss │ │ │ │ └── _CameraWrap.scss │ │ │ ├── camera-only/ │ │ │ │ ├── CameraOnly.jsx │ │ │ │ ├── layout/ │ │ │ │ │ └── CameraWrap.jsx │ │ │ │ └── styles/ │ │ │ │ └── _CameraOnly.scss │ │ │ ├── canvas/ │ │ │ │ ├── Canvas.jsx │ │ │ │ ├── layout/ │ │ │ │ │ ├── CanvasWrap.jsx │ │ │ │ │ └── TextToolbar.jsx │ │ │ │ ├── modules/ │ │ │ │ │ ├── ArrowTool.jsx │ │ │ │ │ ├── CustomControls.jsx │ │ │ │ │ ├── EraserTool.jsx │ │ │ │ │ ├── History.jsx │ │ │ │ │ ├── ImageTool.jsx │ │ │ │ │ ├── PenTool.jsx │ │ │ │ │ ├── SelectTool.jsx │ │ │ │ │ ├── ShapeTool.jsx │ │ │ │ │ └── TextTool.jsx │ │ │ │ └── styles/ │ │ │ │ ├── _Canvas.scss │ │ │ │ └── layout/ │ │ │ │ └── _Canvas.scss │ │ │ ├── context/ │ │ │ │ ├── ContentState.jsx │ │ │ │ ├── messaging/ │ │ │ │ │ └── handlers.js │ │ │ │ └── utils/ │ │ │ │ ├── checkAuthStatus.js │ │ │ │ ├── checkRecording.js │ │ │ │ └── updateFromStorage.js │ │ │ ├── countdown/ │ │ │ │ ├── Countdown.jsx │ │ │ │ └── styles/ │ │ │ │ └── _Countdown.scss │ │ │ ├── cursor/ │ │ │ │ └── trackClicks.js │ │ │ ├── images/ │ │ │ │ └── popup/ │ │ │ │ └── images.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── index.jsx │ │ │ ├── modal/ │ │ │ │ ├── Modal.jsx │ │ │ │ └── styles/ │ │ │ │ └── _Modal.scss │ │ │ ├── popup/ │ │ │ │ ├── PopupContainer.jsx │ │ │ │ ├── components/ │ │ │ │ │ ├── BackgroundEffects.jsx │ │ │ │ │ ├── Dropdown.jsx │ │ │ │ │ ├── RegionDimensions.jsx │ │ │ │ │ ├── Switch.jsx │ │ │ │ │ ├── TimeSetter.jsx │ │ │ │ │ ├── TooltipWrap.jsx │ │ │ │ │ └── VideoItem.jsx │ │ │ │ ├── layout/ │ │ │ │ │ ├── Announcement.jsx │ │ │ │ │ ├── InactiveSubscription.jsx │ │ │ │ │ ├── LoggedOut.jsx │ │ │ │ │ ├── RecordingTab.jsx │ │ │ │ │ ├── RecordingType.jsx │ │ │ │ │ ├── Settings.jsx │ │ │ │ │ ├── SettingsMenu.jsx │ │ │ │ │ ├── VideosTab.jsx │ │ │ │ │ ├── Welcome.jsx │ │ │ │ │ └── WelcomeAlternate.jsx │ │ │ │ ├── onboarding/ │ │ │ │ │ ├── proOnboarding.js │ │ │ │ │ └── storage.js │ │ │ │ └── styles/ │ │ │ │ ├── _Popup.scss │ │ │ │ ├── components/ │ │ │ │ │ ├── _BackgroundEffects.scss │ │ │ │ │ ├── _Dropdown.scss │ │ │ │ │ ├── _MainButton.scss │ │ │ │ │ ├── _RegionDimensions.scss │ │ │ │ │ ├── _Switch.scss │ │ │ │ │ ├── _Tabs.scss │ │ │ │ │ ├── _TimeSetter.scss │ │ │ │ │ ├── _Tooltip.scss │ │ │ │ │ └── _VideoItem.scss │ │ │ │ └── layout/ │ │ │ │ ├── _Announcement.scss │ │ │ │ ├── _PopupContainer.scss │ │ │ │ ├── _Settings.scss │ │ │ │ ├── _SettingsMenu.scss │ │ │ │ ├── _VideosTab.scss │ │ │ │ └── _Welcome.scss │ │ │ ├── region/ │ │ │ │ ├── Region.jsx │ │ │ │ ├── components/ │ │ │ │ │ └── RegionHandles.jsx │ │ │ │ ├── layout/ │ │ │ │ │ ├── CameraToolbar.jsx │ │ │ │ │ └── CameraWrap.jsx │ │ │ │ └── styles/ │ │ │ │ ├── _Region.scss │ │ │ │ └── layout/ │ │ │ │ ├── _CameraToolbar.scss │ │ │ │ └── _CameraWrap.scss │ │ │ ├── shortcuts/ │ │ │ │ └── Shortcuts.jsx │ │ │ ├── styles/ │ │ │ │ ├── _variables.scss │ │ │ │ ├── app.css │ │ │ │ ├── app.scss │ │ │ │ └── dist/ │ │ │ │ └── app.css │ │ │ ├── toolbar/ │ │ │ │ ├── Toolbar.jsx │ │ │ │ ├── components/ │ │ │ │ │ ├── ColorWheel.jsx │ │ │ │ │ ├── MicToggle.jsx │ │ │ │ │ ├── RadialMenu.jsx │ │ │ │ │ ├── SVG.jsx │ │ │ │ │ ├── StrokeWeight.jsx │ │ │ │ │ ├── Toast.jsx │ │ │ │ │ ├── ToolTrigger.jsx │ │ │ │ │ └── TooltipWrap.jsx │ │ │ │ ├── layout/ │ │ │ │ │ ├── BlurToolbar.jsx │ │ │ │ │ ├── CursorToolbar.jsx │ │ │ │ │ ├── DrawingToolbar.jsx │ │ │ │ │ ├── ShapeToolbar.jsx │ │ │ │ │ └── ToolbarWrap.jsx │ │ │ │ └── styles/ │ │ │ │ ├── _Page.scss │ │ │ │ ├── components/ │ │ │ │ │ ├── _ColorWheel.scss │ │ │ │ │ ├── _RadialMenu.scss │ │ │ │ │ ├── _StrokeWidth.scss │ │ │ │ │ ├── _Toast.scss │ │ │ │ │ └── _Tooltip.scss │ │ │ │ └── layout/ │ │ │ │ ├── _DrawingToolbar.scss │ │ │ │ ├── _ShapeToolbar.scss │ │ │ │ └── _Toolbar.scss │ │ │ ├── utils/ │ │ │ │ ├── BlurTool.jsx │ │ │ │ ├── CursorModes.jsx │ │ │ │ └── ZoomContainer.jsx │ │ │ └── warning/ │ │ │ ├── Warning.jsx │ │ │ └── styles/ │ │ │ └── _Warning.scss │ │ ├── Download/ │ │ │ ├── Download.jsx │ │ │ ├── index.html │ │ │ └── index.jsx │ │ ├── Editor/ │ │ │ ├── Sandbox.jsx │ │ │ ├── index.html │ │ │ ├── index.jsx │ │ │ └── utils/ │ │ │ ├── addAudioToVideo.js │ │ │ ├── base64toBlob.js │ │ │ ├── blobToArrayBuffer.js │ │ │ ├── cropVideo.js │ │ │ ├── cutVideo.js │ │ │ ├── getFrame.js │ │ │ ├── hasAudio.js │ │ │ ├── muteVideo.js │ │ │ ├── reencodeVideo.js │ │ │ ├── toGIF.js │ │ │ └── toWebM.js │ │ ├── EditorViewer/ │ │ │ ├── Sandbox.jsx │ │ │ ├── index.css │ │ │ ├── index.html │ │ │ └── index.jsx │ │ ├── EditorWebCodecs/ │ │ │ ├── Sandbox.jsx │ │ │ ├── index.html │ │ │ ├── index.jsx │ │ │ ├── mediabunny/ │ │ │ │ └── lib/ │ │ │ │ ├── videoAudioMixer.ts │ │ │ │ ├── videoConverter.ts │ │ │ │ ├── videoCropper.ts │ │ │ │ ├── videoCutter.ts │ │ │ │ ├── videoMuter.ts │ │ │ │ └── videoTrimmer.ts │ │ │ └── utils/ │ │ │ ├── addAudioToVideo.js │ │ │ ├── blobToArrayBuffer.js │ │ │ ├── convertMp4ToWebm.js │ │ │ ├── convertWebmToMp4.js │ │ │ ├── cropVideo.js │ │ │ ├── cutVideo.js │ │ │ ├── getFrame.js │ │ │ ├── hasAudio.js │ │ │ ├── muteVideo.js │ │ │ ├── reencodeVideo.js │ │ │ └── toGIF.js │ │ ├── Permissions/ │ │ │ ├── Permissions.jsx │ │ │ ├── index.html │ │ │ └── index.jsx │ │ ├── Playground/ │ │ │ ├── Setup.jsx │ │ │ ├── index.html │ │ │ └── index.jsx │ │ ├── Recorder/ │ │ │ ├── Recorder.jsx │ │ │ ├── RecorderUI.jsx │ │ │ ├── index.html │ │ │ ├── index.jsx │ │ │ ├── mediaRecorderUtils.js │ │ │ ├── messaging.js │ │ │ ├── recorderConfig.js │ │ │ ├── warning/ │ │ │ │ └── Warning.jsx │ │ │ └── webcodecs/ │ │ │ ├── Mp4MuxerWrapper.ts │ │ │ └── WebCodecsRecorder.js │ │ ├── RecorderOffscreen/ │ │ │ ├── RecorderOffscreen.jsx │ │ │ ├── index.html │ │ │ └── index.jsx │ │ ├── Region/ │ │ │ ├── Recorder.jsx │ │ │ ├── index.html │ │ │ └── index.jsx │ │ ├── Sandbox/ │ │ │ ├── DevHUD.jsx │ │ │ ├── Sandbox.jsx │ │ │ ├── components/ │ │ │ │ ├── editor/ │ │ │ │ │ ├── CropperWrap.jsx │ │ │ │ │ ├── Dropdown.jsx │ │ │ │ │ ├── Switch.jsx │ │ │ │ │ ├── Trimmer.jsx │ │ │ │ │ ├── VideoPlayer.jsx │ │ │ │ │ └── Waveform.jsx │ │ │ │ ├── global/ │ │ │ │ │ ├── Modal.jsx │ │ │ │ │ └── ProBanner.jsx │ │ │ │ └── player/ │ │ │ │ ├── HelpButton.jsx │ │ │ │ ├── ShareModal.jsx │ │ │ │ ├── Title.jsx │ │ │ │ └── VideoPlayer.jsx │ │ │ ├── context/ │ │ │ │ └── ContentState.jsx │ │ │ ├── index.html │ │ │ ├── index.jsx │ │ │ ├── layout/ │ │ │ │ ├── editor/ │ │ │ │ │ ├── AudioNav.js │ │ │ │ │ ├── AudioUI.js │ │ │ │ │ ├── CropNav.js │ │ │ │ │ ├── CropUI.js │ │ │ │ │ ├── Editor.js │ │ │ │ │ ├── EditorNav.js │ │ │ │ │ └── TrimUI.js │ │ │ │ └── player/ │ │ │ │ ├── Content.js │ │ │ │ ├── Player.js │ │ │ │ ├── PlayerNav.js │ │ │ │ └── RightPanel.js │ │ │ └── styles/ │ │ │ ├── edit/ │ │ │ │ ├── _Dropdown.module.scss │ │ │ │ ├── _EditorNav.module.scss │ │ │ │ ├── _Switch.module.scss │ │ │ │ ├── _TrimUI.module.scss │ │ │ │ ├── _Trimmer.module.scss │ │ │ │ ├── _VideoPlayer.scss │ │ │ │ └── _Waveform.module.scss │ │ │ ├── global/ │ │ │ │ ├── _app.scss │ │ │ │ └── _variables.scss │ │ │ ├── player/ │ │ │ │ ├── _Content.module.scss │ │ │ │ ├── _HelpButton.module.scss │ │ │ │ ├── _Nav.module.scss │ │ │ │ ├── _Player.module.scss │ │ │ │ ├── _RightPanel.module.scss │ │ │ │ ├── _ShareModal.module.scss │ │ │ │ └── _Title.module.scss │ │ │ └── plyr.css │ │ ├── Setup/ │ │ │ ├── Setup.jsx │ │ │ ├── index.html │ │ │ └── index.jsx │ │ ├── Waveform/ │ │ │ ├── Waveform.jsx │ │ │ ├── index.html │ │ │ └── index.jsx │ │ └── utils/ │ │ ├── buildDiagnosticZip.js │ │ ├── buildSupportContext.js │ │ ├── buildSupportDebugInfo.js │ │ ├── diagnosticLog.js │ │ ├── errorCodes.js │ │ ├── filenameHelpers.js │ │ ├── mediaDeviceFallback.js │ │ ├── recordingDebug.js │ │ └── startFlowTrace.js │ └── schema.json ├── tsconfig.json ├── utils/ │ ├── autoReloadClients/ │ │ ├── backgroundClient.js │ │ └── contentScriptClient.js │ ├── build.js │ ├── env.js │ └── server.js └── webpack.config.js
SYMBOL INDEX (1108 symbols across 102 files)
FILE: src/assets/mediapipeVision/vision_wasm_internal.js
function locateFile (line 1) | function locateFile(path){if(Module["locateFile"]){return Module["locate...
function assert (line 1) | function assert(condition,text){if(!condition){abort(text)}}
function updateMemoryViews (line 1) | function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array...
function preRun (line 1) | function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="func...
function initRuntime (line 1) | function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!...
function postRun (line 1) | function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="f...
function abort (line 1) | function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";...
function findWasmBinary (line 1) | function findWasmBinary(){return locateFile("vision_wasm_internal.wasm")}
function getBinarySync (line 1) | function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return...
function getWasmBinary (line 1) | async function getWasmBinary(binaryFile){if(!wasmBinary){try{var respons...
function instantiateArrayBuffer (line 1) | async function instantiateArrayBuffer(binaryFile,imports){try{var binary...
function instantiateAsync (line 1) | async function instantiateAsync(binary,binaryFile,imports){if(!binary&&!...
function getWasmImports (line 1) | function getWasmImports(){var imports={a:wasmImports};return imports}
function createWasm (line 1) | async function createWasm(){function receiveInstance(instance,module){wa...
class ExitStatus (line 1) | class ExitStatus{name="ExitStatus";constructor(status){this.message=`Pro...
method constructor (line 1) | constructor(status){this.message=`Program terminated with exit(${statu...
function getFullscreenElement (line 1) | function getFullscreenElement(){return document.fullscreenElement||docum...
method init (line 1) | init(){if(Browser.initted)return;Browser.initted=true;var imagePlugin={}...
method createContext (line 1) | createContext(canvas,useWebGL,setInModule,webGLContextAttributes){if(use...
method requestFullscreen (line 1) | requestFullscreen(lockPointer,resizeCanvas){Browser.lockPointer=lockPoin...
method exitFullscreen (line 1) | exitFullscreen(){if(!Browser.isFullscreen){return false}var CFS=document...
method safeSetTimeout (line 1) | safeSetTimeout(func,timeout){return safeSetTimeout(func,timeout)}
method getMimetype (line 1) | getMimetype(name){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/p...
method getUserMedia (line 1) | getUserMedia(func){window.getUserMedia||=navigator["getUserMedia"]||navi...
method getMovementX (line 1) | getMovementX(event){return event["movementX"]||event["mozMovementX"]||ev...
method getMovementY (line 1) | getMovementY(event){return event["movementY"]||event["mozMovementY"]||ev...
method getMouseWheelDelta (line 1) | getMouseWheelDelta(event){var delta=0;switch(event.type){case"DOMMouseSc...
method calculateMouseCoords (line 1) | calculateMouseCoords(pageX,pageY){var canvas=Browser.getCanvas();var rec...
method setMouseCoords (line 1) | setMouseCoords(pageX,pageY){const{x,y}=Browser.calculateMouseCoords(page...
method calculateMouseEvent (line 1) | calculateMouseEvent(event){if(Browser.pointerLock){if(event.type!="mouse...
method updateResizeListeners (line 1) | updateResizeListeners(){var canvas=Browser.getCanvas();Browser.resizeLis...
method setCanvasSize (line 1) | setCanvasSize(width,height,noUpdates){var canvas=Browser.getCanvas();Bro...
method setFullscreenCanvasSize (line 1) | setFullscreenCanvasSize(){if(typeof SDL!="undefined"){var flags=HEAPU32[...
method setWindowedCanvasSize (line 1) | setWindowedCanvasSize(){if(typeof SDL!="undefined"){var flags=HEAPU32[SD...
method updateCanvasDimensions (line 1) | updateCanvasDimensions(canvas,wNative,hNative){if(wNative&&hNative){canv...
class ExceptionInfo (line 1) | class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excP...
method constructor (line 1) | constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}
method set_type (line 1) | set_type(type){HEAPU32[this.ptr+4>>2]=type}
method get_type (line 1) | get_type(){return HEAPU32[this.ptr+4>>2]}
method set_destructor (line 1) | set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}
method get_destructor (line 1) | get_destructor(){return HEAPU32[this.ptr+8>>2]}
method set_caught (line 1) | set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}
method get_caught (line 1) | get_caught(){return HEAP8[this.ptr+12]!=0}
method set_rethrown (line 1) | set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}
method get_rethrown (line 1) | get_rethrown(){return HEAP8[this.ptr+13]!=0}
method init (line 1) | init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);thi...
method set_adjusted_ptr (line 1) | set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}
method get_adjusted_ptr (line 1) | get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}
function trim (line 1) | function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[sta...
method init (line 1) | init(){}
method shutdown (line 1) | shutdown(){}
method register (line 1) | register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevi...
method open (line 1) | open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.Er...
method close (line 1) | close(stream){stream.tty.ops.fsync(stream.tty)}
method fsync (line 1) | fsync(stream){stream.tty.ops.fsync(stream.tty)}
method read (line 1) | read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.ge...
method write (line 1) | write(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.p...
method get_char (line 1) | get_char(tty){return FS_stdin_getChar()}
method put_char (line 1) | put_char(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.out...
method fsync (line 1) | fsync(tty){if(tty.output?.length>0){out(UTF8ArrayToString(tty.output));t...
method ioctl_tcgets (line 1) | ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:353...
method ioctl_tcsets (line 1) | ioctl_tcsets(tty,optional_actions,data){return 0}
method ioctl_tiocgwinsz (line 1) | ioctl_tiocgwinsz(tty){return[24,80]}
method put_char (line 1) | put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.out...
method fsync (line 1) | fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));t...
method mount (line 1) | mount(mount){return MEMFS.createNode(null,"/",16895,0)}
method createNode (line 1) | createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){...
method getFileDataAsTypedArray (line 1) | getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0)...
method expandFileStorage (line 1) | expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node....
method resizeFileStorage (line 1) | resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(new...
method getattr (line 1) | getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr...
method setattr (line 1) | setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(...
method lookup (line 1) | lookup(parent,name){if(!MEMFS.doesNotExistError){MEMFS.doesNotExistError...
method mknod (line 1) | mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)}
method rename (line 1) | rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNod...
method unlink (line 1) | unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mti...
method rmdir (line 1) | rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node...
method readdir (line 1) | readdir(node){return[".","..",...Object.keys(node.contents)]}
method symlink (line 1) | symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname...
method readlink (line 1) | readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}ret...
method read (line 1) | read(stream,buffer,offset,length,position){var contents=stream.node.cont...
method write (line 1) | write(stream,buffer,offset,length,position,canOwn){if(buffer.buffer===HE...
method llseek (line 1) | llseek(stream,offset,whence){var position=offset;if(whence===1){position...
method mmap (line 1) | mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode))...
method msync (line 1) | msync(stream,buffer,offset,length,mmapFlags){MEMFS.stream_ops.write(stre...
method constructor (line 1) | constructor(errno){this.errno=errno}
method object (line 1) | get object(){return this.node}
method object (line 1) | set object(val){this.node=val}
method isRead (line 1) | get isRead(){return(this.flags&2097155)!==1}
method isWrite (line 1) | get isWrite(){return(this.flags&2097155)!==0}
method isAppend (line 1) | get isAppend(){return this.flags&1024}
method flags (line 1) | get flags(){return this.shared.flags}
method flags (line 1) | set flags(val){this.shared.flags=val}
method position (line 1) | get position(){return this.shared.position}
method position (line 1) | set position(val){this.shared.position=val}
method constructor (line 1) | constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=p...
method read (line 1) | get read(){return(this.mode&this.readMode)===this.readMode}
method read (line 1) | set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}
method write (line 1) | get write(){return(this.mode&this.writeMode)===this.writeMode}
method write (line 1) | set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}
method isFolder (line 1) | get isFolder(){return FS.isDir(this.mode)}
method isDevice (line 1) | get isDevice(){return FS.isChrdev(this.mode)}
method lookupPath (line 1) | lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.foll...
method getPath (line 1) | getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mo...
method hashName (line 1) | hashName(parentid,name){var hash=0;for(var i=0;i<name.length;i++){hash=(...
method hashAddNode (line 1) | hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.na...
method hashRemoveNode (line 1) | hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(F...
method lookupNode (line 1) | lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){thr...
method createNode (line 1) | createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mod...
method destroyNode (line 1) | destroyNode(node){FS.hashRemoveNode(node)}
method isRoot (line 1) | isRoot(node){return node===node.parent}
method isMountpoint (line 1) | isMountpoint(node){return!!node.mounted}
method isFile (line 1) | isFile(mode){return(mode&61440)===32768}
method isDir (line 1) | isDir(mode){return(mode&61440)===16384}
method isLink (line 1) | isLink(mode){return(mode&61440)===40960}
method isChrdev (line 1) | isChrdev(mode){return(mode&61440)===8192}
method isBlkdev (line 1) | isBlkdev(mode){return(mode&61440)===24576}
method isFIFO (line 1) | isFIFO(mode){return(mode&61440)===4096}
method isSocket (line 1) | isSocket(mode){return(mode&49152)===49152}
method flagsToPermissionString (line 1) | flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&5...
method nodePermissions (line 1) | nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.i...
method mayLookup (line 1) | mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermi...
method mayCreate (line 1) | mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lo...
method mayDelete (line 1) | mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catc...
method mayOpen (line 1) | mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return ...
method checkOpExists (line 1) | checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op}
method nextfd (line 1) | nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){retu...
method getStreamChecked (line 1) | getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new F...
method createStream (line 1) | createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);...
method closeStream (line 1) | closeStream(fd){FS.streams[fd]=null}
method dupStream (line 1) | dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);st...
method doSetAttr (line 1) | doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var a...
method open (line 1) | open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops...
method llseek (line 1) | llseek(){throw new FS.ErrnoError(70)}
method registerDevice (line 1) | registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}}
method getMounts (line 1) | getMounts(mount){var mounts=[];var check=[mount];while(check.length){var...
method syncfs (line 1) | syncfs(populate,callback){if(typeof populate=="function"){callback=popul...
method mount (line 1) | mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountp...
method unmount (line 1) | unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:fa...
method lookup (line 1) | lookup(parent,name){return parent.node_ops.lookup(parent,name)}
method mknod (line 1) | mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var pa...
method statfs (line 1) | statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)}
method statfsStream (line 1) | statfsStream(stream){return FS.statfsNode(stream.node)}
method statfsNode (line 1) | statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,ba...
method create (line 1) | create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}
method mkdir (line 1) | mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode...
method mkdirTree (line 1) | mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of di...
method mkdev (line 1) | mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|...
method symlink (line 1) | symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.Errn...
method rename (line 1) | rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new...
method rmdir (line 1) | rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=look...
method readdir (line 1) | readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=look...
method unlink (line 1) | unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=loo...
method readlink (line 1) | readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!l...
method stat (line 1) | stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow}...
method fstat (line 1) | fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var ge...
method lstat (line 1) | lstat(path){return FS.stat(path,true)}
method doChmod (line 1) | doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode...
method chmod (line 1) | chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var looku...
method lchmod (line 1) | lchmod(path,mode){FS.chmod(path,mode,true)}
method fchmod (line 1) | fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,str...
method doChown (line 1) | doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date...
method chown (line 1) | chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lo...
method lchown (line 1) | lchown(path,uid,gid){FS.chown(path,uid,gid,true)}
method fchown (line 1) | fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,...
method doTruncate (line 1) | doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoEr...
method truncate (line 1) | truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typ...
method ftruncate (line 1) | ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.f...
method utime (line 1) | utime(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var...
method open (line 1) | open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flag...
method close (line 1) | close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stre...
method isClosed (line 1) | isClosed(stream){return stream.fd===null}
method llseek (line 1) | llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoE...
method read (line 1) | read(stream,buffer,offset,length,position){if(length<0||position<0){thro...
method write (line 1) | write(stream,buffer,offset,length,position,canOwn){if(length<0||position...
method mmap (line 1) | mmap(stream,length,position,prot,flags){if((prot&2)!==0&&(flags&2)===0&&...
method msync (line 1) | msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync...
method ioctl (line 1) | ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoErr...
method readFile (line 1) | readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encod...
method writeFile (line 1) | writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.op...
method chdir (line 1) | chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node=...
method createDefaultDirectories (line 1) | createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("...
method createDefaultDevices (line 1) | createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3...
method createSpecialDirectories (line 1) | createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/pr...
method createStandardStreams (line 1) | createStandardStreams(input,output,error){if(input){FS.createDevice("/de...
method staticInit (line 1) | staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.crea...
method init (line 1) | init(input,output,error){FS.initialized=true;input??=Module["stdin"];out...
method quit (line 1) | quit(){FS.initialized=false;for(var stream of FS.streams){if(stream){FS....
method findObject (line 1) | findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontRes...
method analyzePath (line 1) | analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,...
method createPath (line 1) | createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?...
method createFile (line 1) | createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(...
method createDataFile (line 1) | createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;i...
method createDevice (line 1) | createDevice(parent,name,input,output){var path=PATH.join2(typeof parent...
method forceLoadFile (line 1) | forceLoadFile(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents...
method createLazyFile (line 1) | createLazyFile(parent,name,url,canRead,canWrite){class LazyUint8Array{le...
method calculateAt (line 1) | calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var ...
method writeStat (line 1) | writeStat(buf,stat){HEAPU32[buf>>2]=stat.dev;HEAPU32[buf+4>>2]=stat.mode...
method writeStatFs (line 1) | writeStatFs(buf,stats){HEAPU32[buf+4>>2]=stats.bsize;HEAPU32[buf+60>>2]=...
method doMsync (line 1) | doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){t...
method getStreamFromFD (line 1) | getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream}
method getStr (line 1) | getStr(ptr){var ret=UTF8ToString(ptr);return ret}
function ___syscall_dup (line 1) | function ___syscall_dup(fd){try{var old=SYSCALLS.getStreamFromFD(fd);ret...
function ___syscall_faccessat (line 1) | function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS....
function ___syscall_fcntl64 (line 1) | function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try...
function ___syscall_fstat64 (line 1) | function ___syscall_fstat64(fd,buf){try{return SYSCALLS.writeStat(buf,FS...
function ___syscall_ftruncate64 (line 1) | function ___syscall_ftruncate64(fd,length_low,length_high){var length=co...
function ___syscall_ioctl (line 1) | function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{va...
function ___syscall_lstat64 (line 1) | function ___syscall_lstat64(path,buf){try{path=SYSCALLS.getStr(path);ret...
function ___syscall_newfstatat (line 1) | function ___syscall_newfstatat(dirfd,path,buf,flags){try{path=SYSCALLS.g...
function ___syscall_openat (line 1) | function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=va...
function ___syscall_stat64 (line 1) | function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);retu...
method constructor (line 1) | constructor(message){super(message);this.name="BindingError"}
function sharedRegisterType (line 1) | function sharedRegisterType(rawType,registeredInstance,options={}){var n...
function registerType (line 1) | function registerType(rawType,registeredInstance,options={}){return shar...
function readPointer (line 1) | function readPointer(pointer){return this.fromWireType(HEAPU32[pointer>>...
function decodeMemoryView (line 1) | function decodeMemoryView(handle){var size=HEAPU32[handle>>2];var data=H...
method fromWireType (line 1) | fromWireType(value){var length=HEAPU32[value>>2];var payload=value+4;var...
method toWireType (line 1) | toWireType(destructors,value){if(value instanceof ArrayBuffer){value=new...
method destructorFunction (line 1) | destructorFunction(ptr){_free(ptr)}
method destructorFunction (line 1) | destructorFunction(ptr){_free(ptr)}
function __gmtime_js (line 1) | function __gmtime_js(time_low,time_high,tmPtr){var time=convertI32PairTo...
function __localtime_js (line 1) | function __localtime_js(time_low,time_high,tmPtr){var time=convertI32Pai...
function __mmap_js (line 1) | function __mmap_js(len,prot,flags,fd,offset_low,offset_high,allocated,ad...
function __munmap_js (line 1) | function __munmap_js(addr,len,prot,flags,fd,offset_low,offset_high){var ...
function _clock_time_get (line 1) | function _clock_time_get(clk_id,ignored_precision_low,ignored_precision_...
function fixedGetContext (line 1) | function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2...
function makePrimitiveState (line 1) | function makePrimitiveState(psPtr){if(!psPtr)return undefined;return{top...
function makeBlendComponent (line 1) | function makeBlendComponent(bdPtr){if(!bdPtr)return undefined;return{ope...
function makeBlendState (line 1) | function makeBlendState(bsPtr){if(!bsPtr)return undefined;return{alpha:m...
function makeColorState (line 1) | function makeColorState(csPtr){var format=WebGPU.TextureFormat[HEAP32[cs...
function makeColorStates (line 1) | function makeColorStates(count,csArrayPtr){var states=[];for(var i=0;i<c...
function makeStencilStateFace (line 1) | function makeStencilStateFace(ssfPtr){return{compare:WebGPU.CompareFunct...
function makeDepthStencilState (line 1) | function makeDepthStencilState(dssPtr){if(!dssPtr)return undefined;retur...
function makeVertexAttribute (line 1) | function makeVertexAttribute(vaPtr){return{format:WebGPU.VertexFormat[HE...
function makeVertexAttributes (line 1) | function makeVertexAttributes(count,vaArrayPtr){var vas=[];for(var i=0;i...
function makeVertexBuffer (line 1) | function makeVertexBuffer(vbPtr){if(!vbPtr)return undefined;var stepMode...
function makeVertexBuffers (line 1) | function makeVertexBuffers(count,vbArrayPtr){if(!count)return undefined;...
function makeVertexState (line 1) | function makeVertexState(viPtr){if(!viPtr)return undefined;var desc={mod...
function makeMultisampleState (line 1) | function makeMultisampleState(msPtr){if(!msPtr)return undefined;return{c...
function makeFragmentState (line 1) | function makeFragmentState(fsPtr){if(!fsPtr)return undefined;var desc={m...
function setLimitValueU32 (line 1) | function setLimitValueU32(name,limitOffset){var limitValue=limits[name];...
function setLimitValueU64 (line 1) | function setLimitValueU64(name,limitOffset){var limitValue=limits[name];...
function _fd_close (line 1) | function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.cl...
function _fd_read (line 1) | function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamF...
function _fd_seek (line 1) | function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset...
function _fd_write (line 1) | function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStream...
function roundedToNextMultipleOf (line 1) | function roundedToNextMultipleOf(x,y){return x+y-1&-y}
function _mediapipe_find_canvas_event_target (line 1) | function _mediapipe_find_canvas_event_target(canvasSelector){let target=...
function _mediapipe_webgl_tex_image_drawable (line 1) | function _mediapipe_webgl_tex_image_drawable(drawableHandle){const drawa...
function _random_get (line 1) | function _random_get(buffer,size){try{randomFill(HEAPU8.subarray(buffer,...
function makeColorAttachment (line 1) | function makeColorAttachment(caPtr){var viewPtr=HEAPU32[caPtr+4>>2];if(v...
function makeColorAttachments (line 1) | function makeColorAttachments(count,caPtr){var attachments=[];for(var i=...
function makeDepthStencilAttachment (line 1) | function makeDepthStencilAttachment(dsaPtr){if(dsaPtr===0)return undefin...
function makeRenderPassDescriptor (line 1) | function makeRenderPassDescriptor(descriptor){var nextInChainPtr=HEAPU32...
function makeEntry (line 1) | function makeEntry(entryPtr){var bufferPtr=HEAPU32[entryPtr+8>>2];var sa...
function makeEntries (line 1) | function makeEntries(count,entriesPtrs){var entries=[];for(var i=0;i<cou...
function makeBufferEntry (line 1) | function makeBufferEntry(substructPtr){var typeInt=HEAPU32[substructPtr+...
function makeSamplerEntry (line 1) | function makeSamplerEntry(substructPtr){var typeInt=HEAPU32[substructPtr...
function makeTextureEntry (line 1) | function makeTextureEntry(substructPtr){var sampleTypeInt=HEAPU32[substr...
function makeStorageTextureEntry (line 1) | function makeStorageTextureEntry(substructPtr){var accessInt=HEAPU32[sub...
function makeEntry (line 1) | function makeEntry(entryPtr){var entry={binding:HEAPU32[entryPtr+4>>2],v...
function makeEntries (line 1) | function makeEntries(count,entriesPtrs){var entries=[];for(var i=0;i<cou...
function _wgpuQueueWriteBuffer (line 1) | function _wgpuQueueWriteBuffer(queuePtr,bufferPtr,bufferOffset_low,buffe...
function convertReturnValue (line 1) | function convertReturnValue(ret){if(returnType==="string"){return UTF8To...
function onDone (line 1) | function onDone(ret){if(stack!==0)stackRestore(stack);return convertRetu...
function BeginGlQueryTiming (line 1) | function BeginGlQueryTiming(calc_name,num_repetitions){const gl=Module.c...
function EndGlQueryTiming (line 1) | function EndGlQueryTiming(calc_name){const gl=Module.canvas.getContext("...
function JsWrapImageConverter (line 1) | function JsWrapImageConverter(){if(!Module._imageConverter){Module._imag...
function JsOnUint8ArrayImageListener (line 1) | function JsOnUint8ArrayImageListener(output_stream_name,binary_ptr,binar...
function JsOnFloat32ArrayImageListener (line 1) | function JsOnFloat32ArrayImageListener(output_stream_name,binary_ptr,bin...
function JsOnWebGLTextureListener (line 1) | function JsOnWebGLTextureListener(output_stream_name,name,width,height,t...
function JsOnUint8ArrayImageVectorListener (line 1) | function JsOnUint8ArrayImageVectorListener(output_stream_name,binary_ptr...
function JsOnFloat32ArrayImageVectorListener (line 1) | function JsOnFloat32ArrayImageVectorListener(output_stream_name,binary_p...
function JsOnWebGLTextureVectorListener (line 1) | function JsOnWebGLTextureVectorListener(output_stream_name,name,width,he...
function JsOnEmptyPacketListener (line 1) | function JsOnEmptyPacketListener(output_stream_name,timestamp){Module._w...
function JsOnVectorFinishedListener (line 1) | function JsOnVectorFinishedListener(output_stream_name,timestamp){Module...
function JsOnSimpleListenerBool (line 1) | function JsOnSimpleListenerBool(output_stream_name,out_data,timestamp){M...
function JsOnVectorListenerBool (line 1) | function JsOnVectorListenerBool(output_stream_name,out_data,timestamp){M...
function JsOnSimpleListenerInt (line 1) | function JsOnSimpleListenerInt(output_stream_name,out_data,timestamp){Mo...
function JsOnVectorListenerInt (line 1) | function JsOnVectorListenerInt(output_stream_name,out_data,timestamp){Mo...
function JsOnSimpleListenerUint (line 1) | function JsOnSimpleListenerUint(output_stream_name,out_data,timestamp){M...
function JsOnVectorListenerUint (line 1) | function JsOnVectorListenerUint(output_stream_name,out_data,timestamp){M...
function JsOnSimpleListenerDouble (line 1) | function JsOnSimpleListenerDouble(output_stream_name,out_data,timestamp)...
function JsOnVectorListenerDouble (line 1) | function JsOnVectorListenerDouble(output_stream_name,out_data,timestamp)...
function JsOnSimpleListenerFloat (line 1) | function JsOnSimpleListenerFloat(output_stream_name,out_data,timestamp){...
function JsOnVectorListenerFloat (line 1) | function JsOnVectorListenerFloat(output_stream_name,out_data,timestamp){...
function JsOnSimpleListenerString (line 1) | function JsOnSimpleListenerString(output_stream_name,out_data,timestamp)...
function JsOnVectorListenerString (line 1) | function JsOnVectorListenerString(output_stream_name,out_data,timestamp)...
function JsOnVectorListenerProto (line 1) | function JsOnVectorListenerProto(output_stream_name,proto_ptr,proto_size...
function JsWrapSimpleListeners (line 1) | function JsWrapSimpleListeners(){if(!Module._wrapSimpleListenerOutput){M...
function JsOnSimpleListenerBinaryArray (line 1) | function JsOnSimpleListenerBinaryArray(output_stream_name,binary_ptr,bin...
function mediapipe_import_external_texture (line 1) | function mediapipe_import_external_texture(device_handle,source_handle){...
function mediapipe_create_utility_canvas2d (line 1) | function mediapipe_create_utility_canvas2d(){let canvas;if(typeof HTMLCa...
function GetAdapterArchitecture (line 1) | function GetAdapterArchitecture(){const device=Module["preinitializedWeb...
function GetAdapterDescription (line 1) | function GetAdapterDescription(){const device=Module["preinitializedWebG...
function GetAdapterDeviceName (line 1) | function GetAdapterDeviceName(){const device=Module["preinitializedWebGP...
function GetAdapterVendor (line 1) | function GetAdapterVendor(){const device=Module["preinitializedWebGPUDev...
function __asyncjs__mediapipe_map_buffer_jspi (line 1) | function __asyncjs__mediapipe_map_buffer_jspi(buffer_handle,data){return...
function hardware_concurrency (line 1) | function hardware_concurrency(){var concurrency=1;try{concurrency=self.n...
function JsWrapErrorListener (line 1) | function JsWrapErrorListener(code,message){if(Module.errorListener){cons...
function UseBottomLeftGpuOrigin (line 1) | function UseBottomLeftGpuOrigin(){return Module&&Module.gpuOriginForWebT...
function custom_emscripten_dbgn (line 1) | function custom_emscripten_dbgn(str,len){if(typeof dbg!=="undefined"){db...
function assignWasmExports (line 1) | function assignWasmExports(wasmExports){_free=Module["_free"]=wasmExport...
function run (line 1) | function run(){if(runDependencies>0){dependenciesFulfilled=run;return}pr...
FILE: src/assets/mediapipeVision/vision_wasm_nosimd_internal.js
function locateFile (line 1) | function locateFile(path){if(Module["locateFile"]){return Module["locate...
function assert (line 1) | function assert(condition,text){if(!condition){abort(text)}}
function updateMemoryViews (line 1) | function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array...
function preRun (line 1) | function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="func...
function initRuntime (line 1) | function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!...
function postRun (line 1) | function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="f...
function abort (line 1) | function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";...
function findWasmBinary (line 1) | function findWasmBinary(){return locateFile("vision_wasm_nosimd_internal...
function getBinarySync (line 1) | function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return...
function getWasmBinary (line 1) | async function getWasmBinary(binaryFile){if(!wasmBinary){try{var respons...
function instantiateArrayBuffer (line 1) | async function instantiateArrayBuffer(binaryFile,imports){try{var binary...
function instantiateAsync (line 1) | async function instantiateAsync(binary,binaryFile,imports){if(!binary&&!...
function getWasmImports (line 1) | function getWasmImports(){var imports={a:wasmImports};return imports}
function createWasm (line 1) | async function createWasm(){function receiveInstance(instance,module){wa...
class ExitStatus (line 1) | class ExitStatus{name="ExitStatus";constructor(status){this.message=`Pro...
method constructor (line 1) | constructor(status){this.message=`Program terminated with exit(${statu...
function getFullscreenElement (line 1) | function getFullscreenElement(){return document.fullscreenElement||docum...
method init (line 1) | init(){if(Browser.initted)return;Browser.initted=true;var imagePlugin={}...
method createContext (line 1) | createContext(canvas,useWebGL,setInModule,webGLContextAttributes){if(use...
method requestFullscreen (line 1) | requestFullscreen(lockPointer,resizeCanvas){Browser.lockPointer=lockPoin...
method exitFullscreen (line 1) | exitFullscreen(){if(!Browser.isFullscreen){return false}var CFS=document...
method safeSetTimeout (line 1) | safeSetTimeout(func,timeout){return safeSetTimeout(func,timeout)}
method getMimetype (line 1) | getMimetype(name){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/p...
method getUserMedia (line 1) | getUserMedia(func){window.getUserMedia||=navigator["getUserMedia"]||navi...
method getMovementX (line 1) | getMovementX(event){return event["movementX"]||event["mozMovementX"]||ev...
method getMovementY (line 1) | getMovementY(event){return event["movementY"]||event["mozMovementY"]||ev...
method getMouseWheelDelta (line 1) | getMouseWheelDelta(event){var delta=0;switch(event.type){case"DOMMouseSc...
method calculateMouseCoords (line 1) | calculateMouseCoords(pageX,pageY){var canvas=Browser.getCanvas();var rec...
method setMouseCoords (line 1) | setMouseCoords(pageX,pageY){const{x,y}=Browser.calculateMouseCoords(page...
method calculateMouseEvent (line 1) | calculateMouseEvent(event){if(Browser.pointerLock){if(event.type!="mouse...
method updateResizeListeners (line 1) | updateResizeListeners(){var canvas=Browser.getCanvas();Browser.resizeLis...
method setCanvasSize (line 1) | setCanvasSize(width,height,noUpdates){var canvas=Browser.getCanvas();Bro...
method setFullscreenCanvasSize (line 1) | setFullscreenCanvasSize(){if(typeof SDL!="undefined"){var flags=HEAPU32[...
method setWindowedCanvasSize (line 1) | setWindowedCanvasSize(){if(typeof SDL!="undefined"){var flags=HEAPU32[SD...
method updateCanvasDimensions (line 1) | updateCanvasDimensions(canvas,wNative,hNative){if(wNative&&hNative){canv...
class ExceptionInfo (line 1) | class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excP...
method constructor (line 1) | constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}
method set_type (line 1) | set_type(type){HEAPU32[this.ptr+4>>2]=type}
method get_type (line 1) | get_type(){return HEAPU32[this.ptr+4>>2]}
method set_destructor (line 1) | set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}
method get_destructor (line 1) | get_destructor(){return HEAPU32[this.ptr+8>>2]}
method set_caught (line 1) | set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}
method get_caught (line 1) | get_caught(){return HEAP8[this.ptr+12]!=0}
method set_rethrown (line 1) | set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}
method get_rethrown (line 1) | get_rethrown(){return HEAP8[this.ptr+13]!=0}
method init (line 1) | init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);thi...
method set_adjusted_ptr (line 1) | set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}
method get_adjusted_ptr (line 1) | get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}
function trim (line 1) | function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[sta...
method init (line 1) | init(){}
method shutdown (line 1) | shutdown(){}
method register (line 1) | register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevi...
method open (line 1) | open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.Er...
method close (line 1) | close(stream){stream.tty.ops.fsync(stream.tty)}
method fsync (line 1) | fsync(stream){stream.tty.ops.fsync(stream.tty)}
method read (line 1) | read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.ge...
method write (line 1) | write(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.p...
method get_char (line 1) | get_char(tty){return FS_stdin_getChar()}
method put_char (line 1) | put_char(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.out...
method fsync (line 1) | fsync(tty){if(tty.output?.length>0){out(UTF8ArrayToString(tty.output));t...
method ioctl_tcgets (line 1) | ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:353...
method ioctl_tcsets (line 1) | ioctl_tcsets(tty,optional_actions,data){return 0}
method ioctl_tiocgwinsz (line 1) | ioctl_tiocgwinsz(tty){return[24,80]}
method put_char (line 1) | put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.out...
method fsync (line 1) | fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));t...
method mount (line 1) | mount(mount){return MEMFS.createNode(null,"/",16895,0)}
method createNode (line 1) | createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){...
method getFileDataAsTypedArray (line 1) | getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0)...
method expandFileStorage (line 1) | expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node....
method resizeFileStorage (line 1) | resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(new...
method getattr (line 1) | getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr...
method setattr (line 1) | setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(...
method lookup (line 1) | lookup(parent,name){if(!MEMFS.doesNotExistError){MEMFS.doesNotExistError...
method mknod (line 1) | mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)}
method rename (line 1) | rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNod...
method unlink (line 1) | unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mti...
method rmdir (line 1) | rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node...
method readdir (line 1) | readdir(node){return[".","..",...Object.keys(node.contents)]}
method symlink (line 1) | symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname...
method readlink (line 1) | readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}ret...
method read (line 1) | read(stream,buffer,offset,length,position){var contents=stream.node.cont...
method write (line 1) | write(stream,buffer,offset,length,position,canOwn){if(buffer.buffer===HE...
method llseek (line 1) | llseek(stream,offset,whence){var position=offset;if(whence===1){position...
method mmap (line 1) | mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode))...
method msync (line 1) | msync(stream,buffer,offset,length,mmapFlags){MEMFS.stream_ops.write(stre...
method constructor (line 1) | constructor(errno){this.errno=errno}
method object (line 1) | get object(){return this.node}
method object (line 1) | set object(val){this.node=val}
method isRead (line 1) | get isRead(){return(this.flags&2097155)!==1}
method isWrite (line 1) | get isWrite(){return(this.flags&2097155)!==0}
method isAppend (line 1) | get isAppend(){return this.flags&1024}
method flags (line 1) | get flags(){return this.shared.flags}
method flags (line 1) | set flags(val){this.shared.flags=val}
method position (line 1) | get position(){return this.shared.position}
method position (line 1) | set position(val){this.shared.position=val}
method constructor (line 1) | constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=p...
method read (line 1) | get read(){return(this.mode&this.readMode)===this.readMode}
method read (line 1) | set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}
method write (line 1) | get write(){return(this.mode&this.writeMode)===this.writeMode}
method write (line 1) | set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}
method isFolder (line 1) | get isFolder(){return FS.isDir(this.mode)}
method isDevice (line 1) | get isDevice(){return FS.isChrdev(this.mode)}
method lookupPath (line 1) | lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.foll...
method getPath (line 1) | getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mo...
method hashName (line 1) | hashName(parentid,name){var hash=0;for(var i=0;i<name.length;i++){hash=(...
method hashAddNode (line 1) | hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.na...
method hashRemoveNode (line 1) | hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(F...
method lookupNode (line 1) | lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){thr...
method createNode (line 1) | createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mod...
method destroyNode (line 1) | destroyNode(node){FS.hashRemoveNode(node)}
method isRoot (line 1) | isRoot(node){return node===node.parent}
method isMountpoint (line 1) | isMountpoint(node){return!!node.mounted}
method isFile (line 1) | isFile(mode){return(mode&61440)===32768}
method isDir (line 1) | isDir(mode){return(mode&61440)===16384}
method isLink (line 1) | isLink(mode){return(mode&61440)===40960}
method isChrdev (line 1) | isChrdev(mode){return(mode&61440)===8192}
method isBlkdev (line 1) | isBlkdev(mode){return(mode&61440)===24576}
method isFIFO (line 1) | isFIFO(mode){return(mode&61440)===4096}
method isSocket (line 1) | isSocket(mode){return(mode&49152)===49152}
method flagsToPermissionString (line 1) | flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&5...
method nodePermissions (line 1) | nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.i...
method mayLookup (line 1) | mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermi...
method mayCreate (line 1) | mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lo...
method mayDelete (line 1) | mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catc...
method mayOpen (line 1) | mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return ...
method checkOpExists (line 1) | checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op}
method nextfd (line 1) | nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){retu...
method getStreamChecked (line 1) | getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new F...
method createStream (line 1) | createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);...
method closeStream (line 1) | closeStream(fd){FS.streams[fd]=null}
method dupStream (line 1) | dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);st...
method doSetAttr (line 1) | doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var a...
method open (line 1) | open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops...
method llseek (line 1) | llseek(){throw new FS.ErrnoError(70)}
method registerDevice (line 1) | registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}}
method getMounts (line 1) | getMounts(mount){var mounts=[];var check=[mount];while(check.length){var...
method syncfs (line 1) | syncfs(populate,callback){if(typeof populate=="function"){callback=popul...
method mount (line 1) | mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountp...
method unmount (line 1) | unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:fa...
method lookup (line 1) | lookup(parent,name){return parent.node_ops.lookup(parent,name)}
method mknod (line 1) | mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var pa...
method statfs (line 1) | statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)}
method statfsStream (line 1) | statfsStream(stream){return FS.statfsNode(stream.node)}
method statfsNode (line 1) | statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,ba...
method create (line 1) | create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}
method mkdir (line 1) | mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode...
method mkdirTree (line 1) | mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of di...
method mkdev (line 1) | mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|...
method symlink (line 1) | symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.Errn...
method rename (line 1) | rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new...
method rmdir (line 1) | rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=look...
method readdir (line 1) | readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=look...
method unlink (line 1) | unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=loo...
method readlink (line 1) | readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!l...
method stat (line 1) | stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow}...
method fstat (line 1) | fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var ge...
method lstat (line 1) | lstat(path){return FS.stat(path,true)}
method doChmod (line 1) | doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode...
method chmod (line 1) | chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var looku...
method lchmod (line 1) | lchmod(path,mode){FS.chmod(path,mode,true)}
method fchmod (line 1) | fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,str...
method doChown (line 1) | doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date...
method chown (line 1) | chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lo...
method lchown (line 1) | lchown(path,uid,gid){FS.chown(path,uid,gid,true)}
method fchown (line 1) | fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,...
method doTruncate (line 1) | doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoEr...
method truncate (line 1) | truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typ...
method ftruncate (line 1) | ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.f...
method utime (line 1) | utime(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var...
method open (line 1) | open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flag...
method close (line 1) | close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stre...
method isClosed (line 1) | isClosed(stream){return stream.fd===null}
method llseek (line 1) | llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoE...
method read (line 1) | read(stream,buffer,offset,length,position){if(length<0||position<0){thro...
method write (line 1) | write(stream,buffer,offset,length,position,canOwn){if(length<0||position...
method mmap (line 1) | mmap(stream,length,position,prot,flags){if((prot&2)!==0&&(flags&2)===0&&...
method msync (line 1) | msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync...
method ioctl (line 1) | ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoErr...
method readFile (line 1) | readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encod...
method writeFile (line 1) | writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.op...
method chdir (line 1) | chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node=...
method createDefaultDirectories (line 1) | createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("...
method createDefaultDevices (line 1) | createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3...
method createSpecialDirectories (line 1) | createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/pr...
method createStandardStreams (line 1) | createStandardStreams(input,output,error){if(input){FS.createDevice("/de...
method staticInit (line 1) | staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.crea...
method init (line 1) | init(input,output,error){FS.initialized=true;input??=Module["stdin"];out...
method quit (line 1) | quit(){FS.initialized=false;for(var stream of FS.streams){if(stream){FS....
method findObject (line 1) | findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontRes...
method analyzePath (line 1) | analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,...
method createPath (line 1) | createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?...
method createFile (line 1) | createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(...
method createDataFile (line 1) | createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;i...
method createDevice (line 1) | createDevice(parent,name,input,output){var path=PATH.join2(typeof parent...
method forceLoadFile (line 1) | forceLoadFile(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents...
method createLazyFile (line 1) | createLazyFile(parent,name,url,canRead,canWrite){class LazyUint8Array{le...
method calculateAt (line 1) | calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var ...
method writeStat (line 1) | writeStat(buf,stat){HEAPU32[buf>>2]=stat.dev;HEAPU32[buf+4>>2]=stat.mode...
method writeStatFs (line 1) | writeStatFs(buf,stats){HEAPU32[buf+4>>2]=stats.bsize;HEAPU32[buf+60>>2]=...
method doMsync (line 1) | doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){t...
method getStreamFromFD (line 1) | getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream}
method getStr (line 1) | getStr(ptr){var ret=UTF8ToString(ptr);return ret}
function ___syscall_dup (line 1) | function ___syscall_dup(fd){try{var old=SYSCALLS.getStreamFromFD(fd);ret...
function ___syscall_faccessat (line 1) | function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS....
function ___syscall_fcntl64 (line 1) | function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try...
function ___syscall_fstat64 (line 1) | function ___syscall_fstat64(fd,buf){try{return SYSCALLS.writeStat(buf,FS...
function ___syscall_ftruncate64 (line 1) | function ___syscall_ftruncate64(fd,length_low,length_high){var length=co...
function ___syscall_ioctl (line 1) | function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{va...
function ___syscall_lstat64 (line 1) | function ___syscall_lstat64(path,buf){try{path=SYSCALLS.getStr(path);ret...
function ___syscall_newfstatat (line 1) | function ___syscall_newfstatat(dirfd,path,buf,flags){try{path=SYSCALLS.g...
function ___syscall_openat (line 1) | function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=va...
function ___syscall_stat64 (line 1) | function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);retu...
method constructor (line 1) | constructor(message){super(message);this.name="BindingError"}
function sharedRegisterType (line 1) | function sharedRegisterType(rawType,registeredInstance,options={}){var n...
function registerType (line 1) | function registerType(rawType,registeredInstance,options={}){return shar...
function readPointer (line 1) | function readPointer(pointer){return this.fromWireType(HEAPU32[pointer>>...
function decodeMemoryView (line 1) | function decodeMemoryView(handle){var size=HEAPU32[handle>>2];var data=H...
method fromWireType (line 1) | fromWireType(value){var length=HEAPU32[value>>2];var payload=value+4;var...
method toWireType (line 1) | toWireType(destructors,value){if(value instanceof ArrayBuffer){value=new...
method destructorFunction (line 1) | destructorFunction(ptr){_free(ptr)}
method destructorFunction (line 1) | destructorFunction(ptr){_free(ptr)}
function __gmtime_js (line 1) | function __gmtime_js(time_low,time_high,tmPtr){var time=convertI32PairTo...
function __localtime_js (line 1) | function __localtime_js(time_low,time_high,tmPtr){var time=convertI32Pai...
function __mmap_js (line 1) | function __mmap_js(len,prot,flags,fd,offset_low,offset_high,allocated,ad...
function __munmap_js (line 1) | function __munmap_js(addr,len,prot,flags,fd,offset_low,offset_high){var ...
function _clock_time_get (line 1) | function _clock_time_get(clk_id,ignored_precision_low,ignored_precision_...
function fixedGetContext (line 1) | function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2...
function makePrimitiveState (line 1) | function makePrimitiveState(psPtr){if(!psPtr)return undefined;return{top...
function makeBlendComponent (line 1) | function makeBlendComponent(bdPtr){if(!bdPtr)return undefined;return{ope...
function makeBlendState (line 1) | function makeBlendState(bsPtr){if(!bsPtr)return undefined;return{alpha:m...
function makeColorState (line 1) | function makeColorState(csPtr){var format=WebGPU.TextureFormat[HEAP32[cs...
function makeColorStates (line 1) | function makeColorStates(count,csArrayPtr){var states=[];for(var i=0;i<c...
function makeStencilStateFace (line 1) | function makeStencilStateFace(ssfPtr){return{compare:WebGPU.CompareFunct...
function makeDepthStencilState (line 1) | function makeDepthStencilState(dssPtr){if(!dssPtr)return undefined;retur...
function makeVertexAttribute (line 1) | function makeVertexAttribute(vaPtr){return{format:WebGPU.VertexFormat[HE...
function makeVertexAttributes (line 1) | function makeVertexAttributes(count,vaArrayPtr){var vas=[];for(var i=0;i...
function makeVertexBuffer (line 1) | function makeVertexBuffer(vbPtr){if(!vbPtr)return undefined;var stepMode...
function makeVertexBuffers (line 1) | function makeVertexBuffers(count,vbArrayPtr){if(!count)return undefined;...
function makeVertexState (line 1) | function makeVertexState(viPtr){if(!viPtr)return undefined;var desc={mod...
function makeMultisampleState (line 1) | function makeMultisampleState(msPtr){if(!msPtr)return undefined;return{c...
function makeFragmentState (line 1) | function makeFragmentState(fsPtr){if(!fsPtr)return undefined;var desc={m...
function setLimitValueU32 (line 1) | function setLimitValueU32(name,limitOffset){var limitValue=limits[name];...
function setLimitValueU64 (line 1) | function setLimitValueU64(name,limitOffset){var limitValue=limits[name];...
function _fd_close (line 1) | function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.cl...
function _fd_read (line 1) | function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamF...
function _fd_seek (line 1) | function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset...
function _fd_write (line 1) | function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStream...
function roundedToNextMultipleOf (line 1) | function roundedToNextMultipleOf(x,y){return x+y-1&-y}
function _mediapipe_find_canvas_event_target (line 1) | function _mediapipe_find_canvas_event_target(canvasSelector){let target=...
function _mediapipe_webgl_tex_image_drawable (line 1) | function _mediapipe_webgl_tex_image_drawable(drawableHandle){const drawa...
function _random_get (line 1) | function _random_get(buffer,size){try{randomFill(HEAPU8.subarray(buffer,...
function makeColorAttachment (line 1) | function makeColorAttachment(caPtr){var viewPtr=HEAPU32[caPtr+4>>2];if(v...
function makeColorAttachments (line 1) | function makeColorAttachments(count,caPtr){var attachments=[];for(var i=...
function makeDepthStencilAttachment (line 1) | function makeDepthStencilAttachment(dsaPtr){if(dsaPtr===0)return undefin...
function makeRenderPassDescriptor (line 1) | function makeRenderPassDescriptor(descriptor){var nextInChainPtr=HEAPU32...
function makeEntry (line 1) | function makeEntry(entryPtr){var bufferPtr=HEAPU32[entryPtr+8>>2];var sa...
function makeEntries (line 1) | function makeEntries(count,entriesPtrs){var entries=[];for(var i=0;i<cou...
function makeBufferEntry (line 1) | function makeBufferEntry(substructPtr){var typeInt=HEAPU32[substructPtr+...
function makeSamplerEntry (line 1) | function makeSamplerEntry(substructPtr){var typeInt=HEAPU32[substructPtr...
function makeTextureEntry (line 1) | function makeTextureEntry(substructPtr){var sampleTypeInt=HEAPU32[substr...
function makeStorageTextureEntry (line 1) | function makeStorageTextureEntry(substructPtr){var accessInt=HEAPU32[sub...
function makeEntry (line 1) | function makeEntry(entryPtr){var entry={binding:HEAPU32[entryPtr+4>>2],v...
function makeEntries (line 1) | function makeEntries(count,entriesPtrs){var entries=[];for(var i=0;i<cou...
function _wgpuQueueWriteBuffer (line 1) | function _wgpuQueueWriteBuffer(queuePtr,bufferPtr,bufferOffset_low,buffe...
function convertReturnValue (line 1) | function convertReturnValue(ret){if(returnType==="string"){return UTF8To...
function onDone (line 1) | function onDone(ret){if(stack!==0)stackRestore(stack);return convertRetu...
function BeginGlQueryTiming (line 1) | function BeginGlQueryTiming(calc_name,num_repetitions){const gl=Module.c...
function EndGlQueryTiming (line 1) | function EndGlQueryTiming(calc_name){const gl=Module.canvas.getContext("...
function JsWrapImageConverter (line 1) | function JsWrapImageConverter(){if(!Module._imageConverter){Module._imag...
function JsOnUint8ArrayImageListener (line 1) | function JsOnUint8ArrayImageListener(output_stream_name,binary_ptr,binar...
function JsOnFloat32ArrayImageListener (line 1) | function JsOnFloat32ArrayImageListener(output_stream_name,binary_ptr,bin...
function JsOnWebGLTextureListener (line 1) | function JsOnWebGLTextureListener(output_stream_name,name,width,height,t...
function JsOnUint8ArrayImageVectorListener (line 1) | function JsOnUint8ArrayImageVectorListener(output_stream_name,binary_ptr...
function JsOnFloat32ArrayImageVectorListener (line 1) | function JsOnFloat32ArrayImageVectorListener(output_stream_name,binary_p...
function JsOnWebGLTextureVectorListener (line 1) | function JsOnWebGLTextureVectorListener(output_stream_name,name,width,he...
function JsOnEmptyPacketListener (line 1) | function JsOnEmptyPacketListener(output_stream_name,timestamp){Module._w...
function JsOnVectorFinishedListener (line 1) | function JsOnVectorFinishedListener(output_stream_name,timestamp){Module...
function JsOnSimpleListenerBool (line 1) | function JsOnSimpleListenerBool(output_stream_name,out_data,timestamp){M...
function JsOnVectorListenerBool (line 1) | function JsOnVectorListenerBool(output_stream_name,out_data,timestamp){M...
function JsOnSimpleListenerInt (line 1) | function JsOnSimpleListenerInt(output_stream_name,out_data,timestamp){Mo...
function JsOnVectorListenerInt (line 1) | function JsOnVectorListenerInt(output_stream_name,out_data,timestamp){Mo...
function JsOnSimpleListenerUint (line 1) | function JsOnSimpleListenerUint(output_stream_name,out_data,timestamp){M...
function JsOnVectorListenerUint (line 1) | function JsOnVectorListenerUint(output_stream_name,out_data,timestamp){M...
function JsOnSimpleListenerDouble (line 1) | function JsOnSimpleListenerDouble(output_stream_name,out_data,timestamp)...
function JsOnVectorListenerDouble (line 1) | function JsOnVectorListenerDouble(output_stream_name,out_data,timestamp)...
function JsOnSimpleListenerFloat (line 1) | function JsOnSimpleListenerFloat(output_stream_name,out_data,timestamp){...
function JsOnVectorListenerFloat (line 1) | function JsOnVectorListenerFloat(output_stream_name,out_data,timestamp){...
function JsOnSimpleListenerString (line 1) | function JsOnSimpleListenerString(output_stream_name,out_data,timestamp)...
function JsOnVectorListenerString (line 1) | function JsOnVectorListenerString(output_stream_name,out_data,timestamp)...
function JsOnVectorListenerProto (line 1) | function JsOnVectorListenerProto(output_stream_name,proto_ptr,proto_size...
function JsWrapSimpleListeners (line 1) | function JsWrapSimpleListeners(){if(!Module._wrapSimpleListenerOutput){M...
function JsOnSimpleListenerBinaryArray (line 1) | function JsOnSimpleListenerBinaryArray(output_stream_name,binary_ptr,bin...
function mediapipe_import_external_texture (line 1) | function mediapipe_import_external_texture(device_handle,source_handle){...
function mediapipe_create_utility_canvas2d (line 1) | function mediapipe_create_utility_canvas2d(){let canvas;if(typeof HTMLCa...
function GetAdapterArchitecture (line 1) | function GetAdapterArchitecture(){const device=Module["preinitializedWeb...
function GetAdapterDescription (line 1) | function GetAdapterDescription(){const device=Module["preinitializedWebG...
function GetAdapterDeviceName (line 1) | function GetAdapterDeviceName(){const device=Module["preinitializedWebGP...
function GetAdapterVendor (line 1) | function GetAdapterVendor(){const device=Module["preinitializedWebGPUDev...
function __asyncjs__mediapipe_map_buffer_jspi (line 1) | function __asyncjs__mediapipe_map_buffer_jspi(buffer_handle,data){return...
function JsWrapErrorListener (line 1) | function JsWrapErrorListener(code,message){if(Module.errorListener){cons...
function UseBottomLeftGpuOrigin (line 1) | function UseBottomLeftGpuOrigin(){return Module&&Module.gpuOriginForWebT...
function custom_emscripten_dbgn (line 1) | function custom_emscripten_dbgn(str,len){if(typeof dbg!=="undefined"){db...
function assignWasmExports (line 1) | function assignWasmExports(wasmExports){_free=Module["_free"]=wasmExport...
function run (line 1) | function run(){if(runDependencies>0){dependenciesFulfilled=run;return}pr...
FILE: src/assets/vendor/ffmpeg-core.js
function ja (line 10) | function ja(a,b){throw b;}
function qa (line 11) | function qa(a){return f.locateFile?f.locateFile(a,pa):pa+a}
function assert (line 17) | function assert(a,b){a||n("Assertion failed: "+b)}
function Fa (line 17) | function Fa(a){var b=f["_"+a];assert(b,"Cannot call unknown function "+a...
function Ga (line 18) | function Ga(a,b,c,d){var e={string:function(q){var t=0;if(null!==q&&void...
function Ja (line 19) | function Ja(a,b,c){c=b+c;for(var d="";!(b>=c);){var e=a[b++];if(!e)break...
function C (line 19) | function C(a,b){return a?Ja(v,a,b):""}
function Ia (line 20) | function Ia(a,b,c,d){if(!(0<d))return 0;var e=c;d=c+d-1;for(var g=0;g<a....
function Ka (line 21) | function Ka(a){for(var b=0,c=0;c<a.length;++c){var d=a.charCodeAt(c);552...
function La (line 21) | function La(a){var b=Ka(a)+1,c=Ma(b);c&&Ia(a,y,c,b);return c}
function Na (line 21) | function Na(a){var b=Ka(a)+1,c=Ha(b);Ia(a,y,c,b);return c}
function Pa (line 21) | function Pa(a,b,c){for(var d=0;d<a.length;++d)y[b++>>0]=a.charCodeAt(d);...
function $a (line 23) | function $a(){var a=f.preRun.shift();Va.unshift(a)}
function eb (line 24) | function eb(){assert(!l,"addRunDependency cannot be used in a pthread wo...
function fb (line 24) | function fb(){ab--;f.monitorRunDependencies&&f.monitorRunDependencies(ab...
function n (line 25) | function n(a){if(f.onAbort)f.onAbort(a);l&&console.error("Pthread aborti...
function gb (line 25) | function gb(a){var b=hb;return String.prototype.startsWith?b.startsWith(...
function ib (line 25) | function ib(){return gb("data:application/octet-stream;base64,")}
function jb (line 26) | function jb(){try{if(Ba)return new Uint8Array(Ba);if(sa)return sa(hb);th...
function kb (line 26) | function kb(){return Ba||!ka&&!la||"function"!==typeof fetch||gb("file:/...
function nb (line 27) | function nb(a){for(;0<a.length;){var b=a.shift();if("function"==typeof b...
function ob (line 27) | function ob(a){return a.replace(/\b_Z[\w\d_]+/g,function(b){return b===b...
function sb (line 28) | function sb(a,b,c){pb=a|0;rb=b|0;qb=c|0}
function tb (line 29) | function tb(a,b){if(0>=a||a>y.length||a&1||0>b)return-28;if(0==b)return ...
function ub (line 30) | function ub(a){if(l)throw"Internal Error! cancelThread() can only ever b...
function vb (line 30) | function vb(a){if(l)throw"Internal Error! cleanupThread() can only ever ...
function Eb (line 38) | function Eb(a){return E[Fb()>>2]=a}
function Gb (line 38) | function Gb(a,b){if(0===a)a=Date.now();else if(1===a||4===a)a=Db();else ...
function Hb (line 38) | function Hb(a,b){if(l)return N(1,1,a,b);Ya.unshift({uh:a,Sf:b})}
function Ib (line 39) | function Ib(a,b){a=new Date(1E3*E[a>>2]);E[b>>2]=a.getUTCSeconds();E[b+4...
function Jb (line 40) | function Jb(){function a(k){return(k=k.toTimeString().match(/\(([A-Za-z ...
function Nb (line 41) | function Nb(a,b){Jb();a=new Date(1E3*E[a>>2]);E[b>>2]=a.getSeconds();E[b...
function Ob (line 42) | function Ob(a,b){for(var c=0,d=a.length-1;0<=d;d--){var e=a[d];"."===e?a...
function Pb (line 42) | function Pb(a){var b="/"===a.charAt(0),c="/"===a.substr(-1);(a=Ob(a.spli...
function Qb (line 43) | function Qb(a){var b=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|)...
function Rb (line 43) | function Rb(a){if("/"===a)return"/";a=Pb(a);a=a.replace(/\/$/,"");var b=...
function Sb (line 43) | function Sb(a,b){return Pb(a+"/"+b)}
function Tb (line 44) | function Tb(){if("object"===typeof crypto&&"function"===typeof crypto.ge...
function Ub (line 45) | function Ub(){for(var a="",b=!1,c=arguments.length-1;-1<=c&&!b;c--){b=0<...
function Vb (line 46) | function Vb(a,b){function c(k){for(var m=0;m<k.length&&""===k[m];m++);fo...
function Xb (line 46) | function Xb(a,b){Wb[a]={input:[],output:[],Xf:b};O.bh(a,Yb)}
function c (line 64) | function c(k){O.Bg--;return b(k)}
function d (line 64) | function d(k){if(k){if(!d.fi)return d.fi=!0,c(k)}else++g>=e.length&&c(nu...
function g (line 88) | function g(){this.Ug=!1;this.Rf=[]}
function t (line 93) | function t(B){function p(z){q&&q();m||O.lh(a,b,z,d,e,r);g&&g();fb()}var ...
function hc (line 97) | function hc(a,b,c){try{var d=a(b)}catch(e){if(e&&e.node&&Pb(b)!==Pb(O.Hf...
function Q (line 98) | function Q(){ic+=4;return E[ic-4>>2]}
function jc (line 98) | function jc(a){a=O.yf(a);if(!a)throw new O.$e(8);return a}
function kc (line 99) | function kc(a,b,c,d,e){if(l)return N(3,1,a,b,c,d,e);try{e=0;for(var g=b?...
function lc (line 100) | function lc(a,b){if(l)return N(4,1,a,b);try{a=C(a);if(b&-8)var c=-28;els...
function mc (line 101) | function mc(a,b,c){if(l)return N(5,1,a,b,c);ic=c;try{var d=jc(a);switch(...
function nc (line 102) | function nc(a,b){if(l)return N(6,1,a,b);try{var c=jc(a);return hc(O.stat...
function oc (line 103) | function oc(a,b,c){if(l)return N(7,1,a,b,c);try{var d=jc(a);d.Kf||(d.Kf=...
function pc (line 104) | function pc(a,b){if(l)return N(8,1,a,b);try{return qc(b,0,136),E[b>>2]=1...
function rc (line 105) | function rc(a,b,c){if(l)return N(9,1,a,b,c);ic=c;try{var d=jc(a);switch(...
function sc (line 106) | function sc(a,b){if(l)return N(10,1,a,b);try{return a=C(a),hc(O.lstat,a,...
function tc (line 106) | function tc(a,b){if(l)return N(11,1,a,b);try{return a=C(a),a=Pb(a),"/"==...
function uc (line 107) | function uc(a,b,c,d,e,g){if(l)return N(12,1,a,b,c,d,e,g);try{a:{g<<=12;v...
function wc (line 108) | function wc(a,b){if(l)return N(13,1,a,b);try{if(-1===(a|0)||0===b)var c=...
function xc (line 108) | function xc(a,b,c){if(l)return N(14,1,a,b,c);ic=c;try{var d=C(a),e=Q();r...
function yc (line 109) | function yc(a,b,c){if(l)return N(15,1,a,b,c);try{for(var d=c=0;d<b;d++){...
function zc (line 109) | function zc(a,b,c,d){if(l)return N(16,1,a,b,c,d);try{return d&&(E[d>>2]=...
function Ac (line 110) | function Ac(a,b,c){if(l)return N(17,1,a,b,c);try{var d=jc(a);return O.re...
function Bc (line 110) | function Bc(a,b){if(l)return N(18,1,a,b);try{return a=C(a),b=C(b),O.rena...
function Cc (line 110) | function Cc(a){if(l)return N(19,1,a);try{return a=C(a),O.rmdir(a),0}catc...
function c (line 115) | function c(){f.websocket.emit("open",a.stream.fd);try{for(var g=b.tg.shi...
function d (line 115) | function d(g){if("string"===typeof g)g=(new TextEncoder).encode(g);else{...
function Dc (line 124) | function Dc(a){a=a.split(".");for(var b=0;4>b;b++){var c=Number(a[b]);if...
function Ec (line 125) | function Ec(a){var b,c,d=[];if(!/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4...
function Jc (line 127) | function Jc(a){var b=Dc(a);if(null!==b)return a;b=Ec(a);if(null!==b)retu...
function Kc (line 127) | function Kc(a){return Ic[a]?Ic[a]:null}
function Lc (line 127) | function Lc(a){return(a&255)+"."+(a>>8&255)+"."+(a>>16&255)+"."+(a>>24&2...
function Mc (line 128) | function Mc(a){var b="",c,d=0,e=0,g=0,k=0;a=[a[0]&65535,a[0]>>16,a[1]&65...
function Oc (line 129) | function Oc(a,b){var c=Qa[a>>1],d=Nc(Ra[a+2>>1]);switch(c){case 2:if(16!...
function Pc (line 130) | function Pc(a,b,c,d){switch(b){case 2:c=Dc(c);Qa[a>>1]=b;E[a+4>>2]=c;Qa[...
function Qc (line 131) | function Qc(a,b){if(l)return N(20,1,a,b);try{ic=b;b=function(){var aa=R....
function Rc (line 135) | function Rc(a,b){if(l)return N(21,1,a,b);try{return a=C(a),hc(O.stat,a,b...
function Sc (line 135) | function Sc(a){if(l)return N(22,1,a);try{return a=C(a),O.unlink(a),0}cat...
function Tc (line 135) | function Tc(){void 0===Tc.start&&(Tc.start=Date.now());return 1E3*(Date....
function Uc (line 136) | function Uc(){h||la||(za||(za={}),za["Blocking on the main thread is ver...
function Vc (line 137) | function Vc(a,b,c){if(0>=a||a>y.length||a&1)return-28;if(ka){if(Atomics....
function Wc (line 138) | function Wc(a){var b=a.getExtension("ANGLE_instanced_arrays");b&&(a.vert...
function Xc (line 139) | function Xc(a){var b=a.getExtension("OES_vertex_array_object");b&&(a.cre...
function Yc (line 139) | function Yc(a){var b=a.getExtension("WEBGL_draw_buffers");b&&(a.drawBuff...
function U (line 140) | function U(a){jd||(jd=a)}
function kd (line 140) | function kd(a){for(var b=Zc++,c=a.length;c<b;c++)a[c]=null;return b}
function ld (line 141) | function ld(a){a||(a=md);if(!a.ni){a.ni=!0;var b=a.pg;Wc(b);Xc(b);Yc(b);...
function od (line 142) | function od(a,b,c,d){for(var e=0;e<a;e++){var g=V[c](),k=g&&kd(d);g?(g.n...
function rd (line 142) | function rd(a,b,c,d,e,g,k,m){b=S[b];if(a=V[a](b,c))d=m&&Ia(a.name,v,m,d)...
function sd (line 142) | function sd(a,b){F[a>>2]=b;F[a+4>>2]=(b-F[a>>2])/4294967296}
function td (line 143) | function td(a,b,c){if(b){var d=void 0;switch(a){case 36346:d=1;break;cas...
function ud (line 145) | function ud(a){var b=Ka(a)+1,c=Ma(b);Ia(a,v,c,b);return c}
function vd (line 145) | function vd(a,b,c,d){if(c)if(a=V.getUniform(S[a],T[b]),"number"==typeof ...
function wd (line 146) | function wd(a,b,c,d){if(c)if(a=V.getVertexAttrib(a,b),34975==b)E[c>>2]=a...
function xd (line 147) | function xd(a,b,c,d,e){a-=5120;a=1==a?v:4==a?E:6==a?G:5==a||28922==a?F:R...
function N (line 147) | function N(a,b){for(var c=arguments.length-2,d=A(),e=Ha(8*c),g=e>>3,k=0;...
function Ed (line 148) | function Ed(a){a=2<a?C(a):a;return Dd[a]||("undefined"!==typeof document...
function Fd (line 149) | function Fd(a,b,c){var d=Ed(a);if(!d)return-4;d.rg&&(E[d.rg>>2]=b,E[d.rg...
function Hd (line 149) | function Hd(a,b,c){return l?N(23,1,a,b,c):Fd(a,b,c)}
function Kd (line 150) | function Kd(){if(!Ld){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/"...
function Md (line 151) | function Md(a){if(l)return N(24,1,a);try{var b=jc(a);O.close(b);return 0...
function Nd (line 151) | function Nd(a,b){if(l)return N(25,1,a,b);try{var c=jc(a);y[b>>0]=c.tty?2...
function Od (line 152) | function Od(a,b,c,d){if(l)return N(26,1,a,b,c,d);try{a:{for(var e=jc(a),...
function Pd (line 153) | function Pd(a,b,c,d,e){if(l)return N(27,1,a,b,c,d,e);try{var g=jc(a);a=4...
function Qd (line 154) | function Qd(a,b,c,d){if(l)return N(28,1,a,b,c,d);try{a:{for(var e=jc(a),...
function Sd (line 155) | function Sd(a){Sd.buffer||(Sd.buffer=Ma(256),Rd["0"]="Success",Rd["-1"]=...
function Td (line 157) | function Td(a,b,c,d){function e(w,B,p,x,z,I){var W=10===w?28:16;z=10===w...
function Bb (line 160) | function Bb(a){if(l)throw"Internal Error! spawnThread() can only ever be...
function Wd (line 162) | function Wd(){return pb|0}
function Xd (line 163) | function Xd(a,b){if(!a)return u("pthread_join attempted on a null thread...
function Yd (line 164) | function Yd(a){return 0===a%4&&(0!==a%100||0===a%400)}
function Zd (line 164) | function Zd(a,b){for(var c=0,d=0;d<=b;c+=a[d++]);return c}
function be (line 165) | function be(a,b){for(a=new Date(a.getTime());0<b;){var c=a.getMonth(),d=...
function ce (line 166) | function ce(a){if(l)return N(30,1,a);switch(a){case 30:return 16384;case...
function de (line 168) | function de(a,b,c,d){a||(a=this);this.parent=a;this.hf=a.hf;this.kg=null...
function Zb (line 170) | function Zb(a,b){var c=Array(Ka(a)+1);a=Ia(a,c,0,c.length);b&&(c.length=...
function e (line 206) | function e(p,x,z){for(p="number"===typeof p?p.toString():p||"";p.length<...
function g (line 206) | function g(p,x){return e(p,x,"0")}
function k (line 206) | function k(p,x){function z(W){return 0>W?-1:0<W?1:0}var I;0===(I=z(p.get...
function m (line 206) | function m(p){switch(p.getDay()){case 0:return new Date(p.getFullYear()-
function r (line 207) | function r(p){p=be(new Date(p.qf+1900,0,1),p.Fg);var x=new Date(p.getFul...
function a (line 214) | function a(e,g){f.asm=e.exports;H=f.asm.Rd;Da=g;l||fb()}
function b (line 214) | function b(e){a(e.instance,e.module)}
function c (line 214) | function c(e){return kb().then(function(g){return WebAssembly.instantiat...
function pe (line 231) | function pe(a,b,c){var d=A();try{return H.get(a)(b,c)}catch(e){D(d);if(e...
function we (line 231) | function we(a,b){var c=A();try{H.get(a)(b)}catch(d){D(c);if(d!==d+0&&"lo...
function ze (line 231) | function ze(a,b,c,d,e){var g=A();try{H.get(a)(b,c,d,e)}catch(k){D(g);if(...
function xe (line 231) | function xe(a,b,c){var d=A();try{H.get(a)(b,c)}catch(e){D(d);if(e!==e+0&...
function oe (line 232) | function oe(a,b){var c=A();try{return H.get(a)(b)}catch(d){D(c);if(d!==d...
function re (line 232) | function re(a,b,c,d,e){var g=A();try{return H.get(a)(b,c,d,e)}catch(k){D...
function te (line 232) | function te(a,b,c,d,e,g,k,m,r){var q=A();try{return H.get(a)(b,c,d,e,g,k...
function ye (line 232) | function ye(a,b,c,d){var e=A();try{H.get(a)(b,c,d)}catch(g){D(e);if(g!==...
function ne (line 233) | function ne(a){var b=A();try{return H.get(a)()}catch(c){D(b);if(c!==c+0&...
function Ae (line 233) | function Ae(a,b,c,d,e,g){var k=A();try{H.get(a)(b,c,d,e,g)}catch(m){D(k)...
function qe (line 233) | function qe(a,b,c,d){var e=A();try{return H.get(a)(b,c,d)}catch(g){D(e);...
function se (line 233) | function se(a,b,c,d,e,g){var k=A();try{return H.get(a)(b,c,d,e,g)}catch(...
function Ce (line 234) | function Ce(a,b,c,d,e,g,k,m,r){var q=A();try{H.get(a)(b,c,d,e,g,k,m,r)}c...
function Be (line 234) | function Be(a,b,c,d,e,g,k){var m=A();try{H.get(a)(b,c,d,e,g,k)}catch(r){...
function De (line 234) | function De(a,b,c,d,e,g,k,m,r,q){var t=A();try{Ge(a,b,c,d,e,g,k,m,r,q)}c...
function ue (line 234) | function ue(a,b,c,d,e,g,k,m){var r=A();try{return He(a,b,c,d,e,g,k,m)}ca...
function ve (line 235) | function ve(a,b,c,d){var e=A();try{return Ie(a,b,c,d)}catch(g){D(e);if(g...
function wa (line 237) | function wa(a){this.name="ExitStatus";this.message="Program terminated w...
function Le (line 238) | function Le(a){function b(){if(!Je&&(Je=!0,f.calledRun=!0,!Ea)){f.noFSIn...
function Cb (line 239) | function Cb(a){if(!noExitRuntime){M.Ni();l||(nb(Ya),O.quit(),M.dh());if(...
FILE: src/assets/vendor/ffmpeg-core.worker.js
function threadPrintErr (line 1) | function threadPrintErr(){var text=Array.prototype.slice.call(arguments)...
function threadAlert (line 1) | function threadAlert(){var text=Array.prototype.slice.call(arguments).jo...
function globalEval (line 1) | function globalEval(x){global.require=require;global.Module=Module;eval....
FILE: src/assets/vendor/gif.js/gif.worker.js
function s (line 2) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
function ByteArray (line 2) | function ByteArray(){this.page=-1;this.pages=[];this.newPage()}
function GIFEncoder (line 2) | function GIFEncoder(width,height){this.width=~~width;this.height=~~heigh...
function LZWEncoder (line 2) | function LZWEncoder(width,height,pixels,colorDepth){var initCodeSize=Mat...
function NeuQuant (line 2) | function NeuQuant(pixels,samplefac){var network;var netindex;var bias;va...
FILE: src/media/fastRecorderGate.ts
type FastRecorderProbeResult (line 3) | type FastRecorderProbeResult = {
type FastRecorderStickyState (line 10) | type FastRecorderStickyState = {
type FastRecorderValidationResult (line 16) | type FastRecorderValidationResult = {
constant STORAGE_KEYS (line 23) | const STORAGE_KEYS = {
constant GATE_VERSION (line 34) | const GATE_VERSION = "ladder-v1";
FILE: src/pages/Background/auth/loginWithWebsite.js
constant API_BASE (line 3) | const API_BASE = process.env.SCREENITY_API_BASE_URL;
constant CLOUD_FEATURES_ENABLED (line 4) | const CLOUD_FEATURES_ENABLED =
FILE: src/pages/Background/listeners/onActionButtonClickedListener.js
constant CLOUD_FEATURES_ENABLED (line 10) | const CLOUD_FEATURES_ENABLED =
FILE: src/pages/Background/listeners/onMessageExternalListener.js
constant CLOUD_FEATURES_ENABLED (line 10) | const CLOUD_FEATURES_ENABLED =
FILE: src/pages/Background/messaging/handlers.js
constant API_BASE (line 75) | const API_BASE = process.env.SCREENITY_API_BASE_URL;
constant APP_BASE (line 76) | const APP_BASE = process.env.SCREENITY_APP_BASE;
constant CLOUD_FEATURES_ENABLED (line 77) | const CLOUD_FEATURES_ENABLED =
constant DEBUG_POSTSTOP (line 80) | const DEBUG_POSTSTOP = false;
constant STOP_RECORDING_TAB_DEBOUNCE_MS (line 81) | const STOP_RECORDING_TAB_DEBOUNCE_MS = 1200;
constant CLOUD_LOCAL_PLAYBACK_MAX_BYTES (line 82) | const CLOUD_LOCAL_PLAYBACK_MAX_BYTES = 250 * 1024 * 1024;
constant CLOUD_LOCAL_PLAYBACK_MAX_CHUNKS (line 83) | const CLOUD_LOCAL_PLAYBACK_MAX_CHUNKS = 4000;
constant CLOUD_LOCAL_PLAYBACK_MIN_TTL_MS (line 84) | const CLOUD_LOCAL_PLAYBACK_MIN_TTL_MS = 60 * 1000;
constant CLOUD_LOCAL_PLAYBACK_MAX_TTL_MS (line 85) | const CLOUD_LOCAL_PLAYBACK_MAX_TTL_MS = 24 * 60 * 60 * 1000;
function storeClick (line 1443) | function storeClick(click) {
function getMonitorForWindow (line 1449) | function getMonitorForWindow(message, sender, sendResponse) {
FILE: src/pages/Background/modules/signIn.js
constant EDGE_CLIENT_ID (line 3) | const EDGE_CLIENT_ID =
constant REDIRECT_URI (line 5) | const REDIRECT_URI = isEdge ? chrome.identity.getRedirectURL() : "";
FILE: src/pages/Background/recording/chunkHandler.js
constant DEBUG_POSTSTOP (line 15) | const DEBUG_POSTSTOP = false;
FILE: src/pages/Background/recording/cloudLocalPlaybackConstants.js
constant CLOUD_LOCAL_PLAYBACK_KEY (line 1) | const CLOUD_LOCAL_PLAYBACK_KEY = "cloudLocalScreenPlaybackOffer";
constant CLOUD_LOCAL_PLAYBACK_EVENT_KEY (line 2) | const CLOUD_LOCAL_PLAYBACK_EVENT_KEY = "lastCloudLocalPlaybackEvent";
constant CLOUD_LOCAL_PLAYBACK_ALARM (line 3) | const CLOUD_LOCAL_PLAYBACK_ALARM = "cloud-local-playback-expiry";
FILE: src/pages/Background/recording/restartRecording.js
constant RESTART_ACK_TIMEOUT_MS (line 5) | const RESTART_ACK_TIMEOUT_MS = 7000;
FILE: src/pages/Background/recording/restoreCloudRecording.js
constant RECOVERABLE_CLOUD_STATUSES (line 4) | const RECOVERABLE_CLOUD_STATUSES = new Set([
FILE: src/pages/Background/tabManagement/editorTab.js
constant APP_BASE_URL (line 4) | const APP_BASE_URL = process.env.SCREENITY_APP_BASE;
constant EDITOR_TAB_META_KEY (line 5) | const EDITOR_TAB_META_KEY = "editorTabMeta";
FILE: src/pages/Background/tabManagement/resetActiveTab.js
function isRestrictedDomain (line 107) | async function isRestrictedDomain(tabId) {
FILE: src/pages/Camera/messaging/handlers.js
function waitForVideoRef (line 21) | function waitForVideoRef(callback, attempts = 10) {
FILE: src/pages/Camera/utils/backgroundUtils.js
function getReusableCanvases (line 18) | function getReusableCanvases() {
function getOrCreateMaskImageData (line 44) | function getOrCreateMaskImageData(ctx, width, height) {
function buildSmoothedMask (line 101) | function buildSmoothedMask(segmentationResult, edgeBlurAmount, personOpa...
FILE: src/pages/Camera/utils/cameraUtils.js
constant CLOUD_FEATURES_ENABLED (line 5) | const CLOUD_FEATURES_ENABLED =
FILE: src/pages/CloudRecorder/CloudRecorder.jsx
constant API_BASE (line 20) | const API_BASE = process.env.SCREENITY_API_BASE_URL;
constant DEBUG_START_FLOW (line 21) | const DEBUG_START_FLOW =
constant SCREEN_CHUNK_MEMORY_WINDOW (line 23) | const SCREEN_CHUNK_MEMORY_WINDOW = 8;
constant CAMERA_CHUNK_MEMORY_WINDOW (line 24) | const CAMERA_CHUNK_MEMORY_WINDOW = 8;
constant AUDIO_CHUNK_MEMORY_WINDOW (line 25) | const AUDIO_CHUNK_MEMORY_WINDOW = 8;
constant STORAGE_CHECK_INTERVAL_MS (line 26) | const STORAGE_CHECK_INTERVAL_MS = 5000;
constant STORAGE_LOW_HEADROOM_BYTES (line 27) | const STORAGE_LOW_HEADROOM_BYTES = 250 * 1024 * 1024;
constant STORAGE_CRITICAL_HEADROOM_BYTES (line 28) | const STORAGE_CRITICAL_HEADROOM_BYTES = 120 * 1024 * 1024;
constant AUDIO_MAX_BUFFER_BYTES (line 29) | const AUDIO_MAX_BUFFER_BYTES = 150 * 1024 * 1024;
constant LOCAL_SCREEN_PLAYBACK_TTL_MS (line 30) | const LOCAL_SCREEN_PLAYBACK_TTL_MS = 20 * 60 * 1000;
constant LOCAL_SCREEN_PLAYBACK_MAX_BYTES (line 31) | const LOCAL_SCREEN_PLAYBACK_MAX_BYTES = 250 * 1024 * 1024;
constant MAX_UPLOAD_TELEMETRY_EVENTS (line 32) | const MAX_UPLOAD_TELEMETRY_EVENTS = 300;
constant UPLOAD_TELEMETRY_KEY (line 33) | const UPLOAD_TELEMETRY_KEY = "cloudUploadTelemetryEvents";
constant UPLOAD_TELEMETRY_ENDPOINT (line 34) | const UPLOAD_TELEMETRY_ENDPOINT = `${API_BASE}/log/upload-event`;
constant SESSION_STATE_INDEX_KEY (line 35) | const SESSION_STATE_INDEX_KEY = "cloudRecorderSessionStateIndex";
constant RECOVERABLE_SESSION_STATUSES (line 36) | const RECOVERABLE_SESSION_STATUSES = new Set([
constant IS_INJECTED_IFRAME (line 50) | const IS_INJECTED_IFRAME = urlParams.has("injected");
constant IS_IFRAME_CONTEXT (line 51) | const IS_IFRAME_CONTEXT =
function cleanupTimers (line 3185) | function cleanupTimers() {
function uploadAudioToBunny (line 3196) | async function uploadAudioToBunny(audioFile, projectId) {
function getActiveVideoTime (line 4883) | function getActiveVideoTime() {
FILE: src/pages/CloudRecorder/bunnyTusUploader.js
constant API_BASE (line 1) | const API_BASE = process.env.SCREENITY_API_BASE_URL;
function getThumbnailFromBlob (line 3) | async function getThumbnailFromBlob(blob, seekTo = 0.1) {
class BunnyTusUploader (line 57) | class BunnyTusUploader {
method constructor (line 58) | constructor(options = {}) {
method debugLog (line 125) | debugLog(message, payload = null) {
method getUploaderType (line 134) | getUploaderType() {
method emitTelemetry (line 138) | emitTelemetry(event, payload = {}) {
method notifyStateChange (line 160) | notifyStateChange(reason = null, extra = {}) {
method setUploaderError (line 173) | setUploaderError(errorCode, err = null) {
method setSessionId (line 185) | async setSessionId(sessionId) {
method getResumeState (line 191) | getResumeState() {
method scheduleJournalPersist (line 222) | scheduleJournalPersist({ force = false } = {}) {
method getJournalKey (line 246) | getJournalKey(mediaId) {
method getJournalLookupKey (line 250) | getJournalLookupKey(projectId, sceneId, type) {
method getVideoMapKey (line 254) | getVideoMapKey(projectId, sceneId, type) {
method getVideoMap (line 258) | async getVideoMap(projectId, sceneId, type) {
method persistVideoMap (line 267) | async persistVideoMap({
method buildFingerprint (line 292) | buildFingerprint({ projectId, sceneId, type, width, height, fingerprin...
method clearUploadJournal (line 299) | async clearUploadJournal(journal = null) {
method persistUploadJournal (line 327) | async persistUploadJournal({ force = false } = {}) {
method isResumeJournalStale (line 421) | isResumeJournalStale(updatedAt) {
method validateResumeJournal (line 427) | validateResumeJournal(
method getResumeJournal (line 466) | async getResumeJournal({
method getServerOffset (line 547) | async getServerOffset() {
method initialize (line 580) | async initialize(
method refreshTusAuth (line 787) | async refreshTusAuth() {
method initTusUpload (line 803) | async initTusUpload() {
method write (line 856) | async write(chunk) {
method checkAuthExpiration (line 896) | async checkAuthExpiration() {
method uploadChunk (line 908) | async uploadChunk(chunk) {
method processQueue (line 1036) | async processQueue() {
method waitForPendingUploads (line 1068) | async waitForPendingUploads() {
method finalize (line 1105) | async finalize() {
method getMeta (line 1236) | getMeta() {
method pause (line 1258) | pause() {
method resume (line 1266) | resume() {
method abort (line 1286) | async abort() {
method startHeartbeat (line 1304) | startHeartbeat() {
method stopHeartbeat (line 1329) | stopHeartbeat() {
method recordProgress (line 1334) | recordProgress(bytes) {
FILE: src/pages/CloudRecorder/createVideoProject.js
constant VIDEO_INIT (line 1) | const VIDEO_INIT = {
FILE: src/pages/CloudRecorder/messaging.js
constant IS_INJECTED_IFRAME (line 4) | const IS_INJECTED_IFRAME = urlParams.has("injected");
constant IS_IFRAME_CONTEXT (line 5) | const IS_IFRAME_CONTEXT =
function sendRecordingError (line 10) | function sendRecordingError(why, cancel = false) {
function sendStopRecording (line 28) | function sendStopRecording(reason = "generic") {
FILE: src/pages/CloudRecorder/recorderConfig.js
constant MIME_TYPES (line 1) | const MIME_TYPES = [
function getBitrates (line 10) | function getBitrates(quality) {
constant VIDEO_QUALITIES (line 29) | const VIDEO_QUALITIES = {
function getResolutionForQuality (line 39) | function getResolutionForQuality(qualityValue = "default") {
FILE: src/pages/Content/DevHUD.jsx
constant BTN (line 6) | const BTN = {
FILE: src/pages/Content/canvas/layout/TextToolbar.jsx
function positionToolbarOnTextbox (line 21) | function positionToolbarOnTextbox(textbox) {
function hideToolbar (line 39) | function hideToolbar() {
FILE: src/pages/Content/canvas/modules/CustomControls.jsx
function renderIcon (line 41) | function renderIcon(ctx, left, top, styleOverride, fabricObject) {
function renderIconRotate (line 54) | function renderIconRotate(ctx, left, top, styleOverride, fabricObject) {
function renderIconMiddle (line 68) | function renderIconMiddle(ctx, left, top, styleOverride, fabricObject) {
function renderIconMiddleV (line 81) | function renderIconMiddleV(ctx, left, top, styleOverride, fabricObject) {
FILE: src/pages/Content/canvas/modules/TextTool.jsx
function getMaxLineWidth (line 137) | function getMaxLineWidth(textLines, text) {
FILE: src/pages/Content/context/ContentState.jsx
constant CURSOR_EFFECTS (line 31) | const CURSOR_EFFECTS = ["target", "highlight", "spotlight"];
FILE: src/pages/Content/context/messaging/handlers.js
constant CLOUD_FEATURES_ENABLED (line 13) | const CLOUD_FEATURES_ENABLED =
FILE: src/pages/Content/context/utils/updateFromStorage.js
constant CURSOR_EFFECTS (line 4) | const CURSOR_EFFECTS = ["target", "highlight", "spotlight"];
FILE: src/pages/Content/countdown/Countdown.jsx
constant COUNTDOWN_TIME (line 6) | const COUNTDOWN_TIME = 3;
constant DEBUG_START_FLOW (line 7) | const DEBUG_START_FLOW =
FILE: src/pages/Content/cursor/trackClicks.js
function startClickTracking (line 1) | function startClickTracking(
FILE: src/pages/Content/images/popup/images.js
constant URL (line 2) | const URL =
FILE: src/pages/Content/popup/PopupContainer.jsx
function setPopupPosition (line 194) | function setPopupPosition(e) {
FILE: src/pages/Content/popup/layout/RecordingType.jsx
constant CLOUD_FEATURES_ENABLED (line 15) | const CLOUD_FEATURES_ENABLED =
FILE: src/pages/Content/popup/layout/SettingsMenu.jsx
constant CLOUD_FEATURES_ENABLED (line 24) | const CLOUD_FEATURES_ENABLED =
FILE: src/pages/Content/popup/layout/VideosTab.jsx
constant CLOUD_FEATURES_ENABLED (line 19) | const CLOUD_FEATURES_ENABLED =
FILE: src/pages/Content/popup/onboarding/proOnboarding.js
constant CORE_KEY (line 5) | const CORE_KEY = "proPopupCore";
constant CAMERA_KEY (line 6) | const CAMERA_KEY = "proCameraInfo";
constant POPOVER_CLASS (line 7) | const POPOVER_CLASS = "ScreenityOnboardingPopover onboarding-popover";
constant DRIVER_STYLE_ID (line 8) | const DRIVER_STYLE_ID = "screenity-driver-onboarding-style";
constant TOOLBAR_HELP_URL (line 9) | const TOOLBAR_HELP_URL =
constant IDLE_START_DELAY_MS (line 11) | const IDLE_START_DELAY_MS = 420;
constant STEP_IDS (line 13) | const STEP_IDS = {
constant TOOLBAR_SELECTORS (line 20) | const TOOLBAR_SELECTORS = [
constant INSTANT_PRIMARY_SELECTORS (line 27) | const INSTANT_PRIMARY_SELECTORS = [
constant INSTANT_FALLBACK_SELECTORS (line 32) | const INSTANT_FALLBACK_SELECTORS = [
constant CAMERA_SELECTORS (line 36) | const CAMERA_SELECTORS = [
constant CONFLICT_SELECTORS (line 41) | const CONFLICT_SELECTORS = [
constant START_CANCEL_EVENTS (line 48) | const START_CANCEL_EVENTS = ["mousedown", "click", "keydown"];
constant DEBUG (line 50) | const DEBUG =
FILE: src/pages/Content/popup/onboarding/storage.js
constant ONBOARDING_SEEN_KEY (line 1) | const ONBOARDING_SEEN_KEY = "onboardingSeen";
FILE: src/pages/Content/toolbar/components/SVG.jsx
constant URL (line 4) | const URL =
FILE: src/pages/Content/toolbar/layout/ToolbarWrap.jsx
function setToolbarPosition (line 152) | function setToolbarPosition(e) {
FILE: src/pages/Editor/utils/addAudioToVideo.js
function addAudioToVideo (line 1) | async function addAudioToVideo(
FILE: src/pages/Editor/utils/base64toBlob.js
function base64ToUint8Array (line 1) | function base64ToUint8Array(base64) {
function base64ToBlob (line 18) | async function base64ToBlob(ffmpeg, base64) {
FILE: src/pages/Editor/utils/blobToArrayBuffer.js
function blobToArrayBuffer (line 1) | async function blobToArrayBuffer(blob) {
FILE: src/pages/Editor/utils/cropVideo.js
function cropVideo (line 1) | async function cropVideo(ffmpeg, videoBlob, cropParameters) {
FILE: src/pages/Editor/utils/cutVideo.js
function cutVideo (line 1) | async function cutVideo(ffmpeg, videoBlob, start, end, cut, duration, en...
FILE: src/pages/Editor/utils/getFrame.js
function getFrame (line 2) | async function getFrame(ffmpeg, videoBlob, time = 0) {
FILE: src/pages/Editor/utils/muteVideo.js
function muteVideo (line 1) | async function muteVideo(ffmpeg, videoBlob, start, end) {
FILE: src/pages/Editor/utils/reencodeVideo.js
function reencodeVideo (line 1) | async function reencodeVideo(ffmpeg, blob) {
FILE: src/pages/Editor/utils/toGIF.js
function toGIF (line 1) | async function toGIF(ffmpeg, blob) {
FILE: src/pages/Editor/utils/toWebM.js
function toWebM (line 1) | async function toWebM(ffmpeg, blob) {
FILE: src/pages/EditorWebCodecs/Sandbox.jsx
function isMp4Blob (line 39) | function isMp4Blob(blob) {
FILE: src/pages/EditorWebCodecs/mediabunny/lib/videoAudioMixer.ts
class VideoAudioMixer (line 17) | class VideoAudioMixer {
method addAudio (line 18) | async addAudio(
method _getDuration (line 149) | async _getDuration(blob) {
FILE: src/pages/EditorWebCodecs/mediabunny/lib/videoConverter.ts
type SupportedFormat (line 15) | type SupportedFormat = "mp4" | "webm";
type ConversionOptions (line 17) | interface ConversionOptions {
type CodecInfo (line 26) | interface CodecInfo {
constant CODEC_DISPLAY_NAMES (line 32) | const CODEC_DISPLAY_NAMES: Record<VideoCodec, string> = {
class VideoConverter (line 40) | class VideoConverter {
method convertToMP4 (line 44) | async convertToMP4(sourceBlob: Blob, options: ConversionOptions = {}):...
method convertToWebM (line 48) | async convertToWebM(sourceBlob: Blob, options: ConversionOptions = {})...
method detectBestCodec (line 52) | async detectBestCodec(format: SupportedFormat): Promise<CodecInfo | nu...
method canEncodeCodec (line 73) | async canEncodeCodec(codec: VideoCodec): Promise<boolean> {
method clearCache (line 84) | clearCache(): void {
method convert (line 89) | private async convert(
method getEncoderConfig (line 161) | private getEncoderConfig(codec: VideoCodec): VideoEncoderConfig {
function convertToMP4 (line 176) | async function convertToMP4(blob: Blob, options?: ConversionOptions): Pr...
function convertToWebM (line 180) | async function convertToWebM(blob: Blob, options?: ConversionOptions): P...
FILE: src/pages/EditorWebCodecs/mediabunny/lib/videoCropper.ts
type CropOptions (line 14) | interface CropOptions {
type CropInfo (line 26) | interface CropInfo {
class VideoCropper (line 39) | class VideoCropper {
method crop (line 40) | async crop(sourceBlob: Blob, options: CropOptions): Promise<Blob> {
method getDimensions (line 117) | async getDimensions(blob: Blob): Promise<{
function cropVideo (line 144) | async function cropVideo(
FILE: src/pages/EditorWebCodecs/mediabunny/lib/videoCutter.ts
class VideoCutter (line 17) | class VideoCutter {
method cut (line 18) | async cut(sourceBlob, { cutStart, cutEnd, onProgress }) {
method getDuration (line 103) | getDuration(blob) {
FILE: src/pages/EditorWebCodecs/mediabunny/lib/videoMuter.ts
class VideoMuter (line 17) | class VideoMuter {
method mute (line 18) | async mute(
method _getDuration (line 125) | async _getDuration(blob) {
FILE: src/pages/EditorWebCodecs/mediabunny/lib/videoTrimmer.ts
type TrimOptions (line 14) | interface TrimOptions {
type TrimInfo (line 23) | interface TrimInfo {
class VideoTrimmer (line 31) | class VideoTrimmer {
method trim (line 32) | async trim(sourceBlob: Blob, options: TrimOptions): Promise<Blob> {
method getInfo (line 82) | async getInfo(blob: Blob): Promise<{
function trimVideo (line 117) | async function trimVideo(
FILE: src/pages/EditorWebCodecs/utils/addAudioToVideo.js
function ensureBlob (line 3) | async function ensureBlob(input, mimeType = "video/webm") {
function addAudioToVideo (line 29) | async function addAudioToVideo(
FILE: src/pages/EditorWebCodecs/utils/blobToArrayBuffer.js
function blobToArrayBuffer (line 1) | async function blobToArrayBuffer(blob) {
FILE: src/pages/EditorWebCodecs/utils/convertMp4ToWebm.js
function convertMp4ToWebm (line 3) | async function convertMp4ToWebm(mp4Blob, onProgress = () => {}) {
FILE: src/pages/EditorWebCodecs/utils/convertWebmToMp4.js
function convertWebmToMp4 (line 3) | async function convertWebmToMp4(webmBlob, onProgress = () => {}) {
FILE: src/pages/EditorWebCodecs/utils/cropVideo.js
function cropVideo (line 3) | async function cropVideo(
FILE: src/pages/EditorWebCodecs/utils/cutVideo.js
function cutVideo (line 4) | async function cutVideo(
FILE: src/pages/EditorWebCodecs/utils/getFrame.js
function getFrame (line 1) | async function getFrame(ffmpeg, videoBlob, time) {
FILE: src/pages/EditorWebCodecs/utils/hasAudio.js
function hasAudio (line 1) | async function hasAudio(ffmpeg, videoBlob) {
FILE: src/pages/EditorWebCodecs/utils/muteVideo.js
function muteVideo (line 3) | async function muteVideo(
FILE: src/pages/EditorWebCodecs/utils/reencodeVideo.js
function reencodeVideo (line 3) | async function reencodeVideo(
FILE: src/pages/EditorWebCodecs/utils/toGIF.js
function toGIF (line 3) | async function toGIF(ffmpeg, videoBlob, onProgress = () => {}) {
FILE: src/pages/Recorder/Recorder.jsx
constant DEBUG_RECORDER (line 37) | const DEBUG_RECORDER =
constant FORCE_MEDIARECORDER (line 39) | const FORCE_MEDIARECORDER =
function debug (line 45) | function debug(...args) {
function debugWarn (line 51) | function debugWarn(...args) {
function debugError (line 57) | function debugError(...args) {
constant SL_KEY (line 64) | const SL_KEY = "streamLifecycleLog";
constant SL_MAX (line 65) | const SL_MAX = 40;
function slLog (line 68) | function slLog(tag, extra = {}) {
function logCaptureContext (line 82) | function logCaptureContext(label, stream) {
function buildTrackSnapshot (line 113) | function buildTrackSnapshot(track) {
function logRecordingSnapshot (line 129) | function logRecordingSnapshot(label, data) {
constant QUALITY_ORDER (line 136) | const QUALITY_ORDER = ["240p", "360p", "480p", "720p", "1080p", "4k"];
function canFitChunk (line 285) | async function canFitChunk(byteLength) {
function saveChunk (line 472) | async function saveChunk(e, i) {
function drainQueue (line 542) | async function drainQueue() {
function waitForDrain (line 603) | async function waitForDrain() {
function getStreamReadiness (line 623) | function getStreamReadiness() {
function buildStreamDiagInfo (line 631) | function buildStreamDiagInfo(bucket) {
function armStartGateTimeout (line 654) | function armStartGateTimeout() {
function clearStartGateTimeout (line 677) | function clearStartGateTimeout() {
function resetGateState (line 685) | function resetGateState() {
function requestStart (line 693) | function requestStart() {
function tryStartIfReady (line 734) | function tryStartIfReady() {
function startRecording (line 746) | async function startRecording() {
function warmUpStream (line 1494) | async function warmUpStream(liveStream) {
function stopRecording (line 1597) | async function stopRecording() {
function startAudioStream (line 1792) | async function startAudioStream(id) {
function setAudioInputVolume (line 1865) | function setAudioInputVolume(volume) {
function setAudioOutputVolume (line 1874) | function setAudioOutputVolume(volume) {
function startStream (line 1894) | async function startStream(data, id, options, permissions, permissions2) {
function startStreaming (line 2232) | async function startStreaming(data) {
FILE: src/pages/Recorder/mediaRecorderUtils.js
function createMediaRecorder (line 3) | function createMediaRecorder(
FILE: src/pages/Recorder/messaging.js
function sendRecordingError (line 3) | function sendRecordingError(why, cancel = false) {
function sendStopRecording (line 16) | function sendStopRecording(reason = "generic", extra = {}) {
FILE: src/pages/Recorder/recorderConfig.js
constant MIME_TYPES (line 1) | const MIME_TYPES = [
function getBitrates (line 10) | function getBitrates(quality) {
constant VIDEO_QUALITIES (line 28) | const VIDEO_QUALITIES = {
function getResolutionForQuality (line 38) | function getResolutionForQuality(qualityValue = "default") {
FILE: src/pages/Recorder/webcodecs/Mp4MuxerWrapper.ts
type Mp4MuxerWrapperOptions (line 16) | interface Mp4MuxerWrapperOptions {
class Mp4MuxerWrapper (line 28) | class Mp4MuxerWrapper {
method constructor (line 52) | constructor(private options: Mp4MuxerWrapperOptions) {
method enableAudio (line 76) | enableAudio() {
method addVideoChunk (line 84) | addVideoChunk(chunk: EncodedVideoChunk, meta: any) {
method addAudioChunk (line 99) | addAudioChunk(chunk: EncodedAudioChunk, meta: any) {
method start (line 106) | async start() {
method finalize (line 113) | async finalize() {
method setPausedOffset (line 126) | setPausedOffset(_offsetUs: number) {}
method setAudioOffset (line 128) | setAudioOffset(offsetUs: number) {
method emitChunk (line 132) | private emitChunk(chunk: Uint8Array, timestampUs: number | null) {
method buildPacket (line 143) | private buildPacket(
method normalizeTimestamp (line 157) | private normalizeTimestamp(
FILE: src/pages/Recorder/webcodecs/WebCodecsRecorder.js
class WebCodecsRecorder (line 14) | class WebCodecsRecorder {
method constructor (line 15) | constructor(stream, options) {
method _probeRealResolution (line 78) | async _probeRealResolution() {
method start (line 95) | async start() {
method stop (line 295) | async stop() {
method pause (line 363) | pause() {
method resume (line 369) | resume() {
method cleanup (line 380) | cleanup() {
method initVideoEncoder (line 433) | async initVideoEncoder(config, codecLabel) {
method initAudioEncoder (line 450) | async initAudioEncoder(config) {
method prepareAudioEncoderConfig (line 467) | async prepareAudioEncoderConfig() {
method chooseVideoEncoderConfig (line 495) | async chooseVideoEncoderConfig({ width, height, fps, bitrate }) {
method readVideoLoop (line 534) | async readVideoLoop() {
method readAudioLoop (line 646) | async readAudioLoop() {
FILE: src/pages/RecorderOffscreen/RecorderOffscreen.jsx
function canFitChunk (line 73) | async function canFitChunk(byteLength) {
function saveChunk (line 89) | async function saveChunk(e, i) {
function drainQueue (line 154) | async function drainQueue() {
function waitForDrain (line 199) | async function waitForDrain() {
function startRecording (line 206) | async function startRecording() {
function stopRecording (line 434) | async function stopRecording() {
function startAudioStream (line 525) | async function startAudioStream(id) {
function setAudioInputVolume (line 587) | function setAudioInputVolume(volume) {
function setAudioOutputVolume (line 592) | function setAudioOutputVolume(volume) {
function startStreaming (line 596) | async function startStreaming(data) {
FILE: src/pages/Region/Recorder.jsx
constant DEBUG_RECORDER (line 33) | const DEBUG_RECORDER =
function debug (line 37) | function debug(...args) {
function debugWarn (line 43) | function debugWarn(...args) {
function debugError (line 49) | function debugError(...args) {
function buildTrackSnapshot (line 55) | function buildTrackSnapshot(track) {
function logRecordingSnapshot (line 71) | function logRecordingSnapshot(label, data) {
function canFitChunk (line 229) | async function canFitChunk(byteLength) {
function saveChunk (line 245) | async function saveChunk(e, i) {
function drainQueue (line 358) | async function drainQueue() {
function waitForDrain (line 405) | async function waitForDrain() {
function startRecording (line 437) | async function startRecording() {
function stopRecording (line 1310) | async function stopRecording() {
function startAudioStream (line 1496) | async function startAudioStream(id) {
function setAudioInputVolume (line 1558) | function setAudioInputVolume(volume) {
function setAudioOutputVolume (line 1564) | function setAudioOutputVolume(volume) {
function startStreaming (line 1569) | async function startStreaming(data) {
FILE: src/pages/Sandbox/DevHUD.jsx
constant BTN (line 3) | const BTN = {
constant BTN_RESET (line 13) | const BTN_RESET = { ...BTN, background: "rgba(200,50,50,0.7)" };
FILE: src/pages/Sandbox/components/editor/Waveform.jsx
function blobToArrayBuffer (line 15) | async function blobToArrayBuffer(blob) {
FILE: src/pages/Sandbox/components/global/ProBanner.jsx
constant CLOUD_FEATURES_ENABLED (line 5) | const CLOUD_FEATURES_ENABLED =
FILE: src/pages/Sandbox/components/player/ShareModal.jsx
constant URL (line 10) | const URL = "/assets/";
FILE: src/pages/Sandbox/components/player/Title.jsx
constant URL (line 5) | const URL = "/assets/";
FILE: src/pages/Sandbox/context/ContentState.jsx
constant DEBUG_RECORDER (line 38) | const DEBUG_RECORDER =
constant DEBUG_POSTSTOP (line 41) | const DEBUG_POSTSTOP = DEBUG_RECORDER;
FILE: src/pages/Sandbox/layout/editor/AudioNav.js
constant URL (line 5) | const URL = "/assets/";
FILE: src/pages/Sandbox/layout/editor/AudioUI.js
constant URL (line 10) | const URL = "/assets/";
FILE: src/pages/Sandbox/layout/editor/CropNav.js
constant URL (line 5) | const URL = "/assets/";
FILE: src/pages/Sandbox/layout/editor/CropUI.js
constant URL (line 9) | const URL =
FILE: src/pages/Sandbox/layout/editor/EditorNav.js
constant URL (line 5) | const URL = "/assets/";
FILE: src/pages/Sandbox/layout/editor/TrimUI.js
constant URL (line 8) | const URL = "/assets/";
FILE: src/pages/Sandbox/layout/player/PlayerNav.js
constant URL (line 8) | const URL = "/assets/";
FILE: src/pages/Sandbox/layout/player/RightPanel.js
constant URL (line 8) | const URL =
FILE: src/pages/Waveform/Waveform.jsx
function initializeAudioContext (line 15) | function initializeAudioContext() {
function startVisualization (line 29) | function startVisualization() {
function startVisualization (line 62) | function startVisualization() {
function stopVisualization (line 87) | function stopVisualization() {
function startAudioCapture (line 93) | function startAudioCapture() {
function stopAudioCapture (line 107) | function stopAudioCapture() {
FILE: src/pages/utils/buildDiagnosticZip.js
constant FAST_RECORDER_KEYS (line 8) | const FAST_RECORDER_KEYS = [
FILE: src/pages/utils/buildSupportContext.js
constant MAX_ERR_LEN (line 6) | const MAX_ERR_LEN = 120;
FILE: src/pages/utils/buildSupportDebugInfo.js
constant MAX_ERR_LEN (line 9) | const MAX_ERR_LEN = 120;
FILE: src/pages/utils/diagnosticLog.js
constant MAX_SESSIONS (line 6) | const MAX_SESSIONS = 5;
constant MAX_EVENTS (line 7) | const MAX_EVENTS = 100;
constant FLUSH_EVERY_N (line 8) | const FLUSH_EVERY_N = 10;
FILE: src/pages/utils/errorCodes.js
constant REC_START_PERM (line 9) | const REC_START_PERM = "REC_START_PERM";
constant REC_START_STREAM (line 10) | const REC_START_STREAM = "REC_START_STREAM";
constant REC_START_CODEC (line 11) | const REC_START_CODEC = "REC_START_CODEC";
constant REC_START_REGION (line 12) | const REC_START_REGION = "REC_START_REGION";
constant REC_START_TAB (line 13) | const REC_START_TAB = "REC_START_TAB";
constant REC_START_TIMEOUT (line 14) | const REC_START_TIMEOUT = "REC_START_TIMEOUT";
constant REC_START_CANCEL (line 15) | const REC_START_CANCEL = "REC_START_CANCEL";
constant REC_START_NOT_READY (line 16) | const REC_START_NOT_READY = "REC_START_NOT_READY";
constant REC_RUN_STREAM_END (line 19) | const REC_RUN_STREAM_END = "REC_RUN_STREAM_END";
constant REC_RUN_MEMORY (line 20) | const REC_RUN_MEMORY = "REC_RUN_MEMORY";
constant REC_STOP_CHUNKS (line 23) | const REC_STOP_CHUNKS = "REC_STOP_CHUNKS";
constant REC_STOP_EDITOR (line 24) | const REC_STOP_EDITOR = "REC_STOP_EDITOR";
constant DRV_AUTH (line 27) | const DRV_AUTH = "DRV_AUTH";
constant DRV_FOLDER (line 28) | const DRV_FOLDER = "DRV_FOLDER";
constant DRV_UPLOAD (line 29) | const DRV_UPLOAD = "DRV_UPLOAD";
constant UNKNOWN (line 32) | const UNKNOWN = "UNKNOWN";
constant CANCEL_PATTERNS (line 40) | const CANCEL_PATTERNS = [
constant PERM_PATTERNS (line 48) | const PERM_PATTERNS = [
constant STREAM_PATTERNS (line 57) | const STREAM_PATTERNS = [
constant CODEC_PATTERNS (line 80) | const CODEC_PATTERNS = [
constant TAB_PATTERNS (line 90) | const TAB_PATTERNS = [
constant TIMEOUT_PATTERNS (line 98) | const TIMEOUT_PATTERNS = [
constant REGION_PATTERNS (line 104) | const REGION_PATTERNS = [
FILE: src/pages/utils/mediaDeviceFallback.js
constant DEVICE_ID_ERRORS (line 1) | const DEVICE_ID_ERRORS = new Set(["OverconstrainedError", "NotFoundError...
FILE: src/pages/utils/startFlowTrace.js
constant STORAGE_KEY (line 9) | const STORAGE_KEY = "startFlowTrace";
constant MAX_ERR_LEN (line 10) | const MAX_ERR_LEN = 120;
FILE: webpack.config.js
constant ASSET_PATH (line 11) | const ASSET_PATH = process.env.ASSET_PATH || "/";
Copy disabled (too large)
Download .json
Condensed preview — 376 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (11,150K chars).
[
{
"path": ".babelrc",
"chars": 142,
"preview": "{\n \"presets\": [\n [\"@babel/preset-env\", { \"targets\": { \"chrome\": \"110\" } }],\n [\"@babel/preset-react\", { \"runtime\":"
},
{
"path": ".gitattributes",
"chars": 66,
"preview": "# Auto detect text files and perform LF normalization\n* text=auto\n"
},
{
"path": ".github/FUNDING.yml",
"chars": 65,
"preview": "# These are supported funding model platforms\n\ngithub: alyssaxuu\n"
},
{
"path": ".gitignore",
"chars": 172,
"preview": "logs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nnode_modules/\n.DS_Store\n.vscode/\n.env\n.env.local\n.env.developm"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 5216,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
},
{
"path": "LICENSE",
"chars": 34888,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\nCopyright (C) 2007 Free S"
},
{
"path": "README.md",
"chars": 6891,
"preview": "# Screenity\n\n> _✨ Screenity's open source work is sponsored by_\n> ### Recall.ai - API for desktop recording [<img src=\"h"
},
{
"path": "custom.config.js",
"chars": 164,
"preview": "module.exports = {\n notHMR: [\"background\", \"contentScript\", \"devtools\", \"sandbox\"],\n enableBackgroundAutoReload: true,"
},
{
"path": "package.json",
"chars": 3114,
"preview": "{\n \"name\": \"screenity\",\n \"version\": \"4.3.0\",\n \"description\": \"The free and privacy-friendly screen recorder with no s"
},
{
"path": "patches/fabric+5.3.0.patch",
"chars": 1168,
"preview": "diff --git a/node_modules/fabric/dist/fabric.js b/node_modules/fabric/dist/fabric.js\nindex faee7fc..02e5ae3 100644\n--- a"
},
{
"path": "patches/fabric+5.5.2.patch",
"chars": 1168,
"preview": "diff --git a/node_modules/fabric/dist/fabric.js b/node_modules/fabric/dist/fabric.js\nindex a7ad0f5..d8e7670 100644\n--- a"
},
{
"path": "patches/plyr+3.7.8.patch",
"chars": 7082710,
"preview": "diff --git a/node_modules/plyr/dist/plyr.js b/node_modules/plyr/dist/plyr.js\nindex 0a79517..e69634f 100644\n--- a/node_mo"
},
{
"path": "scripts/patch-radix.js",
"chars": 1110,
"preview": "const fs = require(\"fs\");\nconst path = require(\"path\");\n\nconst root = path.resolve(__dirname, \"..\");\nconst targets = [\n "
},
{
"path": "src/_locales/ca/messages.json",
"chars": 65571,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - Grava i Anota la Pantalla\",\n \"description\": \"Nom de l'extensió\"\n },\n \""
},
{
"path": "src/_locales/de/messages.json",
"chars": 66572,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - Bildschirmaufnahme & Beschriftung\",\n \"description\": \"Erweiterungsname\"\n "
},
{
"path": "src/_locales/en/messages.json",
"chars": 59001,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - Screen Recorder & Annotation Tool\",\n \"description\": \"Extension name\"\n }"
},
{
"path": "src/_locales/es/messages.json",
"chars": 65192,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - Graba y anota tu pantalla\",\n \"description\": \"Nombre de la extensión\"\n }"
},
{
"path": "src/_locales/fr/messages.json",
"chars": 67860,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - Capture & Annotation d'écran\",\n \"description\": \"Nom de l'extension\"\n },"
},
{
"path": "src/_locales/hi/messages.json",
"chars": 61065,
"preview": "{\n \"extName\": {\n \"message\": \"स्क्रीनिटी - स्क्रीन रिकॉर्डिंग & नोट्स\",\n \"description\": \"एक्सटेंशन का नाम\"\n },\n "
},
{
"path": "src/_locales/id/messages.json",
"chars": 61810,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - Perekam Layar & Alat Anotasi\",\n \"description\": \"Nama ekstensi\"\n },\n \"e"
},
{
"path": "src/_locales/it/messages.json",
"chars": 65346,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - Registra lo schermo e annota\",\n \"description\": \"Nome dell'estensione\"\n "
},
{
"path": "src/_locales/ko/messages.json",
"chars": 51214,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - 화면 녹화 프로그램 & 주석 도구\",\n \"description\": \"Extension name\"\n },\n \"extDesc\": "
},
{
"path": "src/_locales/pl/messages.json",
"chars": 64068,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - Nagrywarka & Edytor adnotacji\",\n \"description\": \"Nazwa rozszerzenia\"\n }"
},
{
"path": "src/_locales/pt_BR/messages.json",
"chars": 63628,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - Grave e faça anotações na tela\",\n \"description\": \"Nome da extensão\"\n },"
},
{
"path": "src/_locales/pt_PT/messages.json",
"chars": 64115,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - Grave o ecrã e faça anotações\",\n \"description\": \"Nome da extensão\"\n },\n"
},
{
"path": "src/_locales/ru/messages.json",
"chars": 63593,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - Запись экрана & Аннотации\",\n \"description\": \"Название расширения\"\n },\n "
},
{
"path": "src/_locales/ta/messages.json",
"chars": 63116,
"preview": "{\n \"extName\": {\n \"message\": \"ஸ்க்ரீனிட்டி - திரைப்பதிவு & குறிப்புகள்\",\n \"description\": \"நீட்சிதம் பெயர்\"\n },\n "
},
{
"path": "src/_locales/tr/messages.json",
"chars": 61664,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - Ekran Kayıt & Not Aracı\",\n \"description\": \"Uzantı adı\"\n },\n \"extDesc\":"
},
{
"path": "src/_locales/uk/messages.json",
"chars": 61388,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - Запис екрану & Анотації\",\n \"description\": \"Extension name\"\n },\n \"extDe"
},
{
"path": "src/_locales/zh_CN/messages.json",
"chars": 47830,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - 屏幕录像和标注工具\",\n \"description\": \"Extension name\"\n },\n \"extDesc\": {\n \"me"
},
{
"path": "src/_locales/zh_TW/messages.json",
"chars": 49895,
"preview": "{\n \"extName\": {\n \"message\": \"Screenity - 螢幕錄製與標註工具\",\n \"description\": \"Extension name\"\n },\n \"extDesc\": {\n \"me"
},
{
"path": "src/assets/editor/index.html",
"chars": 1524,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-w"
},
{
"path": "src/assets/fonts/fonts.css",
"chars": 750,
"preview": "@font-face {\n font-family: Satoshi-Light;\n src: url(chrome-extension://__MSG_@@extension_id__/assets/fonts/Satoshi-Lig"
},
{
"path": "src/assets/mediapipeVision/vision_wasm_internal.js",
"chars": 204816,
"preview": "var ModuleFactory=(()=>{var _scriptName=globalThis.document?.currentScript?.src;return async function(moduleArg={}){var "
},
{
"path": "src/assets/mediapipeVision/vision_wasm_nosimd_internal.js",
"chars": 204669,
"preview": "var ModuleFactory=(()=>{var _scriptName=globalThis.document?.currentScript?.src;return async function(moduleArg={}){var "
},
{
"path": "src/assets/satoshi.css",
"chars": 4668,
"preview": "/**\n * @license\n *\n * Font Family: Satoshi\n * Designed by: Deni Anggara\n * URL: https://www.fontshare.com/fonts/satoshi\n"
},
{
"path": "src/assets/vendor/ffmpeg-core.js",
"chars": 105830,
"preview": "\nvar createFFmpegCore = (function() {\n var _scriptDir = typeof document !== 'undefined' && document.currentScript ? doc"
},
{
"path": "src/assets/vendor/ffmpeg-core.worker.js",
"chars": 3609,
"preview": "var threadInfoStruct=0;var selfThreadId=0;var parentThreadId=0;var Module={};function threadPrintErr(){var text=Array.pr"
},
{
"path": "src/assets/vendor/gif.js/gif.worker.js",
"chars": 16636,
"preview": "// gif.worker.js 0.2.0 - https://github.com/jnordberg/gif.js\n(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var "
},
{
"path": "src/manifest.json",
"chars": 3095,
"preview": "{\n \"manifest_version\": 3,\n \"name\": \"__MSG_extName__\",\n \"description\": \"__MSG_extDesc__\",\n \"default_locale\": \"en\",\n "
},
{
"path": "src/media/fastRecorderGate.ts",
"chars": 16971,
"preview": "declare const chrome: any;\n\nexport type FastRecorderProbeResult = {\n ok: boolean;\n reasons: string[];\n details: Recor"
},
{
"path": "src/messaging/messageRouter.js",
"chars": 1099,
"preview": "const handlers = {};\n\nexport const registerMessage = (type, handler) => {\n if (handlers[type]) {\n console.warn(\n "
},
{
"path": "src/pages/AudioOffscreen/index.html",
"chars": 199,
"preview": "<!doctype html>\n<html>\n <head>\n <meta charset=\"utf-8\" />\n <title>Screenity Audio Offscreen</title>\n </head>\n <b"
},
{
"path": "src/pages/AudioOffscreen/index.js",
"chars": 653,
"preview": "const audioUrl = chrome.runtime.getURL(\"assets/sounds/beep.mp3\");\nlet audioEl = null;\n\nconst getAudio = () => {\n if (!a"
},
{
"path": "src/pages/Background/alarms/addAlarmListener.js",
"chars": 463,
"preview": "import { handleAlarm } from \"./handleAlarm\";\n\nconst alarmListener = (alarm) => {\n handleAlarm(alarm);\n};\n\nexport const "
},
{
"path": "src/pages/Background/alarms/handleAlarm.js",
"chars": 3693,
"preview": "import { stopRecording } from \"../recording/stopRecording.js\";\nimport { sendMessageTab } from \"../tabManagement\";\nimport"
},
{
"path": "src/pages/Background/auth/loginWithWebsite.js",
"chars": 5899,
"preview": "import { getCurrentTab, sendMessageTab } from \"../tabManagement\";\n\nconst API_BASE = process.env.SCREENITY_API_BASE_URL;\n"
},
{
"path": "src/pages/Background/backup/initBackup.js",
"chars": 1200,
"preview": "import { sendMessageTab } from \"../tabManagement\";\n\nexport const initBackup = async (request, id) => {\n const { backupT"
},
{
"path": "src/pages/Background/drive/handleSaveToDrive.js",
"chars": 7681,
"preview": "import { base64ToUint8Array } from \"../utils/base64ToUint8Array\";\nimport { sendMessageTab } from \"../tabManagement\";\nimp"
},
{
"path": "src/pages/Background/drive/handleSignOutDrive.js",
"chars": 308,
"preview": "export const handleSignOutDrive = async () => {\n const { token } = await chrome.storage.local.get([\"token\"]);\n var url"
},
{
"path": "src/pages/Background/index.js",
"chars": 2339,
"preview": "import { initializeListeners } from \"./listeners\";\nimport { setupHandlers } from \"./messaging/handlers\";\nimport {\n mess"
},
{
"path": "src/pages/Background/listeners/index.js",
"chars": 927,
"preview": "import { onCommandListener } from \"./onCommandListener\";\nimport { onInstalledListener } from \"./onInstalledListener\";\nim"
},
{
"path": "src/pages/Background/listeners/onActionButtonClickedListener.js",
"chars": 8775,
"preview": "import {\n sendMessageTab,\n getCurrentTab,\n setEditorTabReference,\n clearEditorTabReference,\n} from \"../tabManagement"
},
{
"path": "src/pages/Background/listeners/onCommandListener.js",
"chars": 2758,
"preview": "import { sendMessageTab, getCurrentTab } from \"../tabManagement\";\n\n// Main command listener\nexport const onCommandListen"
},
{
"path": "src/pages/Background/listeners/onInstalledListener.js",
"chars": 2939,
"preview": "import { removeTab } from \"../tabManagement\";\nimport { executeScripts } from \"../utils/executeScripts\";\nimport { support"
},
{
"path": "src/pages/Background/listeners/onMessageExternalListener.js",
"chars": 5603,
"preview": "import {\n getCurrentTab,\n sendMessageTab,\n parseEditorTargetUrl,\n setEditorTabReference,\n clearEditorTabReference,\n"
},
{
"path": "src/pages/Background/listeners/onStartupListener.js",
"chars": 287,
"preview": "// For some reason without this the service worker doesn't always work\nexport const onStartupListener = async () => {\n "
},
{
"path": "src/pages/Background/listeners/onTabActivatedListener.js",
"chars": 2994,
"preview": "import { sendMessageTab } from \"../tabManagement\";\n\nexport const handleTabActivation = async (activeInfo) => {\n try {\n "
},
{
"path": "src/pages/Background/listeners/onTabRemovedListener.js",
"chars": 6238,
"preview": "import { sendMessageTab, clearEditorTabReference } from \"../tabManagement\";\nimport { removeTab } from \"../tabManagement/"
},
{
"path": "src/pages/Background/listeners/onTabUpdatedListener.js",
"chars": 5391,
"preview": "import { sendMessageTab } from \"../tabManagement\";\nimport { diagEvent } from \"../../utils/diagnosticLog\";\nimport { video"
},
{
"path": "src/pages/Background/listeners/onWindowFocusChangedListener.js",
"chars": 438,
"preview": "import { handleTabActivation } from \"./onTabActivatedListener.js\";\n\nexport const onWindowFocusChangedListener = async (w"
},
{
"path": "src/pages/Background/messaging/handlers.js",
"chars": 68928,
"preview": "import { registerMessage } from \"../../../messaging/messageRouter\";\nimport {\n focusTab,\n createTab,\n resetActiveTab,\n"
},
{
"path": "src/pages/Background/modules/signIn.js",
"chars": 2553,
"preview": "const isEdge = navigator.userAgent.includes(\"Edg\");\n\nconst EDGE_CLIENT_ID =\n \"560517327251-856rbcshgori6mft9slnsaq34p21"
},
{
"path": "src/pages/Background/offscreen/closeOffscreenDocument.js",
"chars": 413,
"preview": "export const closeOffscreenDocument = async () => {\n try {\n const existingContexts = await chrome.runtime.getContext"
},
{
"path": "src/pages/Background/offscreen/discardOffscreenDocuments.js",
"chars": 605,
"preview": "/**\n * Closes any active offscreen document if it exists.\n * Also clears the offscreen storage flag to prevent stale sta"
},
{
"path": "src/pages/Background/offscreen/offscreenDocument.js",
"chars": 5943,
"preview": "import { getCurrentTab } from \"../tabManagement\";\nimport { removeTab } from \"../tabManagement/removeTab\";\nimport { sendM"
},
{
"path": "src/pages/Background/recording/cancelRecording.js",
"chars": 2056,
"preview": "import { sendMessageTab, focusTab } from \"../tabManagement\";\nimport { discardOffscreenDocuments } from \"../offscreen/dis"
},
{
"path": "src/pages/Background/recording/checkRecording.js",
"chars": 989,
"preview": "import { discardRecording } from \"./discardRecording\";\nimport { discardOffscreenDocuments } from \"../offscreen/discardOf"
},
{
"path": "src/pages/Background/recording/chunkHandler.js",
"chars": 5761,
"preview": "import localforage from \"localforage\";\nimport { blobToBase64 } from \"../utils/blobToBase64\";\nimport { sendMessageTab } f"
},
{
"path": "src/pages/Background/recording/cloudLocalPlaybackConstants.js",
"chars": 223,
"preview": "export const CLOUD_LOCAL_PLAYBACK_KEY = \"cloudLocalScreenPlaybackOffer\";\nexport const CLOUD_LOCAL_PLAYBACK_EVENT_KEY = \""
},
{
"path": "src/pages/Background/recording/desktopCapture.js",
"chars": 919,
"preview": "import { getCurrentTab } from \"../tabManagement\";\nimport { initBackup } from \"../backup/initBackup\";\nimport { offscreenD"
},
{
"path": "src/pages/Background/recording/discardRecording.js",
"chars": 1007,
"preview": "import { sendMessageRecord } from \"./sendMessageRecord\";\nimport { discardOffscreenDocuments } from \"../offscreen/discard"
},
{
"path": "src/pages/Background/recording/forceProcessing.js",
"chars": 772,
"preview": "import { removeTab } from \"../tabManagement\";\nimport { sendChunks } from \"./sendChunks\";\n\nexport const forceProcessing ="
},
{
"path": "src/pages/Background/recording/getStreamingData.js",
"chars": 655,
"preview": "export const getStreamingData = async () => {\n try {\n const {\n micActive,\n defaultAudioInput,\n defaul"
},
{
"path": "src/pages/Background/recording/recordingHelpers.js",
"chars": 6770,
"preview": "import {\n sendMessageTab,\n focusTab,\n removeTab,\n getCurrentTab,\n} from \"../tabManagement\";\nimport { sendMessageReco"
},
{
"path": "src/pages/Background/recording/restartRecording.js",
"chars": 2116,
"preview": "import { sendMessageRecord } from \"./sendMessageRecord\";\nimport { resetActiveTabRestart } from \"../tabManagement/resetAc"
},
{
"path": "src/pages/Background/recording/restoreCloudRecording.js",
"chars": 1919,
"preview": "import localforage from \"localforage\";\nimport { createTab, sendMessageTab } from \"../tabManagement\";\n\nconst RECOVERABLE_"
},
{
"path": "src/pages/Background/recording/restoreRecording.js",
"chars": 1713,
"preview": "import { sendMessageTab } from \"../tabManagement\";\nimport { chunksStore } from \"./chunkHandler\";\n\nexport const checkRest"
},
{
"path": "src/pages/Background/recording/sendChunks.js",
"chars": 1826,
"preview": "import { chunksStore } from \"./chunkHandler\";\nimport { handleChunks } from \"./chunkHandler\";\nimport { diagEvent } from \""
},
{
"path": "src/pages/Background/recording/sendMessageRecord.js",
"chars": 2260,
"preview": "import { sendMessageTab } from \"../tabManagement\";\n\nexport const sendMessageRecord = (message, responseCallback = null) "
},
{
"path": "src/pages/Background/recording/startRecording.js",
"chars": 5678,
"preview": "import { sendMessageRecord } from \"./sendMessageRecord\";\nimport { sendMessageTab } from \"../tabManagement\";\nimport { ini"
},
{
"path": "src/pages/Background/recording/stopRecording.js",
"chars": 19230,
"preview": "import { focusTab, sendMessageTab } from \"../tabManagement/\";\nimport { discardOffscreenDocuments } from \"../offscreen/di"
},
{
"path": "src/pages/Background/tabManagement/createTab.js",
"chars": 527,
"preview": "export const createTab = async (url, translate = false, active = false) => {\n if (!url) return;\n\n if (translate) {\n "
},
{
"path": "src/pages/Background/tabManagement/editorTab.js",
"chars": 7261,
"preview": "import { createTab } from \"./createTab\";\nimport { focusTab } from \"./focusTab\";\n\nconst APP_BASE_URL = process.env.SCREEN"
},
{
"path": "src/pages/Background/tabManagement/focusTab.js",
"chars": 793,
"preview": "export const focusTab = async (tabId, context = {}) => {\n if (!Number.isInteger(tabId)) {\n console.warn(\"[Screenity]"
},
{
"path": "src/pages/Background/tabManagement/getCurrentTab.js",
"chars": 181,
"preview": "export const getCurrentTab = async () => {\n const queryOptions = { active: true, lastFocusedWindow: true };\n const [ta"
},
{
"path": "src/pages/Background/tabManagement/index.js",
"chars": 817,
"preview": "import { createTab } from \"./createTab\";\nimport { getCurrentTab } from \"./getCurrentTab\";\nimport { sendMessageTab } from"
},
{
"path": "src/pages/Background/tabManagement/removeTab.js",
"chars": 351,
"preview": "export const removeTab = async (tabId) => {\n if (tabId === null) return;\n\n try {\n const tab = await new Promise((re"
},
{
"path": "src/pages/Background/tabManagement/resetActiveTab.js",
"chars": 4018,
"preview": "import { focusTab } from \"./focusTab\";\nimport { sendMessageTab } from \"./sendMessageTab\";\nimport { startRecording } from"
},
{
"path": "src/pages/Background/tabManagement/sendMessageTab.js",
"chars": 2205,
"preview": "export const sendMessageTab = async (\n tabId,\n message,\n responseCallback = null,\n noTab = null\n) => {\n if (tabId ="
},
{
"path": "src/pages/Background/tabManagement/setSurface.js",
"chars": 526,
"preview": "import { sendMessageTab } from \"../tabManagement\";\nimport { loginWithWebsite } from \"../auth/loginWithWebsite\";\n\nexport "
},
{
"path": "src/pages/Background/tabManagement/tabHelpers.js",
"chars": 303,
"preview": "export const setMicActiveTab = async (request) => {\n chrome.storage.local.get([\"region\"], (result) => {\n if (result."
},
{
"path": "src/pages/Background/utils/base64ToUint8Array.js",
"chars": 720,
"preview": "export const base64ToUint8Array = (base64) => {\n const dataUrlRegex = /^data:(.*?);base64,/;\n const matches = base64.m"
},
{
"path": "src/pages/Background/utils/blobToBase64.js",
"chars": 259,
"preview": "export const blobToBase64 = (blob) => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();"
},
{
"path": "src/pages/Background/utils/browserHelpers.js",
"chars": 997,
"preview": "export const isPinned = async () => {\n try {\n const userSettings = await chrome.action.getUserSettings();\n return"
},
{
"path": "src/pages/Background/utils/downloadHelpers.js",
"chars": 1552,
"preview": "import { sendMessageTab } from \"../tabManagement\";\n\nexport const requestDownload = async (base64, title) => {\n try {\n "
},
{
"path": "src/pages/Background/utils/executeScripts.js",
"chars": 756,
"preview": "export const executeScripts = async () => {\n const contentScripts = chrome.runtime.getManifest().content_scripts;\n con"
},
{
"path": "src/pages/Background/utils/featureDetection.js",
"chars": 1912,
"preview": "export const supportsWebCodecsUA = () => {\n try {\n const ua = navigator.userAgent;\n const chromeMatch = ua.match("
},
{
"path": "src/pages/Background/utils/waitForContentScript.js",
"chars": 1158,
"preview": "/**\n * Waits for a content script in the specified tab to be ready.\n * @param {number} tabId - The ID of the tab to wait"
},
{
"path": "src/pages/Backup/Backup.jsx",
"chars": 19996,
"preview": "import React, { useState, useEffect, useRef } from \"react\";\n\nimport localforage from \"localforage\";\n\nlocalforage.config("
},
{
"path": "src/pages/Backup/index.html",
"chars": 1318,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <title>Screenity - Backups</title>\n <meta "
},
{
"path": "src/pages/Backup/index.jsx",
"chars": 366,
"preview": "import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\n\nimport Backup from \"./Backup\";\n\n// Find the c"
},
{
"path": "src/pages/Backup/messaging/handlers.js",
"chars": 0,
"preview": ""
},
{
"path": "src/pages/Camera/Camera.jsx",
"chars": 9137,
"preview": "import React, { useEffect, useRef, useState } from \"react\";\nimport Background from \"./components/Background\";\nimport { u"
},
{
"path": "src/pages/Camera/components/Background.js",
"chars": 5405,
"preview": "import React, { useRef, useEffect, useState } from \"react\";\nimport { useCameraContext } from \"../context/CameraContext\";"
},
{
"path": "src/pages/Camera/context/CameraContext.js",
"chars": 7906,
"preview": "import React, {\n createContext,\n useContext,\n useState,\n useRef,\n useEffect,\n useCallback,\n} from \"react\";\nimport "
},
{
"path": "src/pages/Camera/index.html",
"chars": 314,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <title></title>\n </head>\n\n <body>\n <div "
},
{
"path": "src/pages/Camera/index.jsx",
"chars": 512,
"preview": "// src/index.js\nimport React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport CameraProvider from \"./"
},
{
"path": "src/pages/Camera/messaging/handlers.js",
"chars": 6855,
"preview": "import {\n registerMessage,\n messageRouter,\n} from \"../../../messaging/messageRouter\";\nimport { getContextRefs } from \""
},
{
"path": "src/pages/Camera/utils/backgroundUtils.js",
"chars": 10414,
"preview": "import {\n FilesetResolver,\n ImageSegmenter,\n} from \"@mediapipe/tasks-vision\";\n\n// Pre-allocated canvases reused across"
},
{
"path": "src/pages/Camera/utils/cameraUtils.js",
"chars": 7061,
"preview": "import { getContextRefs } from \"../context/CameraContext\";\nimport { setPipMode } from \"./uiState\";\nimport { getUserMedia"
},
{
"path": "src/pages/Camera/utils/canvasUtils.js",
"chars": 3544,
"preview": "export const initializeCanvases = () => {\n const offScreenCanvas = document.createElement(\"canvas\");\n const offScreenC"
},
{
"path": "src/pages/Camera/utils/effects.js",
"chars": 2266,
"preview": "import { renderEffectBackground } from \"./backgroundUtils\";\nimport { getContextRefs } from \"../context/CameraContext\";\n\n"
},
{
"path": "src/pages/Camera/utils/uiState.js",
"chars": 1261,
"preview": "import { getContextRefs } from \"../context/CameraContext\";\n\nexport const setWidth = (width) => {\n const { videoRef, set"
},
{
"path": "src/pages/CloudRecorder/CloudRecorder.jsx",
"chars": 165037,
"preview": "import React, { useEffect, useState, useRef, useCallback } from \"react\";\nimport RecorderUI from \"./RecorderUI\";\nimport {"
},
{
"path": "src/pages/CloudRecorder/RecorderUI.jsx",
"chars": 4300,
"preview": "import React from \"react\";\nimport Warning from \"./warning/Warning\";\n\nconst RecorderUI = ({\n started,\n initProject = fa"
},
{
"path": "src/pages/CloudRecorder/bunnyTusUploader.js",
"chars": 43114,
"preview": "const API_BASE = process.env.SCREENITY_API_BASE_URL;\n\nexport async function getThumbnailFromBlob(blob, seekTo = 0.1) {\n "
},
{
"path": "src/pages/CloudRecorder/createVideoProject.js",
"chars": 2396,
"preview": "const VIDEO_INIT = {\n aspectRatio: {\n width: 16,\n height: 9,\n source: \"preset\",\n preset: \"Youtube (16:9)\",\n"
},
{
"path": "src/pages/CloudRecorder/index.html",
"chars": 1070,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-w"
},
{
"path": "src/pages/CloudRecorder/index.jsx",
"chars": 386,
"preview": "import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport CloudRecorder from \"./CloudRecorder\";\n\n"
},
{
"path": "src/pages/CloudRecorder/messaging.js",
"chars": 1050,
"preview": "import { classifyError } from \"../utils/errorCodes\";\n\nconst urlParams = new URLSearchParams(window.location.search);\ncon"
},
{
"path": "src/pages/CloudRecorder/recorderConfig.js",
"chars": 1170,
"preview": "export const MIME_TYPES = [\n \"video/webm;codecs=vp9,opus\",\n \"video/webm;codecs=vp8,opus\",\n \"video/webm;codecs=h264\",\n"
},
{
"path": "src/pages/CloudRecorder/warning/Warning.jsx",
"chars": 4996,
"preview": "import React, {\n useState,\n useEffect,\n useContext,\n useCallback,\n useRef,\n} from \"react\";\n\nimport { ReactSVG } fro"
},
{
"path": "src/pages/Content/Content.jsx",
"chars": 5076,
"preview": "import React, { useState, useContext, useEffect, useRef } from \"react\";\n\nimport Wrapper from \"./Wrapper\";\n\nimport Conten"
},
{
"path": "src/pages/Content/DevHUD.jsx",
"chars": 5228,
"preview": "import React, { useState, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nconst Z = 2147483647;\n\nco"
},
{
"path": "src/pages/Content/Wrapper.jsx",
"chars": 11283,
"preview": "import React, { useContext, useRef, useEffect } from \"react\";\n\nimport PopupContainer from \"./popup/PopupContainer\";\nimpo"
},
{
"path": "src/pages/Content/camera/Camera.jsx",
"chars": 1021,
"preview": "import React, { useContext, useEffect } from \"react\";\n\nimport CameraWrap from \"./layout/CameraWrap\";\n\nimport { contentSt"
},
{
"path": "src/pages/Content/camera/components/ResizeHandle.jsx",
"chars": 258,
"preview": "import React from \"react\";\n\nimport { CameraResizeIcon } from \"../../toolbar/components/SVG\";\n\nconst ResizeHandle = ({ po"
},
{
"path": "src/pages/Content/camera/layout/CameraToolbar.jsx",
"chars": 1360,
"preview": "import React, { useState, useEffect, useContext } from \"react\";\n\nimport * as Toolbar from \"@radix-ui/react-toolbar\";\n\nim"
},
{
"path": "src/pages/Content/camera/layout/CameraWrap.jsx",
"chars": 6790,
"preview": "import React, {\n useEffect,\n useContext,\n useRef,\n useState,\n useLayoutEffect,\n} from \"react\";\n\nimport { Rnd } from"
},
{
"path": "src/pages/Content/camera/styles/_Camera.scss",
"chars": 129,
"preview": "@use '../../styles/_variables' as *;\n@use './layout/CameraWrap';\n@use './layout/CameraToolbar';\n@use './components/Resiz"
},
{
"path": "src/pages/Content/camera/styles/components/_ResizeHandle.scss",
"chars": 551,
"preview": "@use '../../../styles/_variables' as *;\n\n.camera-resize {\n\tposition: absolute;\n\tbottom: 20px;\n\tright: 20px;\n\tz-index: $z"
},
{
"path": "src/pages/Content/camera/styles/layout/_CameraToolbar.scss",
"chars": 1726,
"preview": "@use '../../../styles/_variables' as *;\n\n.camera-toolbar {\n\tdisplay: flex;\n\talign-items: center;\n padding-left: 4px;\n\tp"
},
{
"path": "src/pages/Content/camera/styles/layout/_CameraWrap.scss",
"chars": 318,
"preview": "@use '../../../styles/_variables' as *;\n\n.camera-draggable {\n\twidth: 100%;\n\theight: 100%;\n\ttransform-origin: left top;\n\t"
},
{
"path": "src/pages/Content/camera-only/CameraOnly.jsx",
"chars": 560,
"preview": "import React, { useContext } from \"react\";\n\nimport CameraWrap from \"./layout/CameraWrap\";\n\nimport { contentStateContext "
},
{
"path": "src/pages/Content/camera-only/layout/CameraWrap.jsx",
"chars": 806,
"preview": "import React, { useEffect, useContext, useRef, useState } from \"react\";\n\nimport { contentStateContext } from \"../../cont"
},
{
"path": "src/pages/Content/camera-only/styles/_CameraOnly.scss",
"chars": 36,
"preview": "@use '../../styles/_variables' as *;"
},
{
"path": "src/pages/Content/canvas/Canvas.jsx",
"chars": 223,
"preview": "import React, { useContext } from \"react\";\n\nimport CanvasWrap from \"./layout/CanvasWrap\";\n\nconst Canvas = () => {\n retu"
},
{
"path": "src/pages/Content/canvas/layout/CanvasWrap.jsx",
"chars": 7942,
"preview": "import React, { useEffect, useRef, useContext } from \"react\";\nimport { fabric } from \"fabric\";\n\nimport { contentStateCon"
},
{
"path": "src/pages/Content/canvas/layout/TextToolbar.jsx",
"chars": 2763,
"preview": "import React, { useRef, useContext, useEffect, useState } from \"react\";\n\nimport * as Toolbar from \"@radix-ui/react-toolb"
},
{
"path": "src/pages/Content/canvas/modules/ArrowTool.jsx",
"chars": 10714,
"preview": "import { fabric } from \"fabric\";\n\nconst createArrowLine = (x, y, color, strokeWidth) => {\n return new fabric.Line([x, y"
},
{
"path": "src/pages/Content/canvas/modules/CustomControls.jsx",
"chars": 12474,
"preview": "import React from \"react\";\nimport { fabric } from \"fabric\";\n\nimport {\n HandleControl,\n RotateControl,\n MiddleHandleCo"
},
{
"path": "src/pages/Content/canvas/modules/EraserTool.jsx",
"chars": 3470,
"preview": "import { saveCanvas } from \"./History\";\n\nconst EraserTool = (canvas, contentStateRef, setContentState) => {\n const getS"
},
{
"path": "src/pages/Content/canvas/modules/History.jsx",
"chars": 2495,
"preview": "import { fabric } from \"fabric\";\n\nconst getState = (stateOrRef) =>\n stateOrRef && stateOrRef.current ? stateOrRef.curre"
},
{
"path": "src/pages/Content/canvas/modules/ImageTool.jsx",
"chars": 2680,
"preview": "import { fabric } from \"fabric\";\n\nconst ImageTool = (\n canvas,\n src,\n toolSettings,\n setToolSettings,\n saveCanvas,\n"
},
{
"path": "src/pages/Content/canvas/modules/PenTool.jsx",
"chars": 4687,
"preview": "import { fabric } from \"fabric\";\n\nconst PenTool = (canvas, contentStateRef, setContentState, saveCanvas) => {\n const ge"
},
{
"path": "src/pages/Content/canvas/modules/SelectTool.jsx",
"chars": 2571,
"preview": "import { fabric } from \"fabric\";\n\nconst SelectTool = (canvas, contentStateRef, setContentState) => {\n const getState = "
},
{
"path": "src/pages/Content/canvas/modules/ShapeTool.jsx",
"chars": 3375,
"preview": "import { fabric } from \"fabric\";\n\nconst ShapeTool = (canvas, contentStateRef, setContentState, saveCanvas) => {\n const "
},
{
"path": "src/pages/Content/canvas/modules/TextTool.jsx",
"chars": 5338,
"preview": "import { fabric } from \"fabric\";\n\nconst TextTool = (canvas, contentStateRef, setContentState, saveCanvas) => {\n const g"
},
{
"path": "src/pages/Content/canvas/styles/_Canvas.scss",
"chars": 60,
"preview": "@use '../../styles/_variables' as *;\n@use './layout/Canvas';"
},
{
"path": "src/pages/Content/canvas/styles/layout/_Canvas.scss",
"chars": 527,
"preview": "@use '../../../styles/_variables' as *;\n\n.CanvasContainer {\n\twidth: 100%;\n\theight: 100%;\n\tposition: absolute;\n\tpointer-e"
},
{
"path": "src/pages/Content/context/ContentState.jsx",
"chars": 52110,
"preview": "import React, {\n createContext,\n useState,\n useEffect,\n useCallback,\n useRef,\n} from \"react\";\n\nimport { updateFromS"
},
{
"path": "src/pages/Content/context/messaging/handlers.js",
"chars": 34183,
"preview": "// src/content/handlers/recordingHandlers.js\nimport {\n registerMessage,\n messageRouter,\n} from \"../../../../messaging/"
},
{
"path": "src/pages/Content/context/utils/checkAuthStatus.js",
"chars": 675,
"preview": "export const checkAuthStatus = async () => {\n return new Promise((resolve) => {\n chrome.runtime.sendMessage({ type: "
},
{
"path": "src/pages/Content/context/utils/checkRecording.js",
"chars": 586,
"preview": "import { setContentState } from \"../ContentState\";\n\nexport const checkRecording = async (id) => {\n const { recording } "
},
{
"path": "src/pages/Content/context/utils/updateFromStorage.js",
"chars": 13940,
"preview": "import { setContentState } from \"../ContentState\";\nimport { checkRecording } from \"./checkRecording\";\n\nconst CURSOR_EFFE"
},
{
"path": "src/pages/Content/countdown/Countdown.jsx",
"chars": 9383,
"preview": "import React, { useState, useEffect, useContext, useRef } from \"react\";\n\n// Context\nimport { contentStateContext } from "
},
{
"path": "src/pages/Content/countdown/styles/_Countdown.scss",
"chars": 3142,
"preview": "@use \"../../styles/_variables\" as *;\n\n.countdown {\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0px;\n le"
},
{
"path": "src/pages/Content/cursor/trackClicks.js",
"chars": 1989,
"preview": "export function startClickTracking(\n isRegion = false,\n regionWidth = 0,\n regionHeight = 0,\n regionX = 0,\n regionY "
},
{
"path": "src/pages/Content/images/popup/images.js",
"chars": 2956,
"preview": "// I need to make this work for a Chrome extension, so I can't import images, instead it needs to be a string with the p"
},
{
"path": "src/pages/Content/index.css",
"chars": 365,
"preview": "body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Can"
},
{
"path": "src/pages/Content/index.js",
"chars": 250,
"preview": "import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport \"./styles/app.scss\";\nimport Content from \"./C"
},
{
"path": "src/pages/Content/index.jsx",
"chars": 461,
"preview": "import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport Content from \"./Content\";\n\n// Check if "
},
{
"path": "src/pages/Content/modal/Modal.jsx",
"chars": 4466,
"preview": "import React, { useState, useEffect, useContext, useCallback } from \"react\";\nimport * as AlertDialog from \"@radix-ui/rea"
},
{
"path": "src/pages/Content/modal/styles/_Modal.scss",
"chars": 2717,
"preview": "@use \"../../styles/_variables\" as *;\n\n/* reset */\nbutton {\n all: unset;\n}\n\n.AlertDialogOverlay {\n background-color: rg"
},
{
"path": "src/pages/Content/popup/PopupContainer.jsx",
"chars": 22414,
"preview": "import React, {\n useState,\n useEffect,\n useContext,\n useLayoutEffect,\n useRef,\n} from \"react\";\nimport * as Tabs fro"
},
{
"path": "src/pages/Content/popup/components/BackgroundEffects.jsx",
"chars": 1871,
"preview": "import React, { useContext } from \"react\";\nimport * as ToggleGroup from \"@radix-ui/react-toggle-group\";\n\n// Context\nimpo"
},
{
"path": "src/pages/Content/popup/components/Dropdown.jsx",
"chars": 11864,
"preview": "import React, { useEffect, useState, useContext, useRef } from \"react\";\n\nimport * as Select from \"@radix-ui/react-select"
},
{
"path": "src/pages/Content/popup/components/RegionDimensions.jsx",
"chars": 2518,
"preview": "import React, { useState, useRef, useContext, useEffect } from \"react\";\n\n// Context\nimport { contentStateContext } from "
},
{
"path": "src/pages/Content/popup/components/Switch.jsx",
"chars": 9433,
"preview": "import React, { useContext, useEffect, useState, useRef } from \"react\";\nimport * as S from \"@radix-ui/react-switch\";\n\n//"
},
{
"path": "src/pages/Content/popup/components/TimeSetter.jsx",
"chars": 4413,
"preview": "import React, { useContext, useEffect, useState, useRef } from \"react\";\n\n// Context\nimport { contentStateContext } from "
},
{
"path": "src/pages/Content/popup/components/TooltipWrap.jsx",
"chars": 1934,
"preview": "import React, { useEffect, useContext, useState } from \"react\";\n\nimport * as Tooltip from \"@radix-ui/react-tooltip\";\n\n//"
},
{
"path": "src/pages/Content/popup/components/VideoItem.jsx",
"chars": 2664,
"preview": "import React from \"react\";\n\nimport { CopyLinkIcon, MoreActionsIcon } from \"../../images/popup/images\";\n\nconst VideoItem "
},
{
"path": "src/pages/Content/popup/layout/Announcement.jsx",
"chars": 1656,
"preview": "import React, { useState, useEffect } from \"react\";\n\nconst Announcement = (props) => {\n const [URL, setURL] = useState("
},
{
"path": "src/pages/Content/popup/layout/InactiveSubscription.jsx",
"chars": 5044,
"preview": "import React from \"react\";\n\nconst formatDeletionDate = (isoDate) => {\n try {\n const date = new Date(isoDate);\n\n /"
},
{
"path": "src/pages/Content/popup/layout/LoggedOut.jsx",
"chars": 2987,
"preview": "import React from \"react\";\n\nconst LoggedOut = ({ onManageClick, onDowngradeClick }) => {\n return (\n <div\n class"
},
{
"path": "src/pages/Content/popup/layout/RecordingTab.jsx",
"chars": 17032,
"preview": "import React, { useEffect, useState, useContext } from \"react\";\nimport * as Tabs from \"@radix-ui/react-tabs\";\n\nimport Re"
},
{
"path": "src/pages/Content/popup/layout/RecordingType.jsx",
"chars": 14054,
"preview": "import React, { useEffect, useContext, useState, useRef } from \"react\";\n\nimport Dropdown from \"../components/Dropdown\";\n"
},
{
"path": "src/pages/Content/popup/layout/Settings.jsx",
"chars": 3146,
"preview": "import React, { useState, useContext, useEffect } from \"react\";\nimport * as Collapsible from \"@radix-ui/react-collapsibl"
},
{
"path": "src/pages/Content/popup/layout/SettingsMenu.jsx",
"chars": 35585,
"preview": "// Work in progress - settings for the recording\n\nimport React, { useState, useContext, useRef, useEffect } from \"react\""
},
{
"path": "src/pages/Content/popup/layout/VideosTab.jsx",
"chars": 16371,
"preview": "import React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport * as Tabs from \"@radix-ui/react-tabs\";\ni"
},
{
"path": "src/pages/Content/popup/layout/Welcome.jsx",
"chars": 6272,
"preview": "import React, { useEffect, useState } from \"react\";\nimport SoloDev from \"../../../../assets/solo-dev.png\";\n// import Edi"
},
{
"path": "src/pages/Content/popup/layout/WelcomeAlternate.jsx",
"chars": 3637,
"preview": "import React, { useState, useEffect } from \"react\";\nimport CheckBlueIcon from \"../../../../assets/check-blue.svg\";\nimpor"
},
{
"path": "src/pages/Content/popup/onboarding/proOnboarding.js",
"chars": 25008,
"preview": "import { driver } from \"driver.js\";\nimport \"driver.js/dist/driver.css\";\nimport { hasSeenOnboarding, markOnboardingSeen }"
},
{
"path": "src/pages/Content/popup/onboarding/storage.js",
"chars": 1413,
"preview": "const ONBOARDING_SEEN_KEY = \"onboardingSeen\";\n\nexport const hasSeenOnboarding = async (key) => {\n try {\n const resul"
},
{
"path": "src/pages/Content/popup/styles/_Popup.scss",
"chars": 543,
"preview": "@use \"../../styles/_variables\" as *;\n\n@use \"./layout/_PopupContainer.scss\";\n@use \"./layout/_Settings.scss\";\n@use \"./layo"
},
{
"path": "src/pages/Content/popup/styles/components/_BackgroundEffects.scss",
"chars": 1202,
"preview": "@use '../../../styles/_variables' as *;\n\n.background-effects-toggle-group {\n\tdisplay: flex;\n\theight: 40px;\n\twidth: 100%;"
},
{
"path": "src/pages/Content/popup/styles/components/_Dropdown.scss",
"chars": 3240,
"preview": "@use \"../../../styles/_variables\" as *;\n\n/* reset */\nbutton {\n all: unset;\n}\n\n.SelectTrigger {\n display: inline-flex;\n"
},
{
"path": "src/pages/Content/popup/styles/components/_MainButton.scss",
"chars": 2941,
"preview": "@use '../../../styles/_variables' as *;\n\n\n.main-button {\n\twidth: 100%;\n\theight: 45px;\n\tborder-radius: $container-border-"
},
{
"path": "src/pages/Content/popup/styles/components/_RegionDimensions.scss",
"chars": 702,
"preview": "@use '../../../styles/_variables' as *;\n\n.region-dimensions {\n\twidth: 100%;\n\tdisplay: flex;\n\tgap: 10px;\n\tmargin-top: 10p"
},
{
"path": "src/pages/Content/popup/styles/components/_Switch.scss",
"chars": 3043,
"preview": "@use \"../../../styles/_variables\" as *;\n\n/* reset */\nbutton {\n all: unset;\n}\n\n.SwitchRow {\n width: 100%;\n display: fl"
},
{
"path": "src/pages/Content/popup/styles/components/_Tabs.scss",
"chars": 8079,
"preview": "@use \"../../../styles/_variables\" as *;\n\n/* Radix tabs navigation */\n/* reset */\nbutton,\nfieldset,\ninput {\n all: unset;"
},
{
"path": "src/pages/Content/popup/styles/components/_TimeSetter.scss",
"chars": 774,
"preview": "@use '../../../styles/_variables' as *;\n\n.time-set-parent {\n\twidth: 100%;\n\tdisplay: flex;\n\tgap: 10px;\n\tmargin-top: 10px;"
},
{
"path": "src/pages/Content/popup/styles/components/_Tooltip.scss",
"chars": 1964,
"preview": "@use \"../../../styles/_variables\" as *;\n\n.TooltipContent {\n border-radius: $container-border-radius;\n background-color"
},
{
"path": "src/pages/Content/popup/styles/components/_VideoItem.scss",
"chars": 2250,
"preview": "@use \"../../../styles/_variables\" as *;\n\n.video-item-root {\n width: calc(100% - 2 * #{$spacing-03});\n border-radius: 1"
},
{
"path": "src/pages/Content/popup/styles/layout/_Announcement.scss",
"chars": 1693,
"preview": "@use \"../../../styles/_variables\" as *;\n\n.announcement {\n width: 100%;\n top: 0px;\n left: 0px;\n padding-bottom: 24px;"
},
{
"path": "src/pages/Content/popup/styles/layout/_PopupContainer.scss",
"chars": 5315,
"preview": "@use \"../../../styles/_variables\" as *;\n\n.popup-container:hover .popup-controls {\n opacity: 1;\n}\n.open {\n opacity: 1 !"
},
{
"path": "src/pages/Content/popup/styles/layout/_Settings.scss",
"chars": 784,
"preview": "@use '../../../styles/_variables' as *;\n\n.CollapsibleTrigger {\n\tmargin-top: $spacing-04;\n\tfont-weight: $font-bold;\n\tpadd"
},
{
"path": "src/pages/Content/popup/styles/layout/_SettingsMenu.scss",
"chars": 3857,
"preview": "@use \"../../../styles/_variables\" as *;\n\n.DropdownMenuContent,\n.DropdownMenuSubContent {\n min-width: 200px;\n backgroun"
},
{
"path": "src/pages/Content/popup/styles/layout/_VideosTab.scss",
"chars": 2427,
"preview": "@use \"../../../styles/_variables\" as *;\n\n.video-ui {\n position: relative;\n /* Blur the background */\n // &:before {\n "
}
]
// ... and 176 more files (download for full content)
About this extraction
This page contains the full source code of the alyssaxuu/screenity GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 376 files (53.8 MB), approximately 2.7M tokens, and a symbol index with 1108 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.