{"version":3,"sources":["webpack://VideojsRecord/webpack/universalModuleDefinition","webpack://VideojsRecord/webpack/bootstrap","webpack://VideojsRecord/./node_modules/global/window.js","webpack://VideojsRecord/(webpack)/buildin/global.js","webpack://VideojsRecord/./src/js/controls/animation-display.js","webpack://VideojsRecord/./src/js/controls/camera-button.js","webpack://VideojsRecord/./src/js/controls/device-button.js","webpack://VideojsRecord/./src/js/controls/record-canvas.js","webpack://VideojsRecord/./src/js/controls/record-indicator.js","webpack://VideojsRecord/./src/js/controls/record-toggle.js","webpack://VideojsRecord/./src/js/defaults.js","webpack://VideojsRecord/./src/js/engine/record-engine.js","webpack://VideojsRecord/./src/js/engine/record-mode.js","webpack://VideojsRecord/./src/js/engine/record-rtc.js","webpack://VideojsRecord/./src/js/utils/browser-shim.js","webpack://VideojsRecord/./src/js/utils/detect-browser.js","webpack://VideojsRecord/./src/js/utils/format-time.js","webpack://VideojsRecord/./src/js/videojs.record.js","webpack://VideojsRecord/external \"videojs\""],"names":["Component","videojs","getComponent","AnimationDisplay","className","innerHTML","registerComponent","Button","CameraButton","on","player_","onStart","onStop","off","event","recorder","record","isProcessing","start","retrySnapshot","removeClass","addClass","controlText","prototype","controlText_","DeviceButton","getDevice","RecordCanvas","RecordIndicator","player","options","enable","dir","show","hide","RecordToggle","isRecording","stop","pluginDefaultOptions","image","audio","video","animation","maxLength","frameWidth","frameHeight","debug","videoMimeType","videoRecorderType","audioEngine","audioRecorderType","audioMimeType","audioBufferSize","audioSampleRate","audioBitRate","audioChannels","audioWorkerURL","animationFrameRate","animationQuality","timeSlice","RECORDRTC","LIBVORBISJS","RECORDERJS","LAMEJS","OPUSRECORDER","RecordEngine","evented","recordedData","undefined","URL","revokeObjectURL","fileObj","Blob","File","now","Date","lastModified","getTime","lastModifiedDate","e","TypeError","fileExtension","type","split","indexOf","name","data","addFileInfo","dispose","trigger","fileName","Object","keys","navigator","msSaveOrOpenBlob","msSaveBlob","hyperlink","document","createElement","href","createObjectURL","download","style","body","documentElement","appendChild","click","target","dispatchEvent","MouseEvent","view","window","bubbles","cancelable","IMAGE_ONLY","AUDIO_ONLY","VIDEO_ONLY","AUDIO_VIDEO","ANIMATION","getRecorderMode","isModeEnabled","mode","RecordRTCEngine","stream","mediaType","inputStream","engine","RecordRTC","MRecordRTC","disableLogs","mimeType","bufferSize","sampleRate","numberOfAudioChannels","canvas","quality","frameRate","onTimeStamp","addStream","destroy","startRecording","stopRecording","onStopRecording","bind","pauseRecording","resumeRecording","save","audioVideoURL","mediaURL","recordType","getRecordType","getBlob","recording","mtype","gif","setSrcObject","element","ignoreCreateObjectURL","src","srcObject","mozSrcObject","console","log","detectBrowser","result","browser","version","minVersion","mozGetUserMedia","extractVersion","userAgent","webkitGetUserMedia","mediaDevices","match","RTCPeerConnection","uastring","expr","pos","length","parseInt","isEdge","isSafari","isOpera","opera","isChrome","formatTime","seconds","guide","msDisplayMax","s","Math","floor","m","h","gm","gh","ms","isNaN","Infinity","Plugin","getPlugin","Player","AUTO","play","retval","techGet_","then","Record","loadOptions","resetState","deviceIcon","buildCSSClass","deviceButton","addChild","recordIndicator","recordCanvas","animationDisplay","cameraButton","recordToggle","one","setupUI","recordOptions","mergeOptions","options_","plugins","recordImage","recordAudio","recordVideo","recordAnimation","recordTimeSlice","videoFrameWidth","videoFrameHeight","controlBar","el","insertBefore","firstChild","remainingTimeDisplay","display","liveDisplay","loop","surfer","wavesurfer","bigPlayButton","setDuration","usingNativeControls_","tech_","el_","controls","removeTechControlsListeners_","progressControl","userActive","playToggle","_recording","_processing","children","deviceReadyCallback","onDeviceReady","deviceErrorCallback","onDeviceError","engineStopCallback","onRecordComplete","microphone","un","setupPlaybackEvents","liveMode","paused","getUserMedia","catch","_deviceActive","setCurrentTime","playbackTimeUpdate","Error","EngineClass","LibVorbisEngine","RecorderjsEngine","LamejsEngine","OpusRecorderEngine","err","error","bitRate","width","height","setup","uiElements","currentTimeDisplay","timeDivider","durationDisplay","forEach","disable","mediaElement","muted","displayVolumeControl","load","code","deviceErrorCode","startVideoPreview","captureFrame","createSnapshot","pauseTime","pausedTime","startTime","countDown","setInterval","onCountDown","clearInterval","stopStream","stopDevice","getTracks","pause","resume","loadingSpinner","once","streamDuration","showAnimation","hideAnimation","duration","currentTime","streamCurrentTime","getCurrentTime","min","formattedTime_","contentEl","lastChild","textContent","url","saveAs","reset","empty","devices","toDataURL","detected","Promise","resolve","reject","ImageCapture","Function","track","getVideoTracks","imageCapture","photoSettings","imageWidth","imageHeight","takePhoto","blob","createImageBitmap","imageBitmap","drawCanvas","getContext","drawImage","current","all","currentTimestamp","allTimestamps","internal","audioRecorder","gifRecorder","videoRecorder","getInternalRecorder","MediaStreamRecorder","getArrayOfBlobs","enumerateDevices","enumerateErrorCode","device","push","deviceId","errorMessage","setSinkId","sinkId","volumePanel","VERSION","registerPlugin","module","exports"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;ACnEA;;AAEA;AACA;AACA,CAAC;AACD;AACA,CAAC;AACD;AACA,CAAC;AACD;AACA;;AAEA;;;;;;;;;;;;;ACZA;;AAEA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;;AAEA;AACA;AACA,4CAA4C;;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnBA;;;;;AAKA,IAAMA,YAAYC,QAAQC,YAAR,CAAqB,WAArB,CAAlB;;AAEA;;;;;;;IAMMC,gB;;;;;;;;;;;;;AAEF;;;;;;+BAMW;AACP,0IAAsB,KAAtB,EAA6B;AACzBC,mBAAW,uBADc;AAEzBC,mBAAW;AAFc,OAA7B;AAIH;;;;EAb0BL,S;;AAgB/BA,UAAUM,iBAAV,CAA4B,kBAA5B,EAAgDH,gBAAhD;;kBAEeA,gB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/Bf;;;;;AAKA,IAAMI,SAASN,QAAQC,YAAR,CAAqB,QAArB,CAAf;AACA,IAAMF,YAAYC,QAAQC,YAAR,CAAqB,WAArB,CAAlB;;AAEA;;;;;;;IAMMM,Y;;;;;;;;;;;;AACF;;;;;;oCAMgB;AACZ,aAAO,gEAAP;AACH;;AAED;;;;;;6BAGS;AACL;;AAEA,WAAKC,EAAL,CAAQ,KAAKC,OAAb,EAAsB,aAAtB,EAAqC,KAAKC,OAA1C;AACA,WAAKF,EAAL,CAAQ,KAAKC,OAAb,EAAsB,YAAtB,EAAoC,KAAKE,MAAzC;AACH;;AAED;;;;;;8BAGU;AACN;;AAEA,WAAKC,GAAL,CAAS,KAAKH,OAAd,EAAuB,aAAvB,EAAsC,KAAKC,OAA3C;AACA,WAAKE,GAAL,CAAS,KAAKH,OAAd,EAAuB,YAAvB,EAAqC,KAAKE,MAA1C;AACH;;AAED;;;;;;;;;;;;;gCAUYE,K,EAAO;AACf,UAAIC,WAAW,KAAKL,OAAL,CAAaM,MAAb,EAAf;;AAEA,UAAI,CAACD,SAASE,YAAT,EAAL,EAA8B;AAC1B;AACAF,iBAASG,KAAT;AACH,OAHD,MAGO;AACH;AACAH,iBAASI,aAAT;;AAEA;AACA,aAAKP,MAAL;AACH;AACJ;;AAED;;;;;;;;;;;4BAQQE,K,EAAO;AACX;AACA,WAAKM,WAAL,CAAiB,uBAAjB;AACA,WAAKC,QAAL,CAAc,iBAAd;;AAEA;AACA,WAAKC,WAAL,CAAiB,OAAjB;AACH;;AAED;;;;;;;;;;;2BAQOR,K,EAAO;AACV;AACA,WAAKM,WAAL,CAAiB,iBAAjB;AACA,WAAKC,QAAL,CAAc,uBAAd;;AAEA;AACA,WAAKC,WAAL,CAAiB,OAAjB;AACH;;;;EAxFsBf,M;;AA2F3B;;;;;;;;AAMAC,aAAae,SAAb,CAAuBC,YAAvB,GAAsC,OAAtC;;AAEAxB,UAAUM,iBAAV,CAA4B,cAA5B,EAA4CE,YAA5C;;kBAEeA,Y;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnHf;;;;;AAKA,IAAMD,SAASN,QAAQC,YAAR,CAAqB,QAArB,CAAf;AACA,IAAMF,YAAYC,QAAQC,YAAR,CAAqB,WAArB,CAAlB;;AAEA;;;;;;;IAMMuB,Y;;;;;;;;;;;;AACF;;;;;;;;;;;;;gCAaYX,K,EAAO;AACf;AACA,WAAKJ,OAAL,CAAaM,MAAb,GAAsBU,SAAtB;AACH;;;;EAjBsBnB,M;;AAoB3B;;;;;;;;AAMAkB,aAAaF,SAAb,CAAuBC,YAAvB,GAAsC,QAAtC;;AAEAxB,UAAUM,iBAAV,CAA4B,cAA5B,EAA4CmB,YAA5C;;kBAEeA,Y;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5Cf;;;;;AAKA,IAAMzB,YAAYC,QAAQC,YAAR,CAAqB,WAArB,CAAlB;;AAEA;;;;;;;IAMMyB,Y;;;;;;;;;;;;;AAEF;;;;;;+BAMW;AACP,kIAAsB,KAAtB,EAA6B;AACzBvB,mBAAW,mBADc;AAEzBC,mBAAW;AAFc,OAA7B;AAIH;;;;EAbsBL,S;;AAgB3BA,UAAUM,iBAAV,CAA4B,cAA5B,EAA4CqB,YAA5C;;kBAEeA,Y;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/Bf;;;;;AAKA,IAAM3B,YAAYC,QAAQC,YAAR,CAAqB,WAArB,CAAlB;;AAEA;;;;;;;IAMM0B,e;;;AACF;;;;;;;AAOA,2BAAYC,MAAZ,EAAoBC,OAApB,EAA6B;AAAA;;AAAA,kIACnBD,MADmB,EACXC,OADW;;AAGzB,UAAKC,MAAL;AAHyB;AAI5B;;AAED;;;;;;;;;;+BAMW;AACP,wIAAsB,KAAtB,EAA6B;AACzB3B,mBAAW,kCADc;AAEzB4B,aAAK;AAFoB,OAA7B;AAIH;;AAED;;;;;;6BAGS;AACL,WAAKvB,EAAL,CAAQ,KAAKC,OAAb,EAAsB,aAAtB,EAAqC,KAAKuB,IAA1C;AACA,WAAKxB,EAAL,CAAQ,KAAKC,OAAb,EAAsB,YAAtB,EAAoC,KAAKwB,IAAzC;AACH;;AAED;;;;;;8BAGU;AACN,WAAKrB,GAAL,CAAS,KAAKH,OAAd,EAAuB,aAAvB,EAAsC,KAAKuB,IAA3C;AACA,WAAKpB,GAAL,CAAS,KAAKH,OAAd,EAAuB,YAAvB,EAAqC,KAAKwB,IAA1C;AACH;;;;EAzCyBlC,S;;AA4C9BA,UAAUM,iBAAV,CAA4B,iBAA5B,EAA+CsB,eAA/C;;kBAEeA,e;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3Df;;;;;AAKA,IAAMrB,SAASN,QAAQC,YAAR,CAAqB,QAArB,CAAf;AACA,IAAMF,YAAYC,QAAQC,YAAR,CAAqB,WAArB,CAAlB;;AAEA;;;;;;;IAMMiC,Y;;;;;;;;;;;;AACF;;;;;;oCAMgB;AACZ,aAAO,gEAAP;AACH;;AAED;;;;;;6BAGS;AACL;;AAEA,WAAK1B,EAAL,CAAQ,KAAKC,OAAb,EAAsB,aAAtB,EAAqC,KAAKC,OAA1C;AACA,WAAKF,EAAL,CAAQ,KAAKC,OAAb,EAAsB,YAAtB,EAAoC,KAAKE,MAAzC;AACH;;AAED;;;;;;8BAGU;AACN;;AAEA,WAAKC,GAAL,CAAS,KAAKH,OAAd,EAAuB,aAAvB,EAAsC,KAAKC,OAA3C;AACA,WAAKE,GAAL,CAAS,KAAKH,OAAd,EAAuB,YAAvB,EAAqC,KAAKE,MAA1C;AACH;;AAED;;;;;;;;;;;;;gCAUYE,K,EAAO;AACf,UAAIC,WAAW,KAAKL,OAAL,CAAaM,MAAb,EAAf;AACA,UAAI,CAACD,SAASqB,WAAT,EAAL,EAA6B;AACzBrB,iBAASG,KAAT;AACH,OAFD,MAEO;AACHH,iBAASsB,IAAT;AACH;AACJ;;AAED;;;;;;;;;;;4BAQQvB,K,EAAO;AACX;AACA,WAAKM,WAAL,CAAiB,uBAAjB;AACA,WAAKC,QAAL,CAAc,sBAAd;;AAEA;AACA,WAAKC,WAAL,CAAiB,MAAjB;AACH;;AAED;;;;;;;;;;;2BAQOR,K,EAAO;AACV;AACA,WAAKM,WAAL,CAAiB,sBAAjB;AACA,WAAKC,QAAL,CAAc,uBAAd;;AAEA;AACA,WAAKC,WAAL,CAAiB,QAAjB;AACH;;;;EAlFsBf,M;;AAqF3B;;;;;;;;AAMA4B,aAAaZ,SAAb,CAAuBC,YAAvB,GAAsC,QAAtC;;AAEAxB,UAAUM,iBAAV,CAA4B,cAA5B,EAA4C6B,YAA5C;;kBAEeA,Y;;;;;;;;;;;;;;;;;;AC7Gf;;;;;AAKA;AACA,IAAMG,uBAAuB;AACzB;AACAC,WAAO,KAFkB;AAGzB;AACAC,WAAO,KAJkB;AAKzB;AACAC,WAAO,KANkB;AAOzB;AACAC,eAAW,KARc;AASzB;AACAC,eAAW,EAVc;AAWzB;AACAC,gBAAY,GAZa;AAazB;AACAC,iBAAa,GAdY;AAezB;AACAC,WAAO,KAhBkB;AAiBzB;AACA;AACA;AACAC,mBAAe,YApBU;AAqBzB;AACA;AACA;AACAC,uBAAmB,MAxBM;AAyBzB;AACA;AACAC,iBAAa,WA3BY;AA4BzB;AACA;AACA;AACA;AACAC,uBAAmB,MAhCM;AAiCzB;AACA;AACA;AACAC,mBAAe,MApCU;AAqCzB;AACA;AACA;AACA;AACA;AACA;AACA;AACAC,qBAAiB,IA5CQ;AA6CzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAC,qBAAiB,KAtDQ;AAuDzB;AACAC,kBAAc,GAxDW;AAyDzB;AACA;AACAC,mBAAe,CA3DU;AA4DzB;AACAC,oBAAgB,EA7DS;AA8DzB;AACAC,wBAAoB,GA/DK;AAgEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACAC,sBAAkB,EAvEO;AAwEzB;AACAC,eAAW;AAzEc,CAA7B;;kBA4EerB,oB;;;;;;;;;;;;;;;;;;;;;;;;;;;AClFf;;;;;AAKA,IAAMtC,YAAYC,QAAQC,YAAR,CAAqB,WAArB,CAAlB;;AAEA;AACA,IAAM0D,YAAY,WAAlB;AACA,IAAMC,cAAc,cAApB;AACA,IAAMC,aAAa,aAAnB;AACA,IAAMC,SAAS,QAAf;AACA,IAAMC,eAAe,eAArB;;AAEA;;;;;;IAKMC,Y;;;AACF;;;;;;;;;AASA,0BAAYpC,MAAZ,EAAoBC,OAApB,EAA6B;AAAA;;AAEzB;AACAA,gBAAQoC,OAAR,GAAkB,IAAlB;;AAHyB,2HAKnBrC,MALmB,EAKXC,OALW;AAM5B;;AAED;;;;;;;;kCAIU;AACN;AACA,gBAAI,KAAKqC,YAAL,KAAsBC,SAA1B,EAAqC;AACjCC,oBAAIC,eAAJ,CAAoB,KAAKH,YAAzB;AACH;AACJ;;AAED;;;;;;;;oCAKYI,O,EAAS;AACjB,gBAAIA,mBAAmBC,IAAnB,IAA2BD,mBAAmBE,IAAlD,EAAwD;AACpD;AACA,oBAAIC,MAAM,IAAIC,IAAJ,EAAV;AACA,oBAAI;AACAJ,4BAAQK,YAAR,GAAuBF,IAAIG,OAAJ,EAAvB;AACAN,4BAAQO,gBAAR,GAA2BJ,GAA3B;AACH,iBAHD,CAGE,OAAOK,CAAP,EAAU;AACR,wBAAIA,aAAaC,SAAjB,EAA4B;AACxB;AACH,qBAFD,MAEO;AACH;AACA,8BAAMD,CAAN;AACH;AACJ;AACD;AACA;AACA;AACA,oBAAIE,gBAAgB,MAAMV,QAAQW,IAAR,CAAaC,KAAb,CAAmB,GAAnB,EAAwB,CAAxB,CAA1B;AACA,oBAAIF,cAAcG,OAAd,CAAsB,GAAtB,IAA6B,CAAC,CAAlC,EAAqC;AACjCH,oCAAgBA,cAAcE,KAAd,CAAoB,GAApB,EAAyB,CAAzB,CAAhB;AACH;;AAED;AACA,oBAAI;AACAZ,4BAAQc,IAAR,GAAeX,IAAIG,OAAJ,KAAgBI,aAA/B;AACH,iBAFD,CAEE,OAAOF,CAAP,EAAU;AACR,wBAAIA,aAAaC,SAAjB,EAA4B;AACxB;AACH,qBAFD,MAEO;AACH;AACA,8BAAMD,CAAN;AACH;AACJ;AACJ;AACJ;;AAED;;;;;;;;wCAKgBO,I,EAAM;AAClB,iBAAKnB,YAAL,GAAoBmB,IAApB;;AAEA;AACA,iBAAKC,WAAL,CAAiB,KAAKpB,YAAtB;;AAEA;AACA,iBAAKqB,OAAL;;AAEA;AACA,iBAAKC,OAAL,CAAa,gBAAb;AACH;;AAED;;;;;;;;;;;;+BASOJ,I,EAAM;AACT,gBAAIK,WAAWL,KAAKM,OAAOC,IAAP,CAAYP,IAAZ,EAAkB,CAAlB,CAAL,CAAf;;AAEA,gBAAI,OAAOQ,UAAUC,gBAAjB,KAAsC,WAA1C,EAAuD;AACnD,uBAAOD,UAAUC,gBAAV,CAA2B,KAAK3B,YAAhC,EAA8CuB,QAA9C,CAAP;AACH,aAFD,MAEO,IAAI,OAAOG,UAAUE,UAAjB,KAAgC,WAApC,EAAiD;AACpD,uBAAOF,UAAUE,UAAV,CAAqB,KAAK5B,YAA1B,EAAwCuB,QAAxC,CAAP;AACH;;AAED,gBAAIM,YAAYC,SAASC,aAAT,CAAuB,GAAvB,CAAhB;AACAF,sBAAUG,IAAV,GAAiB9B,IAAI+B,eAAJ,CAAoB,KAAKjC,YAAzB,CAAjB;AACA6B,sBAAUK,QAAV,GAAqBX,QAArB;;AAEAM,sBAAUM,KAAV,GAAkB,2CAAlB;AACA,aAACL,SAASM,IAAT,IAAiBN,SAASO,eAA3B,EAA4CC,WAA5C,CAAwDT,SAAxD;;AAEA,gBAAI,OAAOA,UAAUU,KAAjB,KAA2B,UAA/B,EAA2C;AACvCV,0BAAUU,KAAV;AACH,aAFD,MAEO;AACHV,0BAAUW,MAAV,GAAmB,QAAnB;AACAX,0BAAUY,aAAV,CAAwB,IAAIC,UAAJ,CAAe,OAAf,EAAwB;AAC5CC,0BAAMC,MADsC;AAE5CC,6BAAS,IAFmC;AAG5CC,gCAAY;AAHgC,iBAAxB,CAAxB;AAKH;;AAED5C,gBAAIC,eAAJ,CAAoB0B,UAAUG,IAA9B;AACH;;;;EA9HsBnG,S;;AAiI3B;;;AACAC,QAAQgE,YAAR,GAAuBA,YAAvB;AACAjE,UAAUM,iBAAV,CAA4B,cAA5B,EAA4C2D,YAA5C;;QAGIA,Y,GAAAA,Y;QACAL,S,GAAAA,S;QAAWC,W,GAAAA,W;QAAaC,U,GAAAA,U;QAAYC,M,GAAAA,M;QAAQC,Y,GAAAA,Y;;;;;;;;;;;;;;;;;AC1JhD;;;;;AAKA;AACA,IAAMkD,aAAa,YAAnB;AACA,IAAMC,aAAa,YAAnB;AACA,IAAMC,aAAa,YAAnB;AACA,IAAMC,cAAc,aAApB;AACA,IAAMC,YAAY,WAAlB;;AAGA,IAAMC,kBAAkB,SAAlBA,eAAkB,CAAShF,KAAT,EAAgBC,KAAhB,EAAuBC,KAAvB,EAA8BC,SAA9B,EAAyC;AAC7D,QAAI8E,cAAcjF,KAAd,CAAJ,EAA0B;AACtB,eAAO2E,UAAP;AAEH,KAHD,MAGO,IAAIM,cAAc9E,SAAd,CAAJ,EAA8B;AACjC,eAAO4E,SAAP;AAEH,KAHM,MAGA,IAAIE,cAAchF,KAAd,KAAwB,CAACgF,cAAc/E,KAAd,CAA7B,EAAmD;AACtD,eAAO0E,UAAP;AAEH,KAHM,MAGA,IAAIK,cAAchF,KAAd,KAAwBgF,cAAc/E,KAAd,CAA5B,EAAkD;AACrD,eAAO4E,WAAP;AAEH,KAHM,MAGA,IAAI,CAACG,cAAchF,KAAd,CAAD,IAAyBgF,cAAc/E,KAAd,CAA7B,EAAmD;AACtD,eAAO2E,UAAP;AACH;AACJ,CAhBD;;AAkBA;;;;;AAKA,IAAMI,gBAAgB,SAAhBA,aAAgB,CAASC,IAAT,EAAe;AACjC,WAAOA,SAAS9B,OAAO8B,IAAP,CAAT,IAAyBA,SAAS,IAAzC;AACH,CAFD;;QAKIF,e,GAAAA,e;QACAL,U,GAAAA,U;QAAYC,U,GAAAA,U;QAAYC,U,GAAAA,U;QAAYC,W,GAAAA,W;QAAaC,S,GAAAA,S;;;;;;;;;;;;;;;;;;;;;;ACrCrD;;AACA;;AACA;;;;;;+eAPA;;;;;AASA,IAAMtH,YAAYC,QAAQC,YAAR,CAAqB,WAArB,CAAlB;;AAEA;;;;;;;IAMMwH,e;;;;;;;;;;;;;AAEF;;;8BAGMC,M,EAAQC,S,EAAW9E,K,EAAO;AAC5B,iBAAK+E,WAAL,GAAmBF,MAAnB;AACA,iBAAKC,SAAL,GAAiBA,SAAjB;AACA,iBAAK9E,KAAL,GAAaA,KAAb;;AAEA;AACA,iBAAKgF,MAAL,GAAc,IAAIC,UAAUC,UAAd,EAAd;AACA,iBAAKF,MAAL,CAAYF,SAAZ,GAAwB,KAAKA,SAA7B;AACA,iBAAKE,MAAL,CAAYG,WAAZ,GAA0B,CAAC,KAAKnF,KAAhC;AACA,iBAAKgF,MAAL,CAAYI,QAAZ,GAAuB,KAAKA,QAA5B;;AAEA;AACA,iBAAKJ,MAAL,CAAYK,UAAZ,GAAyB,KAAKA,UAA9B;AACA,iBAAKL,MAAL,CAAYM,UAAZ,GAAyB,KAAKA,UAA9B;AACA,iBAAKN,MAAL,CAAYO,qBAAZ,GAAoC,KAAK9E,aAAzC;;AAEA;AACA,iBAAKuE,MAAL,CAAYrF,KAAZ,GAAoB,KAAKA,KAAzB;AACA,iBAAKqF,MAAL,CAAYQ,MAAZ,GAAqB,KAAKA,MAA1B;;AAEA;AACA,iBAAKR,MAAL,CAAYS,OAAZ,GAAsB,KAAKA,OAA3B;AACA,iBAAKT,MAAL,CAAYU,SAAZ,GAAwB,KAAKA,SAA7B;AACA,gBAAI,KAAKC,WAAL,KAAqBrE,SAAzB,EAAoC;AAChC,qBAAK0D,MAAL,CAAYnE,SAAZ,GAAwB,KAAKA,SAA7B;AACA,qBAAKmE,MAAL,CAAYW,WAAZ,GAA0B,KAAKA,WAA/B;AACH;;AAED;AACA,iBAAKX,MAAL,CAAYY,SAAZ,CAAsB,KAAKb,WAA3B;AACH;;AAED;;;;;;kCAGU;AACN;;AAEA,gBAAI,OAAO,KAAKC,MAAL,CAAYa,OAAnB,KAA+B,UAAnC,EAA+C;AAC3C,qBAAKb,MAAL,CAAYa,OAAZ;AACH;AACJ;;AAED;;;;;;gCAGQ;AACJ,iBAAKb,MAAL,CAAYc,cAAZ;AACH;;AAED;;;;;;;+BAIO;AACH,iBAAKd,MAAL,CAAYe,aAAZ,CAA0B,KAAKC,eAAL,CAAqBC,IAArB,CAA0B,IAA1B,CAA1B;AACH;;AAED;;;;;;gCAGQ;AACJ,iBAAKjB,MAAL,CAAYkB,cAAZ;AACH;;AAED;;;;;;iCAGS;AACL,iBAAKlB,MAAL,CAAYmB,eAAZ;AACH;;AAED;;;;;;;;;;;;+BASO5D,I,EAAM;AACT,gBAAI,KAAKyC,MAAL,IAAezC,SAASjB,SAA5B,EAAuC;AACnC,qBAAK0D,MAAL,CAAYoB,IAAZ,CAAiB7D,IAAjB;AACH;AACJ;;AAED;;;;;;;;;;;wCAQgB8D,a,EAAejE,I,EAAM;AAAA;;AACjC;AACA,iBAAKkE,QAAL,GAAgBD,aAAhB;;AAEA;AACA,gBAAIE,aAAa,KAAKxH,MAAL,GAAcb,MAAd,GAAuBsI,aAAvB,EAAjB;AACA,iBAAKxB,MAAL,CAAYyB,OAAZ,CAAoB,UAACC,SAAD,EAAe;AAC/B,wBAAQH,UAAR;AACI;AACI,+BAAKlF,YAAL,GAAoBqF,UAAUhH,KAA9B;;AAEA,+BAAK+C,WAAL,CAAiB,OAAKpB,YAAtB;;AAEA;AACA,+BAAKsB,OAAL,CAAa,gBAAb;AACA;;AAEJ;AACA;AACI;AACA;AACA;AACA;AACA;AACA,4BAAI+D,UAAU/G,KAAV,KAAoB2B,SAAxB,EAAmC;AAC/B;AACA,mCAAKD,YAAL,GAAoBqF,UAAU/G,KAA9B;;AAEA;AACA;AACA,gCAAI4G,0CAA8B,8BAAlC,EAA8C;AAC1C;AACA,uCAAKlF,YAAL,GAAoBqF,SAApB;;AAEA,qCAAK,IAAIC,KAAT,IAAkB,OAAKtF,YAAvB,EAAqC;AACjC,2CAAKoB,WAAL,CAAiB,OAAKpB,YAAL,CAAkBsF,KAAlB,CAAjB;AACH;AACJ,6BAPD,MAOO;AACH,uCAAKlE,WAAL,CAAiB,OAAKpB,YAAtB;AACH;;AAED;AACA,mCAAKsB,OAAL,CAAa,gBAAb;AACH;AACD;;AAEJ;AACI,+BAAKtB,YAAL,GAAoBqF,UAAUE,GAA9B;;AAEA,+BAAKnE,WAAL,CAAiB,OAAKpB,YAAtB;;AAEA;AACA,+BAAKsB,OAAL,CAAa,gBAAb;AACA;AA9CR;AAgDH,aAjDD;AAkDH;;;;;;AAGL;;;AACAxF,QAAQyH,eAAR,GAA0BA,eAA1B;;AAEA1H,UAAUM,iBAAV,CAA4B,iBAA5B,EAA+CoH,eAA/C;;kBAEeA,e;;;;;;;;;;;;;;;;;;ACrLf;;;;;AAKA,IAAMiC,eAAe,SAAfA,YAAe,CAAUhC,MAAV,EAAkBiC,OAAlB,EAA2BC,qBAA3B,EAAkD;AACnE,QAAI,qBAAqBxF,GAArB,IAA4B,CAACwF,qBAAjC,EAAwD;AACpD,YAAI;AACAD,oBAAQE,GAAR,GAAczF,IAAI+B,eAAJ,CAAoBuB,MAApB,CAAd;AACH,SAFD,CAEE,OAAO5C,CAAP,EAAU;AACR4E,yBAAahC,MAAb,EAAqBiC,OAArB,EAA8B,IAA9B;AACA;AACH;AACJ,KAPD,MAOO,IAAI,eAAeA,OAAnB,EAA4B;AAC/BA,gBAAQG,SAAR,GAAoBpC,MAApB;AACH,KAFM,MAEA,IAAI,kBAAkBiC,OAAtB,EAA+B;AAClCA,gBAAQI,YAAR,GAAuBrC,MAAvB;AACH,KAFM,MAEA;AACHsC,gBAAQC,GAAR,CAAY,mDAAZ;AACH;AACJ,CAfD;;kBAiBeP,Y;;;;;;;;;;;;;;;;;;;;ACjBf;;;;;;AAEA;;;;;;;AAOA,IAAMQ,gBAAgB,SAAhBA,aAAgB,GAAW;AAC7B;AACA,QAAIC,SAAS,EAAb;AACAA,WAAOC,OAAP,GAAiB,IAAjB;AACAD,WAAOE,OAAP,GAAiB,IAAjB;AACAF,WAAOG,UAAP,GAAoB,IAApB;;AAEA;AACA,QAAI,4BAAkB,WAAlB,IAAiC,CAAC,iBAAO1E,SAA7C,EAAwD;AACpDuE,eAAOC,OAAP,GAAiB,0BAAjB;AACA,eAAOD,MAAP;AACH;;AAED,QAAIvE,UAAU2E,eAAd,EAA+B;AAAE;AAC7BJ,eAAOC,OAAP,GAAiB,SAAjB;AACAD,eAAOE,OAAP,GAAiBG,eAAe5E,UAAU6E,SAAzB,EACb,kBADa,EACO,CADP,CAAjB;AAEAN,eAAOG,UAAP,GAAoB,EAApB;AACH,KALD,MAKO,IAAI1E,UAAU8E,kBAAd,EAAkC;AACrC;AACA;AACAP,eAAOC,OAAP,GAAiB,QAAjB;AACAD,eAAOE,OAAP,GAAiBG,eAAe5E,UAAU6E,SAAzB,EACb,uBADa,EACY,CADZ,CAAjB;AAEAN,eAAOG,UAAP,GAAoB,EAApB;AACH,KAPM,MAOA,IAAI1E,UAAU+E,YAAV,IACA/E,UAAU6E,SAAV,CAAoBG,KAApB,CAA0B,oBAA1B,CADJ,EACqD;AAAE;AAC1DT,eAAOC,OAAP,GAAiB,MAAjB;AACAD,eAAOE,OAAP,GAAiBG,eAAe5E,UAAU6E,SAAzB,EACb,oBADa,EACS,CADT,CAAjB;AAEAN,eAAOG,UAAP,GAAoB,KAApB;AACH,KANM,MAMA,IAAI,iBAAOO,iBAAP,IACPjF,UAAU6E,SAAV,CAAoBG,KAApB,CAA0B,sBAA1B,CADG,EACgD;AAAE;AACrDT,eAAOC,OAAP,GAAiB,QAAjB;AACAD,eAAOE,OAAP,GAAiBG,eAAe5E,UAAU6E,SAAzB,EACb,sBADa,EACW,CADX,CAAjB;AAEH,KALM,MAKA;AACH;AACAN,eAAOC,OAAP,GAAiB,0BAAjB;AACA,eAAOD,MAAP;AACH;;AAED,WAAOA,MAAP;AACH,CA3CD;;AA6CA;;;;;;;;;;AA3DA;;;;;AAqEA,IAAMK,iBAAiB,SAAjBA,cAAiB,CAASM,QAAT,EAAmBC,IAAnB,EAAyBC,GAAzB,EAA8B;AACjD,QAAIJ,QAAQE,SAASF,KAAT,CAAeG,IAAf,CAAZ;AACA,WAAOH,SAASA,MAAMK,MAAN,IAAgBD,GAAzB,IAAgCE,SAASN,MAAMI,GAAN,CAAT,EAAqB,EAArB,CAAvC;AACH,CAHD;;AAKA,IAAMG,SAAS,SAATA,MAAS,GAAW;AACtB,WAAOjB,gBAAgBE,OAAhB,KAA4B,MAAnC;AACH,CAFD;;AAIA,IAAMgB,WAAW,SAAXA,QAAW,GAAW;AACxB,WAAOlB,gBAAgBE,OAAhB,KAA4B,QAAnC;AACH,CAFD;;AAIA,IAAMiB,UAAU,SAAVA,OAAU,GAAW;AACvB,WAAO,CAAC,CAAC,iBAAOC,KAAT,IAAkB1F,UAAU6E,SAAV,CAAoBtF,OAApB,CAA4B,MAA5B,MAAwC,CAAC,CAAlE;AACH,CAFD;;AAIA,IAAMoG,WAAW,SAAXA,QAAW,GAAW;AACxB,WAAOrB,gBAAgBE,OAAhB,KAA4B,QAAnC;AACH,CAFD;;QAKIF,a,GAAAA,a;QAAeiB,M,GAAAA,M;QAAQE,O,GAAAA,O;QAASE,Q,GAAAA,Q;QAAUH,Q,GAAAA,Q;;;;;;;;;;;;;;;;;AC3F9C;;;;;AAKA;;;;;;;;;;;;;;;;AAgBA,IAAMI,aAAa,SAAbA,UAAa,CAASC,OAAT,EAAkBC,KAAlB,EAAyBC,YAAzB,EAAuC;AACtD;AACAF,cAAUA,UAAU,CAAV,GAAc,CAAd,GAAkBA,OAA5B;AACAC,YAAQA,SAASD,OAAjB;AACA,QAAIG,IAAIC,KAAKC,KAAL,CAAWL,UAAU,EAArB,CAAR;AAAA,QACIM,IAAIF,KAAKC,KAAL,CAAWL,UAAU,EAAV,GAAe,EAA1B,CADR;AAAA,QAEIO,IAAIH,KAAKC,KAAL,CAAWL,UAAU,IAArB,CAFR;AAAA,QAGIQ,KAAKJ,KAAKC,KAAL,CAAWJ,QAAQ,EAAR,GAAa,EAAxB,CAHT;AAAA,QAIIQ,KAAKL,KAAKC,KAAL,CAAWJ,QAAQ,IAAnB,CAJT;AAAA,QAKIS,KAAKN,KAAKC,KAAL,CAAW,CAACL,UAAUG,CAAX,IAAgB,IAA3B,CALT;;AAOA;AACA,QAAIQ,MAAMX,OAAN,KAAkBA,YAAYY,QAAlC,EAA4C;AACxC;AACA;AACA;AACAL,YAAID,IAAIH,IAAIO,KAAK,GAAjB;AACH;;AAED;AACA,QAAIT,QAAQ,CAAR,IAAaA,QAAQC,YAAzB,EAAuC;AACnC,YAAIQ,KAAK,GAAT,EAAc;AACV,gBAAIA,KAAK,EAAT,EAAa;AACTA,qBAAK,OAAOA,EAAZ;AACH,aAFD,MAEO;AACHA,qBAAK,MAAMA,EAAX;AACH;AACJ;AACDA,aAAK,MAAMA,EAAX;AACH,KATD,MASO;AACHA,aAAK,EAAL;AACH;;AAED;AACAH,QAAKA,IAAI,CAAJ,IAASE,KAAK,CAAf,GAAoBF,IAAI,GAAxB,GAA8B,EAAlC;;AAEA;AACA;AACAD,QAAI,CAAE,CAACC,KAAKC,MAAM,EAAZ,KAAmBF,IAAI,EAAxB,GAA8B,MAAMA,CAApC,GAAwCA,CAAzC,IAA8C,GAAlD;;AAEA;AACAH,QAAMA,IAAI,EAAL,GAAW,MAAMA,CAAjB,GAAqBA,CAA1B;;AAEA,WAAOI,IAAID,CAAJ,GAAQH,CAAR,GAAYO,EAAnB;AACH,CA5CD;;kBA8CeX,U;;;;;;;;;;;;;;;;;;;;;AC5Df;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA;;;;AACA;;;;AACA;;;;AACA;;AAEA;;;;AACA;;AACA;;AAEA;;;;;;;;;;+eAvBA;;;;;;;AAyBA,IAAMc,SAAS,gBAAQC,SAAR,CAAkB,QAAlB,CAAf;AACA,IAAMC,SAAS,gBAAQvM,YAAR,CAAqB,QAArB,CAAf;;AAEA,IAAMwM,OAAO,MAAb;;AAGA;AACAD,OAAOlL,SAAP,CAAiBoL,IAAjB,GAAwB,SAASA,IAAT,GAAgB;AACpC,QAAIC,SAAS,KAAKC,QAAL,CAAc,MAAd,CAAb;AACA;AACA,QAAID,WAAWxI,SAAX,IAAwB,OAAOwI,OAAOE,IAAd,KAAuB,UAAnD,EAA+D;AAC3DF,eAAOE,IAAP,CAAY,IAAZ,EAAkB,UAAC/H,CAAD,EAAO,CAAE,CAA3B;AACH;AACD,WAAO6H,MAAP;AACH,CAPD;;AASA;;;;;;;IAMMG,M;;;AACF;;;;;;AAMA,oBAAYlL,MAAZ,EAAoBC,OAApB,EAA6B;AAAA;;AAGzB;AAHyB,oHACnBD,MADmB,EACXC,OADW;;AAIzB,cAAKkL,WAAL;;AAEA;AACA,cAAKC,UAAL;;AAEA;AACA,YAAIC,aAAa,SAAjB;AACA,gBAAQ,MAAK5D,aAAL,EAAR;AACI;AACA;AACA;AACI4D,6BAAa,YAAb;AACA;AACJ;AACIA,6BAAa,YAAb;AACA;AARR;AAUA,+BAAa3L,SAAb,CAAuB4L,aAAvB,GAAuC,YAAW;AAC9C;AACA,mBAAO,4CAA4CD,UAAnD;AACH,SAHD;AAIArL,eAAOuL,YAAP,GAAsB,2BAAiBvL,MAAjB,EAAyBC,OAAzB,CAAtB;AACAD,eAAOwL,QAAP,CAAgBxL,OAAOuL,YAAvB;;AAEA;AACAvL,eAAOyL,eAAP,GAAyB,8BAAoBzL,MAApB,EAA4BC,OAA5B,CAAzB;AACAD,eAAOyL,eAAP,CAAuBpL,IAAvB;AACAL,eAAOwL,QAAP,CAAgBxL,OAAOyL,eAAvB;;AAEA;AACAzL,eAAO0L,YAAP,GAAsB,2BAAiB1L,MAAjB,EAAyBC,OAAzB,CAAtB;AACAD,eAAO0L,YAAP,CAAoBrL,IAApB;AACAL,eAAOwL,QAAP,CAAgBxL,OAAO0L,YAAvB;;AAEA;AACA1L,eAAO2L,gBAAP,GAA0B,+BAAqB3L,MAArB,EAA6BC,OAA7B,CAA1B;AACAD,eAAO2L,gBAAP,CAAwBtL,IAAxB;AACAL,eAAOwL,QAAP,CAAgBxL,OAAO2L,gBAAvB;;AAEA;AACA3L,eAAO4L,YAAP,GAAsB,2BAAiB5L,MAAjB,EAAyBC,OAAzB,CAAtB;AACAD,eAAO4L,YAAP,CAAoBvL,IAApB;;AAEA;AACAL,eAAO6L,YAAP,GAAsB,2BAAiB7L,MAAjB,EAAyBC,OAAzB,CAAtB;AACAD,eAAO6L,YAAP,CAAoBxL,IAApB;;AAEA;AACA,cAAKL,MAAL,CAAY8L,GAAZ,CAAgB,OAAhB,EAAyB,MAAKC,OAAL,CAAa7E,IAAb,OAAzB;AApDyB;AAqD5B;;AAED;;;;;;;sCAGc;AACV,gBAAI8E,gBAAgB,gBAAQC,YAAR,qBAChB,KAAKjM,MAAL,CAAYkM,QAAZ,CAAqBC,OAArB,CAA6BhN,MADb,CAApB;;AAGA;AACA,iBAAKiN,WAAL,GAAmBJ,cAActL,KAAjC;AACA,iBAAK2L,WAAL,GAAmBL,cAAcrL,KAAjC;AACA,iBAAK2L,WAAL,GAAmBN,cAAcpL,KAAjC;AACA,iBAAK2L,eAAL,GAAuBP,cAAcnL,SAArC;AACA,iBAAKC,SAAL,GAAiBkL,cAAclL,SAA/B;AACA,iBAAKG,KAAL,GAAa+K,cAAc/K,KAA3B;AACA,iBAAKuL,eAAL,GAAuBR,cAAclK,SAArC;;AAEA;AACA,iBAAK2K,eAAL,GAAuBT,cAAcjL,UAArC;AACA,iBAAK2L,gBAAL,GAAwBV,cAAchL,WAAtC;AACA,iBAAKG,iBAAL,GAAyB6K,cAAc7K,iBAAvC;AACA,iBAAKD,aAAL,GAAqB8K,cAAc9K,aAAnC;;AAEA;AACA,iBAAKE,WAAL,GAAmB4K,cAAc5K,WAAjC;AACA,iBAAKC,iBAAL,GAAyB2K,cAAc3K,iBAAvC;AACA,iBAAKM,cAAL,GAAsBqK,cAAcrK,cAApC;AACA,iBAAKJ,eAAL,GAAuByK,cAAczK,eAArC;AACA,iBAAKC,eAAL,GAAuBwK,cAAcxK,eAArC;AACA,iBAAKC,YAAL,GAAoBuK,cAAcvK,YAAlC;AACA,iBAAKC,aAAL,GAAqBsK,cAActK,aAAnC;AACA,iBAAKJ,aAAL,GAAqB0K,cAAc1K,aAAnC;;AAEA;AACA,iBAAKM,kBAAL,GAA0BoK,cAAcpK,kBAAxC;AACA,iBAAKC,gBAAL,GAAwBmK,cAAcnK,gBAAtC;AACH;;AAED;;;;;;;kCAIU;AAAA;;AACN;AACA,iBAAK7B,MAAL,CAAY2M,UAAZ,CAAuBnB,QAAvB,CAAgC,KAAKxL,MAAL,CAAY4L,YAA5C;AACA,iBAAK5L,MAAL,CAAY2M,UAAZ,CAAuBC,EAAvB,GAA4BC,YAA5B,CACI,KAAK7M,MAAL,CAAY4L,YAAZ,CAAyBgB,EAAzB,EADJ,EAEI,KAAK5M,MAAL,CAAY2M,UAAZ,CAAuBC,EAAvB,GAA4BE,UAFhC;AAGA,iBAAK9M,MAAL,CAAY2M,UAAZ,CAAuBC,EAAvB,GAA4BC,YAA5B,CACI,KAAK7M,MAAL,CAAY6L,YAAZ,CAAyBe,EAAzB,EADJ,EAEI,KAAK5M,MAAL,CAAY2M,UAAZ,CAAuBC,EAAvB,GAA4BE,UAFhC;;AAIA;AACA,gBAAI,KAAK9M,MAAL,CAAY2M,UAAZ,CAAuBI,oBAAvB,KAAgDxK,SAApD,EAA+D;AAC3D,qBAAKvC,MAAL,CAAY2M,UAAZ,CAAuBI,oBAAvB,CAA4CH,EAA5C,GAAiDnI,KAAjD,CAAuDuI,OAAvD,GAAiE,MAAjE;AACH;AACD,gBAAI,KAAKhN,MAAL,CAAY2M,UAAZ,CAAuBM,WAAvB,KAAuC1K,SAA3C,EAAsD;AAClD,qBAAKvC,MAAL,CAAY2M,UAAZ,CAAuBM,WAAvB,CAAmCL,EAAnC,GAAwCnI,KAAxC,CAA8CuI,OAA9C,GAAwD,MAAxD;AACH;;AAED;AACA,iBAAKhN,MAAL,CAAYkN,IAAZ,CAAiB,KAAjB;;AAEA;AACA,oBAAQ,KAAKzF,aAAL,EAAR;AACI;AACI;AACA,yBAAK0F,MAAL,GAAc,KAAKnN,MAAL,CAAYoN,UAAZ,EAAd;AACA;;AAEJ;AACA;AACA;AACA;AACI;AACA,yBAAKpN,MAAL,CAAYqN,aAAZ,CAA0BhN,IAA1B;;AAEA;AACA;AACA,yBAAKL,MAAL,CAAY8L,GAAZ,CAAgB,gBAAhB,EAAkC,YAAM;AACpC;AACA,+BAAKwB,WAAL,CAAiB,OAAKxM,SAAtB;AACH,qBAHD;;AAKA;AACA;AACA,wBAAI,KAAKd,MAAL,CAAYuN,oBAAZ,KAAqC,IAAzC,EAA+C;AAC3C,4BAAI,KAAKvN,MAAL,CAAYwN,KAAZ,CAAkBC,GAAlB,KAA0BlL,SAA9B,EAAyC;AACrC,iCAAKvC,MAAL,CAAYwN,KAAZ,CAAkBC,GAAlB,CAAsBC,QAAtB,GAAiC,KAAjC;AACH;AACJ;;AAED;AACA;AACA,yBAAK1N,MAAL,CAAY2N,4BAAZ;;AAEA,wBAAI,KAAK3N,MAAL,CAAYkM,QAAZ,CAAqBwB,QAAzB,EAAmC;AAC/B;AACA,6BAAK1N,MAAL,CAAY2M,UAAZ,CAAuBiB,eAAvB,CAAuCvN,IAAvC;;AAEA;AACA,6BAAKL,MAAL,CAAYpB,EAAZ,CAAe,cAAf,EAA+B,UAACK,KAAD,EAAW;AACtC,mCAAKe,MAAL,CAAY6N,UAAZ,CAAuB,IAAvB;AACH,yBAFD;;AAIA;AACA;AACA,6BAAK7N,MAAL,CAAY2M,UAAZ,CAAuBvM,IAAvB;AACA,6BAAKJ,MAAL,CAAY2M,UAAZ,CAAuBC,EAAvB,GAA4BnI,KAA5B,CAAkCuI,OAAlC,GAA4C,MAA5C;AACH;AACD;AA9CR;;AAiDA;AACA;AACA,iBAAKhN,MAAL,CAAYhB,GAAZ,CAAgB,YAAhB;AACA,iBAAKgB,MAAL,CAAYhB,GAAZ,CAAgB,gBAAhB;AACA,iBAAKgB,MAAL,CAAYhB,GAAZ,CAAgB,gBAAhB;;AAEA;AACA,iBAAKsO,WAAL,CAAiB,KAAKxM,SAAtB;;AAEA;AACA,iBAAKd,MAAL,CAAY2M,UAAZ,CAAuBmB,UAAvB,CAAkCzN,IAAlC;AACH;;AAED;;;;;;;;sCAKc;AACV,mBAAO,KAAK0N,UAAZ;AACH;;AAED;;;;;;;;;uCAMe;AACX,mBAAO,KAAKC,WAAZ;AACH;;AAED;;;;;;;;sCAKc;AACV,mBAAO,KAAKhO,MAAL,IAAgB,KAAKA,MAAL,CAAYiO,QAAZ,OAA2B,IAAlD;AACH;;AAED;;;;;;oCAGY;AACR;AACA,gBAAI,KAAKC,mBAAL,KAA6B3L,SAAjC,EAA4C;AACxC,qBAAK2L,mBAAL,GAA2B,KAAKC,aAAL,CAAmBjH,IAAnB,CAAwB,IAAxB,CAA3B;AACH;AACD,gBAAI,KAAKkH,mBAAL,KAA6B7L,SAAjC,EAA4C;AACxC,qBAAK6L,mBAAL,GAA2B,KAAKC,aAAL,CAAmBnH,IAAnB,CAAwB,IAAxB,CAA3B;AACH;AACD,gBAAI,KAAKoH,kBAAL,KAA4B/L,SAAhC,EAA2C;AACvC,qBAAK+L,kBAAL,GAA0B,KAAKC,gBAAL,CAAsBrH,IAAtB,CAA2B,IAA3B,CAA1B;AACH;AACD;AACA;AACA,oBAAQ,KAAKO,aAAL,EAAR;AACI;AACI;AACA,yBAAK1B,SAAL,GAAiB;AACbpF,+BAAQ,KAAKU,iBAAL,KAA2BwJ,IAA5B,GAAoC,IAApC,GAA2C,KAAKxJ,iBAD1C;AAEbT,+BAAO;AAFM,qBAAjB;AAIA;AACA,yBAAKuM,MAAL,CAAYA,MAAZ,CAAmBqB,UAAnB,CAA8BC,EAA9B,CAAiC,aAAjC,EACI,KAAKP,mBADT;AAEA,yBAAKf,MAAL,CAAYA,MAAZ,CAAmBqB,UAAnB,CAA8BC,EAA9B,CAAiC,aAAjC,EACI,KAAKL,mBADT;;AAGA;AACA,yBAAKjB,MAAL,CAAYA,MAAZ,CAAmBqB,UAAnB,CAA8B5P,EAA9B,CAAiC,aAAjC,EACI,KAAKsP,mBADT;AAEA,yBAAKf,MAAL,CAAYA,MAAZ,CAAmBqB,UAAnB,CAA8B5P,EAA9B,CAAiC,aAAjC,EACI,KAAKwP,mBADT;;AAGA;AACA,yBAAKjB,MAAL,CAAYuB,mBAAZ,CAAgC,KAAhC;;AAEA;AACA,yBAAKvB,MAAL,CAAYwB,QAAZ,GAAuB,IAAvB;AACA,yBAAKxB,MAAL,CAAYA,MAAZ,CAAmBqB,UAAnB,CAA8BI,MAA9B,GAAuC,KAAvC;;AAEA;AACA,yBAAKzB,MAAL,CAAYA,MAAZ,CAAmBqB,UAAnB,CAA8BnP,KAA9B;AACA;;AAEJ;AACA;AACI;AACA,yBAAK0G,SAAL,GAAiB;AACbpF,+BAAO,KADM;AAEbC,+BAAQ,KAAKO,iBAAL,KAA2B0J,IAA5B,GAAoC,IAApC,GAA2C,KAAK1J;AAF1C,qBAAjB;AAIA6C,8BAAU+E,YAAV,CAAuB8F,YAAvB,CAAoC;AAChClO,+BAAO,KADyB;AAEhCC,+BAAQ,KAAK6G,aAAL,6BAAD,GAAwC,KAAK2E,WAA7C,GAA2D,KAAKE;AAFvC,qBAApC,EAGGrB,IAHH,CAII,KAAKkD,aAAL,CAAmBjH,IAAnB,CAAwB,IAAxB,CAJJ,EAKE4H,KALF,CAMI,KAAKT,aAAL,CAAmBnH,IAAnB,CAAwB,IAAxB,CANJ;AAQA;;AAEJ;AACI;AACA,yBAAKnB,SAAL,GAAiB;AACbpF,+BAAQ,KAAKU,iBAAL,KAA2BwJ,IAA5B,GAAoC,IAApC,GAA2C,KAAKxJ,iBAD1C;AAEbT,+BAAQ,KAAKO,iBAAL,KAA2B0J,IAA5B,GAAoC,IAApC,GAA2C,KAAK1J;AAF1C,qBAAjB;AAIA6C,8BAAU+E,YAAV,CAAuB8F,YAAvB,CAAoC;AAChClO,+BAAO,KAAK0L,WADoB;AAEhCzL,+BAAO,KAAK0L;AAFoB,qBAApC,EAGGrB,IAHH,CAII,KAAKkD,aAAL,CAAmBjH,IAAnB,CAAwB,IAAxB,CAJJ,EAKE4H,KALF,CAMI,KAAKT,aAAL,CAAmBnH,IAAnB,CAAwB,IAAxB,CANJ;AAQA;;AAEJ;AACI;AACA,yBAAKnB,SAAL,GAAiB;AACb;AACApF,+BAAO,KAFM;AAGbC,+BAAO,KAHM;AAIbiH,6BAAK;AAJQ,qBAAjB;AAMA7D,8BAAU+E,YAAV,CAAuB8F,YAAvB,CAAoC;AAChClO,+BAAO,KADyB;AAEhCC,+BAAO,KAAK2L;AAFoB,qBAApC,EAGGtB,IAHH,CAII,KAAKkD,aAAL,CAAmBjH,IAAnB,CAAwB,IAAxB,CAJJ,EAKE4H,KALF,CAMI,KAAKT,aAAL,CAAmBnH,IAAnB,CAAwB,IAAxB,CANJ;AAQA;AA/ER;AAiFH;;AAED;;;;;;;;sCAKcpB,M,EAAQ;AAAA;;AAClB,iBAAKiJ,aAAL,GAAqB,IAArB;;AAEA;AACA,iBAAKjJ,MAAL,GAAcA,MAAd;;AAEA;AACA,iBAAK9F,MAAL,CAAYuL,YAAZ,CAAyBlL,IAAzB;;AAEA;AACA,iBAAKiN,WAAL,CAAiB,KAAKxM,SAAtB;AACA,iBAAKkO,cAAL,CAAoB,CAApB;;AAEA;AACA,iBAAKhP,MAAL,CAAY2M,UAAZ,CAAuBmB,UAAvB,CAAkCzN,IAAlC;;AAEA;AACA,iBAAKrB,GAAL,CAAS,KAAKgB,MAAd,EAAsB,YAAtB,EAAoC,KAAKiP,kBAAzC;AACA,iBAAKjQ,GAAL,CAAS,KAAKgB,MAAd,EAAsB,OAAtB,EAA+B,KAAKiP,kBAApC;;AAEA;AACA,gBAAI,KAAKxH,aAAL,6BAAJ,EAAyC;AACrC;AACA;AACA,oBAAI,KAAKA,aAAL,kCACC,KAAKrG,WAAL,kCACA,KAAKA,WAAL,6BADA,IAEA,KAAKA,WAAL,yBAFA,IAGA,KAAKA,WAAL,+BAJD,CAAJ,EAIyC;AACrC,0BAAM,IAAI8N,KAAJ,CAAU,eAAe,KAAK9N,WAApB,GACZ,wCADE,CAAN;AAEH;;AAED;AACA,oBAAI+N,WAAJ;AACA,wBAAQ,KAAK/N,WAAb;AACI;AACI;AACA+N,sCAAc,gBAAQtJ,eAAtB;AACA;;AAEJ;AACI;AACAsJ,sCAAc,gBAAQC,eAAtB;AACA;;AAEJ;AACI;AACAD,sCAAc,gBAAQE,gBAAtB;AACA;;AAEJ;AACI;AACAF,sCAAc,gBAAQG,YAAtB;AACA;;AAEJ;AACI;AACAH,sCAAc,gBAAQI,kBAAtB;AACA;;AAEJ;AACI;AACA,8BAAM,IAAIL,KAAJ,CAAU,0BAA0B,KAAK9N,WAAzC,CAAN;AA5BR;AA8BA,oBAAI;AACA;AACA,yBAAK6E,MAAL,GAAc,IAAIkJ,WAAJ,CAAgB,KAAKnP,MAArB,EAA6B,KAAKA,MAAL,CAAYkM,QAAzC,CAAd;AACH,iBAHD,CAIA,OAAOsD,GAAP,EAAY;AACRpH,4BAAQqH,KAAR,CAAcD,GAAd;AACA,0BAAM,IAAIN,KAAJ,CAAU,oBAAoB,KAAK9N,WAAzB,GACZ,SADE,CAAN;AAEH;;AAED;AACA,qBAAK6E,MAAL,CAAYrH,EAAZ,CAAe,gBAAf,EAAiC,KAAK0P,kBAAtC;;AAEA;AACA,qBAAKrI,MAAL,CAAYK,UAAZ,GAAyB,KAAK/E,eAA9B;AACA,qBAAK0E,MAAL,CAAYM,UAAZ,GAAyB,KAAK/E,eAA9B;AACA,qBAAKyE,MAAL,CAAYyJ,OAAZ,GAAsB,KAAKjO,YAA3B;AACA,qBAAKwE,MAAL,CAAYvE,aAAZ,GAA4B,KAAKA,aAAjC;AACA,qBAAKuE,MAAL,CAAYtE,cAAZ,GAA6B,KAAKA,cAAlC;;AAEA;AACA,qBAAKsE,MAAL,CAAYI,QAAZ,GAAuB;AACnBzF,2BAAO,KAAKM,aADO;AAEnB2G,yBAAK;AAFc,iBAAvB;AAIA,oBAAI,KAAKvG,aAAL,KAAuB,IAAvB,IACA,KAAKA,aAAL,KAAuBuJ,IAD3B,EACiC;AAC7B,yBAAK5E,MAAL,CAAYI,QAAZ,CAAqB1F,KAArB,GAA6B,KAAKW,aAAlC;AACH;;AAED;AACA,qBAAK2E,MAAL,CAAYrF,KAAZ,GAAoB;AAChB+O,2BAAO,KAAKlD,eADI;AAEhBmD,4BAAQ,KAAKlD;AAFG,iBAApB;AAIA,qBAAKzG,MAAL,CAAYQ,MAAZ,GAAqB;AACjBkJ,2BAAO,KAAKlD,eADK;AAEjBmD,4BAAQ,KAAKlD;AAFI,iBAArB;;AAKA;AACA,qBAAKzG,MAAL,CAAYS,OAAZ,GAAsB,KAAK7E,gBAA3B;AACA,qBAAKoE,MAAL,CAAYU,SAAZ,GAAwB,KAAK/E,kBAA7B;;AAEA;AACA,oBAAI,KAAK4K,eAAL,IAAwB,KAAKA,eAAL,GAAuB,CAAnD,EAAsD;AAClD,yBAAKvG,MAAL,CAAYnE,SAAZ,GAAwB,KAAK0K,eAA7B;AACA,yBAAKvG,MAAL,CAAYW,WAAZ,GAA0B,KAAKA,WAAL,CAAiBM,IAAjB,CAAsB,IAAtB,CAA1B;AACH;;AAED;AACA,qBAAKjB,MAAL,CAAY4J,KAAZ,CAAkB,KAAK/J,MAAvB,EAA+B,KAAKC,SAApC,EAA+C,KAAK9E,KAApD;;AAEA;AACA;AACA,oBAAI6O,aAAa,CAAC,KAAK9P,MAAL,CAAY2M,UAAZ,CAAuBoD,kBAAxB,EACC,KAAK/P,MAAL,CAAY2M,UAAZ,CAAuBqD,WADxB,EAEC,KAAKhQ,MAAL,CAAY2M,UAAZ,CAAuBsD,eAFxB,CAAjB;AAGAH,2BAAWI,OAAX,CAAmB,UAACnI,OAAD,EAAa;AAC5B,wBAAIA,YAAYxF,SAAhB,EAA2B;AACvBwF,gCAAQ6E,EAAR,GAAanI,KAAb,CAAmBuI,OAAnB,GAA6B,OAA7B;AACAjF,gCAAQ3H,IAAR;AACH;AACJ,iBALD;;AAOA;AACA,qBAAKJ,MAAL,CAAY6L,YAAZ,CAAyBzL,IAAzB;AACH,aA/GD,MA+GO;AACH;AACA,qBAAKJ,MAAL,CAAYyL,eAAZ,CAA4B0E,OAA5B;;AAEA;AACA;AACA,qBAAK7Q,aAAL;;AAEA;AACA,qBAAKU,MAAL,CAAY4L,YAAZ,CAAyB7M,MAAzB;AACA,qBAAKiB,MAAL,CAAY4L,YAAZ,CAAyBxL,IAAzB;AACH;;AAED;AACA,gBAAI,KAAKqH,aAAL,6BAAJ,EAAyC;AACrC;AACA,qBAAK2I,YAAL,GAAoB,KAAKpQ,MAAL,CAAY4M,EAAZ,GAAiBE,UAArC;AACA,qBAAKsD,YAAL,CAAkB1C,QAAlB,GAA6B,KAA7B;;AAEA;AACA,qBAAK0C,YAAL,CAAkBC,KAAlB,GAA0B,IAA1B;;AAEA;AACA,qBAAKC,oBAAL,CAA0B,KAA1B;;AAEA;AACA,qBAAKC,IAAL,CAAU,KAAKzK,MAAf;;AAEA;AACA;AACA,qBAAK9F,MAAL,CAAY8L,GAAZ,CAAgB,gBAAhB,EAAkC,YAAM;AACpC;AACA,2BAAKsE,YAAL,CAAkBtF,IAAlB;;AAEA;AACA,2BAAK9K,MAAL,CAAY4D,OAAZ,CAAoB,aAApB;AACH,iBAND;AAOH,aAvBD,MAuBO;AACH;AACA,qBAAK5D,MAAL,CAAY4D,OAAZ,CAAoB,aAApB;AACH;AACJ;;AAED;;;;;;;sCAIc4M,I,EAAM;AAChB,iBAAKzB,aAAL,GAAqB,KAArB;;AAEA;AACA,iBAAK/O,MAAL,CAAYyQ,eAAZ,GAA8BD,IAA9B;;AAEA;AACA,iBAAKxQ,MAAL,CAAY4D,OAAZ,CAAoB,aAApB;AACH;;AAED;;;;;;gCAGQ;AAAA;;AACJ,gBAAI,CAAC,KAAKxE,YAAL,EAAL,EAA0B;AACtB,qBAAK2O,UAAL,GAAkB,IAAlB;;AAEA;AACA,qBAAK/N,MAAL,CAAY2M,UAAZ,CAAuBmB,UAAvB,CAAkCzN,IAAlC;;AAEA;AACA,qBAAKrB,GAAL,CAAS,KAAKgB,MAAd,EAAsB,YAAtB,EAAoC,KAAKiP,kBAAzC;AACA,qBAAKjQ,GAAL,CAAS,KAAKgB,MAAd,EAAsB,OAAtB,EAA+B,KAAKiP,kBAApC;;AAEA;AACA,wBAAQ,KAAKxH,aAAL,EAAR;AACI;AACI;AACA,6BAAK0F,MAAL,CAAYuB,mBAAZ,CAAgC,KAAhC;;AAEA;AACA,6BAAKvB,MAAL,CAAYA,MAAZ,CAAmBqB,UAAnB,CAA8BI,MAA9B,GAAuC,KAAvC;AACA,6BAAKzB,MAAL,CAAYwB,QAAZ,GAAuB,IAAvB;AACA,6BAAKxB,MAAL,CAAYA,MAAZ,CAAmBqB,UAAnB,CAA8B1D,IAA9B;AACA;;AAEJ;AACA;AACI;AACA,6BAAK4F,iBAAL;AACA;;AAEJ;AACI;AACA,6BAAK1Q,MAAL,CAAY0L,YAAZ,CAAyBrL,IAAzB;;AAEA;AACA,6BAAKL,MAAL,CAAY2L,gBAAZ,CAA6BtL,IAA7B;;AAEA;AACA,6BAAK+P,YAAL,CAAkB3L,KAAlB,CAAwBuI,OAAxB,GAAkC,OAAlC;;AAEA;AACA;AACA;AACA,6BAAK2D,YAAL,GAAoB1F,IAApB,CAAyB,UAAC1C,MAAD,EAAY;AACjC;AACA,mCAAKmI,iBAAL;AACH,yBAHD;AAIA;AAlCR;;AAqCA;AACA,wBAAQ,KAAKjJ,aAAL,EAAR;AACI;AACI;AACA,6BAAKmJ,cAAL;;AAEA;AACA,6BAAK5Q,MAAL,CAAY4D,OAAZ,CAAoB,aAApB;AACA;;AAEJ;AACA;AACA;AACI;AACA,6BAAK5D,MAAL,CAAY8L,GAAZ,CAAgB,gBAAhB,EAAkC,YAAM;AACpC;AACA,mCAAK/E,cAAL;AACH,yBAHD;AAIA;;AAEJ;AACI;AACA;AACA,6BAAKA,cAAL;AAtBR;AAwBH;AACJ;;AAED;;;;;;;yCAIiB;AACb;AACA,iBAAK6H,MAAL,GAAc,KAAd;AACA,iBAAKiC,SAAL,GAAiB,KAAKC,UAAL,GAAkB,CAAnC;AACA,iBAAKC,SAAL,GAAiB,IAAIjO,IAAJ,GAAWE,OAAX,EAAjB;;AAEA;AACA,iBAAKgO,SAAL,GAAiB,KAAKhR,MAAL,CAAYiR,WAAZ,CACb,KAAKC,WAAL,CAAiBhK,IAAjB,CAAsB,IAAtB,CADa,EACgB,GADhB,CAAjB;;AAGA;AACA,gBAAI,KAAKjB,MAAL,KAAgB1D,SAApB,EAA+B;AAC3B,qBAAK0D,MAAL,CAAYtC,OAAZ;AACH;;AAED;AACA,iBAAKsC,MAAL,CAAY5G,KAAZ;;AAEA;AACA,iBAAKW,MAAL,CAAY4D,OAAZ,CAAoB,aAApB;AACH;;AAED;;;;;;+BAGO;AACH,gBAAI,CAAC,KAAKxE,YAAL,EAAL,EAA0B;AACtB,qBAAK2O,UAAL,GAAkB,KAAlB;AACA,qBAAKC,WAAL,GAAmB,IAAnB;;AAEA,oBAAI,KAAKvG,aAAL,6BAAJ,EAAyC;AACrC;AACA,yBAAKzH,MAAL,CAAY4D,OAAZ,CAAoB,YAApB;;AAEA;AACA,yBAAK5D,MAAL,CAAYmR,aAAZ,CAA0B,KAAKH,SAA/B;;AAEA;AACA,wBAAI,KAAK/K,MAAT,EAAiB;AACb,6BAAKA,MAAL,CAAYzF,IAAZ;AACH;AACJ,iBAXD,MAWO;AACH,wBAAI,KAAKR,MAAL,CAAYsC,YAAhB,EAA8B;AAC1B;AACA,6BAAKtC,MAAL,CAAY4D,OAAZ,CAAoB,cAApB;AACH;AACJ;AACJ;AACJ;;AAED;;;;;;qCAGa;AACT,gBAAI,KAAKrD,WAAL,EAAJ,EAAwB;AACpB;AACA;AACA,qBAAKP,MAAL,CAAY8L,GAAZ,CAAgB,cAAhB,EAAgC,KAAKsF,UAAL,CAAgBlK,IAAhB,CAAqB,IAArB,CAAhC;;AAEA;AACA,qBAAK1G,IAAL;AACH,aAPD,MAOO;AACH;AACA,qBAAK4Q,UAAL;AACH;AACJ;;AAED;;;;;;qCAGa;AACT;AACA,gBAAI,KAAKtL,MAAT,EAAiB;AACb,qBAAKiJ,aAAL,GAAqB,KAArB;;AAEA,oBAAI,KAAKtH,aAAL,6BAAJ,EAAyC;AACrC;AACA,yBAAK0F,MAAL,CAAYA,MAAZ,CAAmBqB,UAAnB,CAA8B6C,UAA9B;AACA;AACH;AACD,qBAAKvL,MAAL,CAAYwL,SAAZ,GAAwBpB,OAAxB,CAAgC,UAACpK,MAAD,EAAY;AACxCA,2BAAOtF,IAAP;AACH,iBAFD;AAGH;AACJ;;AAED;;;;;;gCAGQ;AACJ,gBAAI,CAAC,KAAKoO,MAAV,EAAkB;AACd,qBAAKiC,SAAL,GAAiB,IAAI/N,IAAJ,GAAWE,OAAX,EAAjB;AACA,qBAAK4L,MAAL,GAAc,IAAd;;AAEA,qBAAK3I,MAAL,CAAYsL,KAAZ;AACH;AACJ;;AAED;;;;;;iCAGS;AACL,gBAAI,KAAK3C,MAAT,EAAiB;AACb,qBAAKkC,UAAL,IAAmB,IAAIhO,IAAJ,GAAWE,OAAX,KAAuB,KAAK6N,SAA/C;;AAEA,qBAAK5K,MAAL,CAAYuL,MAAZ;AACA,qBAAK5C,MAAL,GAAc,KAAd;AACH;AACJ;;AAED;;;;;;;;2CAKmB;AAAA;;AACf;AACA,iBAAK5O,MAAL,CAAYsC,YAAZ,GAA2B,KAAK2D,MAAL,CAAY3D,YAAvC;;AAEA;AACA,iBAAKtC,MAAL,CAAY2M,UAAZ,CAAuBmB,UAAvB,CAAkCvO,WAAlC,CAA8C,WAA9C;AACA,iBAAKS,MAAL,CAAY2M,UAAZ,CAAuBmB,UAAvB,CAAkC1N,IAAlC;;AAEA;AACA,iBAAKJ,MAAL,CAAY4D,OAAZ,CAAoB,cAApB;;AAEA,oBAAQ,KAAK6D,aAAL,EAAR;AACI;AACI;AACA,yBAAK0F,MAAL,CAAYoE,KAAZ;;AAEA;AACA,yBAAKpE,MAAL,CAAYuB,mBAAZ,CAAgC,IAAhC;;AAEA;AACA,yBAAK1O,MAAL,CAAYyR,cAAZ,CAA2BrR,IAA3B;;AAEA;AACA;AACA,yBAAK+M,MAAL,CAAYA,MAAZ,CAAmBuE,IAAnB,CAAwB,OAAxB,EAAiC,YAAM;AACnC,+BAAK1D,WAAL,GAAmB,KAAnB;AACH,qBAFD;;AAIA;AACA,yBAAKuC,IAAL,CAAU,KAAKvQ,MAAL,CAAYsC,YAAtB;AACA;;AAEJ;AACA;AACI;AACA;AACA;AACA,yBAAKtC,MAAL,CAAY8L,GAAZ,CAAgB,OAAhB,EAAyB,YAAM;AAC3B;AACA,+BAAKkC,WAAL,GAAmB,KAAnB;;AAEA;AACA,+BAAKhO,MAAL,CAAYyR,cAAZ,CAA2BpR,IAA3B;;AAEA;AACA,+BAAKiN,WAAL,CAAiB,OAAKqE,cAAtB;;AAEA;AACA,+BAAK/S,EAAL,CAAQ,OAAKoB,MAAb,EAAqB,YAArB,EACI,OAAKiP,kBADT;AAEA,+BAAKrQ,EAAL,CAAQ,OAAKoB,MAAb,EAAqB,OAArB,EACI,OAAKiP,kBADT;;AAGA;AACA,4BAAI,OAAKxH,aAAL,8BAAJ,EAA0C;AACtC,mCAAK2I,YAAL,CAAkBC,KAAlB,GAA0B,KAA1B;;AAEA;AACA,mCAAKC,oBAAL,CAA0B,IAA1B;AACH;;AAED;AACA,4BAAI,kCAAc,OAAK7I,aAAL,8BAAlB,EAAwD;AACpD;AACA,mCAAK8I,IAAL,CAAU,OAAKvQ,MAAL,CAAYsC,YAAZ,CAAyB1B,KAAnC;AACH,yBAHD,MAGO;AACH,mCAAK2P,IAAL,CAAU,OAAKvQ,MAAL,CAAYsC,YAAtB;AACH;AACJ,qBA/BD;;AAiCA;AACA,yBAAKtC,MAAL,CAAYuR,KAAZ;AACA;;AAEJ;AACI;AACA,yBAAKvD,WAAL,GAAmB,KAAnB;;AAEA;AACA,yBAAKhO,MAAL,CAAYyR,cAAZ,CAA2BpR,IAA3B;;AAEA;AACA,yBAAKiN,WAAL,CAAiB,KAAKqE,cAAtB;;AAEA;AACA,yBAAKvB,YAAL,CAAkB3L,KAAlB,CAAwBuI,OAAxB,GAAkC,MAAlC;;AAEA;AACA,yBAAKhN,MAAL,CAAY0L,YAAZ,CAAyBtL,IAAzB;;AAEA;AACA,yBAAKJ,MAAL,CAAYuR,KAAZ;;AAEA;AACA,yBAAK3S,EAAL,CAAQ,KAAKoB,MAAb,EAAqB,MAArB,EAA6B,KAAK4R,aAAlC;;AAEA;AACA,yBAAKhT,EAAL,CAAQ,KAAKoB,MAAb,EAAqB,OAArB,EAA8B,KAAK6R,aAAnC;AACA;AAvFR;AAyFH;;AAED;;;;;;;sCAIc;AACV,gBAAI,CAAC,KAAKjD,MAAV,EAAkB;AACd,oBAAI/L,MAAM,IAAIC,IAAJ,GAAWE,OAAX,EAAV;AACA,oBAAI8O,WAAW,KAAKhR,SAApB;AACA,oBAAIiR,cAAc,CAAClP,OAAO,KAAKkO,SAAL,GAAiB,KAAKD,UAA7B,CAAD,IAA6C,IAA/D;;AAEA,qBAAKa,cAAL,GAAsBI,WAAtB;;AAEA,oBAAIA,eAAeD,QAAnB,EAA6B;AACzB;AACAC,kCAAcD,QAAd;;AAEA;AACA,yBAAKtR,IAAL;AACH;;AAED;AACA,qBAAK8M,WAAL,CAAiBwE,QAAjB;;AAEA;AACA,qBAAK9C,cAAL,CAAoB+C,WAApB,EAAiCD,QAAjC;;AAEA;AACA,qBAAK9R,MAAL,CAAY4D,OAAZ,CAAoB,gBAApB;AACH;AACJ;;AAED;;;;;;;;yCAKiB;AACb,gBAAImO,cAAcvH,MAAM,KAAKwH,iBAAX,IAAgC,CAAhC,GAAoC,KAAKA,iBAA3D;;AAEA,gBAAI,KAAKvK,aAAL,6BAAJ,EAAyC;AACrCsK,8BAAc,KAAK5E,MAAL,CAAY8E,cAAZ,EAAd;AACH;;AAED,mBAAOF,WAAP;AACH;;AAED;;;;;;;;;;;uCAQeA,W,EAAaD,Q,EAAU;AAClCC,0BAAcvH,MAAMuH,WAAN,IAAqB,CAArB,GAAyBA,WAAvC;AACAD,uBAAWtH,MAAMsH,QAAN,IAAkB,CAAlB,GAAsBA,QAAjC;;AAEA,oBAAQ,KAAKrK,aAAL,EAAR;AACI;AACI,yBAAK0F,MAAL,CAAY6B,cAAZ,CAA2B+C,WAA3B,EAAwCD,QAAxC;AACA;;AAEJ;AACA;AACA;AACI,yBAAKE,iBAAL,GAAyB/H,KAAKiI,GAAL,CAASH,WAAT,EAAsBD,QAAtB,CAAzB;;AAEA;AACA,yBAAK9R,MAAL,CAAY2M,UAAZ,CAAuBoD,kBAAvB,CAA0CoC,cAA1C,GACG,KAAKnS,MAAL,CAAY2M,UAAZ,CAAuBoD,kBAAvB,CAA0CqC,SAA1C,GAAsDC,SAAtD,CAAgEC,WAAhE,GACI,0BAAW,KAAKN,iBAAhB,EAAmCF,QAAnC,EAA6C,KAAK/H,YAAlD,CAFP;AAGA;AAdR;AAgBH;;AAED;;;;;;;;sCAKc;AACV,gBAAI+H,WAAWtH,MAAM,KAAKmH,cAAX,IAA6B,CAA7B,GAAiC,KAAKA,cAArD;;AAEA,mBAAOG,QAAP;AACH;;AAED;;;;;;;;;oCAMYA,Q,EAAU;AAClBA,uBAAWtH,MAAMsH,QAAN,IAAkB,CAAlB,GAAsBA,QAAjC;;AAEA,oBAAQ,KAAKrK,aAAL,EAAR;AACI;AACI,yBAAK0F,MAAL,CAAYG,WAAZ,CAAwBwE,QAAxB;AACA;;AAEJ;AACA;AACA;AACI;AACA,yBAAK9R,MAAL,CAAY2M,UAAZ,CAAuBsD,eAAvB,CAAuCkC,cAAvC,GACI,KAAKnS,MAAL,CAAY2M,UAAZ,CAAuBsD,eAAvB,CAAuCmC,SAAvC,GAAmDC,SAAnD,CAA6DC,WAA7D,GACI,0BAAWR,QAAX,EAAqBA,QAArB,EAA+B,KAAK/H,YAApC,CAFR;AAGA;AAZR;AAcH;;AAED;;;;;;;;;6BAMKwI,G,EAAK;AACN,oBAAQ,KAAK9K,aAAL,EAAR;AACI;AACI;AACA,yBAAK0F,MAAL,CAAYoD,IAAZ,CAAiBgC,GAAjB;AACA;;AAEJ;AACA;AACA;AACA;AACI,wBAAIA,eAAe5P,IAAf,IAAuB4P,eAAe3P,IAA1C,EAAgD;AAC5C;AACA,mDAAa2P,GAAb,EAAkB,KAAKnC,YAAvB,EAAqC,KAArC;AACH,qBAHD,MAGO;AACH;AACA,mDAAamC,GAAb,EAAkB,KAAKnC,YAAvB,EAAqC,IAArC;AACH;AACD;AAjBR;AAmBH;;AAED;;;;;;;;;;;;+BASO5M,I,EAAM;AACT,gBAAI,KAAKyC,MAAL,IAAezC,SAASjB,SAA5B,EAAuC;AACnC,qBAAK0D,MAAL,CAAYuM,MAAZ,CAAmBhP,IAAnB;AACH;AACJ;;AAED;;;;;;;;kCAKU;AACN;AACA,iBAAKxD,MAAL,CAAYhB,GAAZ,CAAgB,OAAhB;AACA,iBAAKgB,MAAL,CAAYhB,GAAZ,CAAgB,cAAhB;AACA,iBAAKgB,MAAL,CAAYhB,GAAZ,CAAgB,gBAAhB;;AAEA;AACA,gBAAI,KAAKiH,MAAT,EAAiB;AACb,qBAAKA,MAAL,CAAYtC,OAAZ;AACA,qBAAKsC,MAAL,CAAYjH,GAAZ,CAAgB,gBAAhB,EAAkC,KAAKsP,kBAAvC;AACH;;AAED;AACA,iBAAK9N,IAAL;AACA,iBAAK6Q,UAAL;;AAEA;AACA,iBAAKrR,MAAL,CAAYmR,aAAZ,CAA0B,KAAKH,SAA/B;;AAEA;AACA,gBAAI,KAAKvJ,aAAL,4BAAJ,EAAwC;AACpC,oBAAI,KAAK0F,MAAT,EAAiB;AACb;AACA,yBAAKA,MAAL,CAAYrG,OAAZ;AACH;AACJ;;AAED,iBAAKsE,UAAL;;AAEA;AACH;;AAED;;;;;;kCAGU;AACN,iBAAKpL,MAAL,CAAY2D,OAAZ;AACH;;AAED;;;;;;gCAGQ;AAAA;;AACJ;AACA,gBAAI,KAAKsC,MAAT,EAAiB;AACb,qBAAKA,MAAL,CAAYtC,OAAZ;AACA,qBAAKsC,MAAL,CAAYjH,GAAZ,CAAgB,gBAAhB,EAAkC,KAAKsP,kBAAvC;AACH;;AAED;AACA,iBAAK9N,IAAL;AACA,iBAAK6Q,UAAL;;AAEA;AACA,iBAAKrR,MAAL,CAAYmR,aAAZ,CAA0B,KAAKH,SAA/B;;AAEA;AACA,iBAAK7F,WAAL;;AAEA;AACA,iBAAKC,UAAL;;AAEA;AACA,iBAAKkC,WAAL,CAAiB,KAAKxM,SAAtB;AACA,iBAAKkO,cAAL,CAAoB,CAApB;;AAEA;AACA,iBAAKhP,MAAL,CAAYyS,KAAZ;AACA,oBAAQ,KAAKhL,aAAL,EAAR;AACI;AACI,wBAAI,KAAK0F,MAAL,IAAe,KAAKA,MAAL,CAAYA,MAA/B,EAAuC;AACnC;AACA,6BAAKA,MAAL,CAAYA,MAAZ,CAAmBuF,KAAnB;AACH;AACD;;AAEJ;AACA;AACI;AACA,yBAAK1S,MAAL,CAAY0L,YAAZ,CAAyBrL,IAAzB;AACA,yBAAKL,MAAL,CAAY4L,YAAZ,CAAyBvL,IAAzB;AACA;AAbR;;AAgBA;AACA,iBAAKL,MAAL,CAAY2M,UAAZ,CAAuBmB,UAAvB,CAAkCzN,IAAlC;;AAEA;AACA,iBAAKL,MAAL,CAAYuL,YAAZ,CAAyBnL,IAAzB;;AAEA;AACA,iBAAKJ,MAAL,CAAY6L,YAAZ,CAAyBxL,IAAzB;;AAEA;AACA;AACA,iBAAKL,MAAL,CAAY8L,GAAZ,CAAgB,gBAAhB,EAAkC,YAAM;AACpC;AACA,uBAAKwB,WAAL,CAAiB,OAAKxM,SAAtB;AACH,aAHD;AAIH;;AAED;;;;;;;qCAIa;AACT,iBAAKiN,UAAL,GAAkB,KAAlB;AACA,iBAAKC,WAAL,GAAmB,KAAnB;AACA,iBAAKe,aAAL,GAAqB,KAArB;AACA,iBAAK4D,OAAL,GAAe,EAAf;AACH;;AAED;;;;;;wCAGgB;AACZ,mBAAO,iCAAgB,KAAKvG,WAArB,EAAkC,KAAKC,WAAvC,EACH,KAAKC,WADF,EACe,KAAKC,eADpB,CAAP;AAEH;;AAED;;;;;;;yCAIiB;AAAA;;AACb,iBAAKoE,YAAL,GAAoB1F,IAApB,CAAyB,UAAC1C,MAAD,EAAY;AACjC;AACA,uBAAKvI,MAAL,CAAYsC,YAAZ,GAA2BiG,OAAOqK,SAAP,CAAiB,WAAjB,CAA3B;;AAEA;AACA,uBAAKxC,YAAL,CAAkB3L,KAAlB,CAAwBuI,OAAxB,GAAkC,MAAlC;;AAEA;AACA,uBAAKhN,MAAL,CAAY0L,YAAZ,CAAyBtL,IAAzB;;AAEA;AACA,uBAAKI,IAAL;AACH,aAZD;AAaH;;AAED;;;;;;;wCAIgB;AACZ,iBAAKwN,WAAL,GAAmB,KAAnB;;AAEA;AACA,iBAAKhO,MAAL,CAAY0L,YAAZ,CAAyBrL,IAAzB;;AAEA;AACA,iBAAKL,MAAL,CAAY4M,EAAZ,GAAiBE,UAAjB,CAA4BrI,KAA5B,CAAkCuI,OAAlC,GAA4C,OAA5C;AACH;;AAED;;;;;;;uCAIe;AAAA;;AACX,gBAAI6F,WAAW,mCAAf;AACA,gBAAInH,eAAe,KAAK1L,MAAL,CAAY0L,YAAZ,CAAyBkB,EAAzB,GAA8BE,UAAjD;;AAEA;AACA;AACApB,yBAAaiE,KAAb,GAAqB,KAAK3P,MAAL,CAAY2P,KAAZ,EAArB;AACAjE,yBAAakE,MAAb,GAAsB,KAAK5P,MAAL,CAAY4P,MAAZ,EAAtB;;AAEA,mBAAO,IAAIkD,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAKH,SAASrK,OAAT,KAAqB,QAArB,IAAiCqK,SAASpK,OAAT,IAAoB,EAAtD,IACA,QAAOwK,YAAP,yCAAOA,YAAP,eAA+BC,QAA/B,yCAA+BA,QAA/B,EADJ,EAC8C;AAC1C,wBAAI;AACA,4BAAIC,QAAQ,OAAKrN,MAAL,CAAYsN,cAAZ,GAA6B,CAA7B,CAAZ;AACA,4BAAIC,eAAe,IAAIJ,YAAJ,CAAiBE,KAAjB,CAAnB;AACA,4BAAIG,gBAAgB;AAChBC,wCAAY7H,aAAaiE,KADT;AAEhB6D,yCAAa9H,aAAakE;AAFV,yBAApB;;AAKA;AACAyD,qCAAaI,SAAb,CAAuBH,aAAvB,EAAsCrI,IAAtC,CAA2C,UAACyI,IAAD,EAAU;AACjD,mCAAOC,kBAAkBD,IAAlB,CAAP;AAEH,yBAHD,EAGGzI,IAHH,CAGQ,UAAC2I,WAAD,EAAiB;AACrB;AACA,mCAAKC,UAAL,CAAgBnI,YAAhB,EAA8BkI,WAA9B;;AAEA;AACAb,oCAAQrH,YAAR;AACH,yBATD;AAUA;AACH,qBApBD,CAoBE,OAAM8D,GAAN,EAAW,CAAE;AAClB;AACD;;AAEA;AACA,uBAAKqE,UAAL,CAAgBnI,YAAhB,EAA8B,OAAK0E,YAAnC;;AAEA;AACA2C,wBAAQrH,YAAR;AACH,aAvCM,CAAP;AAwCH;;AAED;;;;;;;mCAIWjF,M,EAAQsB,O,EAAS;AACxBtB,mBAAOqN,UAAP,CAAkB,IAAlB,EAAwBC,SAAxB,CACIhM,OADJ,EACa,CADb,EACgB,CADhB,EAEItB,OAAOkJ,KAFX,EAGIlJ,OAAOmJ,MAHX;AAKH;;AAED;;;;;;;4CAIoB;AAChB;AACA,iBAAK5Q,GAAL,CAAS,YAAT;AACA,iBAAKA,GAAL,CAAS,gBAAT;AACA,iBAAKA,GAAL,CAAS,gBAAT;AACA,iBAAKA,GAAL,CAAS,MAAT;;AAEA;AACA,iBAAKoR,YAAL,CAAkBC,KAAlB,GAA0B,IAA1B;;AAEA;AACA,iBAAKC,oBAAL,CAA0B,KAA1B;;AAEA;AACA,iBAAKC,IAAL,CAAU,KAAKzK,MAAf;AACA,iBAAKsK,YAAL,CAAkBtF,IAAlB;AACH;;AAED;;;;;;;wCAIgB;AACZ,gBAAIa,mBAAmB,KAAK3L,MAAL,CAAY2L,gBAAZ,CAA6BiB,EAA7B,GAAkCE,UAAzD;;AAEA;AACAnB,6BAAiBgE,KAAjB,GAAyB,KAAK3P,MAAL,CAAY2P,KAAZ,EAAzB;AACAhE,6BAAiBiE,MAAjB,GAA0B,KAAK5P,MAAL,CAAY4P,MAAZ,EAA1B;;AAEA;AACA,iBAAK5P,MAAL,CAAY0L,YAAZ,CAAyBrL,IAAzB;;AAEA;AACA,uCAAa,KAAKL,MAAL,CAAYsC,YAAzB,EAAuCqJ,gBAAvC,EAAyD,KAAzD;AACA,iBAAK3L,MAAL,CAAY2L,gBAAZ,CAA6BvL,IAA7B;AACH;;AAED;;;;;;;wCAIgB;AACZ;AACA,iBAAKJ,MAAL,CAAY0L,YAAZ,CAAyBtL,IAAzB;;AAEA;AACA,iBAAKJ,MAAL,CAAY2L,gBAAZ,CAA6BtL,IAA7B;AACH;;AAED;;;;;;;6CAIqB;AACjB,iBAAK2O,cAAL,CAAoB,KAAKhP,MAAL,CAAY+R,WAAZ,EAApB,EACI,KAAKJ,cADT;AAEH;;AAED;;;;;;;oCAIYqC,O,EAASC,G,EAAK;AACtB,iBAAKjU,MAAL,CAAYkU,gBAAZ,GAA+BF,OAA/B;AACA,iBAAKhU,MAAL,CAAYmU,aAAZ,GAA4BF,GAA5B;;AAEA;AACA,gBAAIG,QAAJ;AACA,oBAAQ,KAAK3M,aAAL,EAAR;AACI;AACI2M,+BAAW,KAAKnO,MAAL,CAAYA,MAAZ,CAAmBoO,aAA9B;AACA;;AAEJ;AACID,+BAAW,KAAKnO,MAAL,CAAYA,MAAZ,CAAmBqO,WAA9B;AACA;;AAEJ;AACIF,+BAAW,KAAKnO,MAAL,CAAYA,MAAZ,CAAmBsO,aAA9B;AAVR;AAYAH,uBAAWA,SAASI,mBAAT,EAAX;AACA,gBAAKJ,oBAAoBK,mBAArB,KAA8C,IAAlD,EAAwD;AACpD,qBAAKzU,MAAL,CAAYsC,YAAZ,GAA2B8R,SAASM,eAAT,EAA3B;;AAEA;AACA,qBAAKzO,MAAL,CAAYvC,WAAZ,CACI,KAAK1D,MAAL,CAAYsC,YAAZ,CAAyB,KAAKtC,MAAL,CAAYsC,YAAZ,CAAyB+G,MAAzB,GAAkC,CAA3D,CADJ;AAEH;;AAED;AACA,iBAAKrJ,MAAL,CAAY4D,OAAZ,CAAoB,WAApB;AACH;;AAED;;;;;;;;;2CAMmB;AAAA;;AACf,gBAAI,CAACI,UAAU+E,YAAX,IAA2B,CAAC/E,UAAU+E,YAAV,CAAuB4L,gBAAvD,EAAyE;AACrE,qBAAK3U,MAAL,CAAY4U,kBAAZ,GAAiC,mCAAjC;AACA,qBAAK5U,MAAL,CAAY4D,OAAZ,CAAoB,gBAApB;AACA;AACH;;AAED;AACAI,sBAAU+E,YAAV,CAAuB4L,gBAAvB,CAAwC,IAAxC,EAA8C1J,IAA9C,CAAmD,UAAC0H,OAAD,EAAa;AAC5D,uBAAKA,OAAL,GAAe,EAAf;AACAA,wBAAQzC,OAAR,CAAgB,UAAC2E,MAAD,EAAY;AACxB,2BAAKlC,OAAL,CAAamC,IAAb,CAAkBD,MAAlB;AACH,iBAFD;;AAIA;AACA,uBAAK7U,MAAL,CAAY4D,OAAZ,CAAoB,gBAApB;AACH,aARD,EAQGkL,KARH,CAQS,UAACU,GAAD,EAAS;AACd,uBAAKxP,MAAL,CAAY4U,kBAAZ,GAAiCpF,GAAjC;AACA,uBAAKxP,MAAL,CAAY4D,OAAZ,CAAoB,gBAApB;AACH,aAXD;AAYH;;AAED;;;;;;;;uCAKemR,Q,EAAU;AAAA;;AACrB,gBAAIC,qBAAJ;;AAEA,oBAAQ,KAAKvN,aAAL,EAAR;AACI;AACI;AACA,yBAAK0F,MAAL,CAAYA,MAAZ,CAAmB8H,SAAnB,CAA6BF,QAA7B,EAAuC9J,IAAvC,CAA4C,UAAC1C,MAAD,EAAY;AACpD;AACA,gCAAKvI,MAAL,CAAY4D,OAAZ,CAAoB,kBAApB;AACA;AACH,qBAJD,EAIGkL,KAJH,CAIS,UAACU,GAAD,EAAS;AACdwF,uCAAexF,GAAf;AACH,qBAND;AAOA;;AAEJ;AACI,wBAAIzH,UAAU/H,OAAOwN,KAAP,CAAaC,GAA3B;AACA,wBAAIsH,QAAJ,EAAc;AACV,4BAAI,OAAOhN,QAAQmN,MAAf,KAA0B,WAA9B,EAA2C;AACvCnN,oCAAQkN,SAAR,CAAkBF,QAAlB,EAA4B9J,IAA5B,CAAiC,UAAC1C,MAAD,EAAY;AACzC;AACA,wCAAKvI,MAAL,CAAY4D,OAAZ,CAAoB,kBAApB;AACA;AACH,6BAJD,EAIGkL,KAJH,CAIS,UAACU,GAAD,EAAS;AACdwF,+CAAexF,GAAf;AACH,6BAND;AAOH,yBARD,MAQO;AACHwF,2CAAe,yDAAf;AACH;AACJ,qBAZD,MAYO;AACHA,uCAAe,uBAAuBD,QAAtC;AACH;AACD;AA7BR;;AAgCA;AACA,iBAAK/U,MAAL,CAAY4D,OAAZ,CAAoB,OAApB,EAA6BoR,YAA7B;AACH;;AAED;;;;;;;;;6CAMqBhI,O,EAAS;AAC1B,gBAAI,KAAKhN,MAAL,CAAY2M,UAAZ,CAAuBwI,WAAvB,KAAuC5S,SAA3C,EAAsD;AAClD,oBAAIyK,YAAY,IAAhB,EAAsB;AAClBA,8BAAU,MAAV;AACH,iBAFD,MAEO;AACHA,8BAAU,MAAV;AACH;AACD,qBAAKhN,MAAL,CAAY2M,UAAZ,CAAuBwI,WAAvB,CAAmCvI,EAAnC,GAAwCnI,KAAxC,CAA8CuI,OAA9C,GAAwDA,OAAxD;AACH;AACJ;;;;EA91CgBtC,M;;AAi2CrB;;;AACAQ,OAAOkK,OAAP,GAAiB,OAAjB;;AAEA;AACA,gBAAQlK,MAAR,GAAiBA,MAAjB;AACA,IAAI,gBAAQP,SAAR,CAAkB,QAAlB,MAAgCpI,SAApC,EAA+C;AAC3C,oBAAQ8S,cAAR,CAAuB,QAAvB,EAAiCnK,MAAjC;AACH;;AAED;AACAoK,OAAOC,OAAP,GAAiB;AACbrK;AADa,CAAjB,C;;;;;;;;;;;AC15CA,sD","file":"videojs.record.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"videojs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"VideojsRecord\", [\"videojs\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VideojsRecord\"] = factory(require(\"videojs\"));\n\telse\n\t\troot[\"VideojsRecord\"] = factory(root[\"videojs\"]);\n})(window, function(__WEBPACK_EXTERNAL_MODULE_video_js__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./src/js/videojs.record.js\");\n","var win;\n\nif (typeof window !== \"undefined\") {\n win = window;\n} else if (typeof global !== \"undefined\") {\n win = global;\n} else if (typeof self !== \"undefined\"){\n win = self;\n} else {\n win = {};\n}\n\nmodule.exports = win;\n","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1, eval)(\"this\");\r\n} catch (e) {\r\n\t// This works if the window reference is available\r\n\tif (typeof window === \"object\") g = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n","/**\n * @file animation-display.js\n * @since 2.0.0\n */\n\nconst Component = videojs.getComponent('Component');\n\n/**\n * Image for displaying animated GIF image.\n *\n * @class\n * @augments videojs.Component\n*/\nclass AnimationDisplay extends Component {\n\n /**\n * Create the `AnimationDisplay`s DOM element.\n *\n * @return {Element}\n * The dom element that gets created.\n */\n createEl() {\n return super.createEl('div', {\n className: 'vjs-animation-display',\n innerHTML: ''\n });\n }\n}\n\nComponent.registerComponent('AnimationDisplay', AnimationDisplay);\n\nexport default AnimationDisplay;\n","/**\n * @file camera-button.js\n * @since 2.0.0\n */\n\nconst Button = videojs.getComponent('Button');\nconst Component = videojs.getComponent('Component');\n\n/**\n * Button to toggle between create and retry snapshot image.\n *\n * @class\n * @augments videojs.Button\n*/\nclass CameraButton extends Button {\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n buildCSSClass() {\n return 'vjs-camera-button vjs-control vjs-button vjs-icon-photo-camera';\n }\n\n /**\n * Enable the `CameraButton` element so that it can be activated or clicked.\n */\n enable() {\n super.enable();\n\n this.on(this.player_, 'startRecord', this.onStart);\n this.on(this.player_, 'stopRecord', this.onStop);\n }\n\n /**\n * Disable the `CameraButton` element so that it cannot be activated or clicked.\n */\n disable() {\n super.disable();\n\n this.off(this.player_, 'startRecord', this.onStart);\n this.off(this.player_, 'stopRecord', this.onStop);\n }\n\n /**\n * This gets called when the button is clicked.\n *\n * @param {EventTarget~Event} event\n * The `tap` or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n handleClick(event) {\n let recorder = this.player_.record();\n\n if (!recorder.isProcessing()) {\n // create snapshot\n recorder.start();\n } else {\n // retry\n recorder.retrySnapshot();\n\n // reset camera button\n this.onStop();\n }\n }\n\n /**\n * Add the vjs-icon-replay class to the element so it can change appearance.\n *\n * @param {EventTarget~Event} [event]\n * The event that caused this function to run.\n *\n * @listens Player#startRecord\n */\n onStart(event) {\n // replace element class so it can change appearance\n this.removeClass('vjs-icon-photo-camera');\n this.addClass('vjs-icon-replay');\n\n // change the button text\n this.controlText('Retry');\n }\n\n /**\n * Add the vjs-icon-photo-camera class to the element so it can change appearance.\n *\n * @param {EventTarget~Event} [event]\n * The event that caused this function to run.\n *\n * @listens Player#stopRecord\n */\n onStop(event) {\n // replace element class so it can change appearance\n this.removeClass('vjs-icon-replay');\n this.addClass('vjs-icon-photo-camera');\n\n // change the button text\n this.controlText('Image');\n }\n}\n\n/**\n * The text that should display over the `CameraButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nCameraButton.prototype.controlText_ = 'Image';\n\nComponent.registerComponent('CameraButton', CameraButton);\n\nexport default CameraButton;\n","/**\n * @file device-button.js\n * @since 2.0.0\n */\n\nconst Button = videojs.getComponent('Button');\nconst Component = videojs.getComponent('Component');\n\n/**\n * Button to select recording device.\n *\n * @class\n * @augments videojs.Button\n*/\nclass DeviceButton extends Button {\n /**\n * This gets called when this button gets:\n *\n * - Clicked (via the `click` event, listening starts in the constructor)\n * - Tapped (via the `tap` event, listening starts in the constructor)\n *\n * @param {EventTarget~Event} event\n * The `keydown`, `tap`, or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n handleClick(event) {\n // open device dialog\n this.player_.record().getDevice();\n }\n}\n\n/**\n * The text that should display over the `DeviceButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nDeviceButton.prototype.controlText_ = 'Device';\n\nComponent.registerComponent('DeviceButton', DeviceButton);\n\nexport default DeviceButton;\n","/**\n * @file record-canvas\n * @since 2.0.0\n */\n\nconst Component = videojs.getComponent('Component');\n\n/**\n * Canvas for displaying snapshot image.\n *\n * @class\n * @augments videojs.Component\n*/\nclass RecordCanvas extends Component {\n\n /**\n * Create the `RecordCanvas`s DOM element.\n *\n * @return {Element}\n * The dom element that gets created.\n */\n createEl() {\n return super.createEl('div', {\n className: 'vjs-record-canvas',\n innerHTML: ''\n });\n }\n}\n\nComponent.registerComponent('RecordCanvas', RecordCanvas);\n\nexport default RecordCanvas;\n","/**\n * @file record-indicator.js\n * @since 2.0.0\n */\n\nconst Component = videojs.getComponent('Component');\n\n/**\n * Icon indicating recording is active.\n *\n * @class\n * @augments videojs.Component\n*/\nclass RecordIndicator extends Component {\n /**\n * The constructor function for the class.\n *\n * @private\n * @param {(videojs.Player|Object)} player - Video.js player instance.\n * @param {Object} options - Player options.\n */\n constructor(player, options) {\n super(player, options);\n\n this.enable();\n }\n\n /**\n * Create the `RecordIndicator`s DOM element.\n *\n * @return {Element}\n * The dom element that gets created.\n */\n createEl() {\n return super.createEl('div', {\n className: 'vjs-record-indicator vjs-control',\n dir: 'ltr'\n });\n }\n\n /**\n * Enable event handlers.\n */\n enable() {\n this.on(this.player_, 'startRecord', this.show);\n this.on(this.player_, 'stopRecord', this.hide);\n }\n\n /**\n * Disable event handlers.\n */\n disable() {\n this.off(this.player_, 'startRecord', this.show);\n this.off(this.player_, 'stopRecord', this.hide);\n }\n}\n\nComponent.registerComponent('RecordIndicator', RecordIndicator);\n\nexport default RecordIndicator;\n","/**\n * @file record-toggle.js\n * @since 2.0.0\n */\n\nconst Button = videojs.getComponent('Button');\nconst Component = videojs.getComponent('Component');\n\n/**\n * Button to toggle between start and stop recording.\n *\n * @class\n * @augments videojs.Button\n*/\nclass RecordToggle extends Button {\n /**\n * Builds the default DOM `className`.\n *\n * @return {string}\n * The DOM `className` for this object.\n */\n buildCSSClass() {\n return 'vjs-record-button vjs-control vjs-button vjs-icon-record-start';\n }\n\n /**\n * Enable the `RecordToggle` element so that it can be activated or clicked.\n */\n enable() {\n super.enable();\n\n this.on(this.player_, 'startRecord', this.onStart);\n this.on(this.player_, 'stopRecord', this.onStop);\n }\n\n /**\n * Disable the `RecordToggle` element so that it cannot be activated or clicked.\n */\n disable() {\n super.disable();\n\n this.off(this.player_, 'startRecord', this.onStart);\n this.off(this.player_, 'stopRecord', this.onStop);\n }\n\n /**\n * This gets called when the button is clicked.\n *\n * @param {EventTarget~Event} event\n * The `tap` or `click` event that caused this function to be\n * called.\n *\n * @listens tap\n * @listens click\n */\n handleClick(event) {\n let recorder = this.player_.record();\n if (!recorder.isRecording()) {\n recorder.start();\n } else {\n recorder.stop();\n }\n }\n\n /**\n * Add the vjs-icon-record-stop class to the element so it can change appearance.\n *\n * @param {EventTarget~Event} [event]\n * The event that caused this function to run.\n *\n * @listens Player#startRecord\n */\n onStart(event) {\n // replace element class so it can change appearance\n this.removeClass('vjs-icon-record-start');\n this.addClass('vjs-icon-record-stop');\n\n // change the button text\n this.controlText('Stop');\n }\n\n /**\n * Add the vjs-icon-record-start class to the element so it can change appearance.\n *\n * @param {EventTarget~Event} [event]\n * The event that caused this function to run.\n *\n * @listens Player#stopRecord\n */\n onStop(event) {\n // replace element class so it can change appearance\n this.removeClass('vjs-icon-record-stop');\n this.addClass('vjs-icon-record-start');\n\n // change the button text\n this.controlText('Record');\n }\n}\n\n/**\n * The text that should display over the `RecordToggle`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nRecordToggle.prototype.controlText_ = 'Record';\n\nComponent.registerComponent('RecordToggle', RecordToggle);\n\nexport default RecordToggle;\n","/**\n * @file defaults.js\n * @since 2.0.0\n */\n\n//plugin defaults\nconst pluginDefaultOptions = {\n // Single snapshot image.\n image: false,\n // Include audio in the recorded clip.\n audio: false,\n // Include video in the recorded clip.\n video: false,\n // Animated GIF.\n animation: false,\n // Maximum length of the recorded clip.\n maxLength: 10,\n // Width of the recorded video frames.\n frameWidth: 320,\n // Height of the recorded video frames.\n frameHeight: 240,\n // Enables console logging for debugging purposes.\n debug: false,\n // The mime type for the video recorder. Default to 'video/webm'.\n // Use 'video/mp4' (Firefox) or 'video/webm;codecs=H264' (Chrome 52 and\n // newer) for MP4.\n videoMimeType: 'video/webm',\n // Video recorder type to use. This allows you to specify an alternative\n // recorder class, e.g. WhammyRecorder. Defaults to 'auto' which let's\n // recordrtc specify the best available recorder type.\n videoRecorderType: 'auto',\n // Audio recording library to use. Legal values are 'recordrtc',\n // 'libvorbis.js', 'opus-recorder', 'lamejs' and 'recorder.js'.\n audioEngine: 'recordrtc',\n // Audio recorder type to use. This allows you to specify an alternative\n // recorder class, e.g. StereoAudioRecorder. Defaults to 'auto' which let's\n // recordrtc specify the best available recorder type. Currently this\n // setting is only used with the 'recordrtc' audioEngine.\n audioRecorderType: 'auto',\n // The mime type for the audio recorder. Defaults to 'auto' which will pick\n // the best option available in the browser (e.g. either 'audio/wav',\n // 'audio/ogg' or 'audio/webm').\n audioMimeType: 'auto',\n // The size of the audio buffer (in sample-frames) which needs to\n // be processed each time onprocessaudio is called.\n // From the spec: This value controls how frequently the audioprocess event is\n // dispatched and how many sample-frames need to be processed each call.\n // Lower values for buffer size will result in a lower (better) latency.\n // Higher values will be necessary to avoid audio breakup and glitches.\n // Legal values are 256, 512, 1024, 2048, 4096, 8192 or 16384.\n audioBufferSize: 4096,\n // The audio sample rate (in sample-frames per second) at which the\n // AudioContext handles audio. It is assumed that all AudioNodes\n // in the context run at this rate. In making this assumption,\n // sample-rate converters or \"varispeed\" processors are not supported\n // in real-time processing.\n // The sampleRate parameter describes the sample-rate of the\n // linear PCM audio data in the buffer in sample-frames per second.\n // An implementation must support sample-rates in at least\n // the range 22050 to 96000.\n audioSampleRate: 44100,\n // The audio bitrate in kbps (only used in lamejs plugin).\n audioBitRate: 128,\n // Allows you to record single-channel audio, which can reduce the\n // filesize.\n audioChannels: 2,\n // URL for the audio worker.\n audioWorkerURL: '',\n // Frame rate in frames per second.\n animationFrameRate: 200,\n // Sets quality of color quantization (conversion of images to the\n // maximum 256 colors allowed by the GIF specification).\n // Lower values (minimum = 1) produce better colors,\n // but slow processing significantly. 10 is the default,\n // and produces good color mapping at reasonable speeds.\n // Values greater than 20 do not yield significant improvements\n // in speed.\n animationQuality: 10,\n // Accepts numbers in milliseconds; use this to force intervals-based blobs.\n timeSlice: 0\n};\n\nexport default pluginDefaultOptions;\n","/**\n * @file record-engine.js\n * @since 2.0.0\n */\n\nconst Component = videojs.getComponent('Component');\n\n// supported recorder plugin engines\nconst RECORDRTC = 'recordrtc';\nconst LIBVORBISJS = 'libvorbis.js';\nconst RECORDERJS = 'recorder.js';\nconst LAMEJS = 'lamejs';\nconst OPUSRECORDER = 'opus-recorder';\n\n/**\n * Base class for recorder backends.\n * @class\n * @augments videojs.Component\n */\nclass RecordEngine extends Component {\n /**\n * Creates an instance of this class.\n *\n * @param {Player} player\n * The `Player` that this class should be attached to.\n *\n * @param {Object} [options]\n * The key/value store of player options.\n */\n constructor(player, options) {\n\n // auto mixin the evented mixin (required since video.js v6.6.0)\n options.evented = true;\n\n super(player, options);\n }\n\n /**\n * Remove any temporary data and references to streams.\n * @private\n */\n dispose() {\n // dispose previous recording\n if (this.recordedData !== undefined) {\n URL.revokeObjectURL(this.recordedData);\n }\n }\n\n /**\n * Add filename and timestamp to recorded file object.\n *\n * @param {(blob|file)} fileObj - Blob or File object.\n */\n addFileInfo(fileObj) {\n if (fileObj instanceof Blob || fileObj instanceof File) {\n // set modification date\n let now = new Date();\n try {\n fileObj.lastModified = now.getTime();\n fileObj.lastModifiedDate = now;\n } catch (e) {\n if (e instanceof TypeError) {\n // ignore: setting getter-only property \"lastModifiedDate\"\n } else {\n // re-raise error\n throw e;\n }\n }\n // guess extension name from mime type, e.g. audio/ogg, but\n // any extension is valid here. Chrome also accepts extended\n // mime types like video/webm;codecs=h264,vp9,opus\n let fileExtension = '.' + fileObj.type.split('/')[1];\n if (fileExtension.indexOf(';') > -1) {\n fileExtension = fileExtension.split(';')[0];\n }\n\n // use timestamp in filename, e.g. 1451180941326.ogg\n try {\n fileObj.name = now.getTime() + fileExtension;\n } catch (e) {\n if (e instanceof TypeError) {\n // ignore: setting getter-only property \"name\"\n } else {\n // re-raise error\n throw e;\n }\n }\n }\n }\n\n /**\n * Invoked when recording is stopped and resulting stream is available.\n *\n * @param {blob} data - Reference to the recorded Blob.\n */\n onStopRecording(data) {\n this.recordedData = data;\n\n // add filename and timestamp to recorded file object\n this.addFileInfo(this.recordedData);\n\n // remove reference to recorded stream\n this.dispose();\n\n // notify listeners\n this.trigger('recordComplete');\n }\n\n /**\n * Show save as dialog in browser so the user can store the recorded media\n * locally.\n *\n * @param {object} name - Object with names for the particular blob(s)\n * you want to save. File extensions are added automatically. For\n * example: {'video': 'name-of-video-file'}. Supported keys are\n * 'audio', 'video' and 'gif'.\n */\n saveAs(name) {\n let fileName = name[Object.keys(name)[0]];\n\n if (typeof navigator.msSaveOrOpenBlob !== 'undefined') {\n return navigator.msSaveOrOpenBlob(this.recordedData, fileName);\n } else if (typeof navigator.msSaveBlob !== 'undefined') {\n return navigator.msSaveBlob(this.recordedData, fileName);\n }\n\n let hyperlink = document.createElement('a');\n hyperlink.href = URL.createObjectURL(this.recordedData);\n hyperlink.download = fileName;\n\n hyperlink.style = 'display:none;opacity:0;color:transparent;';\n (document.body || document.documentElement).appendChild(hyperlink);\n\n if (typeof hyperlink.click === 'function') {\n hyperlink.click();\n } else {\n hyperlink.target = '_blank';\n hyperlink.dispatchEvent(new MouseEvent('click', {\n view: window,\n bubbles: true,\n cancelable: true\n }));\n }\n\n URL.revokeObjectURL(hyperlink.href);\n }\n}\n\n// expose component for external plugins\nvideojs.RecordEngine = RecordEngine;\nComponent.registerComponent('RecordEngine', RecordEngine);\n\nexport {\n RecordEngine,\n RECORDRTC, LIBVORBISJS, RECORDERJS, LAMEJS, OPUSRECORDER\n};\n","/**\n * @file record-mode.js\n * @since 2.0.0\n */\n\n// recorder modes\nconst IMAGE_ONLY = 'image_only';\nconst AUDIO_ONLY = 'audio_only';\nconst VIDEO_ONLY = 'video_only';\nconst AUDIO_VIDEO = 'audio_video';\nconst ANIMATION = 'animation';\n\n\nconst getRecorderMode = function(image, audio, video, animation) {\n if (isModeEnabled(image)) {\n return IMAGE_ONLY;\n\n } else if (isModeEnabled(animation)) {\n return ANIMATION;\n\n } else if (isModeEnabled(audio) && !isModeEnabled(video)) {\n return AUDIO_ONLY;\n\n } else if (isModeEnabled(audio) && isModeEnabled(video)) {\n return AUDIO_VIDEO;\n\n } else if (!isModeEnabled(audio) && isModeEnabled(video)) {\n return VIDEO_ONLY;\n }\n};\n\n/**\n * Return boolean indicating whether mode is enabled or not.\n *\n * @private\n */\nconst isModeEnabled = function(mode) {\n return mode === Object(mode) || mode === true;\n};\n\nexport {\n getRecorderMode,\n IMAGE_ONLY, AUDIO_ONLY, VIDEO_ONLY, AUDIO_VIDEO, ANIMATION\n};\n","/**\n * @file record-rtc.js\n * @since 2.0.0\n */\n\nimport { RecordEngine } from './record-engine';\nimport { isChrome } from '../utils/detect-browser';\nimport {IMAGE_ONLY, AUDIO_ONLY, VIDEO_ONLY, AUDIO_VIDEO, ANIMATION} from './record-mode';\n\nconst Component = videojs.getComponent('Component');\n\n/**\n * Engine used with the MRecordRTC class in the RecordRTC library.\n *\n * @class\n * @augments videojs.RecordEngine\n */\nclass RecordRTCEngine extends RecordEngine {\n\n /**\n * Setup recording engine.\n */\n setup(stream, mediaType, debug) {\n this.inputStream = stream;\n this.mediaType = mediaType;\n this.debug = debug;\n\n // setup RecordRTC\n this.engine = new RecordRTC.MRecordRTC();\n this.engine.mediaType = this.mediaType;\n this.engine.disableLogs = !this.debug;\n this.engine.mimeType = this.mimeType;\n\n // audio settings\n this.engine.bufferSize = this.bufferSize;\n this.engine.sampleRate = this.sampleRate;\n this.engine.numberOfAudioChannels = this.audioChannels;\n\n // video/canvas settings\n this.engine.video = this.video;\n this.engine.canvas = this.canvas;\n\n // animated gif settings\n this.engine.quality = this.quality;\n this.engine.frameRate = this.frameRate;\n if (this.onTimeStamp !== undefined) {\n this.engine.timeSlice = this.timeSlice;\n this.engine.onTimeStamp = this.onTimeStamp;\n }\n\n // connect stream to recording engine\n this.engine.addStream(this.inputStream);\n }\n\n /**\n * Remove any temporary data and references to streams.\n */\n dispose() {\n super.dispose();\n\n if (typeof this.engine.destroy === 'function') {\n this.engine.destroy();\n }\n }\n\n /**\n * Start recording.\n */\n start() {\n this.engine.startRecording();\n }\n\n /**\n * Stop recording. Result will be available async when onStopRecording\n * is called.\n */\n stop() {\n this.engine.stopRecording(this.onStopRecording.bind(this));\n }\n\n /**\n * Pause recording.\n */\n pause() {\n this.engine.pauseRecording();\n }\n\n /**\n * Resume recording.\n */\n resume() {\n this.engine.resumeRecording();\n }\n\n /**\n * Show save as dialog in browser so the user can store the recorded media\n * locally.\n *\n * @param {object} name - Object with names for the particular blob(s)\n * you want to save. File extensions are added automatically. For\n * example: {'video': 'name-of-video-file'}. Supported keys are\n * 'audio', 'video' and 'gif'.\n */\n saveAs(name) {\n if (this.engine && name !== undefined) {\n this.engine.save(name);\n }\n }\n\n /**\n * Invoked when recording is stopped and resulting stream is available.\n *\n * @private\n * @param {string} audioVideoURL - Reference to the recorded Blob\n * object, e.g. 'blob:http://localhost:8080/10100016-4248-9949-b0d6-0bb40db56eba'\n * @param {string} type - Media type, eg. 'video' or 'audio'.\n */\n onStopRecording(audioVideoURL, type) {\n // store reference to recorded stream URL\n this.mediaURL = audioVideoURL;\n\n // store reference to recorded stream data\n let recordType = this.player().record().getRecordType();\n this.engine.getBlob((recording) => {\n switch (recordType) {\n case AUDIO_ONLY:\n this.recordedData = recording.audio;\n\n this.addFileInfo(this.recordedData);\n\n // notify listeners\n this.trigger('recordComplete');\n break;\n\n case VIDEO_ONLY:\n case AUDIO_VIDEO:\n // when recording both audio and video, recordrtc\n // calls this twice on chrome, first with audio data\n // and then with video data.\n // on firefox it's called once but with a single\n // blob that includes both audio and video data.\n if (recording.video !== undefined) {\n // data is video-only but on firefox audio+video\n this.recordedData = recording.video;\n\n // on the chrome browser two blobs are created\n // containing the separate audio/video streams.\n if (recordType === AUDIO_VIDEO && isChrome()) {\n // store both audio and video\n this.recordedData = recording;\n\n for (let mtype in this.recordedData) {\n this.addFileInfo(this.recordedData[mtype]);\n }\n } else {\n this.addFileInfo(this.recordedData);\n }\n\n // notify listeners\n this.trigger('recordComplete');\n }\n break;\n\n case ANIMATION:\n this.recordedData = recording.gif;\n\n this.addFileInfo(this.recordedData);\n\n // notify listeners\n this.trigger('recordComplete');\n break;\n }\n });\n }\n}\n\n// expose plugin\nvideojs.RecordRTCEngine = RecordRTCEngine;\n\nComponent.registerComponent('RecordRTCEngine', RecordRTCEngine);\n\nexport default RecordRTCEngine;\n","/**\n * @file browser-shim.js\n * @since 2.0.0\n */\n\nconst setSrcObject = function (stream, element, ignoreCreateObjectURL) {\n if ('createObjectURL' in URL && !ignoreCreateObjectURL) {\n try {\n element.src = URL.createObjectURL(stream);\n } catch (e) {\n setSrcObject(stream, element, true);\n return;\n }\n } else if ('srcObject' in element) {\n element.srcObject = stream;\n } else if ('mozSrcObject' in element) {\n element.mozSrcObject = stream;\n } else {\n console.log('createObjectURL/srcObject both are not supported.');\n }\n};\n\nexport default setSrcObject;\n","/**\n * @file detect-browser.js\n * @since 2.0.0\n */\n\nimport window from 'global/window';\n\n/**\n * Browser detector.\n *\n * @private\n * @return {object} result containing browser, version and minVersion\n * properties.\n */\nconst detectBrowser = function() {\n // returned result object\n let result = {};\n result.browser = null;\n result.version = null;\n result.minVersion = null;\n\n // fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n result.minVersion = 31;\n } else if (navigator.webkitGetUserMedia) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./, 2);\n result.minVersion = 38;\n } else if (navigator.mediaDevices &&\n navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) { // Edge.\n result.browser = 'edge';\n result.version = extractVersion(navigator.userAgent,\n /Edge\\/(\\d+).(\\d+)$/, 2);\n result.minVersion = 10547;\n } else if (window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./, 1);\n } else {\n // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n};\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @private\n * @param {!string} uastring - userAgent string.\n * @param {!string} expr - Regular expression used as match criteria.\n * @param {!number} pos - position in the version string to be\n * returned.\n * @return {!number} browser version.\n */\nconst extractVersion = function(uastring, expr, pos) {\n let match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n};\n\nconst isEdge = function() {\n return detectBrowser().browser === 'edge';\n};\n\nconst isSafari = function() {\n return detectBrowser().browser === 'safari';\n};\n\nconst isOpera = function() {\n return !!window.opera || navigator.userAgent.indexOf('OPR/') !== -1;\n};\n\nconst isChrome = function() {\n return detectBrowser().browser === 'chrome';\n};\n\nexport {\n detectBrowser, isEdge, isOpera, isChrome, isSafari\n};\n","/**\n * @file format-time.js\n * @since 2.0.0\n */\n\n/**\n * Format seconds as a time string, H:MM:SS, M:SS or M:SS:MMM.\n *\n * Supplying a guide (in seconds) will force a number of leading zeros\n * to cover the length of the guide.\n *\n * @param {number} seconds - Number of seconds to be turned into a\n * string.\n * @param {number} guide - Number (in seconds) to model the string\n * after.\n * @param {number} msDisplayMax - Number (in milliseconds) to model the string\n * after.\n * @return {string} Time formatted as H:MM:SS, M:SS or M:SS:MMM, e.g.\n * 0:00:12.\n * @private\n */\nconst formatTime = function(seconds, guide, msDisplayMax) {\n // Default to using seconds as guide\n seconds = seconds < 0 ? 0 : seconds;\n guide = guide || seconds;\n let s = Math.floor(seconds % 60),\n m = Math.floor(seconds / 60 % 60),\n h = Math.floor(seconds / 3600),\n gm = Math.floor(guide / 60 % 60),\n gh = Math.floor(guide / 3600),\n ms = Math.floor((seconds - s) * 1000);\n\n // handle invalid times\n if (isNaN(seconds) || seconds === Infinity) {\n // '-' is false for all relational operators (e.g. <, >=) so this\n // setting will add the minimum number of fields specified by the\n // guide\n h = m = s = ms = '-';\n }\n\n // Check if we need to show milliseconds\n if (guide > 0 && guide < msDisplayMax) {\n if (ms < 100) {\n if (ms < 10) {\n ms = '00' + ms;\n } else {\n ms = '0' + ms;\n }\n }\n ms = ':' + ms;\n } else {\n ms = '';\n }\n\n // Check if we need to show hours\n h = (h > 0 || gh > 0) ? h + ':' : '';\n\n // If hours are showing, we may need to add a leading zero.\n // Always show at least one digit of minutes.\n m = (((h || gm >= 10) && m < 10) ? '0' + m : m) + ':';\n\n // Check if leading zero is need for seconds\n s = ((s < 10) ? '0' + s : s);\n\n return h + m + s + ms;\n};\n\nexport default formatTime;\n","/**\n * @file videojs.record.js\n *\n * The main file for the videojs-record project.\n * MIT license: https://github.com/collab-project/videojs-record/blob/master/LICENSE\n */\n\nimport AnimationDisplay from './controls/animation-display';\nimport RecordCanvas from './controls/record-canvas';\nimport DeviceButton from './controls/device-button';\nimport CameraButton from './controls/camera-button';\nimport RecordToggle from './controls/record-toggle';\nimport RecordIndicator from './controls/record-indicator';\n\nimport pluginDefaultOptions from './defaults';\nimport formatTime from './utils/format-time';\nimport setSrcObject from './utils/browser-shim';\nimport { detectBrowser, isChrome } from './utils/detect-browser';\n\nimport RecordRTCEngine from './engine/record-rtc';\nimport {RECORDRTC, LIBVORBISJS, RECORDERJS, LAMEJS, OPUSRECORDER} from './engine/record-engine';\nimport {IMAGE_ONLY, AUDIO_ONLY, VIDEO_ONLY, AUDIO_VIDEO, ANIMATION, getRecorderMode} from './engine/record-mode';\n\nimport videojs from 'video.js';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst Player = videojs.getComponent('Player');\n\nconst AUTO = 'auto';\n\n\n// monkey-patch play (#152)\nPlayer.prototype.play = function play() {\n let retval = this.techGet_('play');\n // silence errors (unhandled promise from play)\n if (retval !== undefined && typeof retval.then === 'function') {\n retval.then(null, (e) => {});\n }\n return retval;\n};\n\n/**\n * Record audio/video/images using the Video.js player.\n *\n * @class\n * @augments videojs.Plugin\n */\nclass Record extends Plugin {\n /**\n * The constructor function for the class.\n *\n * @param {(videojs.Player|Object)} player\n * @param {Object} options - Player options.\n */\n constructor(player, options) {\n super(player, options);\n\n // setup plugin options\n this.loadOptions();\n\n // (re)set recorder state\n this.resetState();\n\n // add device button with icon based on type\n let deviceIcon = 'av-perm';\n switch (this.getRecordType()) {\n case IMAGE_ONLY:\n case VIDEO_ONLY:\n case ANIMATION:\n deviceIcon = 'video-perm';\n break;\n case AUDIO_ONLY:\n deviceIcon = 'audio-perm';\n break;\n }\n DeviceButton.prototype.buildCSSClass = function() {\n // use dynamic icon class\n return 'vjs-device-button vjs-control vjs-icon-' + deviceIcon;\n };\n player.deviceButton = new DeviceButton(player, options);\n player.addChild(player.deviceButton);\n\n // add blinking record indicator\n player.recordIndicator = new RecordIndicator(player, options);\n player.recordIndicator.hide();\n player.addChild(player.recordIndicator);\n\n // add canvas for recording and displaying image\n player.recordCanvas = new RecordCanvas(player, options);\n player.recordCanvas.hide();\n player.addChild(player.recordCanvas);\n\n // add image for animation display\n player.animationDisplay = new AnimationDisplay(player, options);\n player.animationDisplay.hide();\n player.addChild(player.animationDisplay);\n\n // add camera button\n player.cameraButton = new CameraButton(player, options);\n player.cameraButton.hide();\n\n // add record toggle\n player.recordToggle = new RecordToggle(player, options);\n player.recordToggle.hide();\n\n // wait until player ui is ready\n this.player.one('ready', this.setupUI.bind(this));\n }\n\n /**\n * Setup plugin options.\n */\n loadOptions() {\n let recordOptions = videojs.mergeOptions(pluginDefaultOptions,\n this.player.options_.plugins.record);\n\n // record settings\n this.recordImage = recordOptions.image;\n this.recordAudio = recordOptions.audio;\n this.recordVideo = recordOptions.video;\n this.recordAnimation = recordOptions.animation;\n this.maxLength = recordOptions.maxLength;\n this.debug = recordOptions.debug;\n this.recordTimeSlice = recordOptions.timeSlice;\n\n // video/canvas settings\n this.videoFrameWidth = recordOptions.frameWidth;\n this.videoFrameHeight = recordOptions.frameHeight;\n this.videoRecorderType = recordOptions.videoRecorderType;\n this.videoMimeType = recordOptions.videoMimeType;\n\n // audio settings\n this.audioEngine = recordOptions.audioEngine;\n this.audioRecorderType = recordOptions.audioRecorderType;\n this.audioWorkerURL = recordOptions.audioWorkerURL;\n this.audioBufferSize = recordOptions.audioBufferSize;\n this.audioSampleRate = recordOptions.audioSampleRate;\n this.audioBitRate = recordOptions.audioBitRate;\n this.audioChannels = recordOptions.audioChannels;\n this.audioMimeType = recordOptions.audioMimeType;\n\n // animation settings\n this.animationFrameRate = recordOptions.animationFrameRate;\n this.animationQuality = recordOptions.animationQuality;\n }\n\n /**\n * Player UI is ready.\n * @private\n */\n setupUI() {\n // insert custom controls on left-side of controlbar\n this.player.controlBar.addChild(this.player.cameraButton);\n this.player.controlBar.el().insertBefore(\n this.player.cameraButton.el(),\n this.player.controlBar.el().firstChild);\n this.player.controlBar.el().insertBefore(\n this.player.recordToggle.el(),\n this.player.controlBar.el().firstChild);\n\n // get rid of unused controls\n if (this.player.controlBar.remainingTimeDisplay !== undefined) {\n this.player.controlBar.remainingTimeDisplay.el().style.display = 'none';\n }\n if (this.player.controlBar.liveDisplay !== undefined) {\n this.player.controlBar.liveDisplay.el().style.display = 'none';\n }\n\n // loop feature is never used in this plugin\n this.player.loop(false);\n\n // tweak player UI based on type\n switch (this.getRecordType()) {\n case AUDIO_ONLY:\n // reference to videojs-wavesurfer plugin\n this.surfer = this.player.wavesurfer();\n break;\n\n case IMAGE_ONLY:\n case VIDEO_ONLY:\n case AUDIO_VIDEO:\n case ANIMATION:\n // customize controls\n this.player.bigPlayButton.hide();\n\n // loadedmetadata resets the durationDisplay for the\n // first time\n this.player.one('loadedmetadata', () => {\n // display max record time\n this.setDuration(this.maxLength);\n });\n\n // the native controls don't work for this UI so disable\n // them no matter what\n if (this.player.usingNativeControls_ === true) {\n if (this.player.tech_.el_ !== undefined) {\n this.player.tech_.el_.controls = false;\n }\n }\n\n // clicking or tapping the player video element should not try\n // to start playback\n this.player.removeTechControlsListeners_();\n\n if (this.player.options_.controls) {\n // progress control isn't used by this plugin\n this.player.controlBar.progressControl.hide();\n\n // prevent controlbar fadeout\n this.player.on('userinactive', (event) => {\n this.player.userActive(true);\n });\n\n // videojs automatically hides the controls when no valid 'source'\n // element is included in the video or audio tag. Don't. Ever again.\n this.player.controlBar.show();\n this.player.controlBar.el().style.display = 'flex';\n }\n break;\n }\n\n // disable time display events that constantly try to reset the current time\n // and duration values\n this.player.off('timeupdate');\n this.player.off('durationchange');\n this.player.off('loadedmetadata');\n\n // display max record time\n this.setDuration(this.maxLength);\n\n // hide play control\n this.player.controlBar.playToggle.hide();\n }\n\n /**\n * Indicates whether the plugin is currently recording or not.\n *\n * @return {boolean} Plugin currently recording or not.\n */\n isRecording() {\n return this._recording;\n }\n\n /**\n * Indicates whether the plugin is currently processing recorded data\n * or not.\n *\n * @return {boolean} Plugin processing or not.\n */\n isProcessing() {\n return this._processing;\n }\n\n /**\n * Indicates whether the plugin is destroyed or not.\n *\n * @return {boolean} Plugin destroyed or not.\n */\n isDestroyed() {\n return this.player && (this.player.children() === null);\n }\n\n /**\n * Open the browser's recording device selection dialog.\n */\n getDevice() {\n // define device callbacks once\n if (this.deviceReadyCallback === undefined) {\n this.deviceReadyCallback = this.onDeviceReady.bind(this);\n }\n if (this.deviceErrorCallback === undefined) {\n this.deviceErrorCallback = this.onDeviceError.bind(this);\n }\n if (this.engineStopCallback === undefined) {\n this.engineStopCallback = this.onRecordComplete.bind(this);\n }\n // ask the browser to give the user access to the media device\n // and get a stream reference in the callback function\n switch (this.getRecordType()) {\n case AUDIO_ONLY:\n // setup microphone\n this.mediaType = {\n audio: (this.audioRecorderType === AUTO) ? true : this.audioRecorderType,\n video: false\n };\n // remove existing microphone listeners\n this.surfer.surfer.microphone.un('deviceReady',\n this.deviceReadyCallback);\n this.surfer.surfer.microphone.un('deviceError',\n this.deviceErrorCallback);\n\n // setup new microphone listeners\n this.surfer.surfer.microphone.on('deviceReady',\n this.deviceReadyCallback);\n this.surfer.surfer.microphone.on('deviceError',\n this.deviceErrorCallback);\n\n // disable existing playback events\n this.surfer.setupPlaybackEvents(false);\n\n // (re)set surfer liveMode\n this.surfer.liveMode = true;\n this.surfer.surfer.microphone.paused = false;\n\n // open browser device selection dialog\n this.surfer.surfer.microphone.start();\n break;\n\n case IMAGE_ONLY:\n case VIDEO_ONLY:\n // setup camera\n this.mediaType = {\n audio: false,\n video: (this.videoRecorderType === AUTO) ? true : this.videoRecorderType\n };\n navigator.mediaDevices.getUserMedia({\n audio: false,\n video: (this.getRecordType() === IMAGE_ONLY) ? this.recordImage : this.recordVideo\n }).then(\n this.onDeviceReady.bind(this)\n ).catch(\n this.onDeviceError.bind(this)\n );\n break;\n\n case AUDIO_VIDEO:\n // setup camera and microphone\n this.mediaType = {\n audio: (this.audioRecorderType === AUTO) ? true : this.audioRecorderType,\n video: (this.videoRecorderType === AUTO) ? true : this.videoRecorderType\n };\n navigator.mediaDevices.getUserMedia({\n audio: this.recordAudio,\n video: this.recordVideo\n }).then(\n this.onDeviceReady.bind(this)\n ).catch(\n this.onDeviceError.bind(this)\n );\n break;\n\n case ANIMATION:\n // setup camera\n this.mediaType = {\n // animated GIF\n audio: false,\n video: false,\n gif: true\n };\n navigator.mediaDevices.getUserMedia({\n audio: false,\n video: this.recordAnimation\n }).then(\n this.onDeviceReady.bind(this)\n ).catch(\n this.onDeviceError.bind(this)\n );\n break;\n }\n }\n\n /**\n * Invoked when the device is ready.\n * @private\n * @param stream: LocalMediaStream instance.\n */\n onDeviceReady(stream) {\n this._deviceActive = true;\n\n // store reference to stream for stopping etc.\n this.stream = stream;\n\n // hide device selection button\n this.player.deviceButton.hide();\n\n // reset time (e.g. when stopDevice was used)\n this.setDuration(this.maxLength);\n this.setCurrentTime(0);\n\n // hide play/pause control (e.g. when stopDevice was used)\n this.player.controlBar.playToggle.hide();\n\n // reset playback listeners\n this.off(this.player, 'timeupdate', this.playbackTimeUpdate);\n this.off(this.player, 'ended', this.playbackTimeUpdate);\n\n // setup recording engine\n if (this.getRecordType() !== IMAGE_ONLY) {\n // currently libvorbis.js, recorder.js, opus-recorder and lamejs\n // are only supported in audio-only mode\n if (this.getRecordType() !== AUDIO_ONLY &&\n (this.audioEngine === LIBVORBISJS ||\n this.audioEngine === RECORDERJS ||\n this.audioEngine === LAMEJS ||\n this.audioEngine === OPUSRECORDER)) {\n throw new Error('Currently ' + this.audioEngine +\n ' is only supported in audio-only mode.');\n }\n\n // get recorder class\n var EngineClass;\n switch (this.audioEngine) {\n case RECORDRTC:\n // RecordRTC.js (default)\n EngineClass = videojs.RecordRTCEngine;\n break;\n\n case LIBVORBISJS:\n // libvorbis.js\n EngineClass = videojs.LibVorbisEngine;\n break;\n\n case RECORDERJS:\n // recorder.js\n EngineClass = videojs.RecorderjsEngine;\n break;\n\n case LAMEJS:\n // lamejs\n EngineClass = videojs.LamejsEngine;\n break;\n\n case OPUSRECORDER:\n // opus-recorder\n EngineClass = videojs.OpusRecorderEngine;\n break;\n\n default:\n // unknown engine\n throw new Error('Unknown audioEngine: ' + this.audioEngine);\n }\n try {\n // connect stream to recording engine\n this.engine = new EngineClass(this.player, this.player.options_);\n }\n catch (err) {\n console.error(err);\n throw new Error('Could not load ' + this.audioEngine +\n ' plugin');\n }\n\n // listen for events\n this.engine.on('recordComplete', this.engineStopCallback);\n\n // audio settings\n this.engine.bufferSize = this.audioBufferSize;\n this.engine.sampleRate = this.audioSampleRate;\n this.engine.bitRate = this.audioBitRate;\n this.engine.audioChannels = this.audioChannels;\n this.engine.audioWorkerURL = this.audioWorkerURL;\n\n // mime type\n this.engine.mimeType = {\n video: this.videoMimeType,\n gif: 'image/gif'\n };\n if (this.audioMimeType !== null &&\n this.audioMimeType !== AUTO) {\n this.engine.mimeType.audio = this.audioMimeType;\n }\n\n // video/canvas settings\n this.engine.video = {\n width: this.videoFrameWidth,\n height: this.videoFrameHeight\n };\n this.engine.canvas = {\n width: this.videoFrameWidth,\n height: this.videoFrameHeight\n };\n\n // animated GIF settings\n this.engine.quality = this.animationQuality;\n this.engine.frameRate = this.animationFrameRate;\n\n // timeSlice\n if (this.recordTimeSlice && this.recordTimeSlice > 0) {\n this.engine.timeSlice = this.recordTimeSlice;\n this.engine.onTimeStamp = this.onTimeStamp.bind(this);\n }\n\n // initialize recorder\n this.engine.setup(this.stream, this.mediaType, this.debug);\n\n // show elements that should never be hidden in animation,\n // audio and/or video modus\n let uiElements = [this.player.controlBar.currentTimeDisplay,\n this.player.controlBar.timeDivider,\n this.player.controlBar.durationDisplay];\n uiElements.forEach((element) => {\n if (element !== undefined) {\n element.el().style.display = 'block';\n element.show();\n }\n });\n\n // show record button\n this.player.recordToggle.show();\n } else {\n // disable record indicator\n this.player.recordIndicator.disable();\n\n // setup UI for retrying snapshot (e.g. when stopDevice was\n // used)\n this.retrySnapshot();\n\n // reset and show camera button\n this.player.cameraButton.onStop();\n this.player.cameraButton.show();\n }\n\n // setup preview\n if (this.getRecordType() !== AUDIO_ONLY) {\n // show live preview\n this.mediaElement = this.player.el().firstChild;\n this.mediaElement.controls = false;\n\n // mute incoming audio for feedback loops\n this.mediaElement.muted = true;\n\n // hide the volume bar while it's muted\n this.displayVolumeControl(false);\n\n // load stream\n this.load(this.stream);\n\n // stream loading is async, so we wait until it's ready to play\n // the stream\n this.player.one('loadedmetadata', () => {\n // start stream\n this.mediaElement.play();\n\n // forward to listeners\n this.player.trigger('deviceReady');\n });\n } else {\n // forward to listeners\n this.player.trigger('deviceReady');\n }\n }\n\n /**\n * Invoked when an device error occurred.\n * @private\n */\n onDeviceError(code) {\n this._deviceActive = false;\n\n // store code\n this.player.deviceErrorCode = code;\n\n // forward error to player\n this.player.trigger('deviceError');\n }\n\n /**\n * Start recording.\n */\n start() {\n if (!this.isProcessing()) {\n this._recording = true;\n\n // hide play/pause control\n this.player.controlBar.playToggle.hide();\n\n // reset playback listeners\n this.off(this.player, 'timeupdate', this.playbackTimeUpdate);\n this.off(this.player, 'ended', this.playbackTimeUpdate);\n\n // start preview\n switch (this.getRecordType()) {\n case AUDIO_ONLY:\n // disable playback events\n this.surfer.setupPlaybackEvents(false);\n\n // start/resume live audio visualization\n this.surfer.surfer.microphone.paused = false;\n this.surfer.liveMode = true;\n this.surfer.surfer.microphone.play();\n break;\n\n case VIDEO_ONLY:\n case AUDIO_VIDEO:\n // preview video stream in video element\n this.startVideoPreview();\n break;\n\n case ANIMATION:\n // hide the first frame\n this.player.recordCanvas.hide();\n\n // hide the animation\n this.player.animationDisplay.hide();\n\n // show preview video\n this.mediaElement.style.display = 'block';\n\n // for animations, capture the first frame\n // that can be displayed as soon as recording\n // is complete\n this.captureFrame().then((result) => {\n // start video preview **after** capturing first frame\n this.startVideoPreview();\n });\n break;\n }\n\n // start recording\n switch (this.getRecordType()) {\n case IMAGE_ONLY:\n // create snapshot\n this.createSnapshot();\n\n // notify UI\n this.player.trigger('startRecord');\n break;\n\n case VIDEO_ONLY:\n case AUDIO_VIDEO:\n case ANIMATION:\n // wait for media stream on video element to actually load\n this.player.one('loadedmetadata', () => {\n // start actually recording process\n this.startRecording();\n });\n break;\n\n default:\n // all resources have already loaded, so we can start\n // recording right away\n this.startRecording();\n }\n }\n }\n\n /**\n * Start recording.\n * @private\n */\n startRecording() {\n // register starting point\n this.paused = false;\n this.pauseTime = this.pausedTime = 0;\n this.startTime = new Date().getTime();\n\n // start countdown\n this.countDown = this.player.setInterval(\n this.onCountDown.bind(this), 100);\n\n // cleanup previous recording\n if (this.engine !== undefined) {\n this.engine.dispose();\n }\n\n // start recording stream\n this.engine.start();\n\n // notify UI\n this.player.trigger('startRecord');\n }\n\n /**\n * Stop recording.\n */\n stop() {\n if (!this.isProcessing()) {\n this._recording = false;\n this._processing = true;\n\n if (this.getRecordType() !== IMAGE_ONLY) {\n // notify UI\n this.player.trigger('stopRecord');\n\n // stop countdown\n this.player.clearInterval(this.countDown);\n\n // stop recording stream (result will be available async)\n if (this.engine) {\n this.engine.stop();\n }\n } else {\n if (this.player.recordedData) {\n // notify listeners that image data is (already) available\n this.player.trigger('finishRecord');\n }\n }\n }\n }\n\n /**\n * Stop device(s) and recording if active.\n */\n stopDevice() {\n if (this.isRecording()) {\n // stop stream once recorded data is available,\n // otherwise it'll break recording\n this.player.one('finishRecord', this.stopStream.bind(this));\n\n // stop recording\n this.stop();\n } else {\n // stop stream now, since there's no recorded data available\n this.stopStream();\n }\n }\n\n /**\n * Stop stream and device.\n */\n stopStream() {\n // stop stream and device\n if (this.stream) {\n this._deviceActive = false;\n\n if (this.getRecordType() === AUDIO_ONLY) {\n // make the microphone plugin stop it's device\n this.surfer.surfer.microphone.stopDevice();\n return;\n }\n this.stream.getTracks().forEach((stream) => {\n stream.stop();\n });\n }\n }\n\n /**\n * Pause recording.\n */\n pause() {\n if (!this.paused) {\n this.pauseTime = new Date().getTime();\n this.paused = true;\n\n this.engine.pause();\n }\n }\n\n /**\n * Resume recording.\n */\n resume() {\n if (this.paused) {\n this.pausedTime += new Date().getTime() - this.pauseTime;\n\n this.engine.resume();\n this.paused = false;\n }\n }\n\n /**\n * Invoked when recording completed and the resulting stream is\n * available.\n * @private\n */\n onRecordComplete() {\n // store reference to recorded stream data\n this.player.recordedData = this.engine.recordedData;\n\n // change the replay button back to a play button\n this.player.controlBar.playToggle.removeClass('vjs-ended');\n this.player.controlBar.playToggle.show();\n\n // notify listeners that data is available\n this.player.trigger('finishRecord');\n\n switch (this.getRecordType()) {\n case AUDIO_ONLY:\n // pause player so user can start playback\n this.surfer.pause();\n\n // setup events for playback\n this.surfer.setupPlaybackEvents(true);\n\n // display loader\n this.player.loadingSpinner.show();\n\n // restore interaction with controls after waveform\n // rendering is complete\n this.surfer.surfer.once('ready', () => {\n this._processing = false;\n });\n\n // visualize recorded stream\n this.load(this.player.recordedData);\n break;\n\n case VIDEO_ONLY:\n case AUDIO_VIDEO:\n // pausing the player so we can visualize the recorded data\n // will trigger an async video.js 'pause' event that we\n // have to wait for.\n this.player.one('pause', () => {\n // video data is ready\n this._processing = false;\n\n // hide loader\n this.player.loadingSpinner.hide();\n\n // show stream total duration\n this.setDuration(this.streamDuration);\n\n // update time during playback and at end\n this.on(this.player, 'timeupdate',\n this.playbackTimeUpdate);\n this.on(this.player, 'ended',\n this.playbackTimeUpdate);\n\n // unmute local audio during playback\n if (this.getRecordType() === AUDIO_VIDEO) {\n this.mediaElement.muted = false;\n\n // show the volume bar when it's unmuted\n this.displayVolumeControl(true);\n }\n\n // load recorded media\n if (isChrome() && this.getRecordType() === AUDIO_VIDEO) {\n // use video property on Chrome\n this.load(this.player.recordedData.video);\n } else {\n this.load(this.player.recordedData);\n }\n });\n\n // pause player so user can start playback\n this.player.pause();\n break;\n\n case ANIMATION:\n // animation data is ready\n this._processing = false;\n\n // hide loader\n this.player.loadingSpinner.hide();\n\n // show animation total duration\n this.setDuration(this.streamDuration);\n\n // hide preview video\n this.mediaElement.style.display = 'none';\n\n // show the first frame\n this.player.recordCanvas.show();\n\n // pause player so user can start playback\n this.player.pause();\n\n // show animation on play\n this.on(this.player, 'play', this.showAnimation);\n\n // hide animation on pause\n this.on(this.player, 'pause', this.hideAnimation);\n break;\n }\n }\n\n /**\n * Invoked during recording and displays the remaining time.\n * @private\n */\n onCountDown() {\n if (!this.paused) {\n var now = new Date().getTime();\n var duration = this.maxLength;\n var currentTime = (now - (this.startTime + this.pausedTime)) / 1000;\n\n this.streamDuration = currentTime;\n\n if (currentTime >= duration) {\n // at the end\n currentTime = duration;\n\n // stop recording\n this.stop();\n }\n\n // update duration\n this.setDuration(duration);\n\n // update current time\n this.setCurrentTime(currentTime, duration);\n\n // notify listeners\n this.player.trigger('progressRecord');\n }\n }\n\n /**\n * Get the current time of the recorded stream during playback.\n *\n * Returns 0 if no recording is available (yet).\n */\n getCurrentTime() {\n let currentTime = isNaN(this.streamCurrentTime) ? 0 : this.streamCurrentTime;\n\n if (this.getRecordType() === AUDIO_ONLY) {\n currentTime = this.surfer.getCurrentTime();\n }\n\n return currentTime;\n }\n\n /**\n * Updates the player's element displaying the current time.\n *\n * @private\n * @param {number} [currentTime=0] - Current position of the\n * playhead (in seconds).\n * @param {number} [duration=0] - Duration in seconds.\n */\n setCurrentTime(currentTime, duration) {\n currentTime = isNaN(currentTime) ? 0 : currentTime;\n duration = isNaN(duration) ? 0 : duration;\n\n switch (this.getRecordType()) {\n case AUDIO_ONLY:\n this.surfer.setCurrentTime(currentTime, duration);\n break;\n\n case VIDEO_ONLY:\n case AUDIO_VIDEO:\n case ANIMATION:\n this.streamCurrentTime = Math.min(currentTime, duration);\n\n // update current time display component\n this.player.controlBar.currentTimeDisplay.formattedTime_ =\n this.player.controlBar.currentTimeDisplay.contentEl().lastChild.textContent =\n formatTime(this.streamCurrentTime, duration, this.msDisplayMax);\n break;\n }\n }\n\n /**\n * Get the length of the recorded stream in seconds.\n *\n * Returns 0 if no recording is available (yet).\n */\n getDuration() {\n let duration = isNaN(this.streamDuration) ? 0 : this.streamDuration;\n\n return duration;\n }\n\n /**\n * Updates the player's element displaying the duration time.\n *\n * @param {number} [duration=0] - Duration in seconds.\n * @private\n */\n setDuration(duration) {\n duration = isNaN(duration) ? 0 : duration;\n\n switch (this.getRecordType()) {\n case AUDIO_ONLY:\n this.surfer.setDuration(duration);\n break;\n\n case VIDEO_ONLY:\n case AUDIO_VIDEO:\n case ANIMATION:\n // update duration display component\n this.player.controlBar.durationDisplay.formattedTime_ =\n this.player.controlBar.durationDisplay.contentEl().lastChild.textContent =\n formatTime(duration, duration, this.msDisplayMax);\n break;\n }\n }\n\n /**\n * Start loading data.\n *\n * @param {(string|blob|file)} url - Either the URL of the media file,\n * a Blob, a File object or MediaStream.\n */\n load(url) {\n switch (this.getRecordType()) {\n case AUDIO_ONLY:\n // visualize recorded Blob stream\n this.surfer.load(url);\n break;\n\n case IMAGE_ONLY:\n case VIDEO_ONLY:\n case AUDIO_VIDEO:\n case ANIMATION:\n if (url instanceof Blob || url instanceof File) {\n // assign blob using createObjectURL\n setSrcObject(url, this.mediaElement, false);\n } else {\n // assign stream without createObjectURL\n setSrcObject(url, this.mediaElement, true);\n }\n break;\n }\n }\n\n /**\n * Show save as dialog in browser so the user can store the recorded media\n * locally.\n *\n * @param {object} name - Object with one or more names for the particular\n * blob(s) you want to save. File extensions are added automatically.\n * For example: {'video': 'name-of-video-file'}. Supported keys are\n * 'audio', 'video' and 'gif'.\n */\n saveAs(name) {\n if (this.engine && name !== undefined) {\n this.engine.saveAs(name);\n }\n }\n\n /**\n * Destroy plugin only.\n *\n * Use `destroy` to remove the plugin and the player.\n */\n dispose() {\n // disable common event listeners\n this.player.off('ready');\n this.player.off('userinactive');\n this.player.off('loadedmetadata');\n\n // prevent callbacks if recording is in progress\n if (this.engine) {\n this.engine.dispose();\n this.engine.off('recordComplete', this.engineStopCallback);\n }\n\n // stop recording and device\n this.stop();\n this.stopDevice();\n\n // stop countdown\n this.player.clearInterval(this.countDown);\n\n // dispose wavesurfer.js\n if (this.getRecordType() == AUDIO_ONLY) {\n if (this.surfer) {\n // also disposes player\n this.surfer.destroy();\n }\n }\n\n this.resetState();\n\n super.dispose();\n }\n\n /**\n * Destroy plugin and players and cleanup resources.\n */\n destroy() {\n this.player.dispose();\n }\n\n /**\n * Reset the plugin.\n */\n reset() {\n // prevent callbacks if recording is in progress\n if (this.engine) {\n this.engine.dispose();\n this.engine.off('recordComplete', this.engineStopCallback);\n }\n\n // stop recording and device\n this.stop();\n this.stopDevice();\n\n // stop countdown\n this.player.clearInterval(this.countDown);\n\n // reset options\n this.loadOptions();\n\n // reset recorder state\n this.resetState();\n\n // reset record time\n this.setDuration(this.maxLength);\n this.setCurrentTime(0);\n\n // reset player\n this.player.reset();\n switch (this.getRecordType()) {\n case AUDIO_ONLY:\n if (this.surfer && this.surfer.surfer) {\n // empty last frame\n this.surfer.surfer.empty();\n }\n break;\n\n case IMAGE_ONLY:\n case ANIMATION:\n // reset UI\n this.player.recordCanvas.hide();\n this.player.cameraButton.hide();\n break;\n }\n\n // hide play control\n this.player.controlBar.playToggle.hide();\n\n // show device selection button\n this.player.deviceButton.show();\n\n // hide record button\n this.player.recordToggle.hide();\n\n // loadedmetadata resets the durationDisplay for the\n // first time\n this.player.one('loadedmetadata', () => {\n // display max record time\n this.setDuration(this.maxLength);\n });\n }\n\n /**\n * Reset the plugin recorder state.\n * @private\n */\n resetState() {\n this._recording = false;\n this._processing = false;\n this._deviceActive = false;\n this.devices = [];\n }\n\n /**\n * Get recorder type.\n */\n getRecordType() {\n return getRecorderMode(this.recordImage, this.recordAudio,\n this.recordVideo, this.recordAnimation);\n }\n\n /**\n * Create and display snapshot image.\n * @private\n */\n createSnapshot() {\n this.captureFrame().then((result) => {\n // turn the canvas data into base64 data with a PNG header\n this.player.recordedData = result.toDataURL('image/png');\n\n // hide preview video\n this.mediaElement.style.display = 'none';\n\n // show the snapshot\n this.player.recordCanvas.show();\n\n // stop recording\n this.stop();\n });\n }\n\n /**\n * Reset UI for retrying a snapshot image.\n * @private\n */\n retrySnapshot() {\n this._processing = false;\n\n // retry: hide the snapshot\n this.player.recordCanvas.hide();\n\n // show preview video\n this.player.el().firstChild.style.display = 'block';\n }\n\n /**\n * Capture frame from camera and copy data to canvas.\n * @private\n */\n captureFrame() {\n var detected = detectBrowser();\n var recordCanvas = this.player.recordCanvas.el().firstChild;\n\n // set the canvas size to the dimensions of the camera,\n // which also wipes the content of the canvas\n recordCanvas.width = this.player.width();\n recordCanvas.height = this.player.height();\n\n return new Promise((resolve, reject) => {\n // MediaCapture is only supported on:\n // - Chrome 60 and newer (see\n // https://github.com/w3c/mediacapture-image/blob/gh-pages/implementation-status.md)\n // - Firefox behind flag (https://bugzilla.mozilla.org/show_bug.cgi?id=888177)\n //\n // importing ImageCapture can fail when enabling chrome flag is still required.\n // if so; ignore and continue\n if ((detected.browser === 'chrome' && detected.version >= 60) &&\n (typeof ImageCapture === typeof Function)) {\n try {\n var track = this.stream.getVideoTracks()[0];\n var imageCapture = new ImageCapture(track);\n let photoSettings = {\n imageWidth: recordCanvas.width,\n imageHeight: recordCanvas.height\n };\n\n // take picture\n imageCapture.takePhoto(photoSettings).then((blob) => {\n return createImageBitmap(blob);\n\n }).then((imageBitmap) => {\n // get a frame and copy it onto the canvas\n this.drawCanvas(recordCanvas, imageBitmap);\n\n // notify others\n resolve(recordCanvas);\n });\n return;\n } catch(err) {}\n }\n // no ImageCapture available: do it the oldskool way\n\n // get a frame and copy it onto the canvas\n this.drawCanvas(recordCanvas, this.mediaElement);\n\n // notify others\n resolve(recordCanvas);\n });\n }\n\n /**\n * Draw image frame on canvas element.\n * @private\n */\n drawCanvas(canvas, element) {\n canvas.getContext('2d').drawImage(\n element, 0, 0,\n canvas.width,\n canvas.height\n );\n }\n\n /**\n * Start preview of video stream.\n * @private\n */\n startVideoPreview() {\n // disable playback events\n this.off('timeupdate');\n this.off('durationchange');\n this.off('loadedmetadata');\n this.off('play');\n\n // mute local audio\n this.mediaElement.muted = true;\n\n // hide volume control to prevent feedback\n this.displayVolumeControl(false);\n\n // start or resume live preview\n this.load(this.stream);\n this.mediaElement.play();\n }\n\n /**\n * Show animated GIF.\n * @private\n */\n showAnimation() {\n var animationDisplay = this.player.animationDisplay.el().firstChild;\n\n // set the image size to the dimensions of the recorded animation\n animationDisplay.width = this.player.width();\n animationDisplay.height = this.player.height();\n\n // hide the first frame\n this.player.recordCanvas.hide();\n\n // show the animation\n setSrcObject(this.player.recordedData, animationDisplay, false);\n this.player.animationDisplay.show();\n }\n\n /**\n * Hide animated GIF.\n * @private\n */\n hideAnimation() {\n // show the first frame\n this.player.recordCanvas.show();\n\n // hide the animation\n this.player.animationDisplay.hide();\n }\n\n /**\n * Update time during playback.\n * @private\n */\n playbackTimeUpdate() {\n this.setCurrentTime(this.player.currentTime(),\n this.streamDuration);\n }\n\n /**\n * Received new timestamp (when timeSlice option is enabled).\n * @private\n */\n onTimeStamp(current, all) {\n this.player.currentTimestamp = current;\n this.player.allTimestamps = all;\n\n // get blob (only for MediaStreamRecorder)\n var internal;\n switch (this.getRecordType()) {\n case AUDIO_ONLY:\n internal = this.engine.engine.audioRecorder;\n break;\n\n case ANIMATION:\n internal = this.engine.engine.gifRecorder;\n break;\n\n default:\n internal = this.engine.engine.videoRecorder;\n }\n internal = internal.getInternalRecorder();\n if ((internal instanceof MediaStreamRecorder) === true) {\n this.player.recordedData = internal.getArrayOfBlobs();\n\n // inject file info for newest blob\n this.engine.addFileInfo(\n this.player.recordedData[this.player.recordedData.length - 1]);\n }\n\n // notify others\n this.player.trigger('timestamp');\n }\n\n /**\n * Collects information about the media input and output devices\n * available on the system.\n *\n * Returns an array.\n */\n enumerateDevices() {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n this.player.enumerateErrorCode = 'enumerateDevices() not supported.';\n this.player.trigger('enumerateError');\n return;\n }\n\n // List cameras and microphones.\n navigator.mediaDevices.enumerateDevices(this).then((devices) => {\n this.devices = [];\n devices.forEach((device) => {\n this.devices.push(device);\n });\n\n // notify listeners\n this.player.trigger('enumerateReady');\n }).catch((err) => {\n this.player.enumerateErrorCode = err;\n this.player.trigger('enumerateError');\n });\n }\n\n /**\n * Change the audio output device.\n *\n * @param {string} deviceId - Id of audio output device.\n */\n setAudioOutput(deviceId) {\n let errorMessage;\n\n switch (this.getRecordType()) {\n case AUDIO_ONLY:\n // use wavesurfer\n this.surfer.surfer.setSinkId(deviceId).then((result) => {\n // notify listeners\n this.player.trigger('audioOutputReady');\n return;\n }).catch((err) => {\n errorMessage = err;\n });\n break;\n\n default:\n let element = player.tech_.el_;\n if (deviceId) {\n if (typeof element.sinkId !== 'undefined') {\n element.setSinkId(deviceId).then((result) => {\n // notify listeners\n this.player.trigger('audioOutputReady');\n return;\n }).catch((err) => {\n errorMessage = err;\n });\n } else {\n errorMessage = 'Browser does not support audio output device selection.';\n }\n } else {\n errorMessage = 'Invalid deviceId: ' + deviceId;\n }\n break;\n }\n\n // error if we get here: notify listeners\n this.player.trigger('error', errorMessage);\n }\n\n /**\n * Show or hide the volume menu.\n *\n * @private\n * @param {boolean} display - Hide/show volume control.\n */\n displayVolumeControl(display) {\n if (this.player.controlBar.volumePanel !== undefined) {\n if (display === true) {\n display = 'flex';\n } else {\n display = 'none';\n }\n this.player.controlBar.volumePanel.el().style.display = display;\n }\n }\n}\n\n// version nr is injected during build\nRecord.VERSION = __VERSION__;\n\n// register plugin\nvideojs.Record = Record;\nif (videojs.getPlugin('record') === undefined) {\n videojs.registerPlugin('record', Record);\n}\n\n// export plugin\nmodule.exports = {\n Record\n};\n","module.exports = __WEBPACK_EXTERNAL_MODULE_video_js__;"],"sourceRoot":""}