1function PasswordSecurityCheck(params){this._isLoaded=false;this._isDebug=false;this._delay=500;this._useOldPwd=params.useOldPwd||true;this._wrapper=params.wrapper||null;this._placeholder=params.placeholder||null;this._messageWrapper=params.messageWrapper||null;this._fieldset=params.fieldset||null;this._changePass=params.changePass||false;this._uuid=params.uuid||false;this._onError=params.events?.error||null;this._onActivation=params.events?.activation||null;this._onUpdate=params.events?.update||null;this._elements=params.elements||null;this._timeout=null;this._lastCheck=true;this._areRulesEnabled=false;this.init();} 2PasswordSecurityCheck.prototype.sendDebug=function(func,message,severity){if(this._isDebug){switch(severity){case"error":console.error(func,message);break;case"info":console.info(func,message);break;case"table":console.table(func,message);break;default:console.log(func,message);break;}}} 3PasswordSecurityCheck.prototype.getWrappedElement=function(element){return $(this._wrapper+" "+element);} 4PasswordSecurityCheck.prototype.init=function(){this.initBindings();this.loadTemplate();this.sendDebug("init()","Class init success","info");} 5PasswordSecurityCheck.prototype.initBindings=function(){var that=this;var selector=this.getWrappedElement(this._elements.newPwd);this.sendDebug("initObs",selector,"info");selector.on('keyup',function(){if(!!that._timeout)clearTimeout(that._timeout);that._timeout=setTimeout(function(){that.isPasswordSecure();},that._delay);});} 6PasswordSecurityCheck.prototype.loadTemplate=function(){} 7PasswordSecurityCheck.prototype.getCurrentEntry=function(){var input=this.getWrappedElement(this._elements.newPwd);return(input.length)?input[0].value:"";} 8PasswordSecurityCheck.prototype.isPasswordSecure=function(){var that=this;this._lastCheck=true;const endpoint="Identification/ControlerSecuriteMotDePasse";Utils.fetch({method:"POST",body:{mdp:that.getCurrentEntry(),token:that._uuid},url:endpoint}).then(function(data){if(data.Obligatoire==false){that.callbackUpdate(true);return;}else{that._areRulesEnabled=true} 9if(!!that._onActivation&&typeof that._onActivation=="function"&&!that._isLoaded){that._onActivation();that._isLoaded=true;} 10var tmplGlobal=$("#securite-mdp-tmpl");var tmplHistory=$("#securite-mdp-tmpl-history");var regles=[];var template=kendo.template(tmplGlobal.html());$.each(data,function(x){if(!!data[x]&&!!data[x].Libelle){if(!!data[x]&&!(!!data[x].Valeur))that._lastCheck=false;if(x=="Historique")regles.unshift(kendo.render(kendo.template(tmplHistory.html()),[data[x]]));else regles.push(kendo.render(template,[data[x]]));}});that.callbackUpdate(that._lastCheck);if(!regles.length&&data.Obligatoire) 11regles.push(kendo.render(template,[{Valeur:!!that.getCurrentEntry(),Libelle:"Un mot de passe est obligatoire"}]));regles=regles.reverse();regles=regles.join("");that.getWrappedElement(that._placeholder).html(regles);}).catch(function(errData){if(!!that._onError&&typeof that._onError=="function"){that._onError(errData);}else $(that._messageWrapper).html(errData);});} 12PasswordSecurityCheck.prototype.callbackUpdate=function(value){if(!!this._onUpdate&&typeof this._onUpdate=="function") 13this._onUpdate(value);} 14PasswordSecurityCheck.prototype.isPasswordSafe=function(){return this._lastCheck;} 15PasswordSecurityCheck.prototype.areRulesEnabled=function(){return this._areRulesEnabled;};Identification={external:{viewModel:new Object(),setIdentifiant(value){Identification.obs.forms.set("identifiant",value);$("#identifiant").trigger("input");$("#pass").focus();}},obs:kendo.observable({loadings:{global:true,inner:false},rcaConnect:false,misc:{hideSecurityCheck:true,hideOpenMobile:false,},forms:{identifiant:null,pass:null,email:null,totp:null,identifiantReset:null,newpass:null,newpassConfirm:null,passwordSafe:false,shouldBeEnabled(){const passwordSafe=Identification.obs.forms.get("passwordSafe");return passwordSafe==true;}},load:{identification(){Identification.Routing.goto("IDENTIFICATION");},forgotPassword(){Identification.Routing.goto("FORGOT_PASSWORD");},openMobile(e){Identification.Routing.goto("OPEN_MOBILE",e);},openMicrosoftAuth(){Identification.Routing.goto("OPEN_MICROSOFT_AUTH");},openGoogleAuth(){Identification.Routing.goto("OPEN_GOOGLE_AUTH");},openHelp(){Identification.Routing.goto("OPEN_HELP");},secondFactor(){Identification.Routing.goto("SECOND_FACTEUR_SAISIE");},},connect:{form(e){this.get("rcaConnect")?Identification.rca.checkRcaConnect(e):Identification.MotDePasse.connect(e);},form2fa(e){Identification.SecondFacteur.submit(e);}},actions:{changePassword(e){Identification.MotDePasse.change(e);},resetPassword(e){Identification.MotDePasse.reset(e);},linkAccount(e){Identification.LiaisonSociale.linkAccount(e)},sendLinkageEmail(e){Identification.LiaisonSociale.sendLinkageEmail(e)},sendSecondFactorEmail(e){Identification.SecondFacteur.sendEmail(e)},}}),Routing:null,init:()=>{Identification.Routing=new IdentificationRouting();Identification.utils.setLogoCmd();kendo.bind($("body"),Identification.obs);Identification.utils.loadings.global.hide();const currentView=Identification.external.viewModel.VuePartielle;Identification.Routing.currentView=currentView;Identification.Routing.executeAfterLoad(currentView);Identification.snackbar.init();},snackbar:{get(){return $("#login-notification");},hide(){Identification.snackbar.get().css("opacity","0");},show(){Identification.snackbar.get().css("opacity","1");}
15,reposition(){const snackbar=Identification.snackbar.get();const snackbarHeight=snackbar.outerHeight();const snackbarWidth=snackbar.outerWidth();const viewPortWidth=$(window).outerWidth();const loginOffsets=$("#login").offset();const adjustedTop=loginOffsets.top/2-snackbarHeight/2;const adjustedWidth=viewPortWidth/2-snackbarWidth/2;snackbar.css({left:adjustedWidth,top:adjustedTop});},init(){Identification.snackbar.get().on("click",()=>Identification.snackbar.hide());$(window).resize(()=>{if(Identification.snackbar.get().length) 16Identification.snackbar.reposition();});},set(str){Identification.snackbar.get().find(".login-notification-snack-message").html(str);Identification.snackbar.show();$(window).trigger("resize");}},utils:{loadings:{global:{hide(){Identification.obs.set("loadings.global",false);},show(){Identification.obs.set("loadings.global",true);},},inner:{hide(){Identification.obs.set("loadings.inner",false);},show(){Identification.obs.set("loadings.inner",true);}}},rebindPartial(){kendo.unbind($("body"));kendo.bind($("body"),Identification.obs);},clearForm(){try{for(const item in Identification.obs.forms.toJSON()) 17if(!!Identification.obs.forms.get(item)) 18Identification.obs.forms.set(item,null);}catch{}},togglePassword(element){const ua=window.navigator.userAgent;const trident=ua.indexOf('Trident/');const edge=ua.indexOf('Edge/');const edgeChromium=ua.indexOf("Edg/");if(trident>0||edge>0||edgeChromium>0){$(element).hide();} 19else{$(element).off('click.identification').on('click.identification',function(e){const clickedInput=$(e.currentTarget).siblings('input');const clickedEye=$(e.currentTarget);const currentStateInput=clickedInput.attr('type');const currentStateEye=clickedEye.attr('class');(currentStateEye.indexOf('fa-eye-slash')>0)?clickedEye.addClass('fa-eye').removeClass('fa-eye-slash'):clickedEye.addClass('fa-eye-slash').removeClass('fa-eye');clickedInput.attr('type',(currentStateInput==='password')?'text':'password');});}},setLogoCmd(){const paramsString=window.location.search;const searchParams=new URLSearchParams(paramsString);if(searchParams.has("cmd")&&localStorage.getItem("logosTuiles")!=null) 20$("#logo-image").attr("src",JSON.parse(localStorage.getItem("logosTuiles"))[searchParams.get("cmd").toUpperCase()]);},placeholder:{setHeight(){const selector=$("#partial-placeholder");Identification.utils.placeholder.clearHeight();setTimeout(()=>{const height=selector.outerHeight(true);selector.css("height",height);},500);},clearHeight(){$("#partial-placeholder").css("height","");}},inputs:{caseAdjust(ctx){const selector=$(ctx);const value=selector.val();if(!!value)selector.css('text-transform',(value.indexOf('@')>-1)?'lowercase':'uppercase');},bindings:{set(){$('#login').off("input.identificationplaceholder").on("input.identificationplaceholder",".partial-body input",(e)=>{const senderLength=$(e.target).val()?.length;const libelleInput=$(e.target).closest('div[class^=identification-input-group')?.find('span');libelleInput.css('opacity',((senderLength===0&&typeof senderLength!=="undefined")?0:1));});$('#login').off("blur.identificationplaceholder").on("blur.identificationplaceholder",".partial-body input[name='identifiant']",(e)=>Identification.utils.inputs.caseAdjust(e.target));}}}}} 21$(document).ready(()=>{Identification.init();const message=Identification.external.viewModel.Message;if(!!message)Identification.snackbar.set(message);});$(window).on("load",()=>{Identification.utils.placeholder.setHeight();});class IdentificationRouting{#views=new Map();#currentView=null;constructor(){this._initViews();} 22get currentView(){return this.#currentView;} 23set currentView(value){this.#currentView=value;} 24_initViews(){const applicationIIS=Utils.getApplicationIISFromUrl();this._addView("IDENTIFICATION",{id:"_Identification",url:`/${Utils.CNX}/${applicationIIS}/Identification/VuePartielleIdentification`,hasInputs:true,afterLoad:()=>{const currentRoute=new URL(window.location.href).pathname;const targetRoute=`/${Utils.CNX}/${applicationIIS}/Connexion`;if(currentRoute!=targetRoute) 25history.replaceState(null,null,targetRoute);const eyesSelector="i.identification-reveal-pwd";if($(eyesSelector).length) 26Identification.utils.togglePassword(eyesSelector);Identification.utils.placeholder.setHeight();Identification.obs.set("misc.hideOpenMobile",false);Identification.obs.set("misc.hideSecurityCheck",true);}});this._addView("FORGOT_PASSWORD",{id:"_DemandeMdp",url:`/${Utils.CNX}/${applicationIIS}/Identification/VueDemanderChangementMotDePasse`,hasInputs:true,afterLoad:()=>{Identification.obs.set("misc.hideOpenMobile",true);}});this._addView("SELECT_PROFILE",{id:"_SelectionProfil",afterLoad:Identification.Microsoft.afterLoadSelectionProfil});this._addView("CHANGE_PASSWORD",{id:"_ChangeMdp",hasInputs:true,afterLoad:Identification.MotDePasse.afterLoadChangePassword});this._addView("LINK_ACCOUNT_EMAIL",{id:"_LiaisonCompteEmail",hasInputs:true,afterLoad:()=>{Identification.obs.set("misc.hideOpenMobile",true);}});this._addView("SECOND_FACTEUR_DEMANDE",{id:"_SecondFacteurDemande",hasInputs:true,afterLoad:Identification.SecondFacteur.afterLoadDemande});this._addView("SECOND_FACTEUR_SAISIE",{id:"_SecondFacteurSaisie",url:`/${Utils.CNX}/${applicationIIS}/Identification/VuePartielleSaisieSecondFacteur`,hasInputs:true,afterLoad:Identification.SecondFacteur.afterLoadSaisie});this._addView("OPEN_MOBILE",{exec:(e)=>{const cabQuery=Identification.external.viewModel.CAB?`?cab=${Identification.external.viewModel.CAB}`:'';window.open(`/${Utils.CNX}/iSuiteExpert/mobile${cabQuery}`);}});this._addView("OPEN_MICROSOFT_AUTH",{exec:()=>Identification.Microsoft.open()});this._addView("OPEN_GOOGLE_AUTH",{exec:()=>Identification.Google.open()});this._addView("OPEN_HELP",{exec:()=>window.open(`${Identification.external.viewModel.Aide}`,"_blank")});} 27_addView(id,obj){if(!this.#views.has(id)) 28this.#views.set(id,obj);} 29goto(id,e){Components.Notification.clear();const hasView=this.#views.has(id);if(!hasView) 30throw`Vue inconnue ${id}`;const view=this.#views.get(id);if(!!view.url) 31this._loadView(this.#views.get(id));if(!!view.exec&&typeof view.exec=="function") 32view.exec(e);}
33_loadView(view){const requestParams={url:view.url,external:true,} 34Identification.snackbar.hide();Utils.fetch(requestParams).then(data=>$("#partial-placeholder").html(data)).then(()=>{Identification.utils.clearForm();Identification.utils.rebindPartial();}).then(()=>{if(!!view.afterLoad&&typeof view.afterLoad=="function") 35view.afterLoad();}).then(()=>this.#currentView=view).then(()=>{if(!!this.#currentView?.hasInputs) 36Identification.utils.inputs.bindings.set();}).catch(err=>Identification.snackbar.set(err.Message));} 37_findById(id){let view=null;this.#views.forEach((value,key)=>{if(value.id==id)view=value;});return view;} 38executeAfterLoad(id){const view=this._findById(id);if(!view) 39throw"Identifiant inconnu (IdentificationRouting)";if(!!view.afterLoad&&typeof view.afterLoad=="function") 40view.afterLoad();if(!!view.hasInputs) 41Identification.utils.inputs.bindings.set();}};Identification.Microsoft={open(){window.location.href=`/${Utils.CNX}/${Utils.getApplicationIISFromUrl()}/Identification/RedirigerVersMicrosoft`;},afterLoadSelectionProfil(){Identification.utils.placeholder.clearHeight();const selector=$("#partial-placeholder");selector.off("click.identificationprofile").on("click.identificationprofile",".identification-social-profiles-wrapper .identification-social-profile",(e)=>{Identification.utils.loadings.global.show();});Identification.obs.set("misc.hideOpenMobile",true);}};Identification.Google={open(){window.location.href=`/${Utils.CNX}/${Utils.getApplicationIISFromUrl()}/Identification/RedirigerVersGoogle`;},afterLoadSelectionProfil(){Identification.utils.placeholder.clearHeight();const selector=$("#partial-placeholder");selector.off("click.identificationprofile").on("click.identificationprofile",".identification-social-profiles-wrapper .identification-social-profile",(e)=>{Identification.utils.loadings.global.show();});Identification.obs.set("misc.hideOpenMobile",true);}};Identification.rca={switchAuthentication(){Identification.obs.set("rcaConnect",false);Identification.utils.loadings.inner.hide();},checkRcaConnect(e){e.preventDefault();Identification.utils.loadings.inner.show();if(Utils.checkEmailValidity(Identification.obs.forms.identifiant)){const params={method:"GET",url:`Identification/VerifierRCAConnectActif?email=${encodeURIComponent(Identification.obs.forms.identifiant)}`} 42Utils.fetch(params).then(response=>{if(!!response.rcaConnect){window.location.href=`/${Utils.CNX}/${Utils.getApplicationIISFromUrl()}/Identification/RedirigerVersRCA` 43+`?email=${encodeURIComponent(Identification.obs.forms.identifiant)}` 44+`&state=${response.state}`;Identification.utils.loadings.inner.hide();} 45else{this.switchAuthentication();}}).catch(async(err)=>{Identification.utils.loadings.inner.hide();Identification.snackbar.set(await err.Message);});} 46else{this.switchAuthentication();}},};Identification.MotDePasse={connect(e){e.preventDefault();Identification.snackbar.hide();const formsData=Identification.obs.forms;new Promise((resolve,reject)=>{if(!formsData.identifiant||formsData.identifiant==""){reject("Merci de renseigner un identifiant");return;} 47Identification.snackbar.hide();Identification.utils.loadings.inner.show();$("#identification-form").submit();}).catch(async(err)=>{Identification.snackbar.set(await err);});},reset(e){e.preventDefault();Identification.snackbar.hide();const formsData=Identification.obs.forms;new Promise((resolve,reject)=>{if(!formsData.identifiantReset||formsData.identifiantReset==""){reject("Identifiant obligatoire");return;} 48Identification.snackbar.hide();Identification.utils.loadings.inner.show();const data={identifiant:formsData.identifiantReset,} 49const requestParams={method:"POST",url:`Identification/DemanderChangementMotDePasse`,body:data} 50Utils.fetch(requestParams).then((data)=>{$("#partial-placeholder").html(data);Identification.utils.rebindPartial();}).then(()=>resolve()).catch((err)=>reject(err))}).catch(async(err)=>{try{Identification.snackbar.set((await err.json()).Message);}catch{if(await err.Message) 51Identification.snackbar.set(err.Message);else 52Identification.snackbar.set(await err);}}).finally(()=>{Identification.utils.loadings.inner.hide()});},change(e){e.preventDefault();Identification.snackbar.hide();const formsData=Identification.obs.forms;new Promise((resolve,reject)=>{if(!formsData.newpass||formsData.newpass==""){reject("Nouveau mot de passe obligatoire");return;} 53if(!formsData.newpassConfirm||formsData.newpassConfirm==""){reject("Une confirmation est obligatoire");return;} 54if(formsData.newpass!=formsData.newpassConfirm){reject("Les mots de passe ne sont pas identiques");return;} 55if(!Identification.PasswordSecurityCheck.isPasswordSafe()){reject("Un mot de passe sécurisé est requis.");return;} 56Identification.snackbar.hide();Identification.utils.loadings.inner.show();const data={identifiant:Identification.external.viewModel.Identite.identifiant,pass:formsData.newpass,token:Identification.external.viewModel.Uuid} 57const requestData={method:"POST",url:`Identification/ValiderChangementMotDePasse`,body:data} 58Utils.fetch(requestData).then((data)=>{$("#partial-placeholder").html(data);Identification.obs.misc.set("hideSecurityCheck",true);Identification.utils.rebindPartial();}).then(()=>resolve()).catch((err)=>reject(err))}).catch(async(err)=>{try{Identification.snackbar.set((await err.json()).Message);}catch{if(await err.Message) 59Identification.snackbar.set(err.Message);else 60Identification.snackbar.set(await err);}}).finally(()=>{Identification.utils.loadings.inner.hide()});},afterLoadChangePassword(){if(!!Identification.external.viewModel.Uuid){Identification.PasswordSecurityCheck=new PasswordSecurityCheck({uuid:Identification.external.viewModel.Uuid,wrapper:"#login",placeholder:"#login__mdp__regles",fieldset:"#login__mdp__regles__wrapper fieldset",changePass:Identification.external.viewModel.Uuid==='',useOldPwd:false,elements:{newPwd:"#newpass",newPwdConfirm:"#newpassConfirm"},events:{error:(msg)=>{Identification.snackbar.set(msg);},activation:()=>{const currentValue=Identification.obs.misc.get("hideSecurityCheck");Identification.obs.misc.set("hideSecurityCheck",!currentValue);},update:(value)=>{Identification.obs.forms.set("passwordSafe",value);}}});} 61Identification.utils.inputs.caseAdjust("#identifiant");const eyesSelector="i.identification-reveal-pwd";if($(eyesSelector).length) 62Identification.utils.togglePassword(eyesSelector);$("#login .partial-body .identification-input-group:first-child > span").css("opacity",1);Identification.PasswordSecurityCheck.isPasswordSecure();Identification.obs.set("misc.hideOpenMobile",true);}};Identification.LiaisonSociale={linkAccount(e){location.href=`Identification/LierCompteSocial`;},sendLinkageEmail(e){e.preventDefault();Identification.snackbar.hide();const formsData=Identification.obs.forms;if(!formsData.email||!Utils.checkEmailValidity(formsData.email)){Identification.snackbar.set("Veuillez saisir une adresse e-mail valide");return;} 63Identification.snackbar.hide();Identification.utils.loadings.inner.show();const data={email:formsData.email,}
64const requestParams={method:"POST",url:`Identification/EnvoyerDemandeConfirmationLiaison`,body:data} 65Utils.fetch(requestParams).then((data)=>{$("#partial-placeholder").html(data);Identification.utils.rebindPartial();}).catch((err)=>{Identification.snackbar.set(err.Message);}).finally(()=>{Identification.utils.loadings.inner.hide()});},};Identification.SecondFacteur={submit(e){e.preventDefault();Identification.snackbar.hide();const codeSecondFacteur=this.getTotpFromInput();Identification.obs.set("forms.totp",codeSecondFacteur);new Promise((resolve,reject)=>{if(!codeSecondFacteur||codeSecondFacteur==""){reject("Merci de renseigner un code");return;} 66Identification.snackbar.hide();Identification.utils.loadings.inner.show();$("#identification-second-facteur-form").submit();}).catch(async(err)=>{Identification.snackbar.set(await err);});},sendEmail(e){Identification.snackbar.hide();Identification.utils.loadings.inner.show();const requestParams={method:"POST",url:`Identification/EnvoyerEmailSecondFacteur`,} 67if(e.currentTarget.id=="send-totp-email"){Utils.fetch(requestParams).then(()=>Identification.Routing.goto("SECOND_FACTEUR_SAISIE")).catch((err)=>Identification.snackbar.set(err?.Message??"Erreur lors de l'envoi de l'email, veuillez réessayer.")).finally(()=>Identification.utils.loadings.inner.hide());} 68else if(e.currentTarget.id=="resend-totp-email"){Utils.fetch(requestParams).catch((err)=>Identification.snackbar.set(err?.Message??"Erreur lors de l'envoi de l'email, veuillez réessayer.")).finally(()=>{Identification.utils.loadings.inner.hide();Components.Notification.show("Un code de sécurité vous a été renvoyé.","success");});}},isCtrlDown:false,changeCell(e){let currentCell=$(`#${e.target.id}`);const currentDigit=parseInt(e.target.id.replace("digit",""));const previousDigit=currentDigit-1;let previousCell=$(`#digit${previousDigit}`);const nextDigit=currentDigit+1;let nextCell=$(`#digit${nextDigit}`);const isNumberKey=e.key>=0&&e.key<=9;const isCtrlKey=e.key=="Control";if(currentCell.val().length==1&&isNumberKey){currentCell.data("empty","false");if(currentDigit<6&&nextCell.val().length==0) 69nextCell.focus();} 70const isEmpty=currentCell.val().length==0&¤tCell.data("empty")=="true";const isEraseKey=e.key=="Backspace";if(isEraseKey&&isEmpty){previousCell.focus();} 71else if(isEraseKey&&!isEmpty){currentCell.data("empty","true");} 72if(isCtrlKey) 73Identification.SecondFacteur.isCtrlDown=false;},pasteTotp(e){e.stopPropagation();e.preventDefault();const pastedData=e.originalEvent.clipboardData.getData('text');const regex=/\d{6}/;if(regex.test(pastedData)){for(let index=1;index<=6;index++){$(`#digit${index}`).val(pastedData.charAt(index-1));$(`#digit${index}`).data("empty",false);} 74$(`#digit6`).focus();}},checkCellInput(e){let currentCell=$(`#${e.target.id}`);const currentDigit=parseInt(e.target.id.replace("digit",""));let previousCell=$(`#digit${currentDigit - 1}`);let nextCell=$(`#digit${currentDigit + 1}`);const isTab=e.key=="Tab";const isLeftArrow=e.key=="ArrowLeft";const isRightArrow=e.key=="ArrowRight";const isNumberKey=e.key>=0&&e.key<=9;const isEraseKey=e.key=="Backspace";const isCtrlKey=e.key=="Control";const isVKey=e.key=="v";const caretPos=e.target.selectionStart;const isPaste=Identification.SecondFacteur.isCtrlDown&&isVKey;if(isCtrlKey){Identification.SecondFacteur.isCtrlDown=true;return true;} 75if(isLeftArrow&&caretPos==0){previousCell.focus();return false;} 76else if((isRightArrow||isTab)&&caretPos==currentCell.val().length){nextCell.focus();return false;} 77if(isNumberKey||isEraseKey||isLeftArrow||isRightArrow||isCtrlKey||isPaste) 78return true;return false;},getTotpFromInput(e){let totp="";for(let i=1;i<=6;i++){totp+=document.getElementById("digit"+i).value;} 79return totp;},afterLoadDemande(e){Identification.obs.set("misc.hideOpenMobile",true);},afterLoadSaisie(e){$('[id^="digit"]').on("keyup",Identification.SecondFacteur.changeCell);$('[id^="digit"]').on("keydown",Identification.SecondFacteur.checkCellInput);$('[id^="digit"]').on("paste",Identification.SecondFacteur.pasteTotp);Identification.obs.set("misc.hideOpenMobile",true);},};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.