(function (){
var cfg=typeof podPhasio==='undefined' ? null:podPhasio;
if(!cfg) return;
if(cfg.restUrl&&typeof cfg.restUrl==='string'){
cfg.restUrl=cfg.restUrl.replace(/:(\d+):\1(?=\/|\?|$)/g, ':$1');
if(cfg.restUrl.slice(-1)!=='/'){
cfg.restUrl +='/';
}}
var allowedExt=/\.(stl|stp|step)$/i;
function qsa(sel){
return Array.prototype.slice.call(document.querySelectorAll(sel));
}
function el(tag, attrs, text){
var e=document.createElement(tag);
if(attrs) Object.keys(attrs).forEach(function (k){ e.setAttribute(k, attrs[k]); });
if(text!=null) e.textContent=text;
return e;
}
function validateFile(file){
if(!file||!allowedExt.test(file.name)){
window.alert(cfg.i18n.fileInvalid);
return false;
}
if(file.size > cfg.maxBytes){
window.alert(cfg.i18n.fileInvalid);
return false;
}
return true;
}
function parseJsonSafe(res){
return res.json().catch(function (){ return {};});
}
async function postJson(path, body){
var res=await fetch(cfg.restUrl + path, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': cfg.nonce
},
body: JSON.stringify(body)
});
var data=await parseJsonSafe(res);
if(!res.ok){
var msg=(data&&data.message)||cfg.i18n.errorGeneric;
throw new Error(msg);
}
return data;
}
async function postUpload(file, email, uploadToken, signal){
var fd=new FormData();
fd.append('file', file);
fd.append('email', email);
if(uploadToken) fd.append('uploadToken', uploadToken);
var fetchOpts={
method: 'POST',
headers: { 'X-WP-Nonce': cfg.nonce },
body: fd
};
if(signal) fetchOpts.signal=signal;
var res=await fetch(cfg.restUrl + 'phasio/upload', fetchOpts);
var data=await parseJsonSafe(res);
if(!res.ok) throw new Error((data&&data.message)||cfg.i18n.errorGeneric);
return data;
}
async function postQuickUpload(file, signal){
var fd=new FormData();
fd.append('file', file);
var fetchOpts={
method: 'POST',
headers: { 'X-WP-Nonce': cfg.nonce },
body: fd
};
if(signal) fetchOpts.signal=signal;
var res=await fetch(cfg.restUrl + 'phasio/quick-upload', fetchOpts);
return parseJsonSafe(res);
}
var threeModulesPromise=null;
function loadThreeModules(){
if(!threeModulesPromise){
threeModulesPromise=Promise.all([
import('three'),
import('three/addons/loaders/STLLoader.js'),
import('three/addons/controls/OrbitControls.js')
]).then(function (mods){
return {
THREE: mods[0],
STLLoader: mods[1].STLLoader,
OrbitControls: mods[2].OrbitControls
};});
}
return threeModulesPromise;
}
var OCCT_SCRIPT_URL =
'https://cdn.jsdelivr.net/npm/occt-import-js@0.0.22/dist/occt-import-js.js';
var occtModulePromise=null;
function loadOcctModule(){
if(occtModulePromise) return occtModulePromise;
occtModulePromise=new Promise(function (resolve, reject){
function startInit(){
var fn=typeof window.occtimportjs==='function' ? window.occtimportjs:null;
if(!fn){
reject(new Error('occt'));
return;
}
var p=fn();
if(p&&typeof p.then==='function'){
p.then(resolve).catch(reject);
}else{
reject(new Error('occt'));
}}
if(typeof window.occtimportjs==='function'){
startInit();
return;
}
var pending=document.querySelector('script[data-pod-occt-import]');
if(pending){
pending.addEventListener('load', startInit);
pending.addEventListener('error', function (){
try {
pending.remove();
} catch (e){}
reject(new Error('occt-load'));
});
return;
}
var s=document.createElement('script');
s.src=OCCT_SCRIPT_URL;
s.async=true;
s.setAttribute('data-pod-occt-import', '1');
s.onload=startInit;
s.onerror=function (){
try {
s.remove();
} catch (e){}
reject(new Error('occt-load'));
};
document.head.appendChild(s);
}).catch(function (err){
occtModulePromise=null;
var dead=document.querySelector('script[data-pod-occt-import]');
if(dead&&typeof window.occtimportjs!=='function'){
try {
dead.remove();
} catch (e2){}}
return Promise.reject(err);
});
return occtModulePromise;
}
function mergeOcctMeshesToBufferGeometry(result, THREE){
if(!result||!result.success||!result.meshes||!result.meshes.length) return null;
var positions=[];
var indices=[];
var vertexOffset=0;
var mi;
for (mi=0; mi < result.meshes.length; mi++){
var mesh=result.meshes[mi];
if(!mesh.attributes||!mesh.attributes.position||!mesh.attributes.position.array) continue;
if(!mesh.index||!mesh.index.array) continue;
var posArr=mesh.attributes.position.array;
var idxArr=mesh.index.array;
var i;
for (i=0; i < posArr.length; i++) positions.push(posArr[i]);
for (i=0; i < idxArr.length; i++) indices.push(vertexOffset + idxArr[i]);
vertexOffset +=posArr.length / 3;
}
if(positions.length < 9||indices.length < 3) return null;
var geo=new THREE.BufferGeometry();
geo.setAttribute('position', new THREE.Float32BufferAttribute(new Float32Array(positions), 3));
geo.setIndex(indices);
geo.computeVertexNormals();
return geo;
}
function delay(ms){
return new Promise(function (resolve){
setTimeout(resolve, ms);
});
}
function runPhase(msMin, work){
var w=typeof work==='function' ? work():work;
var p=w&&typeof w.then==='function' ? w:Promise.resolve(w);
return Promise.all([delay(msMin), p]).then(function (){});
}
function isStlName(name){
return /\.stl$/i.test(name||'');
}
function isStepName(name){
return /\.(stp|step)$/i.test(name||'');
}
function appendOtpIntroParagraph(parent, email){
var tpl=cfg.i18n.otpIntro||'Vul de verificatiecode in die we naar %s verstuurd hebben';
var safeEmail=String(email||'');
var parts=String(tpl).split('%s');
var intro=el('p', { class: 'pod-phasio-otp-intro' });
if(parts.length >=2){
intro.appendChild(document.createTextNode(parts[0]));
intro.appendChild(el('strong', { class: 'pod-phasio-otp-intro__email' }, safeEmail));
intro.appendChild(document.createTextNode(parts.slice(1).join('%s')));
}else{
intro.appendChild(document.createTextNode(tpl + safeEmail));
}
parent.appendChild(intro);
}
function mountSegmentedOtp(parent){
var cells=[];
var wrap=el('div', {
class: 'pod-phasio-otp-field',
role: 'group',
'aria-label': cfg.i18n.otpLabel||'OTP'
});
var i;
for (i=0; i < 6; i++){
var cell=el('input', {
type: 'text',
class: 'pod-phasio-otp-cell',
maxlength: '1',
inputmode: 'numeric',
pattern: '[0-9]*',
autocomplete: i===0 ? 'one-time-code':'off',
'aria-label': (cfg.i18n.otpLabel||'OTP') + ' — cijfer ' + (i + 1)
});
cells.push(cell);
wrap.appendChild(cell);
}
parent.appendChild(wrap);
function getCode(){
return cells
.map(function (c){
return c.value.replace(/\D/g, '').slice(0, 1);
})
.join('');
}
for (i=0; i < cells.length; i++){
(function (cell, idx){
cell.addEventListener('keydown', function (ev){
if(ev.key==='Backspace'){
if(!cell.value&&idx > 0){
cells[idx - 1].focus();
cells[idx - 1].value='';
ev.preventDefault();
}
return;
}
if(ev.key==='ArrowLeft'&&idx > 0){
cells[idx - 1].focus();
ev.preventDefault();
}
if(ev.key==='ArrowRight'&&idx < cells.length - 1){
cells[idx + 1].focus();
ev.preventDefault();
}});
cell.addEventListener('input', function (){
var v=cell.value.replace(/\D/g, '').slice(0, 1);
cell.value=v;
if(v&&idx < cells.length - 1){
cells[idx + 1].focus();
}});
cell.addEventListener('paste', function (ev){
ev.preventDefault();
var text=(ev.clipboardData&&ev.clipboardData.getData('text'))||'';
var digits=text.replace(/\D/g, '').slice(0, cells.length);
var j;
for (j=0; j < cells.length; j++){
cells[j].value=digits[j]||'';
}
var focusIdx=Math.min(Math.max(0, digits.length - 1), cells.length - 1);
cells[focusIdx].focus();
});
})(cells[i], i);
}
return {
getCode: getCode,
focusFirst: function (){
if(cells[0]) cells[0].focus();
}};}
function prefersReducedMotion(){
return typeof window.matchMedia==='function'&&window.matchMedia('(prefers-reduced-motion: reduce)').matches;
}
function disposePodPreview(ctx){
if(!ctx) return;
if(ctx.raf){
cancelAnimationFrame(ctx.raf);
ctx.raf=0;
}
if(ctx.resizeObs&&typeof ctx.resizeObs.disconnect==='function'){
ctx.resizeObs.disconnect();
ctx.resizeObs=null;
}
if(ctx.controls&&typeof ctx.controls.dispose==='function'){
ctx.controls.dispose();
ctx.controls=null;
}
if(ctx.mesh){
if(ctx.mesh.geometry) ctx.mesh.geometry.dispose();
if(ctx.mesh.material) ctx.mesh.material.dispose();
ctx.mesh=null;
}
if(ctx.renderer){
ctx.renderer.dispose();
if(ctx.mount&&ctx.renderer.domElement.parentNode===ctx.mount){
ctx.mount.removeChild(ctx.renderer.domElement);
}
ctx.renderer=null;
}
ctx.scene=null;
ctx.camera=null;
ctx.mount=null;
}
function openDialog(file){
var dlg=el('dialog', { class: 'pod-phasio-dialog pod-phasio-dialog--wide' });
var inner=el('div', { class: 'pod-phasio-dialog__inner' });
var mode='progress';
var step=1;
var destroyed=false;
var uploadAbort=null;
var state={
file: file,
email: '',
uploadToken: '',
uploadMessage: '',
arrayBuffer: null,
stlGeometry: null,
stepPreviewFailed: false,
previewCtx: null,
lastError: '',
portalRedirectUrl: '',
portalOpened: false
};
function showFlowError(message){
state.lastError=message&&String(message).trim() ? String(message).trim():cfg.i18n.errorGeneric;
mode='flow_error';
render();
}
var step1Hint=cfg.integrationEnabled&&cfg.i18n.otpSent ? cfg.i18n.otpSent:cfg.i18n.stubHint;
function teardownAll(){
destroyed=true;
disposePodPreview(state.previewCtx);
state.previewCtx=null;
state.arrayBuffer=null;
state.stlGeometry=null;
state.stepPreviewFailed=false;
state.file=null;
if(uploadAbort){
try {
uploadAbort.abort();
} catch (e){}
uploadAbort=null;
}}
function startStlPreview(mountEl){
if(!state.stlGeometry||!mountEl||destroyed) return;
disposePodPreview(state.previewCtx);
state.previewCtx=null;
loadThreeModules()
.then(function (M){
if(destroyed) return;
var THREE=M.THREE;
var geo=state.stlGeometry.clone();
geo.computeVertexNormals();
geo.computeBoundingBox();
var box=geo.boundingBox;
var center=new THREE.Vector3();
box.getCenter(center);
geo.translate(-center.x, -center.y, -center.z);
geo.computeBoundingBox();
box=geo.boundingBox;
var size=new THREE.Vector3();
box.getSize(size);
var maxDim=Math.max(size.x, size.y, size.z, 1e-6);
var fit=2.2 * 1.15;
geo.scale(fit / maxDim, fit / maxDim, fit / maxDim);
var w=mountEl.clientWidth||400;
var h=mountEl.clientHeight||280;
var renderer=new THREE.WebGLRenderer({ antialias: true, alpha: false });
renderer.setPixelRatio(Math.min(window.devicePixelRatio||1, 2));
renderer.setSize(w, h);
renderer.setClearColor(0xffffff, 1);
mountEl.appendChild(renderer.domElement);
var scene=new THREE.Scene();
var camera=new THREE.PerspectiveCamera(45, w / h, 0.1, 100);
camera.position.set(1.35, 1.05, 1.85);
var amb=new THREE.AmbientLight(0xffffff, 0.72);
scene.add(amb);
var dir=new THREE.DirectionalLight(0xffffff, 1);
dir.position.set(2, 4, 3);
scene.add(dir);
var mat=new THREE.MeshStandardMaterial({
color: 0x6b7fa3,
metalness: 0.28,
roughness: 0.42,
flatShading: false
});
var mesh=new THREE.Mesh(geo, mat);
scene.add(mesh);
var controls=new M.OrbitControls(camera, renderer.domElement);
controls.enableDamping=true;
controls.dampingFactor=0.06;
controls.autoRotate = !prefersReducedMotion();
controls.autoRotateSpeed=prefersReducedMotion() ? 0:1.45;
controls.target.set(0, 0, 0);
controls.update();
var ctx={
renderer: renderer,
scene: scene,
camera: camera,
controls: controls,
mesh: mesh,
mount: mountEl,
raf: 0,
resizeObs: null
};
function onResize(){
if(destroyed||!ctx.mount||!ctx.renderer) return;
var rw=ctx.mount.clientWidth||400;
var rh=ctx.mount.clientHeight||280;
ctx.camera.aspect=rw / rh;
ctx.camera.updateProjectionMatrix();
ctx.renderer.setSize(rw, rh);
}
if(typeof ResizeObserver!=='undefined'){
ctx.resizeObs=new ResizeObserver(onResize);
ctx.resizeObs.observe(mountEl);
}
function loop(){
if(destroyed||!ctx.renderer) return;
ctx.raf=requestAnimationFrame(loop);
ctx.controls.update();
ctx.renderer.render(ctx.scene, ctx.camera);
}
loop();
state.previewCtx=ctx;
})
.catch(function (){
mountEl.textContent=cfg.i18n.errorGeneric;
});
}
function render(){
if(mode!=='preview'&&state.previewCtx){
disposePodPreview(state.previewCtx);
state.previewCtx=null;
}
if(mode!=='embed'){
dlg.classList.remove('pod-phasio-dialog--embed');
}
inner.textContent='';
if(mode==='flow_error'){
inner.appendChild(el('h2', {}, cfg.i18n.flowErrorTitle||cfg.i18n.modalTitle));
inner.appendChild(el('p', { class: 'pod-phasio-dialog__error-msg' }, state.lastError||cfg.i18n.errorGeneric));
var actErr=el('div', { class: 'pod-phasio-dialog__actions' });
var portalErr=el('button', { type: 'button', class: 'pod-phasio-dialog__primary' }, cfg.i18n.openPortal);
var closeErr=el('button', { type: 'button', class: 'pod-phasio-dialog__secondary' }, cfg.i18n.cancel);
portalErr.addEventListener('click', function (){
window.open(cfg.portalUrl, '_blank', 'noopener,noreferrer');
dlg.close();
});
closeErr.addEventListener('click', function (){
dlg.close();
});
actErr.appendChild(portalErr);
actErr.appendChild(closeErr);
inner.appendChild(actErr);
return;
}
inner.appendChild(el('h2', {}, cfg.i18n.modalTitle));
if(mode==='progress'){
var metaP=el('p', { class: 'pod-phasio-dialog__file-meta' }, file.name + ' • ' + Math.round(file.size / 1024) + ' KB');
inner.appendChild(metaP);
var progWrap=el('div', { class: 'pod-phasio-preview__canvas-wrap pod-phasio-preview__canvas-wrap--progress', tabindex: '-1' });
var progInner=el('div', { class: 'pod-phasio-preview__progress-inner' });
progInner.appendChild(el('div', { class: 'pod-phasio-progress__spinner', 'aria-hidden': 'true' }, ''));
var labelP=el('p', { class: 'pod-phasio-progress__label' }, cfg.i18n.progressUploading);
progInner.appendChild(labelP);
progWrap.appendChild(progInner);
inner.appendChild(progWrap);
var cancelP=el('button', { type: 'button', class: 'pod-phasio-dialog__secondary' }, cfg.i18n.cancel);
cancelP.addEventListener('click', function (){ dlg.close(); });
var actProg=el('div', { class: 'pod-phasio-dialog__actions' });
actProg.appendChild(cancelP);
inner.appendChild(actProg);
return labelP;
}
if(mode==='preview'){
inner.appendChild(el('p', { class: 'pod-phasio-dialog__file-meta' }, file.name + ' • ' + Math.round(file.size / 1024) + ' KB'));
var wrap=el('div', { class: 'pod-phasio-preview__canvas-wrap', tabindex: '-1' });
inner.appendChild(wrap);
if(state.stlGeometry){
startStlPreview(wrap);
}else{
var ph=el('div', { class: 'pod-phasio-preview__placeholder' });
ph.appendChild(el('p', { class: 'pod-phasio-preview__placeholder-title' }, state.stepPreviewFailed ? cfg.i18n.previewUnavailable:'3D preview')
);
ph.appendChild(el(
'p',
{ class: 'pod-phasio-preview__placeholder-text' },
state.stepPreviewFailed ? cfg.i18n.previewStepError:cfg.i18n.previewStepNote
)
);
wrap.appendChild(ph);
}
if(cfg.skipAuth){
mode='embed';
render();
return;
}
inner.appendChild(el('p', { class: 'pod-phasio-preview__price-hint' }, cfg.i18n.previewPriceLogin));
var authBlock=el('div', { class: 'pod-phasio-preview__auth' });
authBlock.appendChild(el('p', { class: 'pod-phasio-login-hint' }, cfg.i18n.loginToContinue));
authBlock.appendChild(el('label', { for: 'pod-phasio-email' }, cfg.i18n.emailLabel));
var emPv=el('input', {
type: 'email',
id: 'pod-phasio-email',
autocomplete: 'email',
placeholder: cfg.i18n.emailPlaceholder,
required: 'required'
});
if(state.email) emPv.value=state.email;
authBlock.appendChild(emPv);
authBlock.appendChild(el('p', { class: 'pod-phasio-dialog__hint' }, step1Hint));
var actPv=el('div', { class: 'pod-phasio-dialog__actions' });
var cancelV=el('button', { type: 'button', class: 'pod-phasio-dialog__secondary' }, cfg.i18n.cancel);
var cont=el('button', { type: 'button', class: 'pod-phasio-dialog__primary' }, cfg.i18n.continue);
cancelV.addEventListener('click', function (){ dlg.close(); });
cont.addEventListener('click', function (){
state.email=emPv.value.trim();
if(!state.email) return;
postJson('phasio/request-otp', {
email: state.email,
filename: file.name,
filesize: file.size
}).then(function (){
step=2;
mode='auth_otp';
render();
}).catch(function (e){
showFlowError(e&&e.message ? e.message:cfg.i18n.errorGeneric);
});
});
actPv.appendChild(cancelV);
actPv.appendChild(cont);
authBlock.appendChild(actPv);
inner.appendChild(authBlock);
return;
}
if(mode==='auth_otp'){
appendOtpIntroParagraph(inner, state.email);
var otpWidget=mountSegmentedOtp(inner);
var act2=el('div', { class: 'pod-phasio-dialog__actions' });
var back=el('button', { type: 'button', class: 'pod-phasio-dialog__secondary' }, cfg.i18n.back);
var next2=el('button', { type: 'button', class: 'pod-phasio-dialog__primary' }, cfg.i18n.continue);
back.addEventListener('click', function (){
step=1;
mode='preview';
render();
});
next2.addEventListener('click', function (){
var code=otpWidget.getCode();
if(code.length < 4) return;
uploadAbort=typeof AbortController!=='undefined' ? new AbortController():null;
var sig=uploadAbort ? uploadAbort.signal:undefined;
postJson('phasio/verify-otp', { email: state.email, code: code })
.then(function (data){
if(data&&data.skipServerUpload){
state.uploadToken='';
state.uploadMessage =
(data.message&&String(data.message)) ||
(cfg.i18n&&cfg.i18n.portalAfterVerify) ||
'';
mode='complete';
step=3;
render();
return null;
}
var t=data&&(data.uploadToken||data.upload_token);
state.uploadToken=t ? String(t):'';
return postUpload(file, state.email, state.uploadToken, sig);
})
.then(function (upData){
if(upData==null) return;
state.uploadMessage=upData&&upData.message ? upData.message:'';
mode='complete';
step=3;
render();
})
.catch(function (e){
if(e&&e.name==='AbortError') return;
showFlowError(e&&e.message ? e.message:cfg.i18n.errorGeneric);
})
.finally(function (){
uploadAbort=null;
});
});
act2.appendChild(back);
act2.appendChild(next2);
inner.appendChild(act2);
if(typeof window.requestAnimationFrame==='function'){
window.requestAnimationFrame(function (){
otpWidget.focusFirst();
});
}else{
otpWidget.focusFirst();
}
return;
}
if(mode==='embed'){
dlg.classList.add('pod-phasio-dialog--embed');
var embedHeader=el('div', { class: 'pod-phasio-embed__header' });
var embedTitle=el('span', { class: 'pod-phasio-embed__title' }, cfg.i18n.embedTitle||'Configure your part');
var embedClose=el('button', {
type: 'button',
class: 'pod-phasio-embed__close',
'aria-label': cfg.i18n.close||'Close'
}, '\u00d7');
embedClose.addEventListener('click', function (){ dlg.close(); });
embedHeader.appendChild(embedTitle);
embedHeader.appendChild(embedClose);
inner.appendChild(embedHeader);
var iframeWrap=el('div', { class: 'pod-phasio-embed__iframe-wrap pod-phasio-embed-scroll-shell' });
var loadingMsg=el('div', { class: 'pod-phasio-embed__loading' });
loadingMsg.appendChild(el('div', { class: 'pod-phasio-progress__spinner', 'aria-hidden': 'true' }));
loadingMsg.appendChild(el('p', {}, cfg.i18n.embedLoading||'Loading portal…'));
iframeWrap.appendChild(loadingMsg);
var targetUrl=cfg.embedUrl
? cfg.embedUrl.replace(/\/$/, '')
: (cfg.storefrontUrl||cfg.portalUrl).replace(/\/$/, '') + '/configure';
var iframe=el('iframe', {
src: targetUrl,
class: 'pod-phasio-embed__iframe',
allow: 'fullscreen; storage-access',
frameborder: '0',
title: cfg.i18n.embedTitle||'Phasio Storefront'
});
var scrollRibbonText =
(cfg.i18n.embedScrollRibbon&&String(cfg.i18n.embedScrollRibbon)) ||
'Scroll in het portaal \u2193 voor alle opties';
var dismissAria =
(cfg.i18n.embedScrollRibbonDismiss&&String(cfg.i18n.embedScrollRibbonDismiss)) ||
'Dismiss';
iframeWrap.appendChild(iframe);
var scrollRibbon=appendPhasioScrollRibbon(iframeWrap, scrollRibbonText, dismissAria);
iframe.addEventListener('load', function (){
loadingMsg.style.display='none';
iframe.classList.add('pod-phasio-embed__iframe--loaded');
if(!iframeWrap.classList.contains('pod-phasio-embed-scroll-shell--ribbon-dismissed')){
scrollRibbon.removeAttribute('hidden');
}});
inner.appendChild(iframeWrap);
var embedFoot=el('div', { class: 'pod-phasio-embed__footer' });
var openTab=el('a', {
href: targetUrl,
target: '_blank',
rel: 'noopener noreferrer',
class: 'pod-phasio-dialog__portal-link'
}, cfg.i18n.openPortal);
embedFoot.appendChild(openTab);
inner.appendChild(embedFoot);
return;
}
if(mode==='complete'){
var completedUrl=state.portalRedirectUrl||cfg.portalUrl;
inner.appendChild(el('p', {}, state.uploadMessage||cfg.i18n.uploadSuccess||cfg.i18n.stubHint)
);
if(cfg.skipAuth&&!state.portalOpened){
var fallback=el('p', { class: 'pod-phasio-dialog__hint' });
var fallbackLink=el('a', {
href: completedUrl,
target: '_blank',
rel: 'noopener noreferrer',
class: 'pod-phasio-dialog__portal-link'
}, cfg.i18n.popupBlocked||'Klik hier als het portal niet automatisch opent →');
fallback.appendChild(fallbackLink);
inner.appendChild(fallback);
}
var act3=el('div', { class: 'pod-phasio-dialog__actions' });
var portal=el('button', { type: 'button', class: 'pod-phasio-dialog__primary' }, cfg.i18n.openPortal);
portal.addEventListener('click', function (){
window.open(completedUrl, '_blank', 'noopener,noreferrer');
dlg.close();
});
var closeComplete=el('button', { type: 'button', class: 'pod-phasio-dialog__secondary' }, cfg.i18n.cancel);
closeComplete.addEventListener('click', function (){ dlg.close(); });
act3.appendChild(closeComplete);
act3.appendChild(portal);
inner.appendChild(act3);
}}
dlg.appendChild(inner);
document.body.appendChild(dlg);
dlg.addEventListener('close', function (){
teardownAll();
dlg.remove();
});
if(typeof dlg.showModal==='function'){
dlg.showModal();
}else{
window.alert(cfg.i18n.errorGeneric);
return;
}
var progressLabel=null;
if(cfg.skipAuth){
mode='embed';
render();
return;
}
render();
progressLabel=inner.querySelector('.pod-phasio-progress__label');
(async function runProgress(){
try {
await runPhase(3000, function (){
if(destroyed) return Promise.reject(new Error('abort'));
return file.arrayBuffer().then(function (buf){
if(destroyed) return;
state.arrayBuffer=buf;
});
});
if(destroyed) return;
if(progressLabel) progressLabel.textContent=cfg.i18n.progressRepairing;
await runPhase(3000, function (){
if(destroyed) return Promise.reject(new Error('abort'));
var buf=state.arrayBuffer;
if(isStlName(file.name)){
state.stepPreviewFailed=false;
return loadThreeModules().then(function (M){
if(destroyed) return;
var loader=new M.STLLoader();
state.stlGeometry=loader.parse(buf);
});
}
if(isStepName(file.name)){
state.stepPreviewFailed=false;
return loadOcctModule()
.then(function (occt){
if(destroyed) return;
return loadThreeModules().then(function (M){
if(destroyed) return;
var u8=new Uint8Array(buf);
var params={
linearUnit: 'millimeter',
linearDeflectionType: 'bounding_box_ratio',
linearDeflection: 0.045
};
var result=occt.ReadStepFile(u8, params);
var geo=mergeOcctMeshesToBufferGeometry(result, M.THREE);
if(geo){
state.stlGeometry=geo;
}else{
state.stlGeometry=null;
state.stepPreviewFailed=true;
}});
})
.catch(function (){
if(destroyed) return;
state.stlGeometry=null;
state.stepPreviewFailed=true;
});
}
state.stlGeometry=null;
state.stepPreviewFailed=false;
return Promise.resolve();
});
if(destroyed) return;
if(progressLabel) progressLabel.textContent=cfg.i18n.progressAnalyzing;
await runPhase(3000, function (){
if(destroyed) return Promise.reject(new Error('abort'));
return Promise.resolve();
});
if(destroyed) return;
if(progressLabel) progressLabel.textContent=cfg.i18n.progressPricing;
await runPhase(1200, function (){
if(destroyed) return Promise.reject(new Error('abort'));
return Promise.resolve();
});
if(destroyed) return;
mode='preview';
render();
} catch (err){
if(err&&(err.message==='abort'||destroyed)) return;
if(!destroyed) showFlowError(cfg.i18n.errorGeneric);
}})();
}
function buildContoursEl(gradientId){
var ns='http://www.w3.org/2000/svg';
var wrap=document.createElement('div');
wrap.className='simple-banner__contours';
wrap.setAttribute('aria-hidden', 'true');
var svg=document.createElementNS(ns, 'svg');
svg.setAttribute('class', 'simple-banner__contours-svg');
var viewBox =
cfg&&cfg.heroContourViewBox ? cfg.heroContourViewBox:'0 0 951 703';
svg.setAttribute('viewBox', viewBox);
svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');
var defs=document.createElementNS(ns, 'defs');
var grad=document.createElementNS(ns, 'linearGradient');
grad.setAttribute('id', gradientId);
grad.setAttribute('x1', '0%');
grad.setAttribute('y1', '0%');
grad.setAttribute('x2', '100%');
grad.setAttribute('y2', '100%');
[
['0%', 'rgba(255,255,255,0.97)'],
['55%', 'rgba(165,220,255,0.78)'],
['100%', 'rgba(230,245,255,0.58)']
].forEach(function (st){
var stop=document.createElementNS(ns, 'stop');
stop.setAttribute('offset', st[0]);
stop.setAttribute('stop-color', st[1]);
grad.appendChild(stop);
});
defs.appendChild(grad);
svg.appendChild(defs);
var paths=cfg&&cfg.heroContourPaths&&cfg.heroContourPaths.length ? cfg.heroContourPaths:null;
if(paths){
var g=document.createElementNS(ns, 'g');
g.setAttribute('transform', 'translate(1,1)');
g.setAttribute('fill', 'none');
g.setAttribute('fill-rule', 'evenodd');
paths.forEach(function (d, i){
var delayPath=Math.round(i * 12) / 100;
var p=document.createElementNS(ns, 'path');
p.setAttribute('class', 'simple-banner__contour-ring');
p.setAttribute('d', d);
p.setAttribute('fill', 'none');
p.setAttribute('stroke', 'url(#' + gradientId + ')');
p.setAttribute('stroke-width', '2');
p.setAttribute('stroke-linecap', 'round');
p.setAttribute('stroke-linejoin', 'round');
p.setAttribute('style', 'animation-delay:' + delayPath + 's');
g.appendChild(p);
});
svg.appendChild(g);
}else{
svg.setAttribute('viewBox', '0 0 400 400');
var i;
for (i=0; i < 14; i++){
var rx=40 + i * 12;
var ry=28 + i * 10;
var rot=-8 + i * 3;
var delayEll=Math.round(i * 12) / 100;
var ell=document.createElementNS(ns, 'ellipse');
ell.setAttribute('class', 'simple-banner__contour-ring');
ell.setAttribute('transform', 'rotate(' + rot + ' 200 200)');
ell.setAttribute('cx', '200');
ell.setAttribute('cy', '200');
ell.setAttribute('rx', String(rx));
ell.setAttribute('ry', String(ry));
ell.setAttribute('fill', 'none');
ell.setAttribute('stroke', 'url(#' + gradientId + ')');
ell.setAttribute('stroke-width', '2');
ell.setAttribute('stroke-linecap', 'round');
ell.setAttribute('style', 'animation-delay:' + delayEll + 's');
svg.appendChild(ell);
}}
wrap.appendChild(svg);
return wrap;
}
function buildUploadZoneEl(){
var btn=document.createElement('button');
btn.type='button';
btn.className='simple-banner__upload-zone';
btn.setAttribute('aria-label', cfg.i18n.uploadAriaLabel||cfg.i18n.uploadLabel);
var spanIcon=document.createElement('span');
spanIcon.className='simple-banner__upload-icon';
spanIcon.setAttribute('aria-hidden', 'true');
spanIcon.innerHTML =
'<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">' +
'<path d="M12 4v12m0 0l4-4m-4 4l-4-4" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>' +
'<path d="M4 17v1a2 2 0 002 2h12a2 2 0 002-2v-1" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>' +
'</svg>';
var spanText=document.createElement('span');
spanText.className='simple-banner__upload-text';
spanText.textContent=cfg.i18n.uploadLabel;
var input=document.createElement('input');
input.type='file';
input.className='simple-banner__upload-input';
input.setAttribute('accept', '.stl,.stp,.step,.STL,.STP,.STEP');
input.tabIndex=-1;
btn.appendChild(spanIcon);
btn.appendChild(spanText);
btn.appendChild(input);
return btn;
}
function upgradeLegacySimpleBannerShapes(){
qsa('img.banner-shape--simple-banner-lg').forEach(function (img){
if(img.closest('.simple-banner__visual')) return;
var section=img.closest('section');
if(!section||!section.querySelector('.simple-banner')) return;
var gid =
'podContourGrad_' +
Math.random()
.toString(36)
.slice(2, 10) +
Math.random()
.toString(36)
.slice(2, 10);
var wrap=document.createElement('div');
wrap.className='simple-banner__visual simple-banner__visual--legacy-js';
img.parentNode.insertBefore(wrap, img);
img.classList.remove('banner-shape', 'banner-shape--simple-banner-lg');
img.classList.add('simple-banner__visual-img');
;['data-aos', 'data-aos-delay', 'data-aos-anchor'].forEach(function (a){
img.removeAttribute(a);
});
wrap.appendChild(img);
wrap.appendChild(buildContoursEl(gid));
wrap.appendChild(buildUploadZoneEl());
});
}
var phasioModal=null;
function buildPhasioTrustedOrigins(){
var trusted={};
function add(u){
if(!u||typeof u!=='string') return;
try {
trusted[new URL(u.replace(/\/$/, ''), window.location.href).origin]=1;
} catch (e){}}
add(cfg.embedUrl);
add(cfg.storefrontUrl);
add(cfg.portalUrl);
return trusted;
}
function findPhasioScrollShellForSource(win){
if(!win) return null;
var ifr=document.querySelector('iframe.pod-phasio-embed__iframe');
if(ifr&&ifr.contentWindow===win){
return ifr.closest('.pod-phasio-embed-scroll-shell');
}
ifr=document.querySelector('iframe.pod-phasio-hero-iframe');
if(ifr&&ifr.contentWindow===win){
return ifr.closest('.pod-phasio-embed-scroll-shell');
}
return null;
}
function clearPhasioShellFadeTimer(shell){
if(shell&&shell._podFadeTimer){
clearTimeout(shell._podFadeTimer);
shell._podFadeTimer=null;
}}
var phasioParentMessageBridgeInstalled=false;
function installPhasioEmbedParentMessageBridge(){
if(phasioParentMessageBridgeInstalled) return;
phasioParentMessageBridgeInstalled=true;
var trusted=buildPhasioTrustedOrigins();
window.addEventListener('message',
function (ev){
if(!trusted[ev.origin]) return;
var d=ev.data;
if(!d||typeof d!=='object') return;
if(d.type!=='phasio:embed:scroll'&&d.type!=='podPhasioEmbedScroll') return;
var shell=findPhasioScrollShellForSource(ev.source);
if(!shell) return;
var atBottom = !!d.atBottom;
var hasOverflow=d.hasOverflow!==false;
shell.setAttribute('data-phasio-scroll-sync', '1');
clearPhasioShellFadeTimer(shell);
shell.classList.toggle('pod-phasio-embed-scroll-shell--fade-out', atBottom||!hasOverflow);
},
false
);
}
function appendPhasioScrollRibbon(shell, ribbonText, dismissAria){
var root=document.createElement('div');
root.className='pod-phasio-embed-scroll-ribbon';
root.setAttribute('hidden', 'hidden');
var inner=document.createElement('span');
inner.className='pod-phasio-embed-scroll-ribbon__inner';
var textEl=document.createElement('span');
textEl.className='pod-phasio-embed-scroll-ribbon__text';
textEl.textContent=ribbonText;
var btn=document.createElement('button');
btn.type='button';
btn.className='pod-phasio-embed-scroll-ribbon__dismiss';
btn.setAttribute('aria-label', dismissAria);
btn.appendChild(document.createTextNode('\u00d7'));
btn.addEventListener('click', function (e){
e.preventDefault();
e.stopPropagation();
shell.classList.add('pod-phasio-embed-scroll-shell--ribbon-dismissed');
root.setAttribute('hidden', 'hidden');
});
inner.appendChild(textEl);
inner.appendChild(btn);
root.appendChild(inner);
shell.appendChild(root);
return root;
}
function createPhasioModal(){
if(phasioModal) return phasioModal;
var iframeUrl=cfg.embedUrl
? cfg.embedUrl.replace(/\/$/, '')
: (cfg.storefrontUrl||cfg.portalUrl).replace(/\/$/, '') + '/configure';
var iframeReady=false;
var isModal=false;
var heroIframe=el('iframe', {
src: iframeUrl,
class: 'pod-phasio-hero-iframe',
allow: 'fullscreen; storage-access',
frameborder: '0',
tabindex: '-1',
'aria-hidden': 'true',
title: cfg.i18n.embedTitle||'Phasio Storefront'
});
heroIframe.addEventListener('load', function (){
iframeReady=true;
heroIframe.classList.add('pod-phasio-hero-iframe--ready');
});
var backdrop=el('div', { class: 'pod-phasio-hero-backdrop' });
var modalHeader=el('div', { class: 'pod-phasio-hero-modal__header' });
var modalTitle=el('span', { class: 'pod-phasio-hero-modal__title' },
cfg.i18n.embedTitle||'Configure your part');
var modalClose=el('button', {
type: 'button',
class: 'pod-phasio-hero-modal__close',
'aria-label': cfg.i18n.close||'Close'
}, '\u00d7');
var modalFooter=el('div', { class: 'pod-phasio-hero-modal__footer' });
var openTabLink=el('a', {
href: iframeUrl,
target: '_blank',
rel: 'noopener noreferrer',
class: 'pod-phasio-dialog__portal-link',
'data-phasio-external': ''
}, cfg.i18n.openPortal||'Ga naar portal');
modalFooter.appendChild(openTabLink);
modalHeader.appendChild(modalTitle);
modalHeader.appendChild(modalClose);
var loginHint=el('span', { class: 'pod-phasio-hero-modal__login-hint' });
var loginHintText=document.createTextNode(cfg.i18n.loginHint||'Log in om je sessie op te slaan');
var loginHintArrow=el('span', { class: 'pod-phasio-hero-modal__login-arrow' }, '\u2193');
loginHint.appendChild(loginHintText);
loginHint.appendChild(loginHintArrow);
modalHeader.appendChild(loginHint);
document.body.appendChild(backdrop);
document.body.appendChild(modalHeader);
var heroIframeWrap=el('div', {
class: 'pod-phasio-hero-iframe-wrap pod-phasio-embed-scroll-shell'
});
heroIframeWrap.appendChild(heroIframe);
var heroScrollRibbonText =
(cfg.i18n.embedScrollRibbon&&String(cfg.i18n.embedScrollRibbon)) ||
'Scroll in het portaal \u2193 voor alle opties';
var heroDismissAria =
(cfg.i18n.embedScrollRibbonDismiss&&String(cfg.i18n.embedScrollRibbonDismiss)) ||
'Dismiss';
var heroScrollRibbon=appendPhasioScrollRibbon(
heroIframeWrap,
heroScrollRibbonText,
heroDismissAria
);
heroScrollRibbon.removeAttribute('hidden');
document.body.appendChild(heroIframeWrap);
document.body.appendChild(modalFooter);
var resizeTimer=0;
function onResizeHint(){
clearTimeout(resizeTimer);
resizeTimer=setTimeout(positionLoginHint, 60);
}
function positionLoginHint(){
if(!isModal) return;
loginHint.style.right='';
var cssRight=parseFloat(getComputedStyle(loginHint).right)||0;
var iRect=heroIframe.getBoundingClientRect();
var phasioOffset=72; 
if(iRect.width > 1400){
phasioOffset +=(iRect.width - 1400) / 2;
}
var targetX=iRect.right - phasioOffset;
var arrowRect=loginHintArrow.getBoundingClientRect();
var arrowCenterX=(arrowRect.left + arrowRect.right) / 2;
var shift=arrowCenterX - targetX;
loginHint.style.right=(cssRight + shift) + 'px';
}
function expandToModal(){
if(isModal) return;
isModal=true;
heroIframeWrap.classList.add('pod-phasio-hero-iframe-wrap--modal');
backdrop.classList.add('pod-phasio-hero-backdrop--visible');
modalHeader.classList.add('pod-phasio-hero-modal__header--visible');
modalFooter.classList.add('pod-phasio-hero-modal__footer--visible');
heroIframe.removeAttribute('aria-hidden');
heroIframe.removeAttribute('tabindex');
document.body.style.overflow='hidden';
document.addEventListener('keydown', escHandler);
requestAnimationFrame(function (){
requestAnimationFrame(function (){
positionLoginHint();
});
});
window.addEventListener('resize', onResizeHint);
}
function collapseFromModal(){
if(!isModal) return;
isModal=false;
heroIframeWrap.classList.remove('pod-phasio-hero-iframe-wrap--modal');
backdrop.classList.remove('pod-phasio-hero-backdrop--visible');
modalHeader.classList.remove('pod-phasio-hero-modal__header--visible');
modalFooter.classList.remove('pod-phasio-hero-modal__footer--visible');
heroIframe.setAttribute('aria-hidden', 'true');
heroIframe.setAttribute('tabindex', '-1');
document.body.style.overflow='';
document.removeEventListener('keydown', escHandler);
window.removeEventListener('resize', onResizeHint);
loginHint.style.right='';
heroIframe.style.pointerEvents='';
clearPhasioShellFadeTimer(heroIframeWrap);
heroIframeWrap.classList.remove('pod-phasio-embed-scroll-shell--fade-out');
heroIframeWrap.classList.remove('pod-phasio-embed-scroll-shell--ribbon-dismissed');
heroIframeWrap.removeAttribute('data-phasio-scroll-sync');
if(heroScrollRibbon){
heroScrollRibbon.removeAttribute('hidden');
}}
function escHandler(e){
if(e.key==='Escape') collapseFromModal();
}
modalClose.addEventListener('click', collapseFromModal);
backdrop.addEventListener('click', collapseFromModal);
phasioModal={
expand: expandToModal,
collapse: collapseFromModal,
iframeReady: function (){ return iframeReady; }};
return phasioModal;
}
function initEmbedZone(zone){
var input=zone.querySelector('.simple-banner__upload-input');
var modal=createPhasioModal();
zone.addEventListener('click', function (e){
if(e.target===input) return;
modal.expand ();
});
zone.addEventListener('keydown', function (e){
if(e.key==='Enter'||e.key===' '){
e.preventDefault();
modal.expand ();
}});
var dragDepth=0;
zone.addEventListener('dragenter', function (e){
e.preventDefault();
dragDepth++;
zone.classList.add('simple-banner__upload-zone--drag');
if(modal.iframeReady()){
modal.expand ();
}});
zone.addEventListener('dragover', function (e){
e.preventDefault();
});
zone.addEventListener('dragleave', function (e){
e.preventDefault();
dragDepth=Math.max(0, dragDepth - 1);
if(dragDepth===0){
zone.classList.remove('simple-banner__upload-zone--drag');
}});
zone.addEventListener('drop', function (e){
e.preventDefault();
dragDepth=0;
zone.classList.remove('simple-banner__upload-zone--drag');
modal.expand ();
});
if(input){
input.addEventListener('click', function (e){ e.preventDefault(); });
input.addEventListener('change', function (){ input.value=''; });
}}
function initZone(zone){
var input=zone.querySelector('.simple-banner__upload-input');
if(!input) return;
zone.addEventListener('click', function (e){
if(e.target===input) return;
input.click();
});
zone.addEventListener('keydown', function (e){
if(e.key==='Enter'||e.key===' '){
e.preventDefault();
input.click();
}});
var dragDepth=0;
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(function (ev){
zone.addEventListener(ev, function (e){
e.preventDefault();
e.stopPropagation();
});
});
zone.addEventListener('dragenter', function (){
dragDepth++;
zone.classList.add('simple-banner__upload-zone--drag');
});
zone.addEventListener('dragleave', function (){
dragDepth=Math.max(0, dragDepth - 1);
if(dragDepth===0) zone.classList.remove('simple-banner__upload-zone--drag');
});
zone.addEventListener('drop', function (e){
dragDepth=0;
zone.classList.remove('simple-banner__upload-zone--drag');
var f=e.dataTransfer&&e.dataTransfer.files&&e.dataTransfer.files[0];
if(validateFile(f)) openDialog(f);
});
input.addEventListener('change', function (){
var f=input.files&&input.files[0];
if(validateFile(f)){
openDialog(f);
input.value='';
}});
}
upgradeLegacySimpleBannerShapes();
var zoneFn=cfg.skipAuth ? initEmbedZone:initZone;
qsa('.simple-banner__upload-zone').forEach(zoneFn);
if(cfg.skipAuth){
installPhasioEmbedParentMessageBridge();
createPhasioModal();
var phasioHosts=[];
try { if(cfg.embedUrl) phasioHosts.push(new URL(cfg.embedUrl).hostname); } catch (e){}
try { if(cfg.portalUrl) phasioHosts.push(new URL(cfg.portalUrl).hostname); } catch (e){}
try { if(cfg.storefrontUrl) phasioHosts.push(new URL(cfg.storefrontUrl).hostname); } catch (e){}
phasioHosts=phasioHosts.filter(function (h, i, a){ return a.indexOf(h)===i; });
document.addEventListener('click', function (e){
if(e.target.closest('a[data-pod-engineer-modal]')){
return;
}
var trigger=e.target.closest('[data-phasio-modal]');
if(!trigger){
var link=e.target.closest('a[href]');
if(link&&!link.hasAttribute('data-phasio-external')){
try {
var url=new URL(link.href, window.location.origin);
if(phasioHosts.indexOf(url.hostname)!==-1) trigger=link;
} catch (err){}}
}
if(trigger&&phasioModal){
e.preventDefault();
e.stopPropagation();
phasioModal.expand ();
}}, true);
window.podPhasioModal={
open: function (){ if(phasioModal) phasioModal.expand (); },
close: function (){ if(phasioModal) phasioModal.collapse(); }};}})();
!function(){var e={7090:function(e){!function(t,n){var a=function(e,t,n){"use strict";var a,i;if(function(){var t,n={lazyClass:"lazyload",loadedClass:"lazyloaded",loadingClass:"lazyloading",preloadClass:"lazypreload",errorClass:"lazyerror",autosizesClass:"lazyautosizes",fastLoadedClass:"ls-is-cached",iframeLoadMode:0,srcAttr:"data-src",srcsetAttr:"data-srcset",sizesAttr:"data-sizes",minSize:40,customMedia:{},init:!0,expFactor:1.5,hFac:.8,loadMode:2,loadHidden:!0,ricTimeout:0,throttleDelay:125};for(t in i=e.lazySizesConfig||e.lazysizesConfig||{},n)t in i||(i[t]=n[t])}(),!t||!t.getElementsByClassName)return{init:function(){},cfg:i,noSupport:!0};var r=t.documentElement,o=e.HTMLPictureElement,s="addEventListener",l="getAttribute",c=e[s].bind(e),d=e.setTimeout,u=e.requestAnimationFrame||d,f=e.requestIdleCallback,m=/^picture$/i,v=["load","error","lazyincluded","_lazyloaded"],y={},h=Array.prototype.forEach,z=function(e,t){return y[t]||(y[t]=new RegExp("(\\s|^)"+t+"(\\s|$)")),y[t].test(e[l]("class")||"")&&y[t]},p=function(e,t){z(e,t)||e.setAttribute("class",(e[l]("class")||"").trim()+" "+t)},g=function(e,t){var n;(n=z(e,t))&&e.setAttribute("class",(e[l]("class")||"").replace(n," "))},C=function(e,t,n){var a=n?s:"removeEventListener";n&&C(e,t),v.forEach((function(n){e[a](n,t)}))},b=function(e,n,i,r,o){var s=t.createEvent("Event");return i||(i={}),i.instance=a,s.initEvent(n,!r,!o),s.detail=i,e.dispatchEvent(s),s},A=function(t,n){var a;!o&&(a=e.picturefill||i.pf)?(n&&n.src&&!t[l]("srcset")&&t.setAttribute("srcset",n.src),a({reevaluate:!0,elements:[t]})):n&&n.src&&(t.src=n.src)},E=function(e,t){return(getComputedStyle(e,null)||{})[t]},_=function(e,t,n){for(n=n||e.offsetWidth;n<i.minSize&&t&&!e._lazysizesWidth;)n=t.offsetWidth,t=t.parentNode;return n},w=(pe=[],ge=[],Ce=pe,be=function(){var e=Ce;for(Ce=pe.length?ge:pe,he=!0,ze=!1;e.length;)e.shift()();he=!1},Ae=function(e,n){he&&!n?e.apply(this,arguments):(Ce.push(e),ze||(ze=!0,(t.hidden?d:u)(be)))},Ae._lsFlush=be,Ae),M=function(e,t){return t?function(){w(e)}:function(){var t=this,n=arguments;w((function(){e.apply(t,n)}))}},N=function(e){var t,a=0,r=i.throttleDelay,o=i.ricTimeout,s=function(){t=!1,a=n.now(),e()},l=f&&o>49?function(){f(s,{timeout:o}),o!==i.ricTimeout&&(o=i.ricTimeout)}:M((function(){d(s)}),!0);return function(e){var i;(e=!0===e)&&(o=33),t||(t=!0,(i=r-(n.now()-a))<0&&(i=0),e||i<9?l():d(l,i))}},x=function(e){var t,a,i=99,r=function(){t=null,e()},o=function(){var e=n.now()-a;e<i?d(o,i-e):(f||r)(r)};return function(){a=n.now(),t||(t=d(o,i))}},L=(K=/^img$/i,Q=/^iframe$/i,V="onscroll"in e&&!/(gle|ing)bot/.test(navigator.userAgent),X=0,Y=0,Z=0,ee=-1,te=function(e){Z--,(!e||Z<0||!e.target)&&(Z=0)},ne=function(e){return null==J&&(J="hidden"==E(t.body,"visibility")),J||!("hidden"==E(e.parentNode,"visibility")&&"hidden"==E(e,"visibility"))},ae=function(e,n){var a,i=e,o=ne(e);for(I-=n,G+=n,j-=n,U+=n;o&&(i=i.offsetParent)&&i!=t.body&&i!=r;)(o=(E(i,"opacity")||1)>0)&&"visible"!=E(i,"overflow")&&(a=i.getBoundingClientRect(),o=U>a.left&&j<a.right&&G>a.top-1&&I<a.bottom+1);return o},ie=function(){var e,n,o,s,c,d,u,f,m,v,y,h,z=a.elements;if((k=i.loadMode)&&Z<8&&(e=z.length)){for(n=0,ee++;n<e;n++)if(z[n]&&!z[n]._lazyRace)if(!V||a.prematureUnveil&&a.prematureUnveil(z[n]))fe(z[n]);else if((f=z[n][l]("data-expand"))&&(d=1*f)||(d=Y),v||(v=!i.expand||i.expand<1?r.clientHeight>500&&r.clientWidth>500?500:370:i.expand,a._defEx=v,y=v*i.expFactor,h=i.hFac,J=null,Y<y&&Z<1&&ee>2&&k>2&&!t.hidden?(Y=y,ee=0):Y=k>1&&ee>1&&Z<6?v:X),m!==d&&($=innerWidth+d*h,q=innerHeight+d,u=-1*d,m=d),o=z[n].getBoundingClientRect(),(G=o.bottom)>=u&&(I=o.top)<=q&&(U=o.right)>=u*h&&(j=o.left)<=$&&(G||U||j||I)&&(i.loadHidden||ne(z[n]))&&(P&&Z<3&&!f&&(k<3||ee<4)||ae(z[n],d))){if(fe(z[n]),c=!0,Z>9)break}else!c&&P&&!s&&Z<4&&ee<4&&k>2&&(R[0]||i.preloadAfterLoad)&&(R[0]||!f&&(G||U||j||I||"auto"!=z[n][l](i.sizesAttr)))&&(s=R[0]||z[n]);s&&!c&&fe(s)}},re=N(ie),oe=function(e){var t=e.target;t._lazyCache?delete t._lazyCache:(te(e),p(t,i.loadedClass),g(t,i.loadingClass),C(t,le),b(t,"lazyloaded"))},se=M(oe),le=function(e){se({target:e.target})},ce=function(e,t){var n=e.getAttribute("data-load-mode")||i.iframeLoadMode;0==n?e.contentWindow.location.replace(t):1==n&&(e.src=t)},de=function(e){var t,n=e[l](i.srcsetAttr);(t=i.customMedia[e[l]("data-media")||e[l]("media")])&&e.setAttribute("media",t),n&&e.setAttribute("srcset",n)},ue=M((function(e,t,n,a,r){var o,s,c,u,f,v;(f=b(e,"lazybeforeunveil",t)).defaultPrevented||(a&&(n?p(e,i.autosizesClass):e.setAttribute("sizes",a)),s=e[l](i.srcsetAttr),o=e[l](i.srcAttr),r&&(u=(c=e.parentNode)&&m.test(c.nodeName||"")),v=t.firesLoad||"src"in e&&(s||o||u),f={target:e},p(e,i.loadingClass),v&&(clearTimeout(D),D=d(te,2500),C(e,le,!0)),u&&h.call(c.getElementsByTagName("source"),de),s?e.setAttribute("srcset",s):o&&!u&&(Q.test(e.nodeName)?ce(e,o):e.src=o),r&&(s||u)&&A(e,{src:o})),e._lazyRace&&delete e._lazyRace,g(e,i.lazyClass),w((function(){var t=e.complete&&e.naturalWidth>1;v&&!t||(t&&p(e,i.fastLoadedClass),oe(f),e._lazyCache=!0,d((function(){"_lazyCache"in e&&delete e._lazyCache}),9)),"lazy"==e.loading&&Z--}),!0)})),fe=function(e){if(!e._lazyRace){var t,n=K.test(e.nodeName),a=n&&(e[l](i.sizesAttr)||e[l]("sizes")),r="auto"==a;(!r&&P||!n||!e[l]("src")&&!e.srcset||e.complete||z(e,i.errorClass)||!z(e,i.lazyClass))&&(t=b(e,"lazyunveilread").detail,r&&W.updateElem(e,!0,e.offsetWidth),e._lazyRace=!0,Z++,ue(e,t,r,a,n))}},me=x((function(){i.loadMode=3,re()})),ve=function(){3==i.loadMode&&(i.loadMode=2),me()},ye=function(){P||(n.now()-H<999?d(ye,999):(P=!0,i.loadMode=3,re(),c("scroll",ve,!0)))},{_:function(){H=n.now(),a.elements=t.getElementsByClassName(i.lazyClass),R=t.getElementsByClassName(i.lazyClass+" "+i.preloadClass),c("scroll",re,!0),c("resize",re,!0),c("pageshow",(function(e){if(e.persisted){var n=t.querySelectorAll("."+i.loadingClass);n.length&&n.forEach&&u((function(){n.forEach((function(e){e.complete&&fe(e)}))}))}})),e.MutationObserver?new MutationObserver(re).observe(r,{childList:!0,subtree:!0,attributes:!0}):(r[s]("DOMNodeInserted",re,!0),r[s]("DOMAttrModified",re,!0),setInterval(re,999)),c("hashchange",re,!0),["focus","mouseover","click","load","transitionend","animationend"].forEach((function(e){t[s](e,re,!0)})),/d$|^c/.test(t.readyState)?ye():(c("load",ye),t[s]("DOMContentLoaded",re),d(ye,2e4)),a.elements.length?(ie(),w._lsFlush()):re()},checkElems:re,unveil:fe,_aLSL:ve}),W=(T=M((function(e,t,n,a){var i,r,o;if(e._lazysizesWidth=a,a+="px",e.setAttribute("sizes",a),m.test(t.nodeName||""))for(r=0,o=(i=t.getElementsByTagName("source")).length;r<o;r++)i[r].setAttribute("sizes",a);n.detail.dataAttr||A(e,n.detail)})),F=function(e,t,n){var a,i=e.parentNode;i&&(n=_(e,i,n),(a=b(e,"lazybeforesizes",{width:n,dataAttr:!!t})).defaultPrevented||(n=a.detail.width)&&n!==e._lazysizesWidth&&T(e,i,a,n))},O=x((function(){var e,t=B.length;if(t)for(e=0;e<t;e++)F(B[e])})),{_:function(){B=t.getElementsByClassName(i.autosizesClass),c("resize",O)},checkElems:O,updateElem:F}),S=function(){!S.i&&t.getElementsByClassName&&(S.i=!0,W._(),L._())};var B,T,F,O;var R,P,D,k,H,$,q,I,j,U,G,J,K,Q,V,X,Y,Z,ee,te,ne,ae,ie,re,oe,se,le,ce,de,ue,fe,me,ve,ye;var he,ze,pe,ge,Ce,be,Ae;return d((function(){i.init&&S()})),a={cfg:i,autoSizer:W,loader:L,init:S,uP:A,aC:p,rC:g,hC:z,fire:b,gW:_,rAF:w}}(t,t.document,Date);t.lazySizes=a,e.exports&&(e.exports=a)}("undefined"!=typeof window?window:{})}},t={};function n(a){var i=t[a];if(void 0!==i)return i.exports;var r=t[a]={exports:{}};return e[a](r,r.exports,n),r.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},function(){"use strict";var e=n(7090);n.n(e)().init()}()}();