Loading
function(l,t,d){let i,c;d.d(t,{_:()=>N,a:()=>U,c:()=>j,d:()=>z,f:()=>r,g:()=>p,h:()=>G,i:()=>J,l:()=>T,m:()=>X,n:()=>H,o:()=>C,p:()=>y,r:()=>F,s:()=>R,t:()=>f,u:()=>S,v:()=>W});var e=d(976886),a=d(209688),s=d(171251),Z=d(351618),n=d(581763),b=d(958027),m=d(948455),o=d(196283),u=d(410903),h=class extends e.t{constructor(){super(e.l.SelfieWithQualityMetrics),this.defaultThresholds={frameMinX:0,frameMinY:0,frameMaxX:1,frameMaxY:1,brightnessThreshold:50,blurrinessThreshold:50,tiltRotationAngleThreshold:15,minMagicCropSize:200,headwearThreshold:.86,lensesThreshold:.95,closedEyesThreshold:.9,maskThreshold:.85,minFaceQualityScore:.63,faceOcclusionThreshold:.3,getReadyDelay:2e3,framesAggregationInterval:2e3,minFramesWithFace:3},this.currentFrame=null}async processFrame(l){this.currentFrame=l,await this.processFrameWasm(l)}async initialize(l){!0===l.useOnDeviceWorkflow?(this.pipelineType=e.l.OnDeviceSelfieWorkflow,await this.initializeBase(l,"onDeviceSelfie")):await this.initializeBase(l,"selfie"),this.applyDefaults(l.autocaptureInterval??0)}processPhoto(l){this.ensureInitialized(),e.r.processPhoto(l)}async postFaceResults(l){return this.ensureInitialized(),e.r.postFaceResults(l)}setCallbacks(l){this.ensureInitialized();let t=(t,d)=>{let i=null;if(this.currentFrame?i=n.n.fromImageData(this.currentFrame):t&&(i=new n.n(t)),!i)return;let c=d?this.formatFaceCoordinates(d):this.createDefaultFaceCoordinates(i);try{i.updateBase64Image(),i.updateBlob()}catch{}l.onCapture?.(i,c)};e.r.setFaceDetectionCallbacks(this.getPipelineType(),l.onFarAway??(()=>{}),l.onTooClose??(()=>{}),l.onTooManyFaces??(()=>{}),l.onNoFace??(()=>{}),t,l.onGetReady??(()=>{}),l.onGetReadyFinished??(()=>{}),l.onCenterFace??(()=>{}),l.onDark??(()=>{}),l.onBlur??(()=>{}),l.onFaceAngle??(()=>{}),l.onLenses??(()=>{}),l.onMask??(()=>{}),l.onEyesClosed??(()=>{}),l.onHeadWear??(()=>{}),l.onSwitchToManualCapture??(()=>{}),l.onFaceOccluded??(()=>{}))}setPositionConstraints(l){this.ensureInitialized(),e.r.setFacePositionConstraints(this.getPipelineType(),l.minX,l.minY,l.maxX,l.maxY)}applyDefaults(l=0){this.ensureInitialized(),this.setThresholds({brightnessThreshold:this.defaultThresholds.brightnessThreshold,blurrinessThreshold:this.defaultThresholds.blurrinessThreshold,tiltRotationAngleThreshold:this.defaultThresholds.tiltRotationAngleThreshold,minMagicCropSize:this.defaultThresholds.minMagicCropSize,autocaptureInterval:l,minFaceQualityScore:this.defaultThresholds.minFaceQualityScore,faceOcclusionThreshold:this.defaultThresholds.faceOcclusionThreshold,getReadyDelay:this.defaultThresholds.getReadyDelay,framesAggregationInterval:this.defaultThresholds.framesAggregationInterval,minFramesWithFace:this.defaultThresholds.minFramesWithFace}),this.setPositionConstraints({minX:this.defaultThresholds.frameMinX,minY:this.defaultThresholds.frameMinY,maxX:this.defaultThresholds.frameMaxX,maxY:this.defaultThresholds.frameMaxY}),this.setAttributesThresholds({headwearThreshold:this.defaultThresholds.headwearThreshold,lensesThreshold:this.defaultThresholds.lensesThreshold,closedEyesThreshold:this.defaultThresholds.closedEyesThreshold,maskThreshold:this.defaultThresholds.maskThreshold})}setAutocaptureInterval(l){(this.ensureInitialized(),this.currentThresholds)?this.setThresholds({...this.currentThresholds,autocaptureInterval:l}):this.applyDefaults(l)}setThresholds(l){this.ensureInitialized(),this.currentThresholds={...l},e.r.setFaceDetectionThresholds(this.getPipelineType(),l.brightnessThreshold,l.blurrinessThreshold,l.tiltRotationAngleThreshold,l.minMagicCropSize,l.autocaptureInterval,l.minFaceQualityScore,l.faceOcclusionThreshold,l.getReadyDelay,l.framesAggregationInterval,l.minFramesWithFace)}setAttributesThresholds(l){this.ensureInitialized(),e.r.setFaceAttributesThresholds(this.getPipelineType(),l.headwearThreshold,l.lensesThreshold,l.closedEyesThreshold,l.maskThreshold)}setChecksEnabled(l){this.ensureInitialized(),e.r.setFaceChecksEnabled(this.getPipelineType(),l.lenses,l.mask,l.closedEyes,l.headWear,l.occlusion)}setVideoSelfieMode(l){this.ensureInitialized(),e.r.setFaceDetectionMode(this.getPipelineType(),l)}reset(){super.reset(),this.currentFrame=null}createDefaultFaceCoordinates(l){return{rightEyeX:0,rightEyeY:0,leftEyeX:0,leftEyeY:0,noseTipX:0,noseTipY:0,rightMouthX:0,rightMouthY:0,mouthX:0,mouthY:0,x:0,y:0,width:l.width()??0,height:l.height()??0}}formatFaceCoordinates(l){return{rightEyeX:l.rightEye.x,rightEyeY:l.rightEye.y,leftEyeX:l.leftEye.x,leftEyeY:l.leftEye.y,noseTipX:l.noseTip.x,noseTipY:l.noseTip.y,rightMouthX:l.rightMouthCorner.x,rightMouthY:l.rightMouthCorner.y,mouthX:l.leftMouthCorner.x,mouthY:l.leftMouthCorner.y,x:l.rect.x,y:l.rect.y,width:l.rect.width,height:l.rect.height}}},W=class{constructor(l){this.disposed=!1,this.isProcessing=!1,this.onFrameEvent=()=>{if(this.disposed||this.isProcessing)return;let l=this.capturer.getLatestFrame();l&&(this.onFrame?.(l),this.isProcessing=!0,this.provider.processFrame(l).catch(()=>{}).finally(()=>{this.isProcessing=!1}))},this.capturer=l.capturer,this.provider=l.provider,this.onFrame=l.onFrame,this.capturer.addEventListener("frame",this.onFrameEvent)}dispose(){this.disposed||(this.disposed=!0,this.capturer.removeEventListener("frame",this.onFrameEvent),this.provider.reset())}isDisposed(){return this.disposed}};async function G(l){return(await a.t.post(s.t.recordingCreateSessionV2,{type:l})).data}async function p(l){return(await a.t.post(s.t.recordingStartV2,{videoRecordingId:l.videoRecordingId,frameRate:30,outputMode:"COMPOSED",resolution:l.resolution,type:l.type,hasAudio:l.hasAudio??!1})).data}async function N(l){return(await a.t.post(s.t.recordingStopV2,{videoRecordingId:l})).data}async function M(l,t){try{return(await a.t.post(s.t.deepsightVideoImport,{video:l,type:"selfie"},{headers:{"X-Incode-Hardware-Id":t}})).data.recordingId??""}catch{return""}}let X={FACE_OCCLUDED:"FACE_OCCLUDED",LIVENESS:"LIVENESS_ERROR",BRIGHTNESS:"BRIGHTNESS_ERROR",LENSES:"LENSES_ERROR",MASK:"MASK_ERROR",CLOSED_EYES:"CLOSED_EYES_ERROR",HEAD_COVER:"HEAD_COVER_ERROR",SERVER:"SERVER_ERROR",FACE_NOT_FOUND:"FACE_NOT_FOUND",MULTIPLE_FACES:"MULTIPLE_FACES",TOO_BLURRY:"TOO_BLURRY_ERROR",TOO_DARK:"TOO_DARK_ERROR",USER_IS_NOT_RECOGNIZED:"USER_IS_NOT_RECOGNIZED",SPOOF_ATTEMPT_DETECTED:"SPOOF_ATTEMPT_DETECTED",FACE_TOO_DARK:"FACE_TOO_DARK",LENSES_DETECTED:"LENSES_DETECTED",FACE_MASK_DETECTED:"FACE_MASK_DETECTED",CLOSED_EYES_DETECTED:"CLOSED_EYES_DETECTED",HEAD_COVER_DETECTED:"HEAD_COVER_DETECTED",FACE_CROPPING_FAILED:"FACE_CROPPING_FAILED",FACE_TOO_SMALL:"FACE_TOO_SMALL",FACE_TOO_BLURRY:"FACE_TOO_BLURRY",BAD_PHOTO_QUALITY:"BAD_PHOTO_QUALITY",PROCESSING_ERROR:"PROCESSING_ERROR",BAD_REQUEST:"BAD_REQUEST",NONEXISTENT_CUSTOMER:"NONEXISTENT_CUSTOMER",HINT_NOT_PROVIDED:"HINT_NOT_PROVIDED",SELFIE_IMAGE_LOW_QUALITY:"SELFIE_IMAGE_LOW_QUALITY"};async function y({encryptedBase64Image:l,faceCoordinates:t,signal:d,metadata:i,recordingId:c}){try{let e={base64Image:l,faceCoordinates:t??void 0,encrypted:!0,clientInfo:{deviceClass:(0,u.t)()},metadata:i??void 0},Z={imageType:"selfie"};c&&(Z.recordingId=c);let n=await a.t.post(s.t.selfie,e,{signal:d,query:Z});if(!n.ok)throw Error(`POST ${s.t.selfie} failed: ${n.status} ${n.statusText}`);return n.data}catch(t){let l=Y(t);if(l)throw Error(l);throw Error(X.SERVER)}}let Y=l=>{if(!1===l.ok&&"number"==typeof l.status)return 400!==l.status?X.SERVER:"number"!=typeof l.data?.status?X.BAD_REQUEST:({3004:X.FACE_NOT_FOUND,3005:X.FACE_NOT_FOUND,3006:X.TOO_BLURRY,3007:X.TOO_DARK,4010:X.MULTIPLE_FACES,4019:X.FACE_NOT_FOUND,4077:X.BAD_PHOTO_QUALITY,4078:X.FACE_OCCLUDED})[l.data.status]??X.BAD_REQUEST};async function r(l="selfie",t){return(await a.t.post(s.t.processFace,{},{query:{imageType:l},signal:t})).data}function T(){return(0,o.t)({cameraLabelInspectionStatus:"FAIL"})}let V={video:{facingMode:"user",height:{ideal:480},width:{ideal:640}},audio:!1},L={video:{height:{ideal:1080}},audio:!1};function I(l){return l?{video:{facingMode:"user",height:l.height?{ideal:l.height}:void 0,width:l.width?{ideal:l.width}:void 0},audio:!1}:(0,b.a)()?L:V}function z(l){(0,Z.i)(l)}async function w(l){return l?(0,Z.r)(I(l)):(0,b.n)()?(0,m.n)({}):(0,Z.r)(I())}async function R(l){let{config:t}=l,d=I(t.cameraResolution),i=new h;return await i.initialize({autocaptureInterval:1e3*t.autoCaptureTimeout,useOnDeviceWorkflow:!0===t.onDeviceFaceResultsSubmissionEnabled}),i.setChecksEnabled({lenses:t.validateLenses??!1,mask:t.validateFaceMask??!1,closedEyes:t.validateClosedEyes??!1,headWear:t.validateHeadCover??!1,occlusion:!1}),await l.deepsightService.performPrcCheck({constraints:{video:d.video}}),{stream:t.assistedOnboarding?(await (0,m.t)()).stream:await w(t.cameraResolution),provider:i}}async function C({canvas:l,dependencies:t}){let d=l.getBase64Image();if(!d)throw Error("Canvas image is empty or null");return(await t.getWasmUtil()).encryptImage(d)}function S(l){let t,d,{provider:i}=l,c=i=>{d?.isDisposed()===!0||t!==i&&(t=i,l.onUpdate(i))},e=()=>{d?.dispose()},a=()=>{e()};return(async()=>{try{i.setCallbacks({onFarAway:()=>c("tooFar"),onTooClose:()=>c("tooClose"),onTooManyFaces:()=>c("tooManyFaces"),onNoFace:()=>c("idle"),onCenterFace:()=>c("centerFace"),onGetReady:()=>c("getReady"),onGetReadyFinished:()=>c("getReadyFinished"),onDark:()=>{l.config.validateBrightness&&c("dark")},onBlur:()=>c("blur"),onFaceAngle:()=>c("faceAngle"),onLenses:()=>{l.config.validateLenses&&c("lenses")},onMask:()=>{l.config.validateFaceMask&&c("faceMask")},onEyesClosed:()=>{l.config.validateClosedEyes&&c("eyesClosed")},onHeadWear:()=>{l.config.validateHeadCover&&c("headWear")},onFaceOccluded:()=>c("faceOcclusion"),onSwitchToManualCapture:()=>{c("manualCapture"),e()},onCapture:(t,d)=>{c("success"),l.onSuccess(t,d),a()}}),c("detecting"),d=new W({capturer:l.capturer,provider:i,onFrame:l.onFrame})}catch{c("error"),a()}})(),{cleanup:a,reset:()=>{i.reset()}}}async function x(){let{OpenViduRecordingProvider:l}=await Promise.all([d.e("7079"),d.e("30117")]).then(d.bind(d,807428));return new l}async function g(l){if("VIDEOLIVENESS"===l.config.deepsightLiveness||!0!==l.config.enableFaceRecording)return;if(l.existing)return l.existing;let t=l.config.recording?.capability??await x(),d=l.clonedStream,i=d.getAudioTracks().length>0,c=function(l){let t=l.getVideoTracks()[0];if(!t)return;let d=t.getSettings(),i=d.width,c=d.height;if("number"==typeof i&&"number"==typeof c)return`${i}x${c}`}(d),e=await G("selfie"),a=await t.connect({sessionToken:e.token,stream:d,events:{}});return await p({videoRecordingId:e.videoRecordingId,type:"selfie",resolution:c,hasAudio:i}),{token:e.token,sessionId:e.sessionId,videoRecordingId:e.videoRecordingId,connection:a,resolution:c,hasAudio:i}}async function D(l){try{await N(l.videoRecordingId)}finally{await l.connection.disconnect()}}async function j(l){let{loadDeepsightSession:t}=await d.e("27811").then(d.bind(d,543278));return t({ds:l.ds,storage:l.storage})}var U=class{constructor(l,t){this.hasFrame=!1,this.disposed=!1,this.eventTarget=new EventTarget,this.video=document.createElement("video"),this.video.srcObject=l,this.video.autoplay=!0,this.video.playsInline=!0,this.video.muted=!0;const d=l.getVideoTracks()[0]?.getSettings(),i=t?.width??d?.width??1280,c=t?.height??d?.height??720;this.canvas=document.createElement("canvas"),this.canvas.width=i,this.canvas.height=c,this.ctx=this.canvas.getContext("2d",{willReadFrequently:!0});const e=t?.fps??10,a=e>0?Math.max(16,Math.floor(1e3/e)):0;this.video.addEventListener("loadedmetadata",()=>{this.video.videoWidth>0&&this.video.videoHeight>0&&(this.canvas.width=this.video.videoWidth,this.canvas.height=this.video.videoHeight)});try{this.video.play()}catch{}this.rafLoop(a)}addEventListener(l,t,d){this.eventTarget.addEventListener(l,t,d)}removeEventListener(l,t,d){this.eventTarget.removeEventListener(l,t,d)}getLatestCanvas(){return(this.hasFrame||this.tick(),this.hasFrame)?new n.n(this.canvas):null}getLatestFrame(){if(!this.ctx||(this.hasFrame||this.tick(),!this.hasFrame))return null;try{return this.ctx.getImageData(0,0,this.canvas.width,this.canvas.height)}catch{return null}}dispose(){this.disposed||(this.disposed=!0,void 0!==this.rafId&&(window.cancelAnimationFrame(this.rafId),this.rafId=void 0),this.video.srcObject=null,this.canvas.width=0,this.canvas.height=0,this.hasFrame=!1)}rafLoop(l){let t=d=>{if(!this.disposed){if(l<=0||void 0===this.lastTickTimeMs||d-this.lastTickTimeMs>=l){this.lastTickTimeMs=d;let l=this.lastFrameTimeSeconds;this.tick();let t=this.video.currentTime;void 0===l?this.hasFrame&&(this.lastFrameTimeSeconds=t,this.eventTarget.dispatchEvent(new Event("frame"))):this.hasFrame&&t!==l&&(this.lastFrameTimeSeconds=t,this.eventTarget.dispatchEvent(new Event("frame")))}this.rafId=window.requestAnimationFrame(t)}};this.rafId=window.requestAnimationFrame(t)}tick(){if(!this.ctx||this.video.readyState<HTMLMediaElement.HAVE_CURRENT_DATA)return;let l=this.video.videoWidth,t=this.video.videoHeight;if(0!==l&&0!==t){(this.canvas.width!==l||this.canvas.height!==t)&&(this.canvas.width=l,this.canvas.height=t);try{this.ctx.drawImage(this.video,0,0),this.hasFrame=!0}catch{this.hasFrame=!1}}}};async function F(){try{await a.t.put(s.t.updateSession,{manualSelfieCheckNeeded:!0})}catch{}}async function J(){try{await a.t.put(s.t.updateSession,{manualIdCheckNeeded:!0})}catch{}}async function O(l){let t=document.createElement("video");t.preload="metadata",t.src=URL.createObjectURL(l);try{Number.isFinite(t.duration)||(t.currentTime=Number.MAX_SAFE_INTEGER,await new Promise(l=>{let d=()=>{Number.isFinite(t.duration)&&(t.removeEventListener("durationchange",d),t.removeEventListener("timeupdate",i),l(t.duration))},i=()=>{Number.isFinite(t.duration)&&(t.removeEventListener("timeupdate",i),t.removeEventListener("durationchange",d),l(t.duration))};t.addEventListener("durationchange",d),t.addEventListener("timeupdate",i)}));let l=t.duration;return Number.isFinite(l)?l:null}finally{URL.revokeObjectURL(t.src),t.src=""}}async function k(l,t){let d=document.createElement("video");d.preload="metadata",d.playsInline=!0,d.muted=!0;let i=URL.createObjectURL(l);d.src=i;let c=await O(l);if(!c||c<t)return URL.revokeObjectURL(i),l;let e=Math.max(0,Math.floor(c)-t);await new Promise(l=>{d.readyState>=2?l():d.addEventListener("loadedmetadata",()=>l(),{once:!0})});let a=document.createElement("canvas");a.width=230,a.height=320;let s=(0,b.t)()?15:24,Z=a.captureStream(s),n=a.getContext("2d");d.currentTime=e,await new Promise(l=>{d.addEventListener("seeked",()=>l(),{once:!0})}),n.drawImage(d,0,0,a.width,a.height);let m=l.type||(MediaRecorder.isTypeSupported("video/webm")?"video/webm":"video/mp4"),o=new MediaRecorder(Z.clone(),{mimeType:m,videoBitsPerSecond:5e5,bitsPerSecond:5e5}),u=[];o.ondataavailable=l=>{l.data.size>0&&u.push(l.data)};let h=new Promise(l=>{o.onstop=()=>{let t=new Blob(u,{type:m});URL.revokeObjectURL(i),o.stream?.getTracks().forEach(l=>l.stop()),Z.getTracks().forEach(l=>l.stop()),d.src="",l(t)}});d.addEventListener("play",()=>{!function l(){if(d.currentTime>=c){o.stop(),d.pause();return}n.drawImage(d,0,0,a.width,a.height),requestAnimationFrame(l)}(),setTimeout(()=>{o.start(100)},500)}),d.play().catch(()=>{URL.revokeObjectURL(i)});let W=await h;return console.timeEnd("trimLastNSecondsUsingPlayback"),W}async function E(l,t){return await k(l,t)}var v=class{constructor(){this.mediaRecorder=null,this._isRecording=!1,this._hasError=!1,this._error=null,this.mimeType="",this.stream=null,this.pauseRecordingBound=this.pauseRecording.bind(this)}get isRecording(){return this._isRecording}get hasError(){return this._hasError}get error(){return this._error}startRecording(l){this.reset(),this.registerEventListeners(),this.stream=l;try{let t,d=(t=function(){for(let l of(0,b.r)()?["video/mp4","video/webm","video/webm;codecs=vp9","video/webm;codecs=vp8"]:["video/webm","video/webm;codecs=vp9","video/webm;codecs=vp8","video/mp4"])if(MediaRecorder.isTypeSupported(l))return l;return""}(),(0,b.r)()?{mimeType:t,videoBitsPerSecond:1e6,bitsPerSecond:1e6}:{mimeType:t,videoBitsPerSecond:5e5,bitsPerSecond:5e5});this.mimeType=d.mimeType;let i=new MediaRecorder(l.clone(),d);i.onerror=l=>{this._error=`Recording error: ${l}`,this._isRecording=!1,this._hasError=!0},i.start(),this.mediaRecorder=i,this._isRecording=!0,this._error=null,this._hasError=!1}catch(l){this._error=`Failed to start recording: ${l}`,this._hasError=!0}}async stopRecording(l,t,d){let i=this.mediaRecorder;return new Promise((c,e)=>{if(this.removeEventListeners(),i&&this._isRecording){let a=[];i.ondataavailable=l=>{l.data.size>0&&a.push(l.data)},i.onstop=async()=>{try{let i=await E(new Blob(a,{type:this.mimeType}),l),e=t(await new Promise((l,t)=>{let d=new FileReader;d.onloadend=()=>{l(d.result.split(",")[1])},d.onerror=()=>t(d.error??Error("FileReader error")),d.readAsDataURL(i)}));d(await i.arrayBuffer()),this._isRecording=!1,c({trimmedBlob:i,encryptedVideo:e})}catch(l){this._isRecording=!1,this._error=`Recording stop failed: ${l}`,this._hasError=!0,e(l)}},i.stop(),this._isRecording=!1}else c({trimmedBlob:new Blob([],{type:this.mimeType}),encryptedVideo:""});i?.stream?.getTracks().forEach(l=>l.stop())})}reset(){this._isRecording=!1,this._error=null,this._hasError=!1}pauseRecording(){if(this._isRecording&&this.mediaRecorder?.state==="recording")try{this.mediaRecorder.pause()}catch{}}registerEventListeners(){document.addEventListener("visibilitychange",this.pauseRecordingBound)}removeEventListeners(){document.removeEventListener("visibilitychange",this.pauseRecordingBound)}};function K(){return i||(i=Promise.all([d.e("7079"),d.e("30117")]).then(d.bind(d,807428))),i}function H(){K(),c||(c=(async()=>(await Promise.all([d.e("7079"),d.e("90050")]).then(d.bind(d,669785))).loadOpenVidu())())}var Q=class{constructor(l,t){this.recorder=new v,this.sessionToken=t,this.wasmUtil=l}async start(l){this.recorder.startRecording(l)}async stop(){if(!this.recorder.isRecording)return{recordingId:null};let l=await this.recorder.stopRecording(10,l=>this.wasmUtil.encryptImage(l),l=>this.wasmUtil.ckvcks(l));return this.sessionToken?{recordingId:await M(l.encryptedVideo,this.sessionToken)}:{recordingId:null}}async stopAndGetVideo(){if(!this.recorder.isRecording)return{videoBase64:void 0};try{return{videoBase64:(await this.recorder.stopRecording(10,l=>l,()=>{})).encryptedVideo||void 0}}catch{return{videoBase64:void 0}}}cleanup(){this.recorder.reset()}},P=class{constructor(l){this.config=l}async start(l){if(!this.provider){let{OpenViduRecordingProvider:l}=await K();this.provider=new l}this.session=await g({config:{...this.config,recording:{capability:this.provider}},clonedStream:l.clone(),existing:this.session})}async stop(){return this.session&&(D(this.session),this.session=void 0),{recordingId:null}}async stopAndGetVideo(){return this.session&&(D(this.session),this.session=void 0),{videoBase64:void 0}}cleanup(){this.session&&D(this.session)}};function f(l){if(!0!==l.config.onDeviceFaceResultsSubmissionEnabled){if("VIDEOLIVENESS"===l.config.deepsightLiveness)return new Q(l.wasmUtil,l.sessionToken);if(!0===l.config.enableFaceRecording)return new P(l.config)}}}